{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "font-size-toolbar-button",
  "title": "Font Size Toolbar Button",
  "description": "A toolbar control for adjusting font size.",
  "dependencies": [
    "@platejs/basic-styles"
  ],
  "registryDependencies": [
    "popover",
    "https://platejs.org/r/toolbar.json"
  ],
  "files": [
    {
      "path": "src/registry/ui/font-size-toolbar-button.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\n\nimport type { TElement } from 'platejs';\n\nimport { toUnitLess } from '@platejs/basic-styles';\nimport { FontSizePlugin } from '@platejs/basic-styles/react';\nimport { Minus, Plus } from 'lucide-react';\nimport { KEYS } from 'platejs';\nimport { useEditorPlugin, useEditorSelector } from 'platejs/react';\n\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from '@/components/ui/popover';\nimport { cn } from '@/lib/utils';\n\nimport { ToolbarButton } from './toolbar';\n\nconst DEFAULT_FONT_SIZE = '16';\n\nconst FONT_SIZE_MAP = {\n  h1: '36',\n  h2: '24',\n  h3: '20',\n} as const;\n\nconst FONT_SIZES = [\n  '8',\n  '9',\n  '10',\n  '12',\n  '14',\n  '16',\n  '18',\n  '24',\n  '30',\n  '36',\n  '48',\n  '60',\n  '72',\n  '96',\n] as const;\n\nexport function FontSizeToolbarButton() {\n  const [inputValue, setInputValue] = React.useState(DEFAULT_FONT_SIZE);\n  const [isFocused, setIsFocused] = React.useState(false);\n  const { editor, tf } = useEditorPlugin(FontSizePlugin);\n\n  const cursorFontSize = useEditorSelector((editor) => {\n    const fontSize = editor.api.marks()?.[KEYS.fontSize];\n\n    if (fontSize) {\n      return toUnitLess(fontSize as string);\n    }\n\n    const [block] = editor.api.block<TElement>() || [];\n\n    if (!block?.type) return DEFAULT_FONT_SIZE;\n\n    return block.type in FONT_SIZE_MAP\n      ? FONT_SIZE_MAP[block.type as keyof typeof FONT_SIZE_MAP]\n      : DEFAULT_FONT_SIZE;\n  }, []);\n\n  const handleInputChange = () => {\n    const newSize = toUnitLess(inputValue);\n\n    if (\n      Number.parseInt(newSize, 10) < 1 ||\n      Number.parseInt(newSize, 10) > 100\n    ) {\n      editor.tf.focus();\n\n      return;\n    }\n    if (newSize !== toUnitLess(cursorFontSize)) {\n      tf.fontSize.addMark(`${newSize}px`);\n    }\n\n    editor.tf.focus();\n  };\n\n  const handleFontSizeChange = (delta: number) => {\n    const newSize = Number(displayValue) + delta;\n    tf.fontSize.addMark(`${newSize}px`);\n    editor.tf.focus();\n  };\n\n  const displayValue = isFocused ? inputValue : cursorFontSize;\n\n  return (\n    <div className=\"flex h-7 items-center gap-1 rounded-md bg-muted/60 p-0\">\n      <ToolbarButton onClick={() => handleFontSizeChange(-1)}>\n        <Minus />\n      </ToolbarButton>\n\n      <Popover open={isFocused} modal={false}>\n        <PopoverTrigger asChild>\n          <input\n            className={cn(\n              'h-full w-10 shrink-0 bg-transparent px-1 text-center text-sm hover:bg-muted'\n            )}\n            value={displayValue}\n            onBlur={() => {\n              setIsFocused(false);\n              handleInputChange();\n            }}\n            onChange={(e) => setInputValue(e.target.value)}\n            onFocus={() => {\n              setIsFocused(true);\n              setInputValue(toUnitLess(cursorFontSize));\n            }}\n            onKeyDown={(e) => {\n              if (e.key === 'Enter') {\n                e.preventDefault();\n                handleInputChange();\n              }\n            }}\n            data-plate-focus=\"true\"\n            type=\"text\"\n          />\n        </PopoverTrigger>\n        <PopoverContent\n          className=\"w-10 px-px py-1\"\n          onOpenAutoFocus={(e) => e.preventDefault()}\n        >\n          {FONT_SIZES.map((size) => (\n            <button\n              key={size}\n              className={cn(\n                'flex h-8 w-full items-center justify-center text-sm hover:bg-accent data-[highlighted=true]:bg-accent'\n              )}\n              onClick={() => {\n                tf.fontSize.addMark(`${size}px`);\n                setIsFocused(false);\n              }}\n              data-highlighted={size === displayValue}\n              type=\"button\"\n            >\n              {size}\n            </button>\n          ))}\n        </PopoverContent>\n      </Popover>\n\n      <ToolbarButton onClick={() => handleFontSizeChange(1)}>\n        <Plus />\n      </ToolbarButton>\n    </div>\n  );\n}\n",
      "type": "registry:ui"
    }
  ],
  "meta": {
    "docs": [
      {
        "route": "/docs/font"
      }
    ],
    "examples": [
      "font-demo"
    ]
  },
  "type": "registry:ui"
}