{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "insert-toolbar-button",
  "title": "Insert Toolbar Button",
  "description": "A menu for inserting different types of blocks.",
  "dependencies": [],
  "registryDependencies": [
    "dropdown-menu",
    "https://platejs.org/r/toolbar.json",
    "https://platejs.org/r/transforms.json"
  ],
  "files": [
    {
      "path": "src/registry/ui/insert-toolbar-button.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\n\nimport type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu';\n\nimport {\n  CalendarIcon,\n  ChevronRightIcon,\n  Code2,\n  Columns3Icon,\n  FileCodeIcon,\n  FilmIcon,\n  Heading1Icon,\n  Heading2Icon,\n  Heading3Icon,\n  ImageIcon,\n  Link2Icon,\n  ListIcon,\n  ListOrderedIcon,\n  MinusIcon,\n  PenToolIcon,\n  PilcrowIcon,\n  PlusIcon,\n  QuoteIcon,\n  RadicalIcon,\n  SquareIcon,\n  SuperscriptIcon,\n  TableIcon,\n  TableOfContentsIcon,\n} from 'lucide-react';\nimport { KEYS } from 'platejs';\nimport { type PlateEditor, useEditorRef } from 'platejs/react';\n\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport {\n  insertBlock,\n  insertInlineElement,\n} from '@/registry/components/editor/transforms';\n\nimport { ToolbarButton, ToolbarMenuGroup } from './toolbar';\n\ntype Group = {\n  group: string;\n  items: Item[];\n};\n\ntype Item = {\n  icon: React.ReactNode;\n  value: string;\n  onSelect: (editor: PlateEditor, value: string) => void;\n  focusEditor?: boolean;\n  label?: string;\n};\n\nconst groups: Group[] = [\n  {\n    group: 'Basic blocks',\n    items: [\n      {\n        icon: <PilcrowIcon />,\n        label: 'Paragraph',\n        value: KEYS.p,\n      },\n      {\n        icon: <Heading1Icon />,\n        label: 'Heading 1',\n        value: 'h1',\n      },\n      {\n        icon: <Heading2Icon />,\n        label: 'Heading 2',\n        value: 'h2',\n      },\n      {\n        icon: <Heading3Icon />,\n        label: 'Heading 3',\n        value: 'h3',\n      },\n      {\n        icon: <TableIcon />,\n        label: 'Table',\n        value: KEYS.table,\n      },\n      {\n        icon: <FileCodeIcon />,\n        label: 'Code',\n        value: KEYS.codeBlock,\n      },\n      {\n        icon: <QuoteIcon />,\n        label: 'Quote',\n        value: KEYS.blockquote,\n      },\n      {\n        icon: <MinusIcon />,\n        label: 'Divider',\n        value: KEYS.hr,\n      },\n    ].map((item) => ({\n      ...item,\n      onSelect: (editor, value) => {\n        insertBlock(editor, value);\n      },\n    })),\n  },\n  {\n    group: 'Lists',\n    items: [\n      {\n        icon: <ListIcon />,\n        label: 'Bulleted list',\n        value: KEYS.ul,\n      },\n      {\n        icon: <ListOrderedIcon />,\n        label: 'Numbered list',\n        value: KEYS.ol,\n      },\n      {\n        icon: <SquareIcon />,\n        label: 'To-do list',\n        value: KEYS.listTodo,\n      },\n      {\n        icon: <ChevronRightIcon />,\n        label: 'Toggle list',\n        value: KEYS.toggle,\n      },\n    ].map((item) => ({\n      ...item,\n      onSelect: (editor, value) => {\n        insertBlock(editor, value);\n      },\n    })),\n  },\n  {\n    group: 'Media',\n    items: [\n      {\n        icon: <ImageIcon />,\n        label: 'Image',\n        value: KEYS.img,\n      },\n      {\n        icon: <FilmIcon />,\n        label: 'Embed',\n        value: KEYS.mediaEmbed,\n      },\n    ].map((item) => ({\n      ...item,\n      onSelect: (editor, value) => {\n        insertBlock(editor, value);\n      },\n    })),\n  },\n  {\n    group: 'Advanced blocks',\n    items: [\n      {\n        icon: <TableOfContentsIcon />,\n        label: 'Table of contents',\n        value: KEYS.toc,\n      },\n      {\n        icon: <Columns3Icon />,\n        label: '3 columns',\n        value: 'action_three_columns',\n      },\n      {\n        focusEditor: false,\n        icon: <RadicalIcon />,\n        label: 'Equation',\n        value: KEYS.equation,\n      },\n      {\n        icon: <PenToolIcon />,\n        label: 'Excalidraw',\n        value: KEYS.excalidraw,\n      },\n      {\n        icon: <Code2 />,\n        label: 'Code Drawing',\n        value: KEYS.codeDrawing,\n      },\n    ].map((item) => ({\n      ...item,\n      onSelect: (editor, value) => {\n        insertBlock(editor, value);\n      },\n    })),\n  },\n  {\n    group: 'Inline',\n    items: [\n      {\n        icon: <Link2Icon />,\n        label: 'Link',\n        value: KEYS.link,\n      },\n      {\n        focusEditor: true,\n        icon: <CalendarIcon />,\n        label: 'Date',\n        value: KEYS.date,\n      },\n      {\n        focusEditor: true,\n        icon: <SuperscriptIcon />,\n        label: 'Footnote',\n        value: 'action_footnote',\n      },\n      {\n        focusEditor: false,\n        icon: <RadicalIcon />,\n        label: 'Inline Equation',\n        value: KEYS.inlineEquation,\n      },\n    ].map((item) => ({\n      ...item,\n      onSelect: (editor, value) => {\n        insertInlineElement(editor, value);\n      },\n    })),\n  },\n];\n\nexport function InsertToolbarButton(props: DropdownMenuProps) {\n  const editor = useEditorRef();\n  const [open, setOpen] = React.useState(false);\n\n  return (\n    <DropdownMenu open={open} onOpenChange={setOpen} modal={false} {...props}>\n      <DropdownMenuTrigger asChild>\n        <ToolbarButton pressed={open} tooltip=\"Insert\" isDropdown>\n          <PlusIcon />\n        </ToolbarButton>\n      </DropdownMenuTrigger>\n\n      <DropdownMenuContent\n        className=\"flex max-h-[500px] min-w-0 flex-col overflow-y-auto\"\n        align=\"start\"\n      >\n        {groups.map(({ group, items: nestedItems }) => (\n          <ToolbarMenuGroup key={group} label={group}>\n            {nestedItems.map(({ icon, label, value, onSelect }) => (\n              <DropdownMenuItem\n                key={value}\n                className=\"min-w-[180px]\"\n                onSelect={() => {\n                  onSelect(editor, value);\n                  editor.tf.focus();\n                }}\n              >\n                {icon}\n                {label}\n              </DropdownMenuItem>\n            ))}\n          </ToolbarMenuGroup>\n        ))}\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n",
      "type": "registry:ui"
    }
  ],
  "meta": {
    "examples": [
      "basic-nodes-demo"
    ]
  },
  "type": "registry:ui"
}