{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "turn-into-toolbar-button",
  "title": "Turn Into Toolbar Button",
  "description": "A menu for converting between different block types.",
  "dependencies": [],
  "registryDependencies": [
    "dropdown-menu",
    "https://platejs.org/r/toolbar.json",
    "https://platejs.org/r/transforms.json"
  ],
  "files": [
    {
      "path": "src/registry/ui/turn-into-toolbar-button.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\n\nimport type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu';\nimport type { TElement } from 'platejs';\n\nimport { DropdownMenuItemIndicator } from '@radix-ui/react-dropdown-menu';\nimport {\n  CheckIcon,\n  ChevronRightIcon,\n  Code2,\n  Columns3Icon,\n  FileCodeIcon,\n  Heading1Icon,\n  Heading2Icon,\n  Heading3Icon,\n  Heading4Icon,\n  Heading5Icon,\n  Heading6Icon,\n  ListIcon,\n  ListOrderedIcon,\n  PilcrowIcon,\n  QuoteIcon,\n  SquareIcon,\n} from 'lucide-react';\nimport { KEYS } from 'platejs';\nimport { useEditorRef, useSelectionFragmentProp } from 'platejs/react';\n\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuRadioItem,\n  DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport {\n  getBlockType,\n  setBlockType,\n} from '@/registry/components/editor/transforms';\n\nimport { ToolbarButton, ToolbarMenuGroup } from './toolbar';\n\nexport const turnIntoItems = [\n  {\n    icon: <PilcrowIcon />,\n    keywords: ['paragraph'],\n    label: 'Text',\n    value: KEYS.p,\n  },\n  {\n    icon: <Heading1Icon />,\n    keywords: ['title', 'h1'],\n    label: 'Heading 1',\n    value: 'h1',\n  },\n  {\n    icon: <Heading2Icon />,\n    keywords: ['subtitle', 'h2'],\n    label: 'Heading 2',\n    value: 'h2',\n  },\n  {\n    icon: <Heading3Icon />,\n    keywords: ['subtitle', 'h3'],\n    label: 'Heading 3',\n    value: 'h3',\n  },\n  {\n    icon: <Heading4Icon />,\n    keywords: ['subtitle', 'h4'],\n    label: 'Heading 4',\n    value: 'h4',\n  },\n  {\n    icon: <Heading5Icon />,\n    keywords: ['subtitle', 'h5'],\n    label: 'Heading 5',\n    value: 'h5',\n  },\n  {\n    icon: <Heading6Icon />,\n    keywords: ['subtitle', 'h6'],\n    label: 'Heading 6',\n    value: 'h6',\n  },\n  {\n    icon: <ListIcon />,\n    keywords: ['unordered', 'ul', '-'],\n    label: 'Bulleted list',\n    value: KEYS.ul,\n  },\n  {\n    icon: <ListOrderedIcon />,\n    keywords: ['ordered', 'ol', '1'],\n    label: 'Numbered list',\n    value: KEYS.ol,\n  },\n  {\n    icon: <SquareIcon />,\n    keywords: ['checklist', 'task', 'checkbox', '[]'],\n    label: 'To-do list',\n    value: KEYS.listTodo,\n  },\n  {\n    icon: <ChevronRightIcon />,\n    keywords: ['collapsible', 'expandable'],\n    label: 'Toggle list',\n    value: KEYS.toggle,\n  },\n  {\n    icon: <FileCodeIcon />,\n    keywords: ['```'],\n    label: 'Code',\n    value: KEYS.codeBlock,\n  },\n  {\n    icon: <Code2 />,\n    keywords: [\n      'code-drawing',\n      'diagram',\n      'plantuml',\n      'graphviz',\n      'flowchart',\n      'mermaid',\n    ],\n    label: 'Code Drawing',\n    value: KEYS.codeDrawing,\n  },\n  {\n    icon: <QuoteIcon />,\n    keywords: ['citation', 'blockquote', '>'],\n    label: 'Quote',\n    value: KEYS.blockquote,\n  },\n  {\n    icon: <Columns3Icon />,\n    label: '3 columns',\n    value: 'action_three_columns',\n  },\n];\n\nexport function TurnIntoToolbarButton(props: DropdownMenuProps) {\n  const editor = useEditorRef();\n  const [open, setOpen] = React.useState(false);\n\n  const value = useSelectionFragmentProp({\n    defaultValue: KEYS.p,\n    getProp: (node) => getBlockType(node as TElement),\n  });\n  const selectedItem = React.useMemo(\n    () =>\n      turnIntoItems.find((item) => item.value === (value ?? KEYS.p)) ??\n      turnIntoItems[0],\n    [value]\n  );\n\n  return (\n    <DropdownMenu open={open} onOpenChange={setOpen} modal={false} {...props}>\n      <DropdownMenuTrigger asChild>\n        <ToolbarButton\n          className=\"min-w-[125px]\"\n          pressed={open}\n          tooltip=\"Turn into\"\n          isDropdown\n        >\n          {selectedItem.label}\n        </ToolbarButton>\n      </DropdownMenuTrigger>\n\n      <DropdownMenuContent\n        className=\"ignore-click-outside/toolbar min-w-0\"\n        onCloseAutoFocus={(e) => {\n          e.preventDefault();\n          editor.tf.focus();\n        }}\n        align=\"start\"\n      >\n        <ToolbarMenuGroup\n          value={value}\n          onValueChange={(type) => {\n            setBlockType(editor, type);\n          }}\n          label=\"Turn into\"\n        >\n          {turnIntoItems.map(({ icon, label, value: itemValue }) => (\n            <DropdownMenuRadioItem\n              key={itemValue}\n              className=\"min-w-[180px] pl-2 *:first:[span]:hidden\"\n              value={itemValue}\n            >\n              <span className=\"pointer-events-none absolute right-2 flex size-3.5 items-center justify-center\">\n                <DropdownMenuItemIndicator>\n                  <CheckIcon />\n                </DropdownMenuItemIndicator>\n              </span>\n              {icon}\n              {label}\n            </DropdownMenuRadioItem>\n          ))}\n        </ToolbarMenuGroup>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n",
      "type": "registry:ui"
    }
  ],
  "meta": {
    "docs": [
      {
        "route": "https://pro.platejs.org/docs/components/turn-into-toolbar-button"
      }
    ],
    "examples": [
      "basic-nodes-demo",
      "basic-nodes-pro"
    ]
  },
  "type": "registry:ui"
}