@frontlit/text-editor 0.1.0-alpha.1 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/empty-doc.ts","../src/create-id.ts","../src/components/custom-code-mirror.tsx","../src/extensions.ts","../src/components/link-editor-popover.tsx","../src/toolbar.tsx","../src/bubble-menu.tsx","../src/lib/cn.ts","../src/image-picker.tsx","../src/editor.tsx","../src/extract-headings.ts","../src/extract-text-from-node.ts","../src/components/rendered-code-block.tsx","../src/text-renderer.tsx","../src/normalize-text-editor-content.ts","../src/extract-text-from-text-editor-content.ts","../src/truncate-text-editor-content.ts"],"names":["jsx","useState","useRef","useEffect","jsxs","LinkIcon","ListIcon","TableIcon","ImageIcon","Trash2","Bold","Italic","Underline","Code","useCallback","Fragment","json","React","Check","classes"],"mappings":"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","file":"index.js","sourcesContent":["import type { JSONContent } from \"@tiptap/core\";\n\nconst emptyDoc: JSONContent = {\n type: \"doc\",\n content: [],\n};\n\nexport default emptyDoc;\n","export function createId(textContent: string) {\n return textContent.replace(/\\s/g, \"-\").toLowerCase();\n}\n","// This is only to maintain backward compatibility for codeMirror node type\n\nimport { Node } from \"@tiptap/core\";\n\nexport const CodeMirrorNode = Node.create({\n name: \"codeMirror\",\n content: \"block+\",\n code: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"pre\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"pre\", HTMLAttributes, 0];\n },\n});\n","import StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Link from \"@tiptap/extension-link\";\nimport {\n Table,\n TableCell,\n TableHeader,\n TableRow,\n} from \"@tiptap/extension-table\";\nimport Image from \"@tiptap/extension-image\";\nimport Dropcursor from \"@tiptap/extension-dropcursor\";\nimport Gapcursor from \"@tiptap/extension-gapcursor\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport { lowlight } from \"lowlight\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport json from \"highlight.js/lib/languages/json\";\nimport css from \"highlight.js/lib/languages/css\";\nimport xml from \"highlight.js/lib/languages/xml\";\nimport type { Extensions } from \"@tiptap/core\";\nimport { createId } from \"./create-id\";\nimport { CodeMirrorNode } from \"./components/custom-code-mirror\";\n\nlowlight.registerLanguage(\"javascript\", javascript);\nlowlight.registerLanguage(\"typescript\", typescript);\nlowlight.registerLanguage(\"json\", json);\nlowlight.registerLanguage(\"css\", css);\nlowlight.registerLanguage(\"html\", xml);\n\ninterface ExtensionOptions {\n placeholder?: string;\n}\n\nexport const createExtensions = ({\n placeholder,\n}: ExtensionOptions = {}): Extensions => [\n StarterKit.configure({\n codeBlock: false,\n // Configured/replaced explicitly below (custom options or a\n // `.extend()`) — disabled here to avoid tiptap's duplicate-extension\n // warning and constructing throwaway instances of each.\n link: false,\n dropcursor: false,\n gapcursor: false,\n heading: false,\n }),\n Placeholder.configure({\n placeholder: placeholder || \"Write something…\",\n }),\n Link.configure({\n openOnClick: false,\n autolink: true,\n linkOnPaste: true,\n }),\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableHeader,\n TableCell,\n Image.configure({\n // We embed uploaded images as data URLs (no backend/media library in\n // this package), so base64 sources must be allowed.\n allowBase64: true,\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-md\",\n },\n resize: {\n enabled: true,\n directions: [\"top\", \"bottom\", \"left\", \"right\"],\n alwaysPreserveAspectRatio: true,\n },\n }),\n Dropcursor.configure({\n color: \"hsl(var(--foreground))\",\n width: 2,\n }),\n Gapcursor,\n CodeBlockLowlight.configure({\n lowlight,\n }),\n Heading.extend({\n renderHTML({ node, HTMLAttributes }) {\n const level = this.options.levels.includes(node.attrs.level)\n ? node.attrs.level\n : this.options.levels[0];\n const id =\n typeof node.textContent === \"string\"\n ? createId(node.textContent)\n : undefined;\n\n return [\n `h${level}`,\n {\n ...HTMLAttributes,\n id,\n },\n 0,\n ];\n },\n }),\n Highlight,\n CodeMirrorNode,\n];\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { Check, Trash2, X } from \"lucide-react\";\n\ninterface LinkEditorPopoverProps {\n editor: Editor;\n onClose: () => void;\n variant?: \"panel\" | \"inline\";\n containerRef?: React.MutableRefObject<HTMLDivElement | null>;\n}\n\nconst LinkEditorPopover = ({\n editor,\n onClose,\n variant = \"panel\",\n containerRef,\n}: LinkEditorPopoverProps): React.JSX.Element => {\n const [linkValue, setLinkValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n const localContainerRef = useRef<HTMLDivElement | null>(null);\n\n const assignContainerRef = (node: HTMLDivElement | null) => {\n localContainerRef.current = node;\n if (containerRef) {\n containerRef.current = node;\n }\n };\n\n useEffect(() => {\n const current = editor.getAttributes(\"link\").href as string | undefined;\n setLinkValue(current ?? \"\");\n }, [editor]);\n\n useEffect(() => {\n const timer = window.setTimeout(() => {\n inputRef.current?.focus();\n }, 20);\n\n return () => window.clearTimeout(timer);\n }, []);\n\n const applyLink = () => {\n const value = linkValue.trim();\n if (!value) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n } else {\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: value })\n .run();\n }\n\n onClose();\n };\n\n const removeLink = () => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n onClose();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n applyLink();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n }\n };\n\n if (variant === \"inline\") {\n return (\n <div\n ref={assignContainerRef}\n className=\"flex items-center gap-2 rounded-md border border-border bg-background p-2 shadow\"\n onMouseDown={(event) => event.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={linkValue}\n onChange={(event) => setLinkValue(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"w-48 rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <button\n type=\"button\"\n aria-label=\"Cancel link editing\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-border text-foreground transition-colors hover:bg-muted\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-border text-foreground transition-colors hover:bg-muted\"\n onClick={removeLink}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Apply link\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={applyLink}\n >\n <Check className=\"h-4 w-4\" />\n </button>\n </div>\n );\n }\n\n return (\n <div\n ref={assignContainerRef}\n className=\"absolute left-2 top-full z-20 mt-2 w-full max-w-sm rounded-md border border-border bg-background p-3 shadow-lg\"\n >\n <div className=\"flex flex-col gap-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Link URL\n </label>\n <input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={linkValue}\n onChange={(event) => setLinkValue(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"w-full rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-sm text-foreground transition-colors hover:bg-muted\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-sm text-foreground transition-colors hover:bg-muted\"\n onClick={removeLink}\n >\n <Trash2 className=\"h-4 w-4\" />\n Remove\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded bg-primary px-2 py-1 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={applyLink}\n >\n <Check className=\"h-4 w-4\" />\n Apply\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LinkEditorPopover;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { Level } from \"@tiptap/extension-heading\";\nimport {\n Bold,\n ChevronDown,\n Code,\n Image as ImageIcon,\n Italic,\n Link as LinkIcon,\n List as ListIcon,\n ListOrdered,\n Minus,\n Plus,\n Quote,\n Redo2,\n Table as TableIcon,\n Trash2,\n Underline,\n Undo2,\n} from \"lucide-react\";\nimport LinkEditorPopover from \"./components/link-editor-popover.js\";\n\ninterface ToolbarProps {\n editor: Editor | null;\n onRequestImageUpload: () => void;\n isUploadingImage?: boolean;\n}\n\ntype PopoverType = \"heading\" | \"insert\" | \"link\" | null;\n\nconst iconButtonBase =\n \"inline-flex h-8 w-8 items-center justify-center rounded border border-transparent text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction IconButton({\n icon: Icon,\n label,\n active,\n disabled,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n}): React.JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={`${iconButtonBase} ${\n active\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-transparent hover:bg-muted\"\n }`}\n disabled={disabled}\n onClick={onClick}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n}\n\nconst headingOptions: Array<{\n label: string;\n value: string;\n level?: Level;\n}> = [\n { label: \"Paragraph\", value: \"paragraph\" },\n { label: \"Heading 1\", value: \"h1\", level: 1 },\n { label: \"Heading 2\", value: \"h2\", level: 2 },\n { label: \"Heading 3\", value: \"h3\", level: 3 },\n];\n\nfunction Divider(): React.JSX.Element {\n return <span aria-hidden className=\"mx-1 h-6 w-px shrink-0 bg-border\" />;\n}\n\nconst Toolbar = ({\n editor,\n onRequestImageUpload,\n isUploadingImage,\n}: ToolbarProps): React.JSX.Element | null => {\n const [activePopover, setActivePopover] = useState<PopoverType>(null);\n const [wordCount, setWordCount] = useState(0);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!activePopover) return undefined;\n\n const handleClick = (event: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(event.target as Node)\n ) {\n setActivePopover(null);\n }\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setActivePopover(null);\n };\n\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [activePopover]);\n\n useEffect(() => {\n if (!editor) return undefined;\n const updateStats = () => {\n const text = editor.getText().trim();\n setWordCount(text ? text.split(/\\s+/).length : 0);\n };\n updateStats();\n editor.on(\"update\", updateStats);\n return () => {\n editor.off(\"update\", updateStats);\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const activeHeading =\n headingOptions.find((option) =>\n option.level\n ? editor.isActive(\"heading\", { level: option.level })\n : editor.isActive(\"paragraph\"),\n ) ?? headingOptions[0];\n const readTime =\n wordCount === 0 ? 0 : Math.max(1, Math.ceil(wordCount / 200));\n\n const selectHeading = (level?: Level) => {\n const chain = editor.chain().focus();\n if (level) chain.setHeading({ level }).run();\n else chain.setParagraph().run();\n setActivePopover(null);\n };\n\n const insertTable = () => {\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run();\n setActivePopover(null);\n };\n\n return (\n <div className=\"relative w-full\">\n <div className=\"overflow-visible border-b border-border bg-card\">\n <div className=\"flex min-h-11 flex-wrap items-center gap-1 px-4 py-1\">\n <IconButton\n icon={Undo2}\n label=\"Undo\"\n disabled={!editor.can().undo()}\n onClick={() => editor.chain().focus().undo().run()}\n />\n <IconButton\n icon={Redo2}\n label=\"Redo\"\n disabled={!editor.can().redo()}\n onClick={() => editor.chain().focus().redo().run()}\n />\n <Divider />\n\n <div\n ref={\n activePopover === \"heading\" ? popoverRef : undefined\n }\n className=\"relative\"\n >\n <button\n type=\"button\"\n className=\"flex h-8 min-w-28 items-center justify-between gap-3 rounded border border-input bg-card px-3 text-sm font-medium hover:bg-muted\"\n aria-haspopup=\"menu\"\n aria-expanded={activePopover === \"heading\"}\n onClick={() =>\n setActivePopover((current) =>\n current === \"heading\" ? null : \"heading\",\n )\n }\n >\n {activeHeading.label}\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n </button>\n {activePopover === \"heading\" && (\n <div className=\"te-popover absolute left-0 top-full z-30 mt-1 w-40 rounded-md p-1 shadow-lg\">\n {headingOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full rounded px-2.5 py-2 text-left text-sm hover:bg-muted\"\n onClick={() =>\n selectHeading(option.level)\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n <Divider />\n\n <IconButton\n icon={Bold}\n label=\"Bold\"\n active={editor.isActive(\"bold\")}\n onClick={() =>\n editor.chain().focus().toggleBold().run()\n }\n />\n <IconButton\n icon={Italic}\n label=\"Italic\"\n active={editor.isActive(\"italic\")}\n onClick={() =>\n editor.chain().focus().toggleItalic().run()\n }\n />\n <IconButton\n icon={Underline}\n label=\"Underline\"\n active={editor.isActive(\"underline\")}\n onClick={() =>\n editor.chain().focus().toggleMark(\"underline\").run()\n }\n />\n <IconButton\n icon={Code}\n label=\"Inline code\"\n active={editor.isActive(\"code\")}\n onClick={() =>\n editor.chain().focus().toggleCode().run()\n }\n />\n <IconButton\n icon={LinkIcon}\n label=\"Insert link\"\n active={editor.isActive(\"link\")}\n onClick={() =>\n setActivePopover((current) =>\n current === \"link\" ? null : \"link\",\n )\n }\n />\n <Divider />\n\n <IconButton\n icon={ListIcon}\n label=\"Bullet list\"\n active={editor.isActive(\"bulletList\")}\n onClick={() =>\n editor.chain().focus().toggleBulletList().run()\n }\n />\n <IconButton\n icon={ListOrdered}\n label=\"Numbered list\"\n active={editor.isActive(\"orderedList\")}\n onClick={() =>\n editor.chain().focus().toggleOrderedList().run()\n }\n />\n <IconButton\n icon={Quote}\n label=\"Blockquote\"\n active={editor.isActive(\"blockquote\")}\n onClick={() =>\n editor.chain().focus().toggleBlockquote().run()\n }\n />\n <Divider />\n\n <div\n ref={\n activePopover === \"insert\" ? popoverRef : undefined\n }\n className=\"relative\"\n >\n <button\n type=\"button\"\n className=\"flex h-8 items-center gap-1.5 rounded border border-primary px-2.5 text-sm font-semibold text-primary hover:bg-[var(--primary-soft)]\"\n aria-haspopup=\"menu\"\n aria-expanded={activePopover === \"insert\"}\n onClick={() =>\n setActivePopover((current) =>\n current === \"insert\" ? null : \"insert\",\n )\n }\n >\n <Plus className=\"size-4\" />\n Insert\n </button>\n {activePopover === \"insert\" && (\n <div className=\"te-popover absolute right-0 top-full z-30 mt-1 w-52 rounded-md p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .setHorizontalRule()\n .run();\n setActivePopover(null);\n }}\n >\n <Minus className=\"size-4\" />\n Horizontal rule\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .toggleCodeBlock()\n .run();\n setActivePopover(null);\n }}\n >\n <Code className=\"size-4\" />\n Code block\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted disabled:opacity-50\"\n onClick={insertTable}\n disabled={\n !editor\n .can()\n .chain()\n .focus()\n .insertTable({\n rows: 3,\n cols: 3,\n withHeaderRow: true,\n })\n .run()\n }\n >\n <TableIcon className=\"size-4\" />\n Table\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted disabled:opacity-50\"\n disabled={isUploadingImage}\n onClick={() => {\n onRequestImageUpload();\n setActivePopover(null);\n }}\n >\n <ImageIcon className=\"size-4\" />\n {isUploadingImage\n ? \"Uploading image…\"\n : \"Image\"}\n </button>\n\n {editor.isActive(\"table\") && (\n <>\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n className=\"flex w-full rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .addRowAfter()\n .run();\n setActivePopover(null);\n }}\n >\n Add table row\n </button>\n <button\n type=\"button\"\n className=\"flex w-full rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .addColumnAfter()\n .run();\n setActivePopover(null);\n }}\n >\n Add table column\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm text-destructive hover:bg-destructive/10\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .deleteTable()\n .run();\n setActivePopover(null);\n }}\n >\n <Trash2 className=\"size-4\" />\n Remove table\n </button>\n </>\n )}\n </div>\n )}\n </div>\n\n <span className=\"ml-auto hidden pl-8 text-xs tabular-nums text-muted-foreground xl:inline\">\n {wordCount.toLocaleString()}{\" \"}\n {wordCount === 1 ? \"word\" : \"words\"}\n <span aria-hidden className=\"mx-2\">\n ·\n </span>\n {readTime} min\n </span>\n </div>\n </div>\n\n {activePopover === \"link\" && (\n <LinkEditorPopover\n editor={editor}\n onClose={() => setActivePopover(null)}\n containerRef={popoverRef}\n />\n )}\n </div>\n );\n};\n\nexport default Toolbar;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { BubbleMenuPluginProps } from \"@tiptap/extension-bubble-menu\";\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\nimport {\n Bold,\n Code,\n Italic,\n Link as LinkIcon,\n Strikethrough,\n Underline,\n} from \"lucide-react\";\nimport LinkEditorPopover from \"./components/link-editor-popover\";\n\ninterface BubbleMenuProps {\n editor: Editor;\n}\n\nconst buttonBase =\n \"inline-flex h-8 w-8 items-center justify-center rounded text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\";\n\ntype TipTapBubbleMenuProps = {\n editor: Editor | null;\n className?: string;\n children: React.ReactNode;\n pluginKey?: string;\n} & Partial<Omit<BubbleMenuPluginProps, \"editor\" | \"element\" | \"pluginKey\">>;\n\nconst TipTapBubbleMenu = ({\n editor,\n className,\n children,\n pluginKey = \"inlineBubbleMenu\",\n updateDelay,\n resizeDelay,\n shouldShow,\n appendTo,\n getReferencedVirtualElement,\n options,\n}: TipTapBubbleMenuProps): React.JSX.Element => {\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const element = menuRef.current;\n\n if (!editor || editor.isDestroyed || !element) {\n return;\n }\n\n const plugin = BubbleMenuPlugin({\n editor,\n element,\n pluginKey,\n updateDelay,\n resizeDelay,\n shouldShow: shouldShow ?? null,\n appendTo,\n getReferencedVirtualElement,\n options,\n });\n\n editor.registerPlugin(plugin);\n\n return () => {\n editor.unregisterPlugin(pluginKey);\n };\n }, [\n editor,\n pluginKey,\n updateDelay,\n resizeDelay,\n shouldShow,\n appendTo,\n getReferencedVirtualElement,\n options,\n ]);\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{ visibility: \"hidden\" }}\n >\n {children}\n </div>\n );\n};\n\nfunction InlineButton({\n icon: Icon,\n label,\n active,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n onClick: () => void;\n}): React.JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={`${buttonBase} ${\n active\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-transparent hover:bg-muted\"\n }`}\n onClick={onClick}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n}\n\nconst InlineBubbleMenu = ({\n editor,\n}: BubbleMenuProps): React.JSX.Element | null => {\n const [isLinkEditing, setIsLinkEditing] = useState(false);\n\n const openLinkEditor = useCallback(() => {\n setIsLinkEditing((prev) => !prev);\n }, []);\n\n useEffect(() => {\n const handleSelectionUpdate = () => {\n setIsLinkEditing(false);\n };\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate);\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate);\n };\n }, [editor]);\n\n if (!editor) {\n return null;\n }\n\n return (\n <TipTapBubbleMenu\n editor={editor}\n className=\"bubble-menu flex flex-col gap-1 rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-xl\"\n >\n <div className=\"flex items-center gap-1\">\n <InlineButton\n icon={Bold}\n label=\"Bold\"\n active={editor.isActive(\"bold\")}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n <InlineButton\n icon={Italic}\n label=\"Italic\"\n active={editor.isActive(\"italic\")}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n <InlineButton\n icon={Underline}\n label=\"Underline\"\n active={editor.isActive(\"underline\")}\n onClick={() =>\n editor.chain().focus().toggleMark(\"underline\").run()\n }\n />\n <InlineButton\n icon={Strikethrough}\n label=\"Strikethrough\"\n active={editor.isActive(\"strike\")}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n />\n <InlineButton\n icon={Code}\n label=\"Inline code\"\n active={editor.isActive(\"code\")}\n onClick={() => editor.chain().focus().toggleCode().run()}\n />\n <InlineButton\n icon={LinkIcon}\n label=\"Insert link\"\n active={editor.isActive(\"link\")}\n onClick={openLinkEditor}\n />\n </div>\n {isLinkEditing && (\n <LinkEditorPopover\n editor={editor}\n onClose={() => setIsLinkEditing(false)}\n variant=\"inline\"\n />\n )}\n </TipTapBubbleMenu>\n );\n};\n\nexport default InlineBubbleMenu;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nexport type PickedImage = {\n src: string;\n alt?: string;\n};\n\nconst ImagePickerContext = createContext<\n (() => Promise<PickedImage | null>) | null\n>(null);\n\nexport function ImagePickerContextProvider({\n pickImage,\n children,\n}: {\n pickImage: () => Promise<PickedImage | null>;\n children: ReactNode;\n}) {\n return (\n <ImagePickerContext.Provider value={pickImage}>\n {children}\n </ImagePickerContext.Provider>\n );\n}\n\nexport function useImagePicker() {\n return useContext(ImagePickerContext);\n}\n","\"use client\";\n\nimport React, {\n FC,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { JSONContent } from \"@tiptap/core\";\nimport { generateText } from \"@tiptap/core\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport emptyDoc from \"./empty-doc\";\nimport { createExtensions } from \"./extensions\";\nimport Toolbar from \"./toolbar\";\nimport BubbleMenu from \"./bubble-menu\";\nimport type { ReactEditorProps } from \"./types\";\nimport { cn } from \"./lib/cn\";\nimport { useImagePicker } from \"./image-picker\";\n\nexport interface EditorProps {\n onChange: (json: JSONContent) => void;\n showToolbar?: boolean;\n editable?: boolean;\n refresh?: number;\n url?: string;\n initialContent?: ReactEditorProps[\"initialContent\"];\n placeholder?: string;\n autoFocus?: boolean;\n imageSizeLimit?: number;\n onError?: (...args: any[]) => void;\n className?: string;\n editorClassName?: string;\n contentClassName?: string;\n beforeContent?: React.ReactNode;\n}\n\ninterface EditorType extends FC<PropsWithChildren<EditorProps>> {\n getPlainText: (doc: JSONContent) => string;\n emptyDoc: JSONContent;\n}\n\nconst Editor: EditorType = Object.assign(\n ({\n initialContent,\n onChange,\n placeholder,\n children,\n showToolbar = true,\n editable = true,\n refresh,\n url,\n autoFocus,\n imageSizeLimit,\n onError,\n className,\n editorClassName,\n contentClassName,\n beforeContent,\n }) => {\n const [isUploading, setIsUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const pickImage = useImagePicker();\n const hasInteractedRef = useRef(false);\n const lastSerializedContentRef = useRef(\n JSON.stringify(initialContent ?? emptyDoc),\n );\n const refreshRef = useRef<EditorProps[\"refresh\"]>(refresh);\n\n const extensions = useMemo(\n () => createExtensions({ placeholder }),\n [placeholder],\n );\n\n const changeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const editor = useEditor(\n {\n immediatelyRender: false,\n extensions,\n content: initialContent ?? emptyDoc,\n autofocus: autoFocus ? \"end\" : false,\n editable,\n editorProps: {\n attributes: {\n class: `tiptap-content ${editorClassName ?? \"\"}`,\n \"data-placeholder\": placeholder ?? \"\",\n },\n },\n onUpdate: ({ editor: instance }) => {\n // TipTap may normalize loaded JSON during initialization\n // (notably `{ type: \"doc\", content: [] }` to\n // `{ type: \"doc\" }`). Do not turn that internal mount work\n // into a user-visible autosave.\n if (!hasInteractedRef.current) {\n return;\n }\n if (changeTimeoutRef.current) {\n clearTimeout(changeTimeoutRef.current);\n }\n\n changeTimeoutRef.current = setTimeout(() => {\n onChange(instance.getJSON());\n changeTimeoutRef.current = null;\n }, 1000);\n },\n onSelectionUpdate: ({ editor: instance }) => {\n hasInteractedRef.current = true;\n },\n },\n [extensions],\n );\n useEffect(() => {\n return () => {\n if (changeTimeoutRef.current) {\n clearTimeout(changeTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n editor.setEditable(editable);\n }, [editor, editable]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const nextContent = initialContent ?? emptyDoc;\n const nextSerialized = JSON.stringify(nextContent);\n const refreshChanged = refreshRef.current !== refresh;\n\n if (refreshChanged) {\n refreshRef.current = refresh;\n hasInteractedRef.current = false;\n lastSerializedContentRef.current = nextSerialized;\n editor.commands.setContent(nextContent, {\n emitUpdate: false,\n });\n return;\n }\n\n if (!hasInteractedRef.current) {\n if (lastSerializedContentRef.current !== nextSerialized) {\n lastSerializedContentRef.current = nextSerialized;\n editor.commands.setContent(nextContent, {\n emitUpdate: false,\n });\n }\n return;\n }\n\n lastSerializedContentRef.current = nextSerialized;\n }, [editor, initialContent, refresh]);\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n const sizeLimit = imageSizeLimit ?? 2097152; // 2 MB\n if (file.size > sizeLimit) {\n onError?.(\"File is larger than the allowed size\");\n return;\n }\n\n try {\n setIsUploading(true);\n // First-draft implementation: embed the image as a data URL so\n // the editor works without a media/upload backend.\n const dataUrl = await new Promise<string>(\n (resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () =>\n resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n },\n );\n editor\n ?.chain()\n .focus()\n .setImage({\n src: dataUrl,\n alt: file.name,\n title: file.name,\n })\n .run();\n } catch (error) {\n console.error(\"Image upload failed\", error);\n } finally {\n setIsUploading(false);\n }\n },\n [editor],\n );\n\n const handleSelectFile = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const file = files[0];\n void handleImageUpload(file);\n event.target.value = \"\";\n },\n [handleImageUpload],\n );\n\n const insertPickedImage = useCallback(\n (image: { src: string; alt?: string }) => {\n editor\n ?.chain()\n .focus()\n .setImage({\n src: image.src,\n alt: image.alt,\n title: image.alt,\n })\n .run();\n },\n [editor],\n );\n\n const openFileDialog = useCallback(() => {\n if (pickImage) {\n void pickImage().then((image) => {\n if (image) insertPickedImage(image);\n });\n return;\n }\n fileInputRef.current?.click();\n }, [insertPickedImage, pickImage]);\n\n if (typeof window === \"undefined\") {\n return <></>;\n }\n\n return (\n <div\n className={cn(\n \"tiptap-editor flex flex-col gap-4 border\",\n className,\n )}\n >\n {editable && showToolbar && (\n <div\n className=\"sticky top-0 bg-background\"\n style={{\n zIndex: 1,\n }}\n >\n <Toolbar\n editor={editor}\n onRequestImageUpload={openFileDialog}\n isUploadingImage={isUploading}\n />\n </div>\n )}\n <div className=\"flex w-full justify-center\">\n <div\n className={cn(\n \"flex w-full max-w-3xl flex-col\",\n contentClassName,\n )}\n >\n {beforeContent}\n <EditorContent\n editor={editor}\n className={`${editorClassName ?? \"\"} ${editorClassName?.includes(\"min-h-\") ? \"\" : \"min-h-[200px]\"}`}\n />\n {pickImage ? null : (\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleSelectFile}\n />\n )}\n {children}\n {editor && <BubbleMenu editor={editor} />}\n </div>\n </div>\n </div>\n );\n },\n {\n getPlainText: (doc: JSONContent) =>\n generateText(doc || emptyDoc, createExtensions()),\n emptyDoc,\n },\n) as EditorType;\n\nexport default Editor;\n","import type { JSONContent } from \"@tiptap/core\";\nimport { createId } from \"./create-id\";\n\ninterface Heading {\n level: number;\n text: string;\n id: string;\n}\n\nexport function extractHeadings(\n json: JSONContent | null | undefined,\n): Heading[] {\n const headings: Heading[] = [];\n\n const collectHeadings = (node?: JSONContent) => {\n if (!node) {\n return;\n }\n\n if (node.type === \"heading\") {\n const level =\n typeof node.attrs?.level === \"number\" ? node.attrs.level : 1;\n\n const collectText = (current?: JSONContent): string => {\n if (!current) {\n return \"\";\n }\n\n if (typeof current.text === \"string\") {\n return current.text;\n }\n\n if (!current.content) {\n return \"\";\n }\n\n return current.content.map(collectText).join(\"\");\n };\n\n const textContent = collectText(node);\n\n headings.push({\n level,\n text: textContent,\n id: createId(textContent),\n });\n }\n\n if (Array.isArray(node.content)) {\n node.content.forEach((child) => {\n collectHeadings(child as JSONContent);\n });\n }\n };\n\n collectHeadings(json || undefined);\n\n return headings;\n}\n","export function extractTextFromNode(node): string {\n if (!node) {\n return \"\";\n }\n\n // ProseMirror nodes have a textContent property that contains all text\n if (typeof node.textContent === \"string\") {\n return node.textContent;\n }\n\n // Fallback: if content is a Fragment, access its content array\n if (\n node.content &&\n node.content.content &&\n Array.isArray(node.content.content)\n ) {\n return node.content.content\n .map((child: any) => {\n // Text nodes have a text property\n if (child.text) {\n return child.text;\n }\n // Recursively extract from child nodes\n return extractTextFromNode(child);\n })\n .join(\"\");\n }\n\n // Fallback: if content is directly an array\n if (Array.isArray(node.content)) {\n return node.content\n .map((child: any) => {\n if (child.text) {\n return child.text;\n }\n return extractTextFromNode(child);\n })\n .join(\"\");\n }\n\n return \"\";\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { extractTextFromNode } from \"../extract-text-from-node\";\n\nfunction textFromChildren(node: React.ReactNode): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(textFromChildren).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n return textFromChildren(node.props.children);\n }\n return \"\";\n}\n\nasync function writeClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.left = \"-9999px\";\n document.body.appendChild(area);\n area.select();\n document.execCommand(\"copy\");\n area.remove();\n}\n\nexport function RenderedCodeBlock({\n node,\n children,\n language,\n}: {\n node?: { textContent?: string; content?: unknown };\n children?: React.ReactNode;\n language?: string;\n}): React.JSX.Element {\n const [copied, setCopied] = useState(false);\n\n const source =\n extractTextFromNode(node) || textFromChildren(children);\n\n useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1500);\n return () => window.clearTimeout(timer);\n }, [copied]);\n\n async function handleCopy() {\n if (!source) return;\n try {\n await writeClipboard(source);\n setCopied(true);\n } catch {\n setCopied(false);\n }\n }\n\n return (\n <div className=\"te-code-block\">\n <pre>\n <code className={language ? `language-${language}` : undefined}>\n {children}\n </code>\n </pre>\n <button\n type=\"button\"\n className=\"te-code-copy\"\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied\" : \"Copy\"}\n onClick={() => {\n void handleCopy();\n }}\n >\n {copied ? (\n <Check className=\"te-code-copy__icon\" aria-hidden />\n ) : (\n <Copy className=\"te-code-copy__icon\" aria-hidden />\n )}\n </button>\n </div>\n );\n}\n","import React from \"react\";\nimport { renderToReactElement } from \"@tiptap/static-renderer\";\nimport { extractTextFromNode } from \"./extract-text-from-node\";\nimport emptyDoc from \"./empty-doc\";\nimport { createExtensions } from \"./extensions\";\nimport { createId } from \"./create-id\";\nimport type { TextEditorContent } from \"./text-editor-content\";\nimport type { TextRendererTheme } from \"./renderer-theme\";\nimport { cn } from \"./lib/cn\";\nimport { RenderedCodeBlock } from \"./components/rendered-code-block\";\n\ninterface TextRendererProps {\n json: TextEditorContent;\n className?: string;\n theme?: TextRendererTheme;\n}\n\nconst typographyClasses = (typography?: {\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n lineHeight?: string;\n letterSpacing?: string;\n textTransform?: string;\n textDecoration?: string;\n textOverflow?: string;\n}) => [\n typography?.fontFamily,\n typography?.fontSize,\n typography?.fontWeight,\n typography?.lineHeight,\n typography?.letterSpacing,\n typography?.textTransform,\n typography?.textDecoration,\n typography?.textOverflow,\n];\n\nfunction removeEmptyTextNodes(node: any): any {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n\n if (node.type === \"text\" && node.text === \"\") {\n return undefined;\n }\n\n if (!Array.isArray(node.content)) {\n return node;\n }\n\n const content = node.content\n .map(removeEmptyTextNodes)\n .filter((child: any) => child !== undefined);\n\n return {\n ...node,\n content,\n };\n}\n\n/**\n * Renders TipTap `TextEditorContent` JSON as static React elements — used to\n * display rich text saved by the `Editor` (e.g. inside a block's body). When\n * a `theme` is provided, headings/paragraphs/links pick up its typography;\n * otherwise plain semantic HTML tags are used.\n */\nexport function TextRenderer({ json, className, theme }: TextRendererProps) {\n const extensions = createExtensions();\n const content = removeEmptyTextNodes(\n (json as any) ?? (emptyDoc as any),\n ) as TextEditorContent;\n\n const rendered = renderToReactElement({\n extensions,\n content,\n options: {\n nodeMapping: {\n paragraph: ({ children }) => {\n const classes = cn(\n \"text-base\",\n ...typographyClasses(theme?.typography?.text1),\n );\n return <p className={classes}>{children}</p>;\n },\n hardBreak: () => <br />,\n heading: ({ node, children }) => {\n const level = node?.attrs?.level ?? 1;\n // Extract text from the node structure (same as extractHeadings does)\n const textContent = extractTextFromNode(node);\n const id = createId(textContent);\n\n if (!theme) {\n const Tag = `h${level}` as React.ElementType;\n return <Tag id={id}>{children}</Tag>;\n }\n\n if (level === 1) {\n const classes = cn(\n \"scroll-m-20 text-4xl font-bold tracking-tight\",\n ...typographyClasses(theme?.typography?.header1),\n );\n return (\n <h1 id={id} className={classes}>\n {children}\n </h1>\n );\n }\n if (level === 2) {\n const classes = cn(\n \"scroll-m-20 text-3xl font-bold tracking-tight\",\n ...typographyClasses(theme?.typography?.header2),\n );\n return (\n <h2 id={id} className={classes}>\n {children}\n </h2>\n );\n }\n const classes = cn(\n \"scroll-m-20 text-2xl font-semibold tracking-normal\",\n ...typographyClasses(theme?.typography?.header3),\n );\n return (\n <h3 id={id} className={classes}>\n {children}\n </h3>\n );\n },\n codeBlock: ({ node, children }) => (\n <RenderedCodeBlock\n node={node}\n language={node?.attrs?.language}\n >\n {children}\n </RenderedCodeBlock>\n ),\n codeMirror: ({ node, children }) => (\n <RenderedCodeBlock node={node}>\n {children}\n </RenderedCodeBlock>\n ),\n },\n markMapping: {\n link: ({ mark, children }) => {\n const href = mark?.attrs?.href;\n const linkStyle = theme?.interactives?.link;\n const classes = cn(\n \"font-medium cursor-pointer\",\n ...typographyClasses(theme?.typography?.link),\n linkStyle?.padding?.x,\n linkStyle?.padding?.y,\n linkStyle?.border?.width,\n linkStyle?.border?.radius,\n linkStyle?.border?.style,\n linkStyle?.custom,\n );\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classes}\n style={{\n textShadow: linkStyle?.textShadow || undefined,\n }}\n >\n {children}\n </a>\n );\n },\n highlight: ({ children }) => (\n <mark className=\"bg-accent text-accent-foreground\">\n {children}\n </mark>\n ),\n },\n },\n });\n\n const combinedClassName = [\"tiptap-renderer\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"text-editor flex flex-col gap-4\">\n <div className={combinedClassName}>{rendered}</div>\n </div>\n );\n}\n\nexport default TextRenderer;\n","import type { TextEditorContent } from \"./text-editor-content\";\n\nfunction createParagraphNode(text: string) {\n const lines = text.split(\"\\n\");\n const content: Record<string, unknown>[] = [];\n\n lines.forEach((line, index) => {\n if (line) {\n content.push({\n type: \"text\",\n text: line,\n });\n }\n\n if (index < lines.length - 1) {\n content.push({\n type: \"hardBreak\",\n });\n }\n });\n\n return {\n type: \"paragraph\",\n ...(content.length ? { content } : {}),\n };\n}\n\n/** Normalizes a plain string or an already-valid TipTap doc into `TextEditorContent`. */\nexport function normalizeTextEditorContent(\n json: TextEditorContent | string,\n): TextEditorContent {\n if (\n json &&\n typeof json === \"object\" &&\n \"type\" in json &&\n json.type === \"doc\"\n ) {\n return json as TextEditorContent;\n }\n\n const text = typeof json === \"string\" ? json.replace(/\\r\\n?/g, \"\\n\") : \"\";\n\n return {\n type: \"doc\",\n content: text\n ? text\n .split(/\\n{2,}/)\n .map((paragraph) => createParagraphNode(paragraph))\n : [],\n };\n}\n","/** Recursively concatenates all plain text out of a TipTap JSON content tree. */\nexport function extractTextFromTextEditorContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!content || typeof content !== \"object\") {\n return \"\";\n }\n\n const record = content as Record<string, unknown>;\n const ownText = typeof record.text === \"string\" ? record.text : \"\";\n const children = Array.isArray(record.content)\n ? record.content.map(extractTextFromTextEditorContent).join(\"\")\n : \"\";\n\n return `${ownText}${children}`;\n}\n","import type { TextEditorContent } from \"./text-editor-content\";\n\nfunction appendEllipsisToLastTextNode(nodes: any[]): any[] {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (!node) {\n continue;\n }\n\n if (node.type === \"text\" && typeof node.text === \"string\") {\n if (!node.text.endsWith(\"...\")) {\n nodes[i] = {\n ...node,\n text: `${node.text.trimEnd()}...`,\n };\n }\n return nodes;\n }\n\n if (Array.isArray(node.content) && node.content.length) {\n nodes[i] = {\n ...node,\n content: appendEllipsisToLastTextNode([...node.content]),\n };\n return nodes;\n }\n }\n\n return nodes;\n}\n\nfunction truncateNodes(\n nodes: any[],\n remaining: number,\n): {\n nodes: any[];\n remaining: number;\n truncated: boolean;\n} {\n const truncatedNodes: any[] = [];\n let truncated = false;\n\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index];\n\n if (!node) {\n continue;\n }\n\n if (remaining <= 0) {\n truncated = true;\n break;\n }\n\n if (node.type === \"text\" && typeof node.text === \"string\") {\n if (node.text.length <= remaining) {\n truncatedNodes.push(node);\n remaining -= node.text.length;\n } else {\n truncatedNodes.push({\n ...node,\n text: node.text.slice(0, remaining).trimEnd(),\n });\n remaining = 0;\n truncated = true;\n break;\n }\n\n continue;\n }\n\n if (node.type === \"hardBreak\") {\n truncatedNodes.push(node);\n remaining -= 1;\n continue;\n }\n\n if (Array.isArray(node.content)) {\n const result = truncateNodes(node.content, remaining);\n remaining = result.remaining;\n\n if (result.nodes.length > 0) {\n truncatedNodes.push({\n ...node,\n content: result.nodes,\n });\n }\n\n if (result.truncated) {\n truncated = true;\n break;\n }\n\n continue;\n }\n\n truncatedNodes.push(node);\n }\n\n if (truncated) {\n return {\n nodes: appendEllipsisToLastTextNode(truncatedNodes),\n remaining,\n truncated,\n };\n }\n\n return {\n nodes: truncatedNodes,\n remaining,\n truncated,\n };\n}\n\nexport function truncateTextEditorContent(\n json: TextEditorContent,\n characterLimit?: number,\n): TextEditorContent {\n if (!characterLimit || characterLimit <= 0) {\n return json;\n }\n\n const content = Array.isArray((json as any)?.content)\n ? (json as any).content\n : [];\n const result = truncateNodes(content, characterLimit);\n\n return {\n ...(json as any),\n content: result.nodes,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/empty-doc.ts","../src/create-id.ts","../src/components/custom-code-mirror.tsx","../src/extensions.ts","../src/components/link-editor-popover.tsx","../src/toolbar.tsx","../src/bubble-menu.tsx","../src/lib/cn.ts","../src/image-picker.tsx","../src/docs/urls.ts","../src/docs/extensions.ts","../src/editor.tsx","../src/extract-headings.ts","../src/extract-text-from-node.ts","../src/components/copy-code-button.tsx","../src/components/rendered-code-block.tsx","../src/docs/headings.ts","../src/text-renderer.tsx","../src/normalize-text-editor-content.ts","../src/extract-text-from-text-editor-content.ts","../src/truncate-text-editor-content.ts"],"names":["jsx","useState","useRef","useEffect","jsxs","LinkIcon","ListIcon","TableIcon","ImageIcon","Trash2","Bold","Italic","Underline","Code","StarterKit","Node","Link","Image","Table","TableRow","TableCell","TableHeader","Placeholder","json","useCallback","Fragment","Check","React","getSchema","Tag","classes"],"mappings":"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","file":"index.js","sourcesContent":["import type { TextEditorContent } from \"./text-editor-content\";\n\nconst emptyDoc: TextEditorContent = {\n type: \"doc\",\n content: [],\n};\n\nexport default emptyDoc;\n","export function createId(textContent: string) {\n return textContent.replace(/\\s/g, \"-\").toLowerCase();\n}\n","// This is only to maintain backward compatibility for codeMirror node type\n\nimport { Node } from \"@tiptap/core\";\n\nexport const CodeMirrorNode = Node.create({\n name: \"codeMirror\",\n content: \"block+\",\n code: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"pre\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"pre\", HTMLAttributes, 0];\n },\n});\n","import StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Link from \"@tiptap/extension-link\";\nimport { Table, TableCell, TableHeader, TableRow } from \"@tiptap/extension-table\";\nimport Image from \"@tiptap/extension-image\";\nimport Dropcursor from \"@tiptap/extension-dropcursor\";\nimport Gapcursor from \"@tiptap/extension-gapcursor\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport { lowlight } from \"lowlight\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport json from \"highlight.js/lib/languages/json\";\nimport css from \"highlight.js/lib/languages/css\";\nimport xml from \"highlight.js/lib/languages/xml\";\nimport type { Extensions } from \"@tiptap/core\";\nimport { createId } from \"./create-id\";\nimport { CodeMirrorNode } from \"./components/custom-code-mirror\";\n\nlowlight.registerLanguage(\"javascript\", javascript);\nlowlight.registerLanguage(\"typescript\", typescript);\nlowlight.registerLanguage(\"json\", json);\nlowlight.registerLanguage(\"css\", css);\nlowlight.registerLanguage(\"html\", xml);\n\ninterface ExtensionOptions {\n placeholder?: string;\n}\n\nexport const createExtensions = ({\n placeholder,\n}: ExtensionOptions = {}): Extensions => [\n StarterKit.configure({\n codeBlock: false,\n // Configured/replaced explicitly below (custom options or a\n // `.extend()`) — disabled here to avoid tiptap's duplicate-extension\n // warning and constructing throwaway instances of each.\n link: false,\n dropcursor: false,\n gapcursor: false,\n heading: false,\n }),\n Placeholder.configure({\n placeholder: placeholder || \"Write something…\",\n }),\n Link.configure({\n openOnClick: false,\n autolink: true,\n linkOnPaste: true,\n }),\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableHeader,\n TableCell,\n Image.configure({\n // We embed uploaded images as data URLs (no backend/media library in\n // this package), so base64 sources must be allowed.\n allowBase64: true,\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-md\",\n },\n resize: {\n enabled: true,\n directions: [\"top\", \"bottom\", \"left\", \"right\"],\n alwaysPreserveAspectRatio: true,\n },\n }),\n Dropcursor.configure({\n color: \"hsl(var(--foreground))\",\n width: 2,\n }),\n Gapcursor,\n CodeBlockLowlight.configure({\n lowlight,\n }),\n Heading.extend({\n renderHTML({ node, HTMLAttributes }) {\n const level = this.options.levels.includes(node.attrs.level)\n ? node.attrs.level\n : this.options.levels[0];\n const id =\n typeof node.textContent === \"string\" ? createId(node.textContent) : undefined;\n\n return [\n `h${level}`,\n {\n ...HTMLAttributes,\n id,\n },\n 0,\n ];\n },\n }),\n Highlight,\n CodeMirrorNode,\n];\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { Check, Trash2, X } from \"lucide-react\";\n\ninterface LinkEditorPopoverProps {\n editor: Editor;\n onClose: () => void;\n variant?: \"panel\" | \"inline\";\n containerRef?: React.MutableRefObject<HTMLDivElement | null>;\n}\n\nconst LinkEditorPopover = ({\n editor,\n onClose,\n variant = \"panel\",\n containerRef,\n}: LinkEditorPopoverProps): React.JSX.Element => {\n const [linkValue, setLinkValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n const localContainerRef = useRef<HTMLDivElement | null>(null);\n\n const assignContainerRef = (node: HTMLDivElement | null) => {\n localContainerRef.current = node;\n if (containerRef) {\n containerRef.current = node;\n }\n };\n\n useEffect(() => {\n const current = editor.getAttributes(\"link\").href as string | undefined;\n setLinkValue(current ?? \"\");\n }, [editor]);\n\n useEffect(() => {\n const timer = window.setTimeout(() => {\n inputRef.current?.focus();\n }, 20);\n\n return () => window.clearTimeout(timer);\n }, []);\n\n const applyLink = () => {\n const value = linkValue.trim();\n if (!value) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: value }).run();\n }\n\n onClose();\n };\n\n const removeLink = () => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n onClose();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n applyLink();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n }\n };\n\n if (variant === \"inline\") {\n return (\n <div\n ref={assignContainerRef}\n className=\"flex items-center gap-2 rounded-md border border-border bg-background p-2 shadow\"\n onMouseDown={(event) => event.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"url\"\n placeholder=\"https://example.com\"\n value={linkValue}\n onChange={(event) => setLinkValue(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"w-48 rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <button\n type=\"button\"\n aria-label=\"Cancel link editing\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-border text-foreground transition-colors hover:bg-muted\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-border text-foreground transition-colors hover:bg-muted\"\n onClick={removeLink}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Apply link\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={applyLink}\n >\n <Check className=\"h-4 w-4\" />\n </button>\n </div>\n );\n }\n\n return (\n <div\n ref={assignContainerRef}\n className=\"absolute left-2 top-full z-20 mt-2 w-full max-w-sm rounded-md border border-border bg-background p-3 shadow-lg\"\n >\n <div className=\"flex flex-col gap-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">Link URL</label>\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"url\"\n placeholder=\"https://example.com\"\n value={linkValue}\n onChange={(event) => setLinkValue(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"w-full rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-sm text-foreground transition-colors hover:bg-muted\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-sm text-foreground transition-colors hover:bg-muted\"\n onClick={removeLink}\n >\n <Trash2 className=\"h-4 w-4\" />\n Remove\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded bg-primary px-2 py-1 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={applyLink}\n >\n <Check className=\"h-4 w-4\" />\n Apply\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LinkEditorPopover;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { Level } from \"@tiptap/extension-heading\";\nimport {\n Bold,\n ChevronDown,\n Code,\n Image as ImageIcon,\n Italic,\n Link as LinkIcon,\n List as ListIcon,\n ListOrdered,\n Minus,\n Plus,\n Quote,\n Redo2,\n Table as TableIcon,\n Trash2,\n Underline,\n Undo2,\n} from \"lucide-react\";\nimport LinkEditorPopover from \"./components/link-editor-popover.js\";\n\ninterface ToolbarProps {\n profile?: \"default\" | \"documentation\";\n editor: Editor | null;\n onRequestImageUpload: () => void;\n isUploadingImage?: boolean;\n}\n\ntype PopoverType = \"heading\" | \"insert\" | \"link\" | null;\n\nconst iconButtonBase =\n \"inline-flex h-8 w-8 items-center justify-center rounded border border-transparent text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction IconButton({\n icon: Icon,\n label,\n active,\n disabled,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n}): React.JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={`${iconButtonBase} ${\n active\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-transparent hover:bg-muted\"\n }`}\n disabled={disabled}\n onClick={onClick}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n}\n\nconst headingOptions: Array<{\n label: string;\n value: string;\n level?: Level;\n}> = [\n { label: \"Paragraph\", value: \"paragraph\" },\n { label: \"Heading 1\", value: \"h1\", level: 1 },\n { label: \"Heading 2\", value: \"h2\", level: 2 },\n { label: \"Heading 3\", value: \"h3\", level: 3 },\n];\n\nfunction Divider(): React.JSX.Element {\n return <span aria-hidden className=\"mx-1 h-6 w-px shrink-0 bg-border\" />;\n}\n\nconst Toolbar = ({\n editor,\n onRequestImageUpload,\n isUploadingImage,\n profile = \"default\",\n}: ToolbarProps): React.JSX.Element | null => {\n const [activePopover, setActivePopover] = useState<PopoverType>(null);\n const [wordCount, setWordCount] = useState(0);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!activePopover) return undefined;\n\n const handleClick = (event: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) {\n setActivePopover(null);\n }\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setActivePopover(null);\n };\n\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [activePopover]);\n\n useEffect(() => {\n if (!editor) return undefined;\n const updateStats = () => {\n const text = editor.getText().trim();\n setWordCount(text ? text.split(/\\s+/).length : 0);\n };\n updateStats();\n editor.on(\"update\", updateStats);\n return () => {\n editor.off(\"update\", updateStats);\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const availableHeadingOptions =\n profile === \"documentation\"\n ? [\n ...headingOptions,\n { label: \"Heading 4\", value: \"h4\", level: 4 as Level },\n { label: \"Heading 5\", value: \"h5\", level: 5 as Level },\n { label: \"Heading 6\", value: \"h6\", level: 6 as Level },\n ]\n : headingOptions;\n const activeHeading =\n availableHeadingOptions.find((option) =>\n option.level\n ? editor.isActive(\"heading\", { level: option.level })\n : editor.isActive(\"paragraph\"),\n ) ?? headingOptions[0];\n const readTime = wordCount === 0 ? 0 : Math.max(1, Math.ceil(wordCount / 200));\n\n const selectHeading = (level?: Level) => {\n const chain = editor.chain().focus();\n if (level) chain.setHeading({ level }).run();\n else chain.setParagraph().run();\n setActivePopover(null);\n };\n\n const insertTable = () => {\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n setActivePopover(null);\n };\n\n return (\n <div className=\"relative w-full\">\n <div className=\"overflow-visible border-b border-border bg-card\">\n <div className=\"flex min-h-11 flex-wrap items-center gap-1 px-4 py-1\">\n <IconButton\n icon={Undo2}\n label=\"Undo\"\n disabled={!editor.can().undo()}\n onClick={() => editor.chain().focus().undo().run()}\n />\n <IconButton\n icon={Redo2}\n label=\"Redo\"\n disabled={!editor.can().redo()}\n onClick={() => editor.chain().focus().redo().run()}\n />\n <Divider />\n\n <div\n ref={activePopover === \"heading\" ? popoverRef : undefined}\n className=\"relative\"\n >\n <button\n type=\"button\"\n className=\"flex h-8 min-w-28 items-center justify-between gap-3 rounded border border-input bg-card px-3 text-sm font-medium hover:bg-muted\"\n aria-haspopup=\"menu\"\n aria-expanded={activePopover === \"heading\"}\n onClick={() =>\n setActivePopover((current) =>\n current === \"heading\" ? null : \"heading\",\n )\n }\n >\n {activeHeading.label}\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n </button>\n {activePopover === \"heading\" && (\n <div className=\"te-popover absolute left-0 top-full z-30 mt-1 w-40 rounded-md p-1 shadow-lg\">\n {availableHeadingOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full rounded px-2.5 py-2 text-left text-sm hover:bg-muted\"\n onClick={() => selectHeading(option.level)}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n <Divider />\n\n <IconButton\n icon={Bold}\n label=\"Bold\"\n active={editor.isActive(\"bold\")}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n <IconButton\n icon={Italic}\n label=\"Italic\"\n active={editor.isActive(\"italic\")}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n {profile !== \"documentation\" && (\n <IconButton\n icon={Underline}\n label=\"Underline\"\n active={editor.isActive(\"underline\")}\n onClick={() => editor.chain().focus().toggleMark(\"underline\").run()}\n />\n )}\n <IconButton\n icon={Code}\n label=\"Inline code\"\n active={editor.isActive(\"code\")}\n onClick={() => editor.chain().focus().toggleCode().run()}\n />\n <IconButton\n icon={LinkIcon}\n label=\"Insert link\"\n active={editor.isActive(\"link\")}\n onClick={() =>\n setActivePopover((current) => (current === \"link\" ? null : \"link\"))\n }\n />\n <Divider />\n\n <IconButton\n icon={ListIcon}\n label=\"Bullet list\"\n active={editor.isActive(\"bulletList\")}\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n />\n <IconButton\n icon={ListOrdered}\n label=\"Numbered list\"\n active={editor.isActive(\"orderedList\")}\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n />\n <IconButton\n icon={Quote}\n label=\"Blockquote\"\n active={editor.isActive(\"blockquote\")}\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n />\n <Divider />\n\n <div\n ref={activePopover === \"insert\" ? popoverRef : undefined}\n className=\"relative\"\n >\n <button\n type=\"button\"\n className=\"flex h-8 items-center gap-1.5 rounded border border-primary px-2.5 text-sm font-semibold text-primary hover:bg-[var(--primary-soft)]\"\n aria-haspopup=\"menu\"\n aria-expanded={activePopover === \"insert\"}\n onClick={() =>\n setActivePopover((current) => (current === \"insert\" ? null : \"insert\"))\n }\n >\n <Plus className=\"size-4\" />\n Insert\n </button>\n {activePopover === \"insert\" && (\n <div className=\"te-popover absolute right-0 top-full z-30 mt-1 w-52 rounded-md p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor.chain().focus().setHorizontalRule().run();\n setActivePopover(null);\n }}\n >\n <Minus className=\"size-4\" />\n Horizontal rule\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor.chain().focus().toggleCodeBlock().run();\n setActivePopover(null);\n }}\n >\n <Code className=\"size-4\" />\n Code block\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted disabled:opacity-50\"\n onClick={insertTable}\n disabled={\n !editor\n .can()\n .chain()\n .focus()\n .insertTable({\n rows: 3,\n cols: 3,\n withHeaderRow: true,\n })\n .run()\n }\n >\n <TableIcon className=\"size-4\" />\n Table\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted disabled:opacity-50\"\n disabled={isUploadingImage}\n onClick={() => {\n onRequestImageUpload();\n setActivePopover(null);\n }}\n >\n <ImageIcon className=\"size-4\" />\n {isUploadingImage ? \"Uploading image…\" : \"Image\"}\n </button>\n\n {editor.isActive(\"table\") && (\n <>\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n className=\"flex w-full rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor.chain().focus().addRowAfter().run();\n setActivePopover(null);\n }}\n >\n Add table row\n </button>\n <button\n type=\"button\"\n className=\"flex w-full rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor.chain().focus().addColumnAfter().run();\n setActivePopover(null);\n }}\n >\n Add table column\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm text-destructive hover:bg-destructive/10\"\n onClick={() => {\n editor.chain().focus().deleteTable().run();\n setActivePopover(null);\n }}\n >\n <Trash2 className=\"size-4\" />\n Remove table\n </button>\n </>\n )}\n </div>\n )}\n </div>\n\n <span className=\"ml-auto hidden pl-8 text-xs tabular-nums text-muted-foreground xl:inline\">\n {wordCount.toLocaleString()} {wordCount === 1 ? \"word\" : \"words\"}\n <span aria-hidden className=\"mx-2\">\n ·\n </span>\n {readTime} min\n </span>\n </div>\n </div>\n\n {activePopover === \"link\" && (\n <LinkEditorPopover\n editor={editor}\n onClose={() => setActivePopover(null)}\n containerRef={popoverRef}\n />\n )}\n </div>\n );\n};\n\nexport default Toolbar;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { BubbleMenuPluginProps } from \"@tiptap/extension-bubble-menu\";\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\nimport {\n Bold,\n Code,\n Italic,\n Link as LinkIcon,\n Strikethrough,\n Underline,\n} from \"lucide-react\";\nimport LinkEditorPopover from \"./components/link-editor-popover\";\n\ninterface BubbleMenuProps {\n editor: Editor;\n profile?: \"default\" | \"documentation\";\n}\n\nconst buttonBase =\n \"inline-flex h-8 w-8 items-center justify-center rounded text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\";\n\ntype TipTapBubbleMenuProps = {\n editor: Editor | null;\n className?: string;\n children: React.ReactNode;\n pluginKey?: string;\n} & Partial<Omit<BubbleMenuPluginProps, \"editor\" | \"element\" | \"pluginKey\">>;\n\nconst TipTapBubbleMenu = ({\n editor,\n className,\n children,\n pluginKey = \"inlineBubbleMenu\",\n updateDelay,\n resizeDelay,\n shouldShow,\n appendTo,\n getReferencedVirtualElement,\n options,\n}: TipTapBubbleMenuProps): React.JSX.Element => {\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const element = menuRef.current;\n\n if (!editor || editor.isDestroyed || !element) {\n return;\n }\n\n const plugin = BubbleMenuPlugin({\n editor,\n element,\n pluginKey,\n updateDelay,\n resizeDelay,\n shouldShow: shouldShow ?? null,\n appendTo,\n getReferencedVirtualElement,\n options,\n });\n\n editor.registerPlugin(plugin);\n\n return () => {\n editor.unregisterPlugin(pluginKey);\n };\n }, [\n editor,\n pluginKey,\n updateDelay,\n resizeDelay,\n shouldShow,\n appendTo,\n getReferencedVirtualElement,\n options,\n ]);\n\n return (\n <div ref={menuRef} className={className} style={{ visibility: \"hidden\" }}>\n {children}\n </div>\n );\n};\n\nfunction InlineButton({\n icon: Icon,\n label,\n active,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n onClick: () => void;\n}): React.JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={`${buttonBase} ${\n active\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-transparent hover:bg-muted\"\n }`}\n onClick={onClick}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n}\n\nconst InlineBubbleMenu = ({\n editor,\n profile = \"default\",\n}: BubbleMenuProps): React.JSX.Element | null => {\n const [isLinkEditing, setIsLinkEditing] = useState(false);\n\n const openLinkEditor = useCallback(() => {\n setIsLinkEditing((prev) => !prev);\n }, []);\n\n useEffect(() => {\n const handleSelectionUpdate = () => {\n setIsLinkEditing(false);\n };\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate);\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate);\n };\n }, [editor]);\n\n if (!editor) {\n return null;\n }\n\n return (\n <TipTapBubbleMenu\n editor={editor}\n className=\"bubble-menu flex flex-col gap-1 rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-xl\"\n >\n <div className=\"flex items-center gap-1\">\n <InlineButton\n icon={Bold}\n label=\"Bold\"\n active={editor.isActive(\"bold\")}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n <InlineButton\n icon={Italic}\n label=\"Italic\"\n active={editor.isActive(\"italic\")}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n {profile !== \"documentation\" && (\n <InlineButton\n icon={Underline}\n label=\"Underline\"\n active={editor.isActive(\"underline\")}\n onClick={() => editor.chain().focus().toggleMark(\"underline\").run()}\n />\n )}\n <InlineButton\n icon={Strikethrough}\n label=\"Strikethrough\"\n active={editor.isActive(\"strike\")}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n />\n <InlineButton\n icon={Code}\n label=\"Inline code\"\n active={editor.isActive(\"code\")}\n onClick={() => editor.chain().focus().toggleCode().run()}\n />\n <InlineButton\n icon={LinkIcon}\n label=\"Insert link\"\n active={editor.isActive(\"link\")}\n onClick={openLinkEditor}\n />\n </div>\n {isLinkEditing && (\n <LinkEditorPopover\n editor={editor}\n onClose={() => setIsLinkEditing(false)}\n variant=\"inline\"\n />\n )}\n </TipTapBubbleMenu>\n );\n};\n\nexport default InlineBubbleMenu;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nexport type PickedImage = {\n src: string;\n alt?: string;\n};\n\nconst ImagePickerContext = createContext<(() => Promise<PickedImage | null>) | null>(\n null,\n);\n\nexport function ImagePickerContextProvider({\n pickImage,\n children,\n}: {\n pickImage: () => Promise<PickedImage | null>;\n children: ReactNode;\n}) {\n return (\n <ImagePickerContext.Provider value={pickImage}>\n {children}\n </ImagePickerContext.Provider>\n );\n}\n\nexport function useImagePicker() {\n return useContext(ImagePickerContext);\n}\n","/** DM-VALIDATE/DM-MEDIA: syntax safety; ownership/provider checks belong to the API. */\nexport function isSafeDocsUrl(value: unknown, image = false): value is string {\n if (typeof value !== \"string\" || !value || value !== value.trim()) return false;\n // Browsers ignore control characters in protocols. Reject their encoded forms too.\n if (\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Browsers ignore controls in dangerous protocols.\n /[\\u0000-\\u0020\\u007f\\\\]/.test(value) ||\n /%(?:0[0-9a-f]|1[0-9a-f]|7f|5c)/i.test(value)\n )\n return false;\n if (value.startsWith(\"//\")) return false;\n const privatePath =\n /\\/(?:attachments|private|ticket-attachments|conversation-attachments)(?:\\/|$)/i;\n const signedKey =\n /^(?:x-amz-.+|x-goog-.+|signature|sig|token|access_token|expires)$/i;\n if (/^(?:https?:|mailto:)/i.test(value)) {\n try {\n const url = new URL(value);\n if (image && url.protocol !== \"https:\") return false;\n if (url.username || url.password) return false;\n if (url.protocol === \"mailto:\") return !image && Boolean(url.pathname);\n // Known private attachment paths and expiring signed links are never docs assets.\n if (privatePath.test(decodeURIComponent(url.pathname))) return false;\n for (const key of url.searchParams.keys()) {\n if (signedKey.test(key)) return false;\n }\n return Boolean(url.hostname);\n } catch {\n return false;\n }\n }\n if (image) return false;\n // Relative Markdown paths, site paths, fragments, and query links are safe data.\n if (/^[^/?#]*:/.test(value) || /%(?:2f|3a)/i.test(value)) return false;\n try {\n const url = new URL(value, \"https://docs.invalid/\");\n return (\n !privatePath.test(decodeURIComponent(url.pathname)) &&\n ![...url.searchParams.keys()].some((key) => signedKey.test(key))\n );\n } catch {\n return false;\n }\n}\n","import { getSchema, Node, type Extensions } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Image from \"@tiptap/extension-image\";\nimport Link from \"@tiptap/extension-link\";\nimport { Table, TableCell, TableHeader, TableRow } from \"@tiptap/extension-table\";\nimport { isSafeDocsUrl } from \"./urls\";\nimport type { Schema } from \"@tiptap/pm/model\";\n\n/** DM-VALIDATE: schema-only extensions; no React, upload controls, or node views. */\nexport function createDocsExtensions(): Extensions {\n return [\n StarterKit.configure({\n document: false,\n underline: false,\n link: false,\n dropcursor: false,\n gapcursor: false,\n trailingNode: false,\n }),\n Node.create({ name: \"doc\", topNode: true, content: \"block*\" }),\n Link.extend({\n addAttributes() {\n return { ...this.parent?.(), title: { default: null } };\n },\n }).configure({ openOnClick: false, isAllowedUri: (url) => isSafeDocsUrl(url) }),\n Image.configure({ allowBase64: false, resize: false }),\n Table.configure({ resizable: false }),\n TableRow,\n TableCell.extend({ content: \"paragraph\" }),\n TableHeader.extend({ content: \"paragraph\" }),\n ];\n}\n\nexport const docsSchema: Schema = getSchema(createDocsExtensions());\nexport const DOCS_SCHEMA_VERSION = 1;\n","\"use client\";\n\nimport React, {\n FC,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { JSONContent } from \"@tiptap/core\";\nimport { generateText } from \"@tiptap/core\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport emptyDoc from \"./empty-doc\";\nimport { createExtensions } from \"./extensions\";\nimport Toolbar from \"./toolbar\";\nimport BubbleMenu from \"./bubble-menu\";\nimport type { ReactEditorProps } from \"./types\";\nimport { cn } from \"./lib/cn\";\nimport { useImagePicker } from \"./image-picker\";\nimport { createDocsExtensions } from \"./docs/extensions\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { isSafeDocsUrl } from \"./docs/urls\";\n\nexport interface EditorProps {\n profile?: \"default\" | \"documentation\";\n onChange: (json: JSONContent) => void;\n onFlushChangeReady?: (flush: () => void) => void;\n /** How long to wait after the last edit before calling `onChange`. Defaults to 1000. */\n debounceMs?: number;\n showToolbar?: boolean;\n editable?: boolean;\n refresh?: number;\n url?: string;\n initialContent?: ReactEditorProps[\"initialContent\"];\n placeholder?: string;\n autoFocus?: boolean;\n imageSizeLimit?: number;\n onError?: (...args: any[]) => void;\n className?: string;\n editorClassName?: string;\n contentClassName?: string;\n beforeContent?: React.ReactNode;\n}\n\ninterface EditorType extends FC<PropsWithChildren<EditorProps>> {\n getPlainText: (doc: JSONContent) => string;\n emptyDoc: JSONContent;\n}\n\nconst Editor: EditorType = Object.assign(\n ({\n initialContent,\n onChange,\n onFlushChangeReady,\n debounceMs = 1000,\n placeholder,\n children,\n showToolbar = true,\n editable = true,\n refresh,\n url,\n autoFocus,\n imageSizeLimit,\n onError,\n className,\n editorClassName,\n contentClassName,\n beforeContent,\n profile = \"default\" as EditorProps[\"profile\"],\n }) => {\n const [isUploading, setIsUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const pickImage = useImagePicker();\n const hasInteractedRef = useRef(false);\n const lastSerializedContentRef = useRef(JSON.stringify(initialContent ?? emptyDoc));\n const refreshRef = useRef<EditorProps[\"refresh\"]>(refresh);\n\n const extensions = useMemo(\n () =>\n profile === \"documentation\"\n ? [\n ...createDocsExtensions(),\n Placeholder.configure({ placeholder: placeholder || \"Write something…\" }),\n ]\n : createExtensions({ placeholder }),\n [placeholder, profile],\n );\n\n const changeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingJsonRef = useRef<JSONContent | null>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const debounceMsRef = useRef(debounceMs);\n debounceMsRef.current = debounceMs;\n\n const editor = useEditor(\n {\n immediatelyRender: false,\n extensions,\n content: initialContent ?? emptyDoc,\n autofocus: autoFocus ? \"end\" : false,\n editable,\n editorProps: {\n attributes: {\n class: `tiptap-content ${editorClassName ?? \"\"}`,\n \"data-placeholder\": placeholder ?? \"\",\n },\n },\n onUpdate: ({ editor: instance }) => {\n // TipTap may normalize loaded JSON during initialization\n // (notably `{ type: \"doc\", content: [] }` to\n // `{ type: \"doc\" }`). Do not turn that internal mount work\n // into a user-visible autosave.\n if (!hasInteractedRef.current) {\n return;\n }\n if (changeTimeoutRef.current) {\n clearTimeout(changeTimeoutRef.current);\n }\n\n pendingJsonRef.current = instance.getJSON();\n changeTimeoutRef.current = setTimeout(() => {\n changeTimeoutRef.current = null;\n const json = pendingJsonRef.current;\n pendingJsonRef.current = null;\n if (json) onChangeRef.current(json);\n }, debounceMsRef.current);\n },\n onSelectionUpdate: ({ editor: instance }) => {\n hasInteractedRef.current = true;\n },\n },\n [extensions],\n );\n useEffect(() => {\n onFlushChangeReady?.(() => {\n if (!editor || !changeTimeoutRef.current) return;\n clearTimeout(changeTimeoutRef.current);\n changeTimeoutRef.current = null;\n pendingJsonRef.current = null;\n onChangeRef.current(editor.getJSON());\n });\n return () => onFlushChangeReady?.(() => {});\n }, [editor, onFlushChangeReady]);\n useEffect(() => {\n // Deliver an edit that is still waiting on the debounce instead of\n // dropping it, e.g. when the panel hosting the editor is closed.\n return () => {\n if (changeTimeoutRef.current) {\n clearTimeout(changeTimeoutRef.current);\n changeTimeoutRef.current = null;\n }\n const json = pendingJsonRef.current;\n pendingJsonRef.current = null;\n if (json) onChangeRef.current(json);\n };\n }, []);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n editor.setEditable(editable);\n }, [editor, editable]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const nextContent = initialContent ?? emptyDoc;\n const nextSerialized = JSON.stringify(nextContent);\n const refreshChanged = refreshRef.current !== refresh;\n\n if (refreshChanged) {\n refreshRef.current = refresh;\n hasInteractedRef.current = false;\n lastSerializedContentRef.current = nextSerialized;\n editor.commands.setContent(nextContent, {\n emitUpdate: false,\n });\n return;\n }\n\n if (!hasInteractedRef.current) {\n if (lastSerializedContentRef.current !== nextSerialized) {\n lastSerializedContentRef.current = nextSerialized;\n editor.commands.setContent(nextContent, {\n emitUpdate: false,\n });\n }\n return;\n }\n\n lastSerializedContentRef.current = nextSerialized;\n }, [editor, initialContent, refresh]);\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n if (profile === \"documentation\") {\n onError?.(\n \"Upload a public image using the media library before inserting it.\",\n );\n return;\n }\n const sizeLimit = imageSizeLimit ?? 2097152; // 2 MB\n if (file.size > sizeLimit) {\n onError?.(\"File is larger than the allowed size\");\n return;\n }\n\n try {\n setIsUploading(true);\n // First-draft implementation: embed the image as a data URL so\n // the editor works without a media/upload backend.\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n editor\n ?.chain()\n .focus()\n .setImage({\n src: dataUrl,\n alt: file.name,\n title: file.name,\n })\n .run();\n } catch (error) {\n console.error(\"Image upload failed\", error);\n } finally {\n setIsUploading(false);\n }\n },\n [editor, profile, onError, imageSizeLimit],\n );\n\n const handleSelectFile = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const file = files[0];\n void handleImageUpload(file);\n event.target.value = \"\";\n },\n [handleImageUpload],\n );\n\n const insertPickedImage = useCallback(\n (image: { src: string; alt?: string }) => {\n if (profile === \"documentation\" && !isSafeDocsUrl(image.src, true)) {\n onError?.(\"Documentation images require a stable public HTTPS URL.\");\n return;\n }\n editor\n ?.chain()\n .focus()\n .setImage({\n src: image.src,\n alt: image.alt,\n title: image.alt,\n })\n .run();\n },\n [editor, profile, onError],\n );\n\n const openFileDialog = useCallback(() => {\n if (pickImage) {\n void pickImage().then((image) => {\n if (image) insertPickedImage(image);\n });\n return;\n }\n fileInputRef.current?.click();\n }, [insertPickedImage, pickImage]);\n\n if (typeof window === \"undefined\") {\n return <></>;\n }\n\n return (\n <div\n className={cn(\"tiptap-editor flex flex-col gap-4 border\", className)}\n onPointerDownCapture={() => {\n hasInteractedRef.current = true;\n }}\n onKeyDownCapture={() => {\n hasInteractedRef.current = true;\n }}\n >\n {editable && showToolbar && (\n <div\n className=\"sticky top-0 bg-background\"\n style={{\n zIndex: 1,\n }}\n >\n <Toolbar\n editor={editor}\n onRequestImageUpload={openFileDialog}\n isUploadingImage={isUploading}\n profile={profile}\n />\n </div>\n )}\n <div className=\"flex w-full justify-center\">\n <div className={cn(\"flex w-full max-w-3xl flex-col\", contentClassName)}>\n {beforeContent}\n <EditorContent\n editor={editor}\n className={`${editorClassName ?? \"\"} ${editorClassName?.includes(\"min-h-\") ? \"\" : \"min-h-[200px]\"}`}\n />\n {pickImage ? null : (\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleSelectFile}\n />\n )}\n {children}\n {editor && <BubbleMenu editor={editor} profile={profile} />}\n </div>\n </div>\n </div>\n );\n },\n {\n getPlainText: (doc: JSONContent) =>\n generateText(doc || emptyDoc, createExtensions()),\n emptyDoc,\n },\n) as EditorType;\n\nexport default Editor;\n","import type { JSONContent } from \"@tiptap/core\";\nimport { createId } from \"./create-id\";\n\ninterface Heading {\n level: number;\n text: string;\n id: string;\n}\n\nexport function extractHeadings(json: JSONContent | null | undefined): Heading[] {\n const headings: Heading[] = [];\n\n const collectHeadings = (node?: JSONContent) => {\n if (!node) {\n return;\n }\n\n if (node.type === \"heading\") {\n const level = typeof node.attrs?.level === \"number\" ? node.attrs.level : 1;\n\n const collectText = (current?: JSONContent): string => {\n if (!current) {\n return \"\";\n }\n\n if (typeof current.text === \"string\") {\n return current.text;\n }\n\n if (!current.content) {\n return \"\";\n }\n\n return current.content.map(collectText).join(\"\");\n };\n\n const textContent = collectText(node);\n\n headings.push({\n level,\n text: textContent,\n id: createId(textContent),\n });\n }\n\n if (Array.isArray(node.content)) {\n node.content.forEach((child) => {\n collectHeadings(child as JSONContent);\n });\n }\n };\n\n collectHeadings(json || undefined);\n\n return headings;\n}\n","export function extractTextFromNode(node): string {\n if (!node) {\n return \"\";\n }\n\n // ProseMirror nodes have a textContent property that contains all text\n if (typeof node.textContent === \"string\") {\n return node.textContent;\n }\n\n // Fallback: if content is a Fragment, access its content array\n if (node.content && node.content.content && Array.isArray(node.content.content)) {\n return node.content.content\n .map((child: any) => {\n // Text nodes have a text property\n if (child.text) {\n return child.text;\n }\n // Recursively extract from child nodes\n return extractTextFromNode(child);\n })\n .join(\"\");\n }\n\n // Fallback: if content is directly an array\n if (Array.isArray(node.content)) {\n return node.content\n .map((child: any) => {\n if (child.text) {\n return child.text;\n }\n return extractTextFromNode(child);\n })\n .join(\"\");\n }\n\n return \"\";\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Check, Copy } from \"lucide-react\";\n\nasync function writeClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.left = \"-9999px\";\n document.body.appendChild(area);\n area.select();\n document.execCommand(\"copy\");\n area.remove();\n}\n\n/** The copy button of a rendered code block; the only client part of it. */\nexport function CopyCodeButton({ source }: { source: string }) {\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1500);\n return () => window.clearTimeout(timer);\n }, [copied]);\n\n async function handleCopy() {\n if (!source) return;\n try {\n await writeClipboard(source);\n setCopied(true);\n } catch {\n setCopied(false);\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"te-code-copy\"\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied\" : \"Copy\"}\n onClick={() => {\n void handleCopy();\n }}\n >\n {copied ? (\n <Check className=\"te-code-copy__icon\" aria-hidden />\n ) : (\n <Copy className=\"te-code-copy__icon\" aria-hidden />\n )}\n </button>\n );\n}\n","import React from \"react\";\nimport { extractTextFromNode } from \"../extract-text-from-node\";\nimport { CopyCodeButton } from \"./copy-code-button\";\n\nfunction textFromChildren(node: React.ReactNode): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(textFromChildren).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n return textFromChildren(node.props.children);\n }\n return \"\";\n}\n\nexport function RenderedCodeBlock({\n node,\n children,\n language,\n}: {\n node?: { textContent?: string; content?: unknown };\n children?: React.ReactNode;\n language?: string;\n}): React.JSX.Element {\n const source = extractTextFromNode(node) || textFromChildren(children);\n\n return (\n <div className=\"te-code-block\">\n <pre>\n <code className={language ? `language-${language}` : undefined}>\n {children}\n </code>\n </pre>\n <CopyCodeButton source={source} />\n </div>\n );\n}\n","export const DOCS_HEADING_POLICY_VERSION = 1;\n\nexport interface HeadingNode {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n content?: HeadingNode[];\n}\n\nexport function docsNodeText(node: HeadingNode): string {\n if (typeof node.text === \"string\") return node.text;\n if (node.type === \"hardBreak\") return \"\\n\";\n return (node.content ?? []).map(docsNodeText).join(\"\");\n}\n\n/** DM-CONVERT: deterministic Unicode anchors, including duplicate-base collisions. */\nexport function createHeadingIdGenerator(): (text: string) => string {\n const used = new Set<string>();\n return (text) => {\n const base =\n text\n .normalize(\"NFKC\")\n .toLowerCase()\n .trim()\n .replace(/[^\\p{L}\\p{N}\\s_-]/gu, \"\")\n .replace(/\\s+/g, \"-\") || \"section\";\n let id = base;\n let suffix = 2;\n while (used.has(id)) id = `${base}-${suffix++}`;\n used.add(id);\n return id;\n };\n}\n\nexport function extractDocsHeadings(json: HeadingNode | null | undefined) {\n const nextId = createHeadingIdGenerator();\n const headings: { level: number; text: string; id: string }[] = [];\n function walk(node: HeadingNode) {\n if (node.type === \"heading\") {\n const text = docsNodeText(node);\n headings.push({ level: Number(node.attrs?.level ?? 1), text, id: nextId(text) });\n }\n for (const child of node.content ?? []) walk(child);\n }\n if (json) walk(json);\n return headings;\n}\n","import React from \"react\";\nimport { renderToReactElement } from \"@tiptap/static-renderer\";\nimport { getSchema } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { extractTextFromNode } from \"./extract-text-from-node\";\nimport emptyDoc from \"./empty-doc\";\nimport { createExtensions } from \"./extensions\";\nimport { createId } from \"./create-id\";\nimport type { TextEditorContent } from \"./text-editor-content\";\nimport type { TextRendererTheme } from \"./renderer-theme\";\nimport { cn } from \"./lib/cn\";\nimport { RenderedCodeBlock } from \"./components/rendered-code-block\";\nimport { extractDocsHeadings } from \"./docs/headings\";\n\ninterface TextRendererProps {\n profile?: \"default\" | \"documentation\";\n json: TextEditorContent;\n className?: string;\n theme?: TextRendererTheme;\n}\n\nconst typographyClasses = (typography?: {\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n lineHeight?: string;\n letterSpacing?: string;\n textTransform?: string;\n textDecoration?: string;\n textOverflow?: string;\n}) => [\n typography?.fontFamily,\n typography?.fontSize,\n typography?.fontWeight,\n typography?.lineHeight,\n typography?.letterSpacing,\n typography?.textTransform,\n typography?.textDecoration,\n typography?.textOverflow,\n];\n\nfunction removeEmptyTextNodes(node: any): any {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n\n if (node.type === \"text\" && node.text === \"\") {\n return undefined;\n }\n\n if (!Array.isArray(node.content)) {\n return node;\n }\n\n const content = node.content\n .map(removeEmptyTextNodes)\n .filter((child: any) => child !== undefined);\n\n return {\n ...node,\n content,\n };\n}\n\n/**\n * Renders TipTap `TextEditorContent` JSON as static React elements — used to\n * display rich text saved by the `Editor` (e.g. inside a block's body). When\n * a `theme` is provided, headings/paragraphs/links pick up its typography;\n * otherwise plain semantic HTML tags are used.\n */\nexport function TextRenderer({\n json,\n className,\n theme,\n profile = \"default\",\n}: TextRendererProps) {\n const extensions = createExtensions();\n const content = removeEmptyTextNodes(\n (json as any) ?? (emptyDoc as any),\n ) as TextEditorContent;\n const docsHeadings = profile === \"documentation\" ? extractDocsHeadings(content) : [];\n // React can replay each mapped node (StrictMode, hydration, or a retry).\n // Bind IDs before rendering instead of consuming an iterator in a component.\n const renderContent =\n profile === \"documentation\" ? getSchema(extensions).nodeFromJSON(content) : content;\n const headingIds = new WeakMap<ProseMirrorNode, string>();\n if (profile === \"documentation\") {\n let headingIndex = 0;\n (renderContent as ProseMirrorNode).descendants((node) => {\n if (node.type.name === \"heading\") {\n headingIds.set(node, docsHeadings[headingIndex++].id);\n }\n });\n }\n\n const rendered = renderToReactElement({\n extensions,\n content: renderContent,\n options: {\n nodeMapping: {\n paragraph: ({ children }) => {\n const classes = cn(\n \"text-base\",\n ...typographyClasses(theme?.typography?.text1),\n );\n return <p className={classes}>{children}</p>;\n },\n hardBreak: () => <br />,\n heading: ({ node, children }) => {\n const level = node?.attrs?.level ?? 1;\n // Extract text from the node structure (same as extractHeadings does)\n const textContent = extractTextFromNode(node);\n const id =\n profile === \"documentation\" ? headingIds.get(node) : createId(textContent);\n\n if (!theme) {\n const Tag = `h${level}` as React.ElementType;\n return <Tag id={id}>{children}</Tag>;\n }\n\n if (level === 1) {\n const classes = cn(\n \"scroll-m-20 text-4xl font-bold tracking-tight\",\n ...typographyClasses(theme?.typography?.header1),\n );\n return (\n <h1 id={id} className={classes}>\n {children}\n </h1>\n );\n }\n if (level === 2) {\n const classes = cn(\n \"scroll-m-20 text-3xl font-bold tracking-tight\",\n ...typographyClasses(theme?.typography?.header2),\n );\n return (\n <h2 id={id} className={classes}>\n {children}\n </h2>\n );\n }\n const classes = cn(\n \"scroll-m-20 text-2xl font-semibold tracking-normal\",\n ...typographyClasses(\n profile === \"documentation\" && level >= 4\n ? (theme?.typography?.header4 ?? theme?.typography?.header3)\n : theme?.typography?.header3,\n ),\n );\n const Tag = (\n profile === \"documentation\" ? `h${level}` : \"h3\"\n ) as React.ElementType;\n return (\n <Tag id={id} className={classes}>\n {children}\n </Tag>\n );\n },\n codeBlock: ({ node, children }) => (\n <RenderedCodeBlock node={node} language={node?.attrs?.language}>\n {children}\n </RenderedCodeBlock>\n ),\n codeMirror: ({ node, children }) => (\n <RenderedCodeBlock node={node}>{children}</RenderedCodeBlock>\n ),\n },\n markMapping: {\n link: ({ mark, children }) => {\n const href = mark?.attrs?.href;\n const linkStyle = theme?.interactives?.link;\n const classes = cn(\n \"font-medium cursor-pointer\",\n ...typographyClasses(theme?.typography?.link),\n linkStyle?.padding?.x,\n linkStyle?.padding?.y,\n linkStyle?.border?.width,\n linkStyle?.border?.radius,\n linkStyle?.border?.style,\n linkStyle?.custom,\n );\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classes}\n style={{\n textShadow: linkStyle?.textShadow || undefined,\n }}\n >\n {children}\n </a>\n );\n },\n highlight: ({ children }) => (\n <mark className=\"bg-accent text-accent-foreground\">{children}</mark>\n ),\n },\n },\n });\n\n const combinedClassName = [\"tiptap-renderer\", className].filter(Boolean).join(\" \");\n\n return (\n <div className=\"text-editor flex flex-col gap-4\">\n <div className={combinedClassName}>{rendered}</div>\n </div>\n );\n}\n\nexport default TextRenderer;\n","import type { TextEditorContent } from \"./text-editor-content\";\n\nfunction createParagraphNode(text: string) {\n const lines = text.split(\"\\n\");\n const content: Record<string, unknown>[] = [];\n\n lines.forEach((line, index) => {\n if (line) {\n content.push({\n type: \"text\",\n text: line,\n });\n }\n\n if (index < lines.length - 1) {\n content.push({\n type: \"hardBreak\",\n });\n }\n });\n\n return {\n type: \"paragraph\",\n ...(content.length ? { content } : {}),\n };\n}\n\n/** Normalizes a plain string or an already-valid TipTap doc into `TextEditorContent`. */\nexport function normalizeTextEditorContent(\n json: TextEditorContent | string,\n): TextEditorContent {\n if (json && typeof json === \"object\" && \"type\" in json && json.type === \"doc\") {\n return json as TextEditorContent;\n }\n\n const text = typeof json === \"string\" ? json.replace(/\\r\\n?/g, \"\\n\") : \"\";\n\n return {\n type: \"doc\",\n content: text\n ? text.split(/\\n{2,}/).map((paragraph) => createParagraphNode(paragraph))\n : [],\n };\n}\n","/** Recursively concatenates all plain text out of a TipTap JSON content tree. */\nexport function extractTextFromTextEditorContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!content || typeof content !== \"object\") {\n return \"\";\n }\n\n const record = content as Record<string, unknown>;\n const ownText = typeof record.text === \"string\" ? record.text : \"\";\n const children = Array.isArray(record.content)\n ? record.content.map(extractTextFromTextEditorContent).join(\"\")\n : \"\";\n\n return `${ownText}${children}`;\n}\n","import type { TextEditorContent } from \"./text-editor-content\";\n\nfunction appendEllipsisToLastTextNode(nodes: any[]): any[] {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (!node) {\n continue;\n }\n\n if (node.type === \"text\" && typeof node.text === \"string\") {\n if (!node.text.endsWith(\"...\")) {\n nodes[i] = {\n ...node,\n text: `${node.text.trimEnd()}...`,\n };\n }\n return nodes;\n }\n\n if (Array.isArray(node.content) && node.content.length) {\n nodes[i] = {\n ...node,\n content: appendEllipsisToLastTextNode([...node.content]),\n };\n return nodes;\n }\n }\n\n return nodes;\n}\n\nfunction truncateNodes(\n nodes: any[],\n remaining: number,\n): {\n nodes: any[];\n remaining: number;\n truncated: boolean;\n} {\n const truncatedNodes: any[] = [];\n let truncated = false;\n\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index];\n\n if (!node) {\n continue;\n }\n\n if (remaining <= 0) {\n truncated = true;\n break;\n }\n\n if (node.type === \"text\" && typeof node.text === \"string\") {\n if (node.text.length <= remaining) {\n truncatedNodes.push(node);\n remaining -= node.text.length;\n } else {\n truncatedNodes.push({\n ...node,\n text: node.text.slice(0, remaining).trimEnd(),\n });\n remaining = 0;\n truncated = true;\n break;\n }\n\n continue;\n }\n\n if (node.type === \"hardBreak\") {\n truncatedNodes.push(node);\n remaining -= 1;\n continue;\n }\n\n if (Array.isArray(node.content)) {\n const result = truncateNodes(node.content, remaining);\n remaining = result.remaining;\n\n if (result.nodes.length > 0) {\n truncatedNodes.push({\n ...node,\n content: result.nodes,\n });\n }\n\n if (result.truncated) {\n truncated = true;\n break;\n }\n\n continue;\n }\n\n truncatedNodes.push(node);\n }\n\n if (truncated) {\n return {\n nodes: appendEllipsisToLastTextNode(truncatedNodes),\n remaining,\n truncated,\n };\n }\n\n return {\n nodes: truncatedNodes,\n remaining,\n truncated,\n };\n}\n\nexport function truncateTextEditorContent(\n json: TextEditorContent,\n characterLimit?: number,\n): TextEditorContent {\n if (!characterLimit || characterLimit <= 0) {\n return json;\n }\n\n const content = Array.isArray((json as any)?.content) ? (json as any).content : [];\n const result = truncateNodes(content, characterLimit);\n\n return {\n ...(json as any),\n content: result.nodes,\n };\n}\n"]}