{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "preview-markdown-demo",
  "dependencies": [
    "prismjs"
  ],
  "registryDependencies": [
    "https://platejs.org/r/basic-nodes-kit.json",
    "https://platejs.org/r/editor.json"
  ],
  "files": [
    {
      "path": "src/registry/examples/preview-markdown-demo.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\n\nimport {\n  type Decorate,\n  type RenderLeafProps,\n  type TText,\n  createSlatePlugin,\n  TextApi,\n} from 'platejs';\nimport { Plate, usePlateEditor } from 'platejs/react';\nimport Prism from 'prismjs';\n\nimport { cn } from '@/lib/utils';\nimport { BasicNodesKit } from '@/registry/components/editor/plugins/basic-nodes-kit';\nimport { previewMdValue } from '@/registry/examples/values/preview-md-value';\nimport { Editor, EditorContainer } from '@/registry/ui/editor';\n\nimport 'prismjs/components/prism-markdown.js';\n\n/** Decorate texts with markdown preview. */\nconst decoratePreview: Decorate = ({ entry: [node, path] }) => {\n  const ranges: any[] = [];\n\n  if (!TextApi.isText(node)) {\n    return ranges;\n  }\n\n  const getLength = (token: any) => {\n    if (typeof token === 'string') {\n      return token.length;\n    }\n    if (typeof token.content === 'string') {\n      return token.content.length;\n    }\n\n    return token.content.reduce((l: any, t: any) => l + getLength(t), 0);\n  };\n\n  const tokens = Prism.tokenize(node.text, Prism.languages.markdown);\n  let start = 0;\n\n  for (const token of tokens) {\n    const length = getLength(token);\n    const end = start + length;\n\n    if (typeof token !== 'string') {\n      ranges.push({\n        anchor: { offset: start, path },\n        focus: { offset: end, path },\n        [token.type]: true,\n      });\n    }\n\n    start = end;\n  }\n\n  return ranges;\n};\n\nfunction PreviewLeaf({\n  attributes,\n  children,\n  leaf,\n}: RenderLeafProps<\n  {\n    blockquote?: boolean;\n    bold?: boolean;\n    code?: boolean;\n    hr?: boolean;\n    italic?: boolean;\n    list?: boolean;\n    title?: boolean;\n  } & TText\n>) {\n  const { blockquote, bold, code, hr, italic, list, title } = leaf;\n\n  return (\n    <span\n      {...attributes}\n      className={cn(\n        bold && 'font-bold',\n        italic && 'italic',\n        title && 'mx-0 mt-5 mb-2.5 inline-block font-bold text-[20px]',\n        list && 'pl-2.5 text-[20px] leading-[10px]',\n        hr && 'block border-[#ddd] border-b-2 text-center',\n        blockquote &&\n          'inline-block border-[#ddd] border-l-2 pl-2.5 text-[#aaa] italic',\n        code && 'bg-[#eee] p-[3px] font-mono'\n      )}\n    >\n      {children}\n    </span>\n  );\n}\n\nexport default function PreviewMdDemo() {\n  const editor = usePlateEditor(\n    {\n      plugins: [\n        ...BasicNodesKit,\n        createSlatePlugin({\n          key: 'preview-markdown',\n          decorate: decoratePreview,\n        }),\n      ],\n      value: previewMdValue,\n    },\n    []\n  );\n\n  return (\n    <Plate editor={editor}>\n      <EditorContainer>\n        <Editor renderLeaf={PreviewLeaf} />\n      </EditorContainer>\n    </Plate>\n  );\n}\n",
      "type": "registry:example"
    },
    {
      "path": "src/registry/examples/values/preview-md-value.tsx",
      "content": "/** @jsxRuntime classic */\n/** @jsx jsx */\nimport { jsx } from '@platejs/test-utils';\n\njsx;\n\nexport const previewMdValue: any = (\n  <fragment>\n    <hh2>👀 Preview Markdown</hh2>\n    <hp>\n      Slate is flexible enough to add **decorations** that can format text based\n      on its content. For example, this editor has **Markdown** preview\n      decorations on it, to make it _dead_ simple to make an editor with\n      built-in `Markdown` previewing.\n    </hp>\n    <hp>- List item.</hp>\n    <hp>&gt; Blockquote paragraph.</hp>\n    <hp>&gt; &gt; Nested blockquote.</hp>\n    <hp>&gt; - Quoted list item.</hp>\n    <hp>---</hp>\n    <hp>## Try it out!</hp>\n    <hp>Try it out for yourself!</hp>\n  </fragment>\n);\n",
      "type": "registry:example"
    }
  ],
  "type": "registry:example"
}