{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "code-block-node",
  "title": "Code Block Nodes",
  "description": "A code block with syntax highlighting and language selection.",
  "dependencies": [
    "@platejs/code-block",
    "lowlight"
  ],
  "registryDependencies": [
    "command",
    "popover",
    "button"
  ],
  "files": [
    {
      "path": "src/registry/ui/code-block-node.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\n\nimport { formatCodeBlock, isLangSupported } from '@platejs/code-block';\nimport { BracesIcon, Check, CheckIcon, CopyIcon } from 'lucide-react';\nimport { type TCodeBlockElement, type TCodeSyntaxLeaf, NodeApi } from 'platejs';\nimport {\n  type PlateElementProps,\n  type PlateLeafProps,\n  PlateElement,\n  PlateLeaf,\n} from 'platejs/react';\nimport { useEditorRef, useElement, useReadOnly } from 'platejs/react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n  Command,\n  CommandEmpty,\n  CommandGroup,\n  CommandInput,\n  CommandItem,\n  CommandList,\n} from '@/components/ui/command';\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from '@/components/ui/popover';\nimport { cn } from '@/lib/utils';\n\ntype CodeBlockElementProps = PlateElementProps<TCodeBlockElement> & {\n  showLanguageLabel?: boolean;\n};\n\nconst codeBlockLanguages: { label: string; value: string }[] = [\n  { label: 'Auto', value: 'auto' },\n  { label: 'Plain Text', value: 'plaintext' },\n  { label: 'ABAP', value: 'abap' },\n  { label: 'Agda', value: 'agda' },\n  { label: 'Arduino', value: 'arduino' },\n  { label: 'ASCII Art', value: 'ascii' },\n  { label: 'Assembly', value: 'x86asm' },\n  { label: 'Bash', value: 'bash' },\n  { label: 'BASIC', value: 'basic' },\n  { label: 'BNF', value: 'bnf' },\n  { label: 'C', value: 'c' },\n  { label: 'C#', value: 'csharp' },\n  { label: 'C++', value: 'cpp' },\n  { label: 'Clojure', value: 'clojure' },\n  { label: 'CoffeeScript', value: 'coffeescript' },\n  { label: 'Coq', value: 'coq' },\n  { label: 'CSS', value: 'css' },\n  { label: 'Dart', value: 'dart' },\n  { label: 'Dhall', value: 'dhall' },\n  { label: 'Diff', value: 'diff' },\n  { label: 'Docker', value: 'dockerfile' },\n  { label: 'EBNF', value: 'ebnf' },\n  { label: 'Elixir', value: 'elixir' },\n  { label: 'Elm', value: 'elm' },\n  { label: 'Erlang', value: 'erlang' },\n  { label: 'F#', value: 'fsharp' },\n  { label: 'Flow', value: 'flow' },\n  { label: 'Fortran', value: 'fortran' },\n  { label: 'Gherkin', value: 'gherkin' },\n  { label: 'GLSL', value: 'glsl' },\n  { label: 'Go', value: 'go' },\n  { label: 'GraphQL', value: 'graphql' },\n  { label: 'Groovy', value: 'groovy' },\n  { label: 'Haskell', value: 'haskell' },\n  { label: 'HCL', value: 'hcl' },\n  { label: 'HTML', value: 'html' },\n  { label: 'Idris', value: 'idris' },\n  { label: 'Java', value: 'java' },\n  { label: 'JavaScript', value: 'javascript' },\n  { label: 'JSON', value: 'json' },\n  { label: 'Julia', value: 'julia' },\n  { label: 'Kotlin', value: 'kotlin' },\n  { label: 'LaTeX', value: 'latex' },\n  { label: 'Less', value: 'less' },\n  { label: 'Lisp', value: 'lisp' },\n  { label: 'LiveScript', value: 'livescript' },\n  { label: 'LLVM IR', value: 'llvm' },\n  { label: 'Lua', value: 'lua' },\n  { label: 'Makefile', value: 'makefile' },\n  { label: 'Markdown', value: 'markdown' },\n  { label: 'Markup', value: 'markup' },\n  { label: 'MATLAB', value: 'matlab' },\n  { label: 'Mathematica', value: 'mathematica' },\n  { label: 'Mermaid', value: 'mermaid' },\n  { label: 'Nix', value: 'nix' },\n  { label: 'Notion Formula', value: 'notion' },\n  { label: 'Objective-C', value: 'objectivec' },\n  { label: 'OCaml', value: 'ocaml' },\n  { label: 'Pascal', value: 'pascal' },\n  { label: 'Perl', value: 'perl' },\n  { label: 'PHP', value: 'php' },\n  { label: 'PowerShell', value: 'powershell' },\n  { label: 'Prolog', value: 'prolog' },\n  { label: 'Protocol Buffers', value: 'protobuf' },\n  { label: 'PureScript', value: 'purescript' },\n  { label: 'Python', value: 'python' },\n  { label: 'R', value: 'r' },\n  { label: 'Racket', value: 'racket' },\n  { label: 'Reason', value: 'reasonml' },\n  { label: 'Ruby', value: 'ruby' },\n  { label: 'Rust', value: 'rust' },\n  { label: 'Sass', value: 'scss' },\n  { label: 'Scala', value: 'scala' },\n  { label: 'Scheme', value: 'scheme' },\n  { label: 'SCSS', value: 'scss' },\n  { label: 'Shell', value: 'shell' },\n  { label: 'Smalltalk', value: 'smalltalk' },\n  { label: 'Solidity', value: 'solidity' },\n  { label: 'SQL', value: 'sql' },\n  { label: 'Swift', value: 'swift' },\n  { label: 'TOML', value: 'toml' },\n  { label: 'TypeScript', value: 'typescript' },\n  { label: 'VB.Net', value: 'vbnet' },\n  { label: 'Verilog', value: 'verilog' },\n  { label: 'VHDL', value: 'vhdl' },\n  { label: 'Visual Basic', value: 'vbnet' },\n  { label: 'WebAssembly', value: 'wasm' },\n  { label: 'XML', value: 'xml' },\n  { label: 'YAML', value: 'yaml' },\n];\n\nfunction getCodeBlockLanguageLabel(lang?: string | null) {\n  const value = lang?.trim();\n\n  if (!value) return null;\n\n  return (\n    codeBlockLanguages.find((language) => language.value === value)?.label ??\n    value\n  );\n}\n\nexport function CodeBlockElement({\n  showLanguageLabel = true,\n  ...props\n}: CodeBlockElementProps) {\n  const { editor, element } = props;\n\n  return (\n    <PlateElement\n      className=\"py-1 **:[.hljs-addition]:bg-[#f0fff4] **:[.hljs-addition]:text-[#22863a] dark:**:[.hljs-addition]:bg-[#3c5743] dark:**:[.hljs-addition]:text-[#ceead5] **:[.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable]:text-[#005cc5] dark:**:[.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable]:text-[#6596cf] **:[.hljs-built\\\\\\\\_in,.hljs-symbol]:text-[#e36209] dark:**:[.hljs-built\\\\\\\\_in,.hljs-symbol]:text-[#c3854e] **:[.hljs-bullet]:text-[#735c0f] **:[.hljs-comment,.hljs-code,.hljs-formula]:text-[#6a737d] dark:**:[.hljs-comment,.hljs-code,.hljs-formula]:text-[#6a737d] **:[.hljs-deletion]:bg-[#ffeef0] **:[.hljs-deletion]:text-[#b31d28] dark:**:[.hljs-deletion]:bg-[#473235] dark:**:[.hljs-deletion]:text-[#e7c7cb] **:[.hljs-emphasis]:italic **:[.hljs-keyword,.hljs-doctag,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language\\\\\\\\_]:text-[#d73a49] dark:**:[.hljs-keyword,.hljs-doctag,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language\\\\\\\\_]:text-[#ee6960] **:[.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo]:text-[#22863a] dark:**:[.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo]:text-[#36a84f] **:[.hljs-regexp,.hljs-string,.hljs-meta_.hljs-string]:text-[#032f62] dark:**:[.hljs-regexp,.hljs-string,.hljs-meta_.hljs-string]:text-[#3593ff] **:[.hljs-section]:font-bold **:[.hljs-section]:text-[#005cc5] dark:**:[.hljs-section]:text-[#61a5f2] **:[.hljs-strong]:font-bold **:[.hljs-title,.hljs-title.class\\\\\\\\_,.hljs-title.class\\\\\\\\_.inherited\\\\\\\\_\\\\\\\\_,.hljs-title.function\\\\\\\\_]:text-[#6f42c1] dark:**:[.hljs-title,.hljs-title.class\\\\\\\\_,.hljs-title.class\\\\\\\\_.inherited\\\\\\\\_\\\\\\\\_,.hljs-title.function\\\\\\\\_]:text-[#a77bfa]\"\n      {...props}\n    >\n      <div className=\"relative rounded-md bg-muted/50\">\n        <pre className=\"overflow-x-auto p-8 pr-4 font-mono text-sm leading-[normal] [tab-size:2] print:break-inside-avoid\">\n          <code>{props.children}</code>\n        </pre>\n\n        <div\n          className=\"absolute top-1 right-1 z-10 flex select-none gap-0.5\"\n          contentEditable={false}\n        >\n          {isLangSupported(element.lang) && (\n            <Button\n              size=\"icon\"\n              variant=\"ghost\"\n              className=\"size-6 text-xs\"\n              onClick={() => formatCodeBlock(editor, { element })}\n              title=\"Format code\"\n            >\n              <BracesIcon className=\"!size-3.5 text-muted-foreground\" />\n            </Button>\n          )}\n\n          <CodeBlockCombobox showLanguageLabel={showLanguageLabel} />\n\n          <CopyButton\n            size=\"icon\"\n            variant=\"ghost\"\n            className=\"size-6 gap-1 text-muted-foreground text-xs\"\n            value={() => NodeApi.string(element)}\n          />\n        </div>\n      </div>\n    </PlateElement>\n  );\n}\n\nfunction CodeBlockCombobox({\n  showLanguageLabel,\n}: {\n  showLanguageLabel: boolean;\n}) {\n  const [open, setOpen] = React.useState(false);\n  const readOnly = useReadOnly();\n  const editor = useEditorRef();\n  const element = useElement<TCodeBlockElement>();\n  const value = element.lang || 'plaintext';\n  const [searchValue, setSearchValue] = React.useState('');\n\n  const items = React.useMemo(\n    () =>\n      codeBlockLanguages.filter(\n        (language) =>\n          !searchValue ||\n          language.label.toLowerCase().includes(searchValue.toLowerCase())\n      ),\n    [searchValue]\n  );\n\n  if (readOnly) {\n    if (!showLanguageLabel) return null;\n\n    return <CodeBlockLanguageLabel lang={element.lang} />;\n  }\n\n  return (\n    <Popover open={open} onOpenChange={setOpen}>\n      <PopoverTrigger asChild>\n        <Button\n          size=\"sm\"\n          variant=\"ghost\"\n          className=\"h-6 select-none justify-between gap-1 px-2 text-muted-foreground text-xs\"\n          aria-expanded={open}\n          role=\"combobox\"\n        >\n          {getCodeBlockLanguageLabel(value) ?? 'Plain Text'}\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent\n        className=\"w-[200px] p-0\"\n        onCloseAutoFocus={() => setSearchValue('')}\n      >\n        <Command shouldFilter={false}>\n          <CommandInput\n            className=\"h-9\"\n            value={searchValue}\n            onValueChange={(value) => setSearchValue(value)}\n            placeholder=\"Search language...\"\n          />\n          <CommandEmpty>No language found.</CommandEmpty>\n\n          <CommandList className=\"h-[344px] overflow-y-auto\">\n            <CommandGroup>\n              {items.map((language) => (\n                <CommandItem\n                  key={language.label}\n                  className=\"cursor-pointer\"\n                  value={language.value}\n                  onSelect={(value) => {\n                    editor.tf.setNodes<TCodeBlockElement>(\n                      { lang: value },\n                      { at: element }\n                    );\n                    setSearchValue(value);\n                    setOpen(false);\n                  }}\n                >\n                  <Check\n                    className={cn(\n                      value === language.value ? 'opacity-100' : 'opacity-0'\n                    )}\n                  />\n                  {language.label}\n                </CommandItem>\n              ))}\n            </CommandGroup>\n          </CommandList>\n        </Command>\n      </PopoverContent>\n    </Popover>\n  );\n}\n\nfunction CodeBlockLanguageLabel({ lang }: { lang?: string | null }) {\n  const label = getCodeBlockLanguageLabel(lang);\n\n  if (!label) return null;\n\n  return (\n    <span className=\"flex h-6 select-none items-center px-2 text-muted-foreground text-xs\">\n      {label}\n    </span>\n  );\n}\n\nfunction CopyButton({\n  value,\n  ...props\n}: { value: (() => string) | string } & Omit<\n  React.ComponentProps<typeof Button>,\n  'value'\n>) {\n  const [hasCopied, setHasCopied] = React.useState(false);\n\n  React.useEffect(() => {\n    setTimeout(() => {\n      setHasCopied(false);\n    }, 2000);\n  }, [hasCopied]);\n\n  return (\n    <Button\n      onClick={() => {\n        void navigator.clipboard.writeText(\n          typeof value === 'function' ? value() : value\n        );\n        setHasCopied(true);\n      }}\n      {...props}\n    >\n      <span className=\"sr-only\">Copy</span>\n      {hasCopied ? (\n        <CheckIcon className=\"!size-3\" />\n      ) : (\n        <CopyIcon className=\"!size-3\" />\n      )}\n    </Button>\n  );\n}\n\nexport function CodeLineElement(props: PlateElementProps) {\n  return <PlateElement {...props} />;\n}\n\nexport function CodeSyntaxLeaf(props: PlateLeafProps<TCodeSyntaxLeaf>) {\n  const tokenClassName = props.leaf.className as string;\n\n  return <PlateLeaf className={tokenClassName} {...props} />;\n}\n",
      "type": "registry:ui"
    },
    {
      "path": "src/registry/ui/code-block-node-static.tsx",
      "content": "import * as React from 'react';\n\nimport type { TCodeBlockElement } from 'platejs';\n\nimport {\n  type SlateElementProps,\n  type SlateLeafProps,\n  SlateElement,\n  SlateLeaf,\n} from 'platejs/static';\n\ntype CodeBlockElementStaticProps = SlateElementProps<TCodeBlockElement> & {\n  showLanguageLabel?: boolean;\n};\n\nconst codeBlockLanguages: { label: string; value: string }[] = [\n  { label: 'Auto', value: 'auto' },\n  { label: 'Plain Text', value: 'plaintext' },\n  { label: 'ABAP', value: 'abap' },\n  { label: 'Agda', value: 'agda' },\n  { label: 'Arduino', value: 'arduino' },\n  { label: 'ASCII Art', value: 'ascii' },\n  { label: 'Assembly', value: 'x86asm' },\n  { label: 'Bash', value: 'bash' },\n  { label: 'BASIC', value: 'basic' },\n  { label: 'BNF', value: 'bnf' },\n  { label: 'C', value: 'c' },\n  { label: 'C#', value: 'csharp' },\n  { label: 'C++', value: 'cpp' },\n  { label: 'Clojure', value: 'clojure' },\n  { label: 'CoffeeScript', value: 'coffeescript' },\n  { label: 'Coq', value: 'coq' },\n  { label: 'CSS', value: 'css' },\n  { label: 'Dart', value: 'dart' },\n  { label: 'Dhall', value: 'dhall' },\n  { label: 'Diff', value: 'diff' },\n  { label: 'Docker', value: 'dockerfile' },\n  { label: 'EBNF', value: 'ebnf' },\n  { label: 'Elixir', value: 'elixir' },\n  { label: 'Elm', value: 'elm' },\n  { label: 'Erlang', value: 'erlang' },\n  { label: 'F#', value: 'fsharp' },\n  { label: 'Flow', value: 'flow' },\n  { label: 'Fortran', value: 'fortran' },\n  { label: 'Gherkin', value: 'gherkin' },\n  { label: 'GLSL', value: 'glsl' },\n  { label: 'Go', value: 'go' },\n  { label: 'GraphQL', value: 'graphql' },\n  { label: 'Groovy', value: 'groovy' },\n  { label: 'Haskell', value: 'haskell' },\n  { label: 'HCL', value: 'hcl' },\n  { label: 'HTML', value: 'html' },\n  { label: 'Idris', value: 'idris' },\n  { label: 'Java', value: 'java' },\n  { label: 'JavaScript', value: 'javascript' },\n  { label: 'JSON', value: 'json' },\n  { label: 'Julia', value: 'julia' },\n  { label: 'Kotlin', value: 'kotlin' },\n  { label: 'LaTeX', value: 'latex' },\n  { label: 'Less', value: 'less' },\n  { label: 'Lisp', value: 'lisp' },\n  { label: 'LiveScript', value: 'livescript' },\n  { label: 'LLVM IR', value: 'llvm' },\n  { label: 'Lua', value: 'lua' },\n  { label: 'Makefile', value: 'makefile' },\n  { label: 'Markdown', value: 'markdown' },\n  { label: 'Markup', value: 'markup' },\n  { label: 'MATLAB', value: 'matlab' },\n  { label: 'Mathematica', value: 'mathematica' },\n  { label: 'Mermaid', value: 'mermaid' },\n  { label: 'Nix', value: 'nix' },\n  { label: 'Notion Formula', value: 'notion' },\n  { label: 'Objective-C', value: 'objectivec' },\n  { label: 'OCaml', value: 'ocaml' },\n  { label: 'Pascal', value: 'pascal' },\n  { label: 'Perl', value: 'perl' },\n  { label: 'PHP', value: 'php' },\n  { label: 'PowerShell', value: 'powershell' },\n  { label: 'Prolog', value: 'prolog' },\n  { label: 'Protocol Buffers', value: 'protobuf' },\n  { label: 'PureScript', value: 'purescript' },\n  { label: 'Python', value: 'python' },\n  { label: 'R', value: 'r' },\n  { label: 'Racket', value: 'racket' },\n  { label: 'Reason', value: 'reasonml' },\n  { label: 'Ruby', value: 'ruby' },\n  { label: 'Rust', value: 'rust' },\n  { label: 'Sass', value: 'scss' },\n  { label: 'Scala', value: 'scala' },\n  { label: 'Scheme', value: 'scheme' },\n  { label: 'SCSS', value: 'scss' },\n  { label: 'Shell', value: 'shell' },\n  { label: 'Smalltalk', value: 'smalltalk' },\n  { label: 'Solidity', value: 'solidity' },\n  { label: 'SQL', value: 'sql' },\n  { label: 'Swift', value: 'swift' },\n  { label: 'TOML', value: 'toml' },\n  { label: 'TypeScript', value: 'typescript' },\n  { label: 'VB.Net', value: 'vbnet' },\n  { label: 'Verilog', value: 'verilog' },\n  { label: 'VHDL', value: 'vhdl' },\n  { label: 'Visual Basic', value: 'vbnet' },\n  { label: 'WebAssembly', value: 'wasm' },\n  { label: 'XML', value: 'xml' },\n  { label: 'YAML', value: 'yaml' },\n];\n\nfunction getCodeBlockLanguageLabel(lang?: string | null) {\n  const value = lang?.trim();\n\n  if (!value) return null;\n\n  return (\n    codeBlockLanguages.find((language) => language.value === value)?.label ??\n    value\n  );\n}\n\nexport function CodeBlockElementStatic({\n  showLanguageLabel = true,\n  ...props\n}: CodeBlockElementStaticProps) {\n  const languageLabel = getCodeBlockLanguageLabel(props.element.lang);\n\n  return (\n    <SlateElement\n      className=\"py-1 **:[.hljs-addition]:bg-[#f0fff4] **:[.hljs-addition]:text-[#22863a] dark:**:[.hljs-addition]:bg-[#3c5743] dark:**:[.hljs-addition]:text-[#ceead5] **:[.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable]:text-[#005cc5] dark:**:[.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable]:text-[#6596cf] **:[.hljs-built\\\\\\\\_in,.hljs-symbol]:text-[#e36209] dark:**:[.hljs-built\\\\\\\\_in,.hljs-symbol]:text-[#c3854e] **:[.hljs-bullet]:text-[#735c0f] **:[.hljs-comment,.hljs-code,.hljs-formula]:text-[#6a737d] dark:**:[.hljs-comment,.hljs-code,.hljs-formula]:text-[#6a737d] **:[.hljs-deletion]:bg-[#ffeef0] **:[.hljs-deletion]:text-[#b31d28] dark:**:[.hljs-deletion]:bg-[#473235] dark:**:[.hljs-deletion]:text-[#e7c7cb] **:[.hljs-emphasis]:italic **:[.hljs-keyword,.hljs-doctag,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language\\\\\\\\_]:text-[#d73a49] dark:**:[.hljs-keyword,.hljs-doctag,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language\\\\\\\\_]:text-[#ee6960] **:[.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo]:text-[#22863a] dark:**:[.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo]:text-[#36a84f] **:[.hljs-regexp,.hljs-string,.hljs-meta_.hljs-string]:text-[#032f62] dark:**:[.hljs-regexp,.hljs-string,.hljs-meta_.hljs-string]:text-[#3593ff] **:[.hljs-section]:font-bold **:[.hljs-section]:text-[#005cc5] dark:**:[.hljs-section]:text-[#61a5f2] **:[.hljs-strong]:font-bold **:[.hljs-title,.hljs-title.class\\\\\\\\_,.hljs-title.class\\\\\\\\_.inherited\\\\\\\\_\\\\\\\\_,.hljs-title.function\\\\\\\\_]:text-[#6f42c1] dark:**:[.hljs-title,.hljs-title.class\\\\\\\\_,.hljs-title.class\\\\\\\\_.inherited\\\\\\\\_\\\\\\\\_,.hljs-title.function\\\\\\\\_]:text-[#a77bfa]\"\n      {...props}\n    >\n      <div className=\"relative rounded-md bg-muted/50\">\n        {showLanguageLabel && languageLabel && (\n          <div\n            className=\"absolute top-1 right-1 z-10 flex h-6 select-none items-center px-2 text-muted-foreground text-xs\"\n            contentEditable={false}\n          >\n            {languageLabel}\n          </div>\n        )}\n\n        <pre className=\"overflow-x-auto p-8 pr-4 font-mono text-sm leading-[normal] [tab-size:2] print:break-inside-avoid\">\n          <code>{props.children}</code>\n        </pre>\n      </div>\n    </SlateElement>\n  );\n}\n\nexport function CodeLineElementStatic(props: SlateElementProps) {\n  return <SlateElement {...props} />;\n}\n\nexport function CodeSyntaxLeafStatic(props: SlateLeafProps) {\n  const tokenClassName = props.leaf.className as string;\n\n  return <SlateLeaf className={tokenClassName} {...props} />;\n}\n\n/**\n * DOCX-compatible code block components.\n * Uses inline styles for proper rendering in Word documents.\n */\n\nexport function CodeBlockElementDocx(\n  props: SlateElementProps<TCodeBlockElement>\n) {\n  return (\n    <SlateElement {...props}>\n      <div\n        style={{\n          backgroundColor: '#f5f5f5',\n          border: '1px solid #e0e0e0',\n          margin: '8pt 0',\n          padding: '12pt',\n        }}\n      >\n        {props.children}\n      </div>\n    </SlateElement>\n  );\n}\n\nexport function CodeLineElementDocx(props: SlateElementProps) {\n  return (\n    <SlateElement\n      {...props}\n      as=\"p\"\n      style={{\n        fontFamily: \"'Courier New', Consolas, monospace\",\n        fontSize: '10pt',\n        margin: 0,\n        padding: 0,\n      }}\n    />\n  );\n}\n\n// Syntax highlighting color map for common token types\nconst syntaxColors: Record<string, string> = {\n  'hljs-addition': '#22863a',\n  'hljs-attr': '#005cc5',\n  'hljs-attribute': '#005cc5',\n  'hljs-built_in': '#e36209',\n  'hljs-bullet': '#735c0f',\n  'hljs-comment': '#6a737d',\n  'hljs-deletion': '#b31d28',\n  'hljs-doctag': '#d73a49',\n  'hljs-emphasis': '#24292e',\n  'hljs-formula': '#6a737d',\n  'hljs-keyword': '#d73a49',\n  'hljs-literal': '#005cc5',\n  'hljs-meta': '#005cc5',\n  'hljs-name': '#22863a',\n  'hljs-number': '#005cc5',\n  'hljs-operator': '#005cc5',\n  'hljs-quote': '#22863a',\n  'hljs-regexp': '#032f62',\n  'hljs-section': '#005cc5',\n  'hljs-selector-attr': '#005cc5',\n  'hljs-selector-class': '#005cc5',\n  'hljs-selector-id': '#005cc5',\n  'hljs-selector-pseudo': '#22863a',\n  'hljs-selector-tag': '#22863a',\n  'hljs-string': '#032f62',\n  'hljs-strong': '#24292e',\n  'hljs-symbol': '#e36209',\n  'hljs-template-tag': '#d73a49',\n  'hljs-template-variable': '#d73a49',\n  'hljs-title': '#6f42c1',\n  'hljs-type': '#d73a49',\n  'hljs-variable': '#005cc5',\n};\n\n// Convert regular spaces to non-breaking spaces to preserve indentation in Word\nconst preserveSpaces = (text: string): string => {\n  // Replace regular spaces with non-breaking spaces\n  return text.replace(/ /g, '\\u00A0');\n};\n\nexport function CodeSyntaxLeafDocx(props: SlateLeafProps) {\n  const tokenClassName = props.leaf.className as string;\n\n  // Extract color from className\n  let color: string | undefined;\n  let fontWeight: string | undefined;\n  let fontStyle: string | undefined;\n\n  if (tokenClassName) {\n    const classes = tokenClassName.split(' ');\n    for (const cls of classes) {\n      if (syntaxColors[cls]) {\n        color = syntaxColors[cls];\n      }\n      if (cls === 'hljs-strong' || cls === 'hljs-section') {\n        fontWeight = 'bold';\n      }\n      if (cls === 'hljs-emphasis') {\n        fontStyle = 'italic';\n      }\n    }\n  }\n\n  // Get the text content and preserve spaces\n  const text = props.leaf.text as string;\n  const preservedText = preserveSpaces(text);\n\n  return (\n    <span\n      data-slate-leaf=\"true\"\n      style={{\n        color,\n        fontFamily: \"'Courier New', Consolas, monospace\",\n        fontSize: '10pt',\n        fontStyle,\n        fontWeight,\n      }}\n    >\n      {preservedText}\n    </span>\n  );\n}\n",
      "type": "registry:ui"
    }
  ],
  "meta": {
    "docs": [
      {
        "route": "/docs/code-block"
      },
      {
        "route": "https://pro.platejs.org/docs/components/code-block-node"
      }
    ],
    "examples": [
      "code-block-demo"
    ]
  },
  "type": "registry:ui"
}