neuphlo-editor 1.8.2 → 2.0.0

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.
Files changed (41) hide show
  1. package/dist/chunk-2DWEJI45.js +1296 -0
  2. package/dist/chunk-2DWEJI45.js.map +1 -0
  3. package/dist/chunk-457ETWB6.js +1351 -0
  4. package/dist/chunk-457ETWB6.js.map +1 -0
  5. package/dist/chunk-62DYB7FY.js +1305 -0
  6. package/dist/chunk-62DYB7FY.js.map +1 -0
  7. package/dist/chunk-DWGPGRTQ.js +1302 -0
  8. package/dist/chunk-DWGPGRTQ.js.map +1 -0
  9. package/dist/chunk-EG7NQJRA.js +1324 -0
  10. package/dist/chunk-EG7NQJRA.js.map +1 -0
  11. package/dist/chunk-FLLPFFI5.js +1296 -0
  12. package/dist/chunk-FLLPFFI5.js.map +1 -0
  13. package/dist/chunk-FVQHB6VC.js +1128 -0
  14. package/dist/chunk-FVQHB6VC.js.map +1 -0
  15. package/dist/chunk-GXJGZHKR.js +1326 -0
  16. package/dist/chunk-GXJGZHKR.js.map +1 -0
  17. package/dist/chunk-KCPPTLGY.js +1299 -0
  18. package/dist/chunk-KCPPTLGY.js.map +1 -0
  19. package/dist/chunk-LHG2NX6C.js +1123 -0
  20. package/dist/chunk-LHG2NX6C.js.map +1 -0
  21. package/dist/chunk-OCNM37WJ.js +1289 -0
  22. package/dist/chunk-OCNM37WJ.js.map +1 -0
  23. package/dist/chunk-RW6QBMJB.js +1300 -0
  24. package/dist/chunk-RW6QBMJB.js.map +1 -0
  25. package/dist/chunk-SOXTEP7H.js +6705 -0
  26. package/dist/chunk-SOXTEP7H.js.map +1 -0
  27. package/dist/headless/index.cjs +207 -144
  28. package/dist/headless/index.cjs.map +1 -1
  29. package/dist/headless/index.d.cts +9 -25
  30. package/dist/headless/index.d.ts +9 -25
  31. package/dist/headless/index.js +1 -1
  32. package/dist/react/index.cjs +1839 -723
  33. package/dist/react/index.cjs.map +1 -1
  34. package/dist/react/index.css +364 -8
  35. package/dist/react/index.css.map +1 -1
  36. package/dist/react/index.d.cts +10 -2
  37. package/dist/react/index.d.ts +10 -2
  38. package/dist/react/index.js +1434 -547
  39. package/dist/react/index.js.map +1 -1
  40. package/dist/styles.css +410 -8
  41. package/package.json +7 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/index.ts","../../src/headless/index.ts","../../src/headless/components/editor.tsx","../../src/headless/utils/store.ts","../../src/headless/components/editor-command.tsx","../../src/headless/utils/atoms.ts","../../src/headless/components/editor-command-item.tsx","../../src/headless/extensions/index.ts","../../src/headless/extensions/CodeBlock/CodeBlock.ts","../../src/headless/extensions/Link/Link.ts","../../src/headless/extensions/ImageBlock/ImageBlock.ts","../../src/headless/extensions/Mention/mention.tsx","../../src/headless/extensions/Mention/mention-command.tsx","../../src/headless/extensions/Mention/mention-node-view.tsx","../../src/headless/extensions/slash-command.tsx","../../src/headless/extensions/extension-kit.ts","../../src/headless/extensions/VideoBlock/VideoBlock.ts","../../src/react/menus/TextMenu.tsx","../../src/react/menus/MenuList.tsx","../../src/react/menus/SlashMenu.tsx","../../src/react/menus/LinkMenu.tsx","../../src/react/menus/ImageMenu.tsx","../../src/react/menus/ImageBlock/ImageBlockView.tsx","../../src/react/menus/ImageBlock/ImageBlockMenu.tsx","../../src/react/menus/ImageBlock/ImageBlockWidth.tsx","../../src/react/menus/ImageBlock/ImageUploader.tsx","../../src/react/menus/ImageBlock/ImageBlockLoading.tsx","../../src/react/menus/VideoBlock/VideoBlockView.tsx","../../src/react/menus/VideoBlock/VideoBlockMenu.tsx","../../src/react/Editor.tsx"],"sourcesContent":["// Auto-apply default styles when consuming the React entry\nimport \"../styles.css\";\n\nexport { Editor } from \"./Editor\";\nexport type {\n NeuphloEditorProps as EditorProps,\n BubbleMenuExtras,\n BubbleMenuExtraRenderer,\n BubbleMenuExtra,\n} from \"./Editor\";\nexport { TextMenu } from \"./menus\";\nexport type { TextMenuProps } from \"./menus\";\n","export { useCurrentEditor as useEditor } from \"@tiptap/react\"\n\nexport {\n EditorRoot,\n EditorContent,\n type EditorContentProps,\n} from \"./components/editor\"\n\nexport { EditorBubble } from \"./components/editor-bubble\"\nexport { EditorBubbleItem } from \"./components/editor-bubble-item\"\nexport {\n EditorCommand,\n EditorCommandList,\n EditorCommandOut,\n} from \"./components/editor-command\"\nexport {\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"./components/editor-command-item\"\n\nexport { Placeholder, StarterKit } from \"./extensions\"\nexport {\n Command as SlashCommand,\n renderItems as renderSlashCommandItems,\n createSuggestionItems,\n handleCommandNavigation,\n} from \"./extensions/slash-command\"\nexport {\n createMentionExtension,\n renderMentionSuggestion,\n MentionCommand,\n type MentionItem,\n type MentionOptions,\n} from \"./extensions/Mention\"\n// Path without extension to satisfy TS/tsup\n// (the file is at ./extensions/slash-command.tsx)\n// eslint-disable-next-line\n","import { EditorProvider } from \"@tiptap/react\"\nimport type { EditorProviderProps } from \"@tiptap/react\"\nimport { forwardRef } from \"react\"\nimport type { FC, ReactNode } from \"react\"\nimport { Provider } from \"jotai\"\nimport { novelStore } from \"../utils/store\"\n\nexport interface EditorRootProps {\n readonly children: ReactNode\n}\n\nexport const EditorRoot: FC<EditorRootProps> = ({ children }) => {\n return (\n <Provider store={novelStore as any}>\n {children as any}\n </Provider>\n )\n}\n\nexport type EditorContentProps = EditorProviderProps & {\n readonly children?: ReactNode\n readonly className?: string\n readonly initialContent?: any\n}\n\nexport const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(\n ({ className, children, initialContent, content, ...rest }, ref) => {\n const effectiveContent = content ?? initialContent\n return (\n <div ref={ref} className={className}>\n <EditorProvider {...rest} content={effectiveContent}>\n {children}\n </EditorProvider>\n </div>\n )\n }\n)\n\nEditorContent.displayName = \"EditorContent\"\n","import { createStore } from \"jotai\";\n\n// biome-ignore lint/suspicious/noExplicitAny: store is opaque to consumers\nexport const novelStore: any = createStore();\nexport * from \"jotai\";\n\n","import { useAtom, useSetAtom } from \"jotai\"\nimport { useEffect, forwardRef } from \"react\"\nimport { Command } from \"cmdk\"\nimport { queryAtom, rangeAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\nimport type { FC } from \"react\"\nimport type { Range } from \"@tiptap/core\"\nimport tunnel from \"tunnel-rat\"\n\nconst commandTunnel: any = (tunnel as any)()\n\ninterface EditorCommandOutProps {\n readonly query: string\n readonly range: Range\n}\n\nexport const EditorCommandOut: FC<EditorCommandOutProps> = ({\n query,\n range,\n}) => {\n const setQuery = useSetAtom(queryAtom, { store: novelStore })\n const setRange = useSetAtom(rangeAtom, { store: novelStore })\n\n useEffect(() => {\n setQuery(query)\n }, [query, setQuery])\n\n useEffect(() => {\n setRange(range)\n }, [range, setRange])\n\n useEffect(() => {\n const navigationKeys = [\"ArrowUp\", \"ArrowDown\", \"Enter\"]\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault()\n const commandRef = document.querySelector(\"#slash-command\")\n\n if (commandRef)\n commandRef.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: e.key,\n cancelable: true,\n bubbles: true,\n })\n )\n\n return false\n }\n }\n document.addEventListener(\"keydown\", onKeyDown)\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown)\n }\n }, [])\n\n return <commandTunnel.Out />\n}\n\nconst CommandAny: any = Command\nexport const EditorCommand = forwardRef<HTMLDivElement, any>(\n ({ children, className, ...rest }, ref) => {\n const [query, setQuery] = useAtom(queryAtom)\n\n return (\n <commandTunnel.In>\n <CommandAny\n ref={ref}\n onKeyDown={(e: any) => {\n e.stopPropagation()\n }}\n id=\"slash-command\"\n className={className}\n {...rest}\n >\n <CommandAny.Input\n value={query}\n onValueChange={setQuery}\n style={{ display: \"none\" }}\n />\n {children}\n </CommandAny>\n </commandTunnel.In>\n )\n }\n)\nexport const EditorCommandList: any = Command.List\n\nEditorCommand.displayName = \"EditorCommand\"\n","import { atom } from \"jotai\"\nimport type { Range } from \"@tiptap/core\"\n\nexport const queryAtom = atom(\"\")\nexport const rangeAtom = atom<Range | null>(null)\n\n","import { forwardRef } from \"react\"\nimport { CommandEmpty, CommandItem } from \"cmdk\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport { rangeAtom } from \"../utils/atoms\"\nimport type { Editor, Range } from \"@tiptap/core\"\n\ninterface EditorCommandItemProps {\n readonly onCommand: ({\n editor,\n range,\n }: {\n editor: Editor\n range: Range\n }) => void\n}\n\nconst CommandItemAny: any = CommandItem\nconst CommandEmptyAny: any = CommandEmpty\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & any\n>(({ children, onCommand, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n const range = useAtomValue(rangeAtom)\n\n if (!editor || !range) return null\n\n return (\n <CommandItemAny\n ref={ref}\n {...(rest as any)}\n onSelect={() => onCommand({ editor, range })}\n >\n {children}\n </CommandItemAny>\n )\n})\n\nEditorCommandItem.displayName = \"EditorCommandItem\"\n\nexport const EditorCommandEmpty: any = CommandEmptyAny\n\nexport default EditorCommandItem\n","export { StarterKit } from \"@tiptap/starter-kit\";\nexport { Placeholder } from \"@tiptap/extension-placeholder\";\n\n// Custom\nexport { CodeBlock } from \"./CodeBlock\";\nexport { Link } from \"./Link\";\nexport { ImageBlock } from \"./ImageBlock\";\nexport type { ImageBlockOptions } from \"./ImageBlock\";\nexport { AISuggestion, AISuggestionPluginKey } from \"./AISuggestion\";\nexport type { AISuggestionOptions } from \"./AISuggestion\";\nexport { createMentionExtension, renderMentionSuggestion, MentionCommand } from \"./Mention\";\nexport type { MentionItem, MentionOptions } from \"./Mention\";\n","import { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\"\nimport { all, createLowlight } from \"lowlight\"\n\nconst lowlight = createLowlight(all)\n\nexport const CodeBlock = CodeBlockLowlight.configure({\n lowlight,\n})\n","import { mergeAttributes } from \"@tiptap/core\"\nimport TiptapLink from \"@tiptap/extension-link\"\nimport { Plugin } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }: any) {\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"link\",\n }),\n 0,\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(((this as any).parent?.() as any[]) || []),\n new Plugin({\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === \"Escape\" && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n },\n }),\n ]\n },\n}).configure({\n openOnClick: false,\n autolink: true,\n enableClickSelection: true,\n})\n\nexport default Link","import { mergeAttributes, Range } from \"@tiptap/core\"\nimport { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageBlockOptions {\n uploadImage?: (file: File) => Promise<string>\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: { src: string }) => ReturnType\n setImageBlockAt: (attributes: {\n src: string\n pos: number | Range\n }) => ReturnType\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setImageBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const ImageBlock = TiptapImage.extend<ImageBlockOptions>({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n inline: false,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n loading: {\n default: false,\n parseHTML: () => false,\n renderHTML: () => ({}),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]:not([src^=\"data:\"])',\n getAttrs: (element) => {\n const el = element as HTMLElement\n return {\n src: el.getAttribute(\"src\"),\n alt: el.getAttribute(\"alt\"),\n width: el.getAttribute(\"data-width\") || \"100%\",\n align: el.getAttribute(\"data-align\") || \"center\",\n }\n },\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"img\", mergeAttributes(HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n // If no custom node view is provided, we fall back to default behavior\n // but avoid the circular dependency require()\n return null\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageBlockDrop\"),\n props: {\n handleDOMEvents: {\n drop: (view: EditorView, event: DragEvent) => {\n const hasFiles =\n event.dataTransfer &&\n event.dataTransfer.files &&\n event.dataTransfer.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.dataTransfer.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n const { schema } = view.state\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!coordinates) return false\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode = schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n const placeholderTr = view.state.tr.insert(\n coordinates.pos,\n placeholderNode\n )\n view.dispatch(placeholderTr)\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = schema.nodes.imageBlock.create({ src: url })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n paste: (view: EditorView, event: ClipboardEvent) => {\n const hasFiles =\n event.clipboardData &&\n event.clipboardData.files &&\n event.clipboardData.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.clipboardData.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode =\n view.state.schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n view.dispatch(\n view.state.tr.replaceSelectionWith(placeholderNode)\n )\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = view.state.schema.nodes.imageBlock.create({\n src: url,\n })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default ImageBlock\n","import { ReactRenderer, ReactNodeViewRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport Mention from \"@tiptap/extension-mention\"\nimport type { SuggestionOptions } from \"@tiptap/suggestion\"\nimport type { RefObject } from \"react\"\nimport { MentionCommand } from \"./mention-command\"\nimport { MentionNodeView } from \"./mention-node-view\"\n\nexport interface MentionItem {\n id: string\n label: string\n avatar?: string\n email?: string\n type?: \"node\" | \"article\" // For reference mentions\n nodeId?: string // For node references (user-facing ID like \"TSK-1\")\n slug?: string // For article references (URL slug)\n}\n\nexport interface MentionOptions {\n /**\n * Function to fetch/filter mentionable items based on query\n */\n items?: (query: string) => MentionItem[] | Promise<MentionItem[]>\n\n /**\n * Custom render function for mention nodes\n */\n renderLabel?: (props: { node: any; options: any }) => string\n\n /**\n * Character that triggers the mention autocomplete (default: @)\n */\n char?: string\n\n /**\n * Custom name for the extension (to avoid duplicates)\n */\n name?: string\n}\n\n/**\n * Create the mention extension with custom suggestion rendering\n */\nexport const createMentionExtension = (options?: MentionOptions) => {\n const extensionName = options?.name ?? \"mention\"\n\n return Mention.extend({\n name: extensionName,\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {}\n }\n return {\n \"data-id\": attributes.id,\n }\n },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) => {\n if (!attributes.label) {\n return {}\n }\n return {\n \"data-label\": attributes.label,\n }\n },\n },\n avatar: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-avatar\"),\n renderHTML: (attributes) => {\n if (!attributes.avatar) {\n return {}\n }\n return {\n \"data-avatar\": attributes.avatar,\n }\n },\n },\n type: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-ref-type\"),\n renderHTML: (attributes) => {\n if (!attributes.type) {\n return {}\n }\n return {\n \"data-ref-type\": attributes.type,\n }\n },\n },\n nodeId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-node-id\"),\n renderHTML: (attributes) => {\n if (!attributes.nodeId) {\n return {}\n }\n return {\n \"data-node-id\": attributes.nodeId,\n }\n },\n },\n slug: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-slug\"),\n renderHTML: (attributes) => {\n if (!attributes.slug) {\n return {}\n }\n return {\n \"data-slug\": attributes.slug,\n }\n },\n },\n }\n },\n addNodeView() {\n return ReactNodeViewRenderer(MentionNodeView)\n },\n }).configure({\n HTMLAttributes: {\n class: \"mention\",\n },\n suggestion: {\n char: options?.char ?? \"@\",\n items: async ({ query }: { query: string }) => {\n if (!options?.items) return []\n const items = await options.items(query)\n return items\n },\n command: ({ editor, range, props: item }: any) => {\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: extensionName,\n attrs: {\n id: item.id,\n label: item.label,\n avatar: item.avatar,\n type: item.type,\n nodeId: item.nodeId,\n slug: item.slug,\n },\n },\n ])\n .run()\n },\n render: renderMentionSuggestion,\n },\n renderLabel: options?.renderLabel ?? ((props) => {\n return `@${props.node.attrs.label ?? props.node.attrs.id}`\n }),\n })\n}\n\n/**\n * Render function for mention suggestions (autocomplete dropdown)\n */\nexport const renderMentionSuggestion = () => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n\n const gap = 8\n const maxDropdownHeight = 300 // Match the maxHeight from MentionCommand\n const spaceBelow = window.innerHeight - clientRect.bottom\n const spaceAbove = clientRect.top\n\n // Position above if not enough space below, otherwise position below\n const shouldPositionAbove = spaceBelow < maxDropdownHeight && spaceAbove > spaceBelow\n\n const left = Math.round(clientRect.left)\n\n if (shouldPositionAbove) {\n const bottom = Math.round(window.innerHeight - clientRect.top + gap)\n container.style.bottom = `${bottom}px`\n container.style.top = 'auto'\n } else {\n const top = Math.round(clientRect.bottom + gap)\n container.style.top = `${top}px`\n container.style.bottom = 'auto'\n }\n\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: any) => {\n component = new ReactRenderer(MentionCommand, {\n props: {\n items: props.items ?? [],\n command: props.command ?? (() => {}),\n query: props.query ?? \"\",\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n document.body.appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: any) => {\n component?.updateProps({\n items: props.items ?? [],\n command: props.command ?? (() => {}),\n query: props.query ?? \"\",\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!component) return false\n\n if (event.key === \"Escape\") {\n event.preventDefault()\n event.stopPropagation()\n destroy()\n return true\n }\n\n // Handle arrow keys and enter\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n event.preventDefault()\n event.stopPropagation()\n // Let the MentionList component handle keyboard navigation\n return (component.ref as any)?.onKeyDown?.({ event }) ?? false\n }\n\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport default createMentionExtension\n","import { forwardRef, useEffect, useImperativeHandle, useState } from \"react\"\nimport type { MentionItem } from \"./mention\"\n\ninterface MentionCommandProps {\n items: MentionItem[]\n command: (item: MentionItem) => void\n query: string\n}\n\n// Simple Avatar component with inline styles\nfunction Avatar({ src, fallback }: { src?: string; fallback: string }) {\n return (\n <div style={{\n position: \"relative\",\n display: \"flex\",\n height: \"24px\",\n width: \"24px\",\n flexShrink: 0,\n overflow: \"hidden\",\n borderRadius: \"9999px\",\n }}>\n {src ? (\n <img\n style={{\n aspectRatio: \"1\",\n height: \"100%\",\n width: \"100%\",\n }}\n src={src}\n alt={fallback}\n />\n ) : (\n <div style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"9999px\",\n backgroundColor: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n fontSize: \"10px\",\n fontWeight: 600,\n }}>\n {fallback}\n </div>\n )}\n </div>\n )\n}\n\n// Icon component for reference types\nfunction ReferenceIcon({ type }: { type: \"node\" | \"article\" }) {\n if (type === \"node\") {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 3l8 4.5v9l-8 4.5l-8-4.5v-9l8-4.5\"></path>\n <path d=\"M12 12l8-4.5\"></path>\n <path d=\"M12 12v9\"></path>\n <path d=\"M12 12l-8-4.5\"></path>\n </svg>\n )\n }\n\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\"></path>\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\"></path>\n <path d=\"M9 9l1 0\"></path>\n <path d=\"M9 13l6 0\"></path>\n <path d=\"M9 17l6 0\"></path>\n </svg>\n )\n}\n\nexport const MentionCommand = forwardRef<any, MentionCommandProps>((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const selectItem = (index: number) => {\n const item = props.items[index]\n if (item) {\n props.command(item)\n }\n }\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length)\n }\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length)\n }\n\n const enterHandler = () => {\n selectItem(selectedIndex)\n }\n\n useEffect(() => setSelectedIndex(0), [props.items])\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler()\n return true\n }\n\n if (event.key === \"ArrowDown\") {\n downHandler()\n return true\n }\n\n if (event.key === \"Enter\") {\n enterHandler()\n return true\n }\n\n return false\n },\n }))\n\n return (\n <div\n id=\"mention-list\"\n style={{\n backgroundColor: \"var(--popover)\",\n color: \"var(--foreground)\",\n maxHeight: \"300px\",\n minWidth: \"280px\",\n overflow: \"hidden\",\n overflowY: \"auto\",\n borderRadius: \"12px\",\n border: \"1px solid var(--border)\",\n padding: \"4px\",\n boxShadow: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n }}\n >\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n style={{\n position: \"relative\",\n display: \"flex\",\n width: \"100%\",\n cursor: \"default\",\n userSelect: \"none\",\n alignItems: \"center\",\n gap: \"8px\",\n borderRadius: \"4px\",\n padding: \"10px 8px\",\n fontSize: \"14px\",\n outline: \"none\",\n backgroundColor: index === selectedIndex ? \"var(--accent)\" : \"transparent\",\n color: index === selectedIndex ? \"var(--accent-foreground)\" : \"inherit\",\n border: \"none\",\n textAlign: \"left\",\n }}\n >\n {item.type ? (\n <ReferenceIcon type={item.type} />\n ) : (\n <Avatar\n src={item.avatar}\n fallback={item.label.slice(0, 2).toUpperCase()}\n />\n )}\n <span style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}>\n {item.label}\n </span>\n </button>\n ))\n ) : (\n <div style={{\n padding: \"24px 0\",\n textAlign: \"center\",\n fontSize: \"14px\",\n color: \"var(--muted-foreground)\",\n }}>\n No results found\n </div>\n )}\n </div>\n )\n})\n\nMentionCommand.displayName = \"MentionCommand\"\n","import { NodeViewWrapper } from \"@tiptap/react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\n\n// Icon components\nfunction NodeIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 3l8 4.5v9l-8 4.5l-8-4.5v-9l8-4.5\"></path>\n <path d=\"M12 12l8-4.5\"></path>\n <path d=\"M12 12v9\"></path>\n <path d=\"M12 12l-8-4.5\"></path>\n </svg>\n )\n}\n\nfunction ArticleIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\"></path>\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\"></path>\n <path d=\"M9 9l1 0\"></path>\n <path d=\"M9 13l6 0\"></path>\n <path d=\"M9 17l6 0\"></path>\n </svg>\n )\n}\n\nexport const MentionNodeView = (props: NodeViewProps) => {\n const { node } = props\n const { id, label, avatar, type } = node.attrs\n\n // Determine styling based on type\n const isNode = type === \"node\"\n const isArticle = type === \"article\"\n const isReference = isNode || isArticle\n\n const backgroundColor = isArticle\n ? \"rgba(249, 115, 22, 0.15)\" // Orange for articles\n : isNode\n ? \"rgba(107, 114, 128, 0.15)\" // Gray for nodes\n : \"var(--accent)\" // Default for user mentions\n\n const color = isArticle\n ? \"rgb(234, 88, 12)\" // Orange text\n : isNode\n ? \"rgb(75, 85, 99)\" // Gray text\n : \"var(--accent-foreground)\" // Default\n\n const border = isArticle\n ? \"1px solid rgba(249, 115, 22, 0.3)\"\n : isNode\n ? \"1px solid rgba(107, 114, 128, 0.3)\"\n : \"none\"\n\n return (\n <NodeViewWrapper\n as=\"span\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"3px\",\n backgroundColor,\n color,\n border,\n padding: isReference ? \"1px 6px\" : \"1px 6px 1px 1px\",\n borderRadius: \"12px\",\n fontSize: \"13px\",\n fontWeight: 500,\n verticalAlign: \"middle\",\n }}\n >\n {/* Show icon for references */}\n {isNode && <NodeIcon />}\n {isArticle && <ArticleIcon />}\n\n {/* Show avatar for user mentions */}\n {!isReference && avatar && (\n <img\n src={avatar}\n alt={label || id}\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n flexShrink: 0,\n }}\n />\n )}\n {!isReference && !avatar && (\n <div\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n backgroundColor: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"10px\",\n fontWeight: 600,\n flexShrink: 0,\n }}\n >\n {(label || id).slice(0, 2).toUpperCase()}\n </div>\n )}\n <span>{label || id}</span>\n </NodeViewWrapper>\n )\n}\n","import { ReactRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport { Extension } from \"@tiptap/core\"\nimport type { RefObject, ReactNode } from \"react\"\nimport { EditorCommandOut } from \"../components/editor-command\"\n\nexport const Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: (ctx: any) => {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n },\n } as any,\n }\n },\n addProseMirrorPlugins() {\n const base: any = this.options.suggestion ?? {}\n return [\n Suggestion({\n editor: this.editor,\n char: base.char ?? \"/\",\n // Only trigger slash command at start of line or after whitespace\n startOfLine: base.startOfLine ?? true,\n items: base.items ?? (() => [\"/\"] as any),\n command: (ctx: any) => {\n if (typeof ctx?.props?.command === \"function\") {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n }\n },\n ...base,\n }),\n ]\n },\n})\n\nexport const renderItems = (elementRef?: RefObject<Element> | null) => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n const top = Math.round(clientRect.bottom + 8)\n const left = Math.round(clientRect.left)\n container.style.top = `${top}px`\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n const { selection } = props.editor.state\n const parentNode = selection.$from.node(selection.$from.depth)\n const blockType = parentNode.type.name\n\n // Don't show slash menu in code blocks\n if (blockType === \"codeBlock\") return false\n\n // Don't show slash menu if inside code or link marks\n const { $from } = selection\n const marks = $from.marks()\n if (marks.some((mark: any) => mark.type.name === \"code\" || mark.type.name === \"link\")) {\n return false\n }\n\n component = new ReactRenderer(EditorCommandOut, {\n props: {\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n container.style.minWidth = \"240px\"\n ;(elementRef?.current ?? document.body).appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n component?.updateProps({\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"Escape\") {\n destroy()\n return true\n }\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport interface SuggestionItem {\n title: string\n description: string\n icon: ReactNode\n searchTerms?: string[]\n command?: (props: {\n editor: any\n range: { from: number; to: number }\n }) => void\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items\n\nexport const handleCommandNavigation = (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) return true\n }\n}\n","import Collaboration from \"@tiptap/extension-collaboration\"\n// import CollaborationCursor from \"@tiptap/extension-collaboration-cursor\" // Temporarily disabled\nimport { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { ImageBlock } from \"./ImageBlock/ImageBlock\"\nimport { VideoBlock } from \"./VideoBlock/VideoBlock\"\nimport { createMentionExtension } from \"./Mention\"\nimport type { MentionOptions } from \"./Mention\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n user?: any\n }\n imageBlockView?: any\n videoBlockView?: any\n mention?: MentionOptions\n reference?: MentionOptions\n slashCommand?: boolean\n placeholder?: string\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => {\n const enableSlashCommand = options?.slashCommand !== false // Default to true\n\n const extensions = [\n StarterKit.configure({ codeBlock: false, link: false }),\n CodeBlock,\n Link,\n ImageBlock.configure({\n uploadImage: options?.uploadImage,\n nodeView: options?.imageBlockView,\n }),\n VideoBlock.configure({\n nodeView: options?.videoBlockView,\n }),\n Placeholder.configure({\n placeholder: ({ node }: any) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`\n }\n // Use custom placeholder if provided, otherwise show slash command hint if enabled\n if (options?.placeholder) {\n return options.placeholder\n }\n return enableSlashCommand ? \"Press '/' for commands\" : \"\"\n },\n includeChildren: true,\n }),\n ]\n\n // Add SlashCommand if enabled\n if (enableSlashCommand) {\n extensions.push(\n SlashCommand.configure({\n suggestion: {\n char: \"/\",\n render: renderSlashItems,\n allowSpaces: true,\n allowedPrefixes: null,\n },\n })\n )\n }\n\n // Add Mention extension if configured\n if (options?.mention) {\n const mentionExt = createMentionExtension(options.mention)\n extensions.push(mentionExt)\n }\n\n // Add Reference extension if configured (uses same Mention extension with different config)\n if (options?.reference) {\n const referenceExt = createMentionExtension({\n ...options.reference,\n name: \"reference\", // Use unique name to avoid conflicts\n })\n extensions.push(referenceExt)\n }\n\n if (options?.collaboration?.doc) {\n extensions.push(\n Collaboration.configure({\n document: options.collaboration.doc,\n field: options.collaboration.field,\n }),\n )\n\n // Note: CollaborationCursor is temporarily disabled due to compatibility issues\n // Collaboration (document syncing) still works without it\n // TODO: Fix CollaborationCursor integration\n }\n\n return extensions\n}\n\nexport default ExtensionKit\n","import { mergeAttributes, Node } from \"@tiptap/core\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\n\nexport interface VideoBlockOptions {\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n videoBlock: {\n setVideoBlock: (attributes: { src: string }) => ReturnType\n setVideoBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setVideoBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const VideoBlock = Node.create<VideoBlockOptions>({\n name: \"videoBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n atom: true,\n\n addOptions() {\n return {\n nodeView: undefined,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-src\"),\n renderHTML: (attributes) => ({\n \"data-src\": attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"video-block\"]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, { \"data-type\": \"video-block\" }),\n ]\n },\n\n addCommands() {\n return {\n setVideoBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"videoBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setVideoBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"videoBlock\", { align }),\n\n setVideoBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"videoBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n return null\n },\n})\n\nexport default VideoBlock\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n IconLink,\n IconCheck,\n IconX,\n} from \"@tabler/icons-react\"\nimport type { ReactNode } from \"react\"\nimport { Fragment, useState, useRef, useEffect } from \"react\"\nimport { MenuList } from \"./MenuList\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type TextMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function TextMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: TextMenuProps) {\n const { editor } = useCurrentEditor()\n const [isAddingLink, setIsAddingLink] = useState(false)\n const [linkUrl, setLinkUrl] = useState(\"\")\n const linkInputRef = useRef<HTMLInputElement | null>(null)\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n return {\n isBold: ctx.editor.isActive(\"bold\"),\n isItalic: ctx.editor.isActive(\"italic\"),\n isStrike: ctx.editor.isActive(\"strike\"),\n isCode: ctx.editor.isActive(\"code\"),\n isCodeBlock: ctx.editor.isActive(\"codeBlock\"),\n isParagraph: ctx.editor.isActive(\"paragraph\"),\n isHeading: ctx.editor.isActive(\"heading\"),\n isList:\n ctx.editor.isActive(\"bulletList\") ||\n ctx.editor.isActive(\"orderedList\"),\n isBlockquote: ctx.editor.isActive(\"blockquote\"),\n }\n },\n })\n\n useEffect(() => {\n if (isAddingLink && linkInputRef.current) {\n linkInputRef.current.focus()\n }\n }, [isAddingLink])\n\n if (!editor || !editorState) return null\n\n const handleSetLink = () => {\n if (!linkUrl) return\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: linkUrl }).run()\n setIsAddingLink(false)\n setLinkUrl(\"\")\n }\n\n const handleCancelLink = () => {\n setIsAddingLink(false)\n setLinkUrl(\"\")\n editor.chain().focus().run()\n }\n\n const hasAnyMarksInSelection = () => {\n const anyEditor: any = editor\n const state = anyEditor.state\n const sel: any = state.selection\n let has = false\n state.doc.nodesBetween(sel.from, sel.to, (node: any) => {\n if (node.isText && node.marks && node.marks.length > 0) {\n has = true\n return false\n }\n return undefined\n })\n if (!has && sel.empty) {\n const marks = state.storedMarks || sel.$from.marks()\n if (marks && marks.length > 0) has = true\n }\n return has\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state, from, to, view }) => {\n // Don't show if imageBlock or videoBlock is active\n if (e.isActive(\"imageBlock\")) return false\n if (e.isActive(\"videoBlock\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // Don't show if link is active (LinkMenu will handle this)\n if (e.isActive(\"link\")) return false\n\n // Check if the selection contains an imageBlock node\n let hasImage = false\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === \"imageBlock\" || node.type.name === \"videoBlock\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <MenuList editor={editor} />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isBold ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isBold}\n aria-label=\"Toggle bold\"\n >\n <IconBold size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isItalic ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isItalic}\n aria-label=\"Toggle italic\"\n >\n <IconItalic size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isStrike ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isStrike}\n aria-label=\"Toggle strike\"\n >\n <IconStrikethrough size={16} />\n </button>\n {!isAddingLink ? (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setIsAddingLink(true)}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editor.isActive(\"link\") ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editor.isActive(\"link\")}\n aria-label=\"Add link\"\n >\n <IconLink size={16} />\n </button>\n ) : (\n <>\n <input\n ref={linkInputRef}\n type=\"url\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleSetLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n handleCancelLink()\n }\n }}\n placeholder=\"https://example.com\"\n className=\"nph-link-input\"\n style={{\n padding: \"4px 8px\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n minWidth: \"200px\",\n fontSize: \"14px\",\n }}\n />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleSetLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Apply\"\n title=\"Apply\"\n disabled={!linkUrl}\n >\n <IconCheck size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleCancelLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Cancel\"\n title=\"Cancel\"\n >\n <IconX size={16} />\n </button>\n </>\n )}\n\n {(() => {\n const hasInlineMarks = hasAnyMarksInSelection()\n\n const isPlainParagraph =\n editorState.isParagraph &&\n !editorState.isHeading &&\n !editorState.isList &&\n !editorState.isBlockquote &&\n !editorState.isCodeBlock &&\n !hasInlineMarks\n\n return (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .setParagraph()\n .unsetAllMarks()\n .run()\n }\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Revert to paragraph\"\n title=\"Revert to paragraph\"\n disabled={isPlainParagraph}\n aria-disabled={isPlainParagraph}\n >\n <IconArrowBackUp size={16} />\n </button>\n )\n })()}\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default TextMenu\n","import React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconChevronDown,\n IconSourceCode,\n} from \"@tabler/icons-react\"\n\nexport type MenuListProps = {\n editor: any\n className?: string\n style?: React.CSSProperties\n onSelect?: () => void\n buttonClassName?: string\n}\n\nexport function MenuList({\n editor,\n className,\n style,\n onSelect,\n buttonClassName,\n}: MenuListProps) {\n const [open, setOpen] = useState(false)\n const [label, setLabel] = useState(\"Paragraph\")\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const computeLabel = useCallback(() => {\n if (!editor) return \"Paragraph\"\n if (editor.isActive(\"heading\", { level: 1 })) return \"Heading 1\"\n if (editor.isActive(\"heading\", { level: 2 })) return \"Heading 2\"\n if (editor.isActive(\"heading\", { level: 3 })) return \"Heading 3\"\n if (editor.isActive(\"heading\", { level: 4 })) return \"Heading 4\"\n if (editor.isActive(\"bulletList\")) return \"Bullet list\"\n if (editor.isActive(\"orderedList\")) return \"Ordered list\"\n if (editor.isActive(\"blockquote\")) return \"Quote\"\n if (editor.isActive(\"code\")) return \"Code\"\n if (editor.isActive(\"codeBlock\")) return \"Code Block\"\n return \"Paragraph\"\n }, [editor])\n\n useEffect(() => {\n setLabel(computeLabel())\n if (!editor) return\n const update = () => setLabel(computeLabel())\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor, computeLabel])\n\n useEffect(() => {\n if (!editor) return\n const close = () => setOpen(false)\n editor.on(\"selectionUpdate\", close)\n editor.on(\"blur\", close)\n return () => {\n editor.off(\"selectionUpdate\", close)\n editor.off(\"blur\", close)\n }\n }, [editor])\n\n useEffect(() => {\n const handlePointerDown = (e: MouseEvent) => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n if (!el.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [open])\n\n const handle = (fn: () => void) => () => {\n fn()\n onSelect?.()\n setOpen(false)\n }\n\n const isActive = useCallback((name: string) => label === name, [label])\n\n return (\n <div ref={rootRef} className=\"nph-dropdown\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={\n buttonClassName ??\n `nph-btn nph-btn-ghost nph-btn-xs${open || label !== \"Paragraph\" ? \" is-active\" : \"\"}`\n }\n aria-expanded={open}\n aria-label=\"Change block type\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span style={{ fontSize: 12 }}>{label}</span>\n <IconChevronDown size={16} />\n </span>\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel nph-command\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <div\n className={className ? className : \"nph-command__list\"}\n style={{ maxHeight: 240, ...(style ?? {}) }}\n >\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Paragraph\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Paragraph\")}\n onClick={handle(() =>\n (editor as any).chain().focus().setParagraph().run()\n )}\n >\n <IconTypography size={16} />\n <span>Paragraph</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 1\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 1\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 1 })\n .run()\n )}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 2\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 2\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 2 })\n .run()\n )}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 3\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 3\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 3 })\n .run()\n )}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 4\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 4\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 4 })\n .run()\n )}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Bullet list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Bullet list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBulletList().run()\n )}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Ordered list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Ordered list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleOrderedList().run()\n )}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Quote\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Quote\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBlockquote().run()\n )}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCode().run()\n )}\n >\n <IconCode size={16} />\n <span>Code</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code Block\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code Block\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCodeBlock().run()\n )}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default MenuList\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport {\n EditorCommand,\n EditorCommandList,\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"../../headless\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconSourceCode,\n IconPhoto,\n IconVideo,\n} from \"@tabler/icons-react\"\n\nexport type SlashMenuProps = {\n className?: string\n}\n\nexport function SlashMenu({ className }: SlashMenuProps) {\n const { editor } = useCurrentEditor()\n if (!editor) return null\n\n return (\n <EditorCommand className={className ?? \"nph-command\"}>\n <EditorCommandList\n className=\"nph-command__list\"\n style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\n >\n <EditorCommandEmpty style={{ padding: \"8px 12px\", fontSize: 14 }}>\n No commands found\n </EditorCommandEmpty>\n <EditorCommandItem\n value=\"bold\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBold()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBold size={16} />\n <span>Bold</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"italic\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleItalic()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconItalic size={16} />\n <span>Italic</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"strike\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleStrike()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconStrikethrough size={16} />\n <span>Strike</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading1 h1\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 1 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading2 h2\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 2 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading3 h3\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 3 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading4 h4\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 4 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"bullet list ul\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBulletList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"ordered list ol\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleOrderedList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"quote blockquote\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBlockquote()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code inline\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCode()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconCode size={16} />\n <span>Code</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code block codeblock\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCodeBlock()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"image photo picture block\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) => {\n ;(editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .setImageBlock({ src: \"\" })\n .run()\n }}\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconPhoto size={16} />\n <span>Image</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"video embed youtube vimeo\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) => {\n ;(editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .setVideoBlock({ src: \"\" })\n .run()\n }}\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconVideo size={16} />\n <span>Video</span>\n </span>\n </EditorCommandItem>\n </EditorCommandList>\n </EditorCommand>\n )\n}\n\nexport default SlashMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useState, useRef, useEffect } from \"react\"\nimport {\n IconLink,\n IconExternalLink,\n IconTrash,\n IconCheck,\n IconX,\n} from \"@tabler/icons-react\"\n\nexport function LinkMenu() {\n const { editor } = useCurrentEditor()\n const [url, setUrl] = useState<string>(\"\")\n const [isEditing, setIsEditing] = useState(false)\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n const currentUrl = editor?.getAttributes(\"link\")?.href || \"\"\n\n useEffect(() => {\n setUrl(currentUrl)\n }, [currentUrl])\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const handleSetLink = useCallback(() => {\n if (!editor || !url) return\n\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run()\n\n setIsEditing(false)\n }, [editor, url])\n\n const handleRemoveLink = useCallback(() => {\n if (!editor) return\n\n editor.chain().focus().unsetLink().run()\n setIsEditing(false)\n }, [editor])\n\n const handleOpenLink = useCallback(() => {\n if (url || currentUrl) {\n window.open(url || currentUrl, \"_blank\", \"noopener,noreferrer\")\n }\n }, [url, currentUrl])\n\n if (!editor) return null\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey=\"linkBubbleMenu\"\n shouldShow={({ editor: e, state }) => {\n // Show when link is active (whether selection is empty or not)\n return e.isActive(\"link\")\n }}\n updateDelay={0}\n >\n <div className=\"bubble-menu\">\n {!isEditing ? (\n <>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setIsEditing(true)}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Edit link\"\n title={currentUrl}\n >\n <IconLink size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleOpenLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Open link\"\n title=\"Open link in new tab\"\n >\n <IconExternalLink size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleRemoveLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Remove link\"\n title=\"Remove link\"\n >\n <IconTrash size={16} />\n </button>\n </>\n ) : (\n <>\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleSetLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setUrl(currentUrl)\n setIsEditing(false)\n }\n }}\n placeholder=\"https://example.com\"\n className=\"nph-link-input\"\n style={{\n padding: \"4px 8px\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n minWidth: \"200px\",\n fontSize: \"14px\",\n }}\n />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleSetLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Apply\"\n title=\"Apply\"\n disabled={!url}\n >\n <IconCheck size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setUrl(currentUrl)\n setIsEditing(false)\n }}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Cancel\"\n title=\"Cancel\"\n >\n <IconX size={16} />\n </button>\n </>\n )}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default LinkMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { Fragment, useEffect, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type ImageMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function ImageMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: ImageMenuProps) {\n const { editor } = useCurrentEditor()\n const [size, setSize] = useState<number>(100)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"left\")\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\") ?? {\n width: \"\",\n align: \"left\",\n }\n const width = attrs.width ?? \"\"\n if (width.includes(\"%\")) {\n setSize(parseInt(width) || 100)\n } else {\n setSize(100)\n }\n setAlign(attrs.align ?? \"left\")\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor])\n\n if (!editor) return null\n\n const updateImageSize = (newSize: number) => {\n setSize(newSize)\n editor.commands.setImageBlockWidth(newSize)\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.setImageBlockAlign(newAlign)\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n editor.commands.updateAttributes(\"imageBlock\", { src: \"\", loading: false })\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"imageBlock\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`image-leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\" }}>\n {size}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"5\"\n value={size}\n onChange={(e) => updateImageSize(parseInt(e.target.value))}\n onMouseDown={(e) => e.stopPropagation()}\n style={{ flex: 1 }}\n />\n </div>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"left\")}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"center\")}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"right\")}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Upload new image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={triggerUpload}\n >\n <IconUpload size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeImage}\n >\n <IconTrash size={16} />\n </button>\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`image-trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockMenu } from \"./ImageBlockMenu\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\ninterface ImageBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const ImageBlockView = (props: ImageBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n alt?: string\n loading?: boolean\n }\n }\n }\n const imageWrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align, alt, loading } = node.attrs\n\n const handleUpload = useCallback(\n (url: string) => {\n updateAttributes({ src: url, loading: false })\n },\n [updateAttributes]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n // Calculate wrapper class based on alignment\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show uploader if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageUploader onUpload={handleUpload} editor={editor} />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show loading placeholder\n if (loading) {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageBlockLoading />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the actual image\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={{ position: \"relative\" }}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n className=\"nph-image-block\"\n />\n </div>\n </div>\n <ImageBlockMenu editor={editor} appendTo={imageWrapperRef} />\n </NodeViewWrapper>\n )\n}\n\nexport default ImageBlockView\n","import { Editor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useRef, useState, useEffect } from \"react\"\nimport { ImageBlockWidth } from \"./ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type ImageBlockMenuProps = {\n editor: Editor\n appendTo?: React.RefObject<HTMLElement | null>\n}\n\nexport const ImageBlockMenu = ({ editor, appendTo }: ImageBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"center\")\n const [width, setWidth] = useState<number>(100)\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\")\n setAlign(attrs.align || \"center\")\n const widthStr = attrs.width || \"100%\"\n setWidth(parseInt(widthStr) || 100)\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n }\n }, [editor])\n\n const getReferenceClientRect = useCallback(() => {\n if (!editor) return new DOMRect(-1000, -1000, 0, 0)\n\n const { view } = editor\n const { state } = view\n const { selection } = state\n\n // Get the node at the current selection\n const node = selection instanceof (window as any).ProseMirror?.state?.NodeSelection\n ? (selection as any).node\n : null\n\n if (node && node.type.name === \"imageBlock\") {\n const nodePos = (selection as any).from\n const domNode = view.nodeDOM(nodePos)\n if (domNode && domNode instanceof HTMLElement) {\n return domNode.getBoundingClientRect()\n }\n }\n\n // Fallback: try to find the image block element\n const imageBlockElements = document.querySelectorAll('[data-node-view-wrapper]')\n for (const el of Array.from(imageBlockElements)) {\n if (el.querySelector(\"img\")) {\n return el.getBoundingClientRect()\n }\n }\n\n return new DOMRect(-1000, -1000, 0, 0)\n }, [editor])\n\n const shouldShow = useCallback(() => {\n if (!editor) return false\n const isActive = editor.isActive(\"imageBlock\")\n if (!isActive) return false\n\n // Check if it's a node selection\n const { state } = editor\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n return isNodeSelection\n }, [editor])\n\n const onAlignImageLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignImageCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignImageRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemoveImage = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n updateDelay={0}\n >\n <div className=\"bubble-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemoveImage}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageBlockMenu\n","import { memo, useCallback, useEffect, useState } from \"react\"\n\nexport type ImageBlockWidthProps = {\n onChange: (value: number) => void\n value: number\n}\n\nexport const ImageBlockWidth = memo(\n ({ onChange, value }: ImageBlockWidthProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = parseInt(e.target.value)\n onChange(nextValue)\n setCurrentValue(nextValue)\n },\n [onChange]\n )\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\", width: 40 }}>\n {currentValue}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"25\"\n value={currentValue}\n onChange={handleChange}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n height: 3,\n borderRadius: 9999,\n appearance: \"none\",\n background: \"linear-gradient(to right, #333 0%, #333 \" + currentValue + \"%, #ddd \" + currentValue + \"%, #ddd 100%)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n className=\"nph-image-width-slider\"\n />\n </div>\n )\n }\n)\n\nImageBlockWidth.displayName = \"ImageBlockWidth\"\n\nexport default ImageBlockWidth\n","import { IconPhoto, IconUpload } from \"@tabler/icons-react\"\nimport { ChangeEvent, useCallback, useRef, useState, DragEvent } from \"react\"\nimport { Editor } from \"@tiptap/react\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\nexport type ImageUploaderProps = {\n onUpload: (url: string) => void\n editor: Editor\n}\n\nexport const ImageUploader = ({ onUpload, editor }: ImageUploaderProps) => {\n const [loading, setLoading] = useState(false)\n const [draggedInside, setDraggedInside] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\n // Get the upload handler from the editor\n const imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const uploadImage = (imageExtension?.options as any)?.uploadImage\n\n if (uploadImage) {\n const url = await uploadImage(file)\n onUpload(url)\n } else {\n console.error(\"No uploadImage handler provided\")\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n } finally {\n setLoading(false)\n }\n },\n [editor, onUpload]\n )\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const onFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n\n const file = e.dataTransfer.files[0]\n if (file && /image/i.test(file.type)) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(true)\n }, [])\n\n const onDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n }, [])\n\n if (loading) {\n return <ImageBlockLoading />\n }\n\n return (\n <div\n className={`nph-image-uploader${draggedInside ? \" nph-image-uploader--dragging\" : \"\"}`}\n onDrop={onDrop}\n onDragOver={onDragEnter}\n onDragLeave={onDragLeave}\n contentEditable={false}\n >\n <IconPhoto size={48} className=\"nph-image-uploader__icon\" />\n <div className=\"nph-image-uploader__content\">\n <div className=\"nph-image-uploader__text\">\n {draggedInside ? \"Drop image here\" : \"Drag and drop or\"}\n </div>\n <div>\n <button\n type=\"button\"\n disabled={draggedInside}\n onClick={handleUploadClick}\n className=\"nph-btn nph-btn-ghost nph-btn-sm nph-image-uploader__button\"\n >\n <IconUpload size={16} />\n Upload an image\n </button>\n </div>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".jpg,.jpeg,.png,.webp,.gif\"\n onChange={onFileChange}\n className=\"nph-image-uploader__input\"\n />\n </div>\n )\n}\n\nexport default ImageUploader\n","import { IconLoader2 } from \"@tabler/icons-react\"\n\nexport const ImageBlockLoading = () => {\n return (\n <div className=\"nph-image-block-loading\">\n <div className=\"nph-image-block-loading__overlay\">\n <div className=\"nph-image-block-loading__content\">\n <IconLoader2 size={24} className=\"nph-image-block-loading__spinner\" />\n <p className=\"nph-image-block-loading__text\">Uploading image...</p>\n </div>\n </div>\n <div className=\"nph-image-block-loading__placeholder\" />\n </div>\n )\n}\n\nexport default ImageBlockLoading\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef, useState } from \"react\"\nimport { VideoBlockMenu } from \"./VideoBlockMenu\"\nimport { IconVideo } from \"@tabler/icons-react\"\n\nfunction toEmbedUrl(url: string): string {\n // YouTube: youtube.com/watch?v=ID or youtu.be/ID\n const ytMatch = url.match(\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([\\w-]+)/\n )\n if (ytMatch) {\n return `https://www.youtube.com/embed/${ytMatch[1]}`\n }\n\n // Vimeo: vimeo.com/ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(\\d+)/)\n if (vimeoMatch) {\n return `https://player.vimeo.com/video/${vimeoMatch[1]}`\n }\n\n return url\n}\n\ninterface VideoBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const VideoBlockView = (props: VideoBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as VideoBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n }\n }\n }\n const wrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align } = node.attrs\n const [inputUrl, setInputUrl] = useState(\"\")\n\n const handleEmbed = useCallback(() => {\n if (!inputUrl.trim()) return\n const embedUrl = toEmbedUrl(inputUrl.trim())\n updateAttributes({ src: embedUrl })\n }, [inputUrl, updateAttributes])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleEmbed()\n }\n },\n [handleEmbed]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show URL input if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div className=\"nph-video-input\" ref={wrapperRef}>\n <div className=\"nph-video-input__icon\">\n <IconVideo size={24} />\n </div>\n <div className=\"nph-video-input__content\">\n <input\n type=\"text\"\n className=\"nph-video-input__field\"\n placeholder=\"Paste a YouTube, Vimeo, or video URL...\"\n value={inputUrl}\n onChange={(e) => setInputUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <button\n type=\"button\"\n className=\"nph-video-input__button\"\n onClick={handleEmbed}\n disabled={!inputUrl.trim()}\n >\n Embed\n </button>\n </div>\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the embedded video\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div\n contentEditable={false}\n ref={wrapperRef}\n style={{ position: \"relative\" }}\n >\n <div className=\"nph-video-block\" onClick={onClick}>\n <iframe\n src={src}\n className=\"nph-video-block__iframe\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n </div>\n </div>\n </div>\n <VideoBlockMenu editor={editor} />\n </NodeViewWrapper>\n )\n}\n\nexport default VideoBlockView\n","import { Editor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useRef, useState, useEffect } from \"react\"\nimport { ImageBlockWidth } from \"../ImageBlock/ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type VideoBlockMenuProps = {\n editor: Editor\n}\n\nexport const VideoBlockMenu = ({ editor }: VideoBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"center\")\n const [width, setWidth] = useState<number>(100)\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"videoBlock\")) return\n const attrs = editor.getAttributes(\"videoBlock\")\n setAlign(attrs.align || \"center\")\n const widthStr = attrs.width || \"100%\"\n setWidth(parseInt(widthStr) || 100)\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n }\n }, [editor])\n\n const shouldShow = useCallback(() => {\n if (!editor) return false\n\n const { state } = editor\n const { selection } = state\n\n // Must be a NodeSelection\n if (selection.constructor.name !== \"NodeSelection\") return false\n\n // The selected node must be a videoBlock\n const node = (selection as any).node\n if (!node || node.type.name !== \"videoBlock\") return false\n\n return true\n }, [editor])\n\n const onAlignLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemove = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n updateDelay={0}\n >\n <div className=\"bubble-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove video\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemove}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default VideoBlockMenu\n","import {\n EditorRoot,\n EditorContent,\n handleCommandNavigation,\n type EditorContentProps,\n} from \"../headless\"\nimport ExtensionKit from \"../headless/extensions/extension-kit\"\nimport type { MentionOptions } from \"../headless/extensions\"\nimport { SlashMenu, TextMenu } from \"./menus\"\nimport { ImageMenu } from \"./menus/ImageMenu\"\nimport { LinkMenu } from \"./menus/LinkMenu\"\nimport { ImageBlockView } from \"./menus/ImageBlock/ImageBlockView\"\nimport { VideoBlockView } from \"./menus/VideoBlock/VideoBlockView\"\nimport type { ReactNode } from \"react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\nexport type BubbleMenuExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type BubbleMenuExtra =\n | BubbleMenuExtraRenderer\n | {\n render: BubbleMenuExtraRenderer\n align?: \"start\" | \"end\"\n }\n\nexport type BubbleMenuExtras = Partial<{\n text: BubbleMenuExtra | BubbleMenuExtra[]\n image: BubbleMenuExtra | BubbleMenuExtra[]\n}>\n\nexport type NeuphloEditorProps = {\n content?: string\n className?: string\n editable?: boolean\n immediatelyRender?: boolean\n showTextMenu?: boolean\n showSlashMenu?: boolean\n showImageMenu?: boolean\n extensions?: any[]\n bubbleMenuExtras?: BubbleMenuExtras\n onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n }\n mentionOptions?: MentionOptions\n referenceOptions?: MentionOptions\n slashCommand?: boolean\n placeholder?: string\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n bubbleMenuExtras,\n onUpdate,\n onCreate,\n uploadImage,\n collaboration,\n mentionOptions,\n referenceOptions,\n slashCommand,\n placeholder,\n}: NeuphloEditorProps) {\n const normalizeExtras = (extras?: BubbleMenuExtra | BubbleMenuExtra[]) => {\n const result: {\n start: BubbleMenuExtraRenderer[]\n end: BubbleMenuExtraRenderer[]\n } = {\n start: [],\n end: [],\n }\n if (!extras) return result\n\n const list = Array.isArray(extras) ? extras : [extras]\n list.forEach((item) => {\n const config =\n typeof item === \"function\"\n ? { render: item, align: \"end\" as const }\n : item\n const slot = config.align === \"start\" ? \"start\" : \"end\"\n result[slot].push(config.render)\n })\n return result\n }\n\n const textExtras = normalizeExtras(bubbleMenuExtras?.text)\n const imageExtras = normalizeExtras(bubbleMenuExtras?.image)\n\n return (\n <div className={className}>\n <EditorRoot>\n <EditorContent\n onUpdate={onUpdate}\n onCreate={onCreate}\n immediatelyRender={immediatelyRender}\n editable={editable}\n content={content}\n extensions={[\n ...\n ExtensionKit({\n uploadImage: uploadImage,\n collaboration: collaboration,\n imageBlockView: ImageBlockView,\n videoBlockView: VideoBlockView,\n mention: mentionOptions,\n reference: referenceOptions,\n slashCommand: slashCommand,\n placeholder: placeholder,\n }),\n ...(extensions ?? []),\n ]}\n editorProps={{\n attributes: {\n class: \"nph-editor max-w-none outline-none\",\n },\n handleKeyDown: (view, event) => {\n return !!handleCommandNavigation?.(event as any)\n },\n }}\n >\n {showTextMenu ? (\n <TextMenu\n leadingExtras={textExtras.start}\n trailingExtras={textExtras.end}\n />\n ) : null}\n {showImageMenu ? (\n <ImageMenu\n leadingExtras={imageExtras.start}\n trailingExtras={imageExtras.end}\n />\n ) : null}\n <LinkMenu />\n {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["Editor","import_react","import_react","import_jotai","import_jotai","import_react","import_jotai","import_jsx_runtime","tunnel","import_react","import_cmdk","import_jotai","import_jsx_runtime","TiptapLink","import_core","import_react","import_state","TiptapImage","node","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Mention","import_react","import_core","Command","Suggestion","import_core","import_react","Command","Collaboration","import_react","import_icons_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_icons_react","import_jsx_runtime","editor","import_react","import_menus","import_icons_react","import_jsx_runtime","import_react","import_menus","import_icons_react","import_jsx_runtime","import_react","import_menus","import_react","import_react","import_jsx_runtime","import_icons_react","import_jsx_runtime","import_icons_react","import_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_menus","import_react","import_icons_react","import_jsx_runtime","import_icons_react","import_jsx_runtime","import_jsx_runtime","Editor"]}
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/headless/index.ts","../../src/headless/components/editor.tsx","../../src/headless/utils/store.ts","../../src/headless/components/editor-command.tsx","../../src/headless/utils/atoms.ts","../../src/headless/components/editor-command-item.tsx","../../src/headless/extensions/index.ts","../../src/headless/extensions/CodeBlock/CodeBlock.ts","../../src/headless/extensions/Link/Link.ts","../../src/headless/extensions/ImageBlock/ImageBlock.ts","../../src/headless/extensions/Mention/mention.tsx","../../src/headless/extensions/Mention/mention-command.tsx","../../src/headless/extensions/Mention/mention-node-view.tsx","../../src/headless/extensions/DragHandle/DragHandle.ts","../../src/headless/extensions/Table/index.ts","../../src/headless/extensions/MarkdownPaste.ts","../../src/headless/extensions/slash-command.tsx","../../src/headless/extensions/extension-kit.ts","../../src/headless/extensions/VideoBlock/VideoBlock.ts","../../src/react/menus/TextMenu.tsx","../../src/react/menus/MenuList.tsx","../../src/react/menus/SlashMenu.tsx","../../src/react/menus/LinkMenu.tsx","../../src/react/menus/ImageMenu.tsx","../../src/react/menus/ImageBlock/ImageBlockView.tsx","../../src/react/menus/ImageBlock/ImageBlockMenu.tsx","../../src/react/menus/ImageBlock/ImageBlockWidth.tsx","../../src/react/menus/ImageBlock/ImageUploader.tsx","../../src/react/menus/ImageBlock/ImageBlockLoading.tsx","../../src/react/menus/ImageBlock/ImageResizeHandle.tsx","../../src/react/menus/VideoBlock/VideoBlockView.tsx","../../src/react/menus/VideoBlock/VideoBlockMenu.tsx","../../src/react/menus/DragHandle/BlockActionMenu.tsx","../../src/react/menus/TableMenu.tsx","../../src/react/Editor.tsx","../../src/react/TableOfContents.tsx"],"sourcesContent":["// Auto-apply default styles when consuming the React entry\nimport \"../styles.css\";\n\nexport { Editor } from \"./Editor\";\nexport type {\n NeuphloEditorProps as EditorProps,\n BubbleMenuExtras,\n BubbleMenuExtraRenderer,\n BubbleMenuExtra,\n} from \"./Editor\";\nexport { TextMenu } from \"./menus\";\nexport type { TextMenuProps } from \"./menus\";\nexport { TableOfContents } from \"./TableOfContents\";\nexport type { TableOfContentsProps } from \"./TableOfContents\";\n","export { useCurrentEditor as useEditor } from \"@tiptap/react\"\n\nexport {\n EditorRoot,\n EditorContent,\n type EditorContentProps,\n} from \"./components/editor\"\n\nexport { EditorBubble } from \"./components/editor-bubble\"\nexport { EditorBubbleItem } from \"./components/editor-bubble-item\"\nexport {\n EditorCommand,\n EditorCommandList,\n EditorCommandOut,\n} from \"./components/editor-command\"\nexport {\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"./components/editor-command-item\"\n\nexport { Placeholder, StarterKit } from \"./extensions\"\nexport {\n Command as SlashCommand,\n renderItems as renderSlashCommandItems,\n createSuggestionItems,\n handleCommandNavigation,\n} from \"./extensions/slash-command\"\nexport {\n createMentionExtension,\n renderMentionSuggestion,\n MentionCommand,\n type MentionItem,\n type MentionOptions,\n} from \"./extensions/Mention\"\n// Path without extension to satisfy TS/tsup\n// (the file is at ./extensions/slash-command.tsx)\n// eslint-disable-next-line\n","import { EditorProvider } from \"@tiptap/react\"\nimport type { EditorProviderProps } from \"@tiptap/react\"\nimport { forwardRef } from \"react\"\nimport type { FC, ReactNode } from \"react\"\nimport { Provider } from \"jotai\"\nimport { novelStore } from \"../utils/store\"\n\nexport interface EditorRootProps {\n readonly children: ReactNode\n}\n\nexport const EditorRoot: FC<EditorRootProps> = ({ children }) => {\n return (\n <Provider store={novelStore as any}>\n {children as any}\n </Provider>\n )\n}\n\nexport type EditorContentProps = EditorProviderProps & {\n readonly children?: ReactNode\n readonly className?: string\n readonly initialContent?: any\n}\n\nexport const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(\n ({ className, children, initialContent, content, ...rest }, ref) => {\n const effectiveContent = content ?? initialContent\n return (\n <div ref={ref} className={className}>\n <EditorProvider {...rest} content={effectiveContent}>\n {children}\n </EditorProvider>\n </div>\n )\n }\n)\n\nEditorContent.displayName = \"EditorContent\"\n","import { createStore } from \"jotai\";\n\n// biome-ignore lint/suspicious/noExplicitAny: store is opaque to consumers\nexport const novelStore: any = createStore();\nexport * from \"jotai\";\n\n","import { useAtomValue } from \"jotai\"\nimport { forwardRef, useRef, useEffect, useLayoutEffect, useState, useCallback } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { queryAtom, slashMenuOpenAtom, slashMenuRectAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\n\n// EditorCommandOut is no longer needed — kept as a no-op for backward compatibility\nexport const EditorCommandOut = () => null\n\nexport const EditorCommand = forwardRef<HTMLDivElement, any>(\n ({ children, className, ...rest }, ref) => {\n const isOpen = useAtomValue(slashMenuOpenAtom, { store: novelStore })\n const rect = useAtomValue(slashMenuRectAtom, { store: novelStore })\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const contentRef = useRef<HTMLDivElement | null>(null)\n\n // Reset active index when query changes\n const query = useAtomValue(queryAtom, { store: novelStore })\n useEffect(() => {\n setActiveIndex(0)\n }, [query])\n\n // Create portal container once\n if (typeof document !== \"undefined\" && !containerRef.current) {\n const el = document.createElement(\"div\")\n el.style.position = \"fixed\"\n el.style.zIndex = \"9999\"\n el.style.minWidth = \"240px\"\n el.style.display = \"none\"\n containerRef.current = el\n }\n\n // Manage DOM attachment\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n document.body.appendChild(el)\n return () => {\n el.remove()\n }\n }, [])\n\n // Show/hide and position\n useLayoutEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n if (!isOpen || !rect) {\n container.style.display = \"none\"\n return\n }\n\n container.style.display = \"\"\n\n const menuHeight = container.offsetHeight || 360\n const viewportHeight = window.innerHeight\n const spaceBelow = viewportHeight - rect.bottom\n const spaceAbove = rect.top\n\n let top: number\n if (spaceBelow < menuHeight + 16 && spaceAbove > spaceBelow) {\n top = Math.round(rect.top - menuHeight - 8)\n if (top < 8) top = 8\n } else {\n top = Math.round(rect.bottom + 8)\n }\n\n let left = Math.round(rect.left)\n const menuWidth = container.offsetWidth || 280\n if (left + menuWidth > window.innerWidth - 8) {\n left = window.innerWidth - menuWidth - 8\n }\n if (left < 8) left = 8\n\n container.style.top = `${top}px`\n container.style.left = `${left}px`\n }, [isOpen, rect])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen || !contentRef.current) return\n\n const items = contentRef.current.querySelectorAll(\"[role='option']\")\n if (items.length === 0) return\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n setActiveIndex((prev) => {\n const next = Math.min(prev + 1, items.length - 1)\n items[next]?.scrollIntoView({ block: \"nearest\" })\n return next\n })\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n setActiveIndex((prev) => {\n const next = Math.max(prev - 1, 0)\n items[next]?.scrollIntoView({ block: \"nearest\" })\n return next\n })\n } else if (e.key === \"Enter\") {\n e.preventDefault()\n const activeItem = items[activeIndex] as HTMLElement | undefined\n activeItem?.click()\n }\n },\n [isOpen, activeIndex]\n )\n\n useEffect(() => {\n if (!isOpen) return\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [isOpen, handleKeyDown])\n\n // Apply active styling\n useEffect(() => {\n if (!contentRef.current) return\n const items = contentRef.current.querySelectorAll(\"[role='option']\")\n items.forEach((item, i) => {\n if (i === activeIndex) {\n item.setAttribute(\"aria-selected\", \"true\")\n } else {\n item.removeAttribute(\"aria-selected\")\n }\n })\n })\n\n if (!isOpen || !containerRef.current) return null\n\n return createPortal(\n <div\n ref={(el) => {\n contentRef.current = el\n if (typeof ref === \"function\") ref(el)\n else if (ref) ref.current = el\n }}\n id=\"slash-command\"\n className={className}\n {...rest}\n >\n {children}\n </div>,\n containerRef.current\n )\n }\n)\n\n// Simple list wrapper\nexport const EditorCommandList = forwardRef<HTMLDivElement, any>(\n ({ children, ...rest }, ref) => {\n return (\n <div ref={ref} role=\"listbox\" {...rest}>\n {children}\n </div>\n )\n }\n)\n\nEditorCommand.displayName = \"EditorCommand\"\nEditorCommandList.displayName = \"EditorCommandList\"\n","import { atom } from \"jotai\"\nimport type { Range } from \"@tiptap/core\"\n\nexport const queryAtom = atom(\"\")\nexport const rangeAtom = atom<Range | null>(null)\nexport const slashMenuOpenAtom = atom(false)\nexport const slashMenuRectAtom = atom<DOMRect | null>(null)\n","import { forwardRef } from \"react\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport { rangeAtom, queryAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\nimport type { Editor, Range } from \"@tiptap/core\"\n\ninterface EditorCommandItemProps {\n readonly onCommand: ({\n editor,\n range,\n }: {\n editor: Editor\n range: Range\n }) => void\n readonly value?: string\n}\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & any\n>(({ children, onCommand, value, className, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n const range = useAtomValue(rangeAtom, { store: novelStore })\n const query = useAtomValue(queryAtom, { store: novelStore })\n\n if (!editor || !range) return null\n\n // Filter: if query is set, check if this item matches\n if (query && value) {\n const searchText = value.toLowerCase()\n const q = query.toLowerCase()\n if (!searchText.includes(q)) return null\n }\n\n return (\n <div\n ref={ref}\n role=\"option\"\n className={className}\n onClick={() => onCommand({ editor, range })}\n {...rest}\n >\n {children}\n </div>\n )\n})\n\nEditorCommandItem.displayName = \"EditorCommandItem\"\n\nexport const EditorCommandEmpty = forwardRef<HTMLDivElement, any>(\n ({ children, ...rest }, ref) => {\n return (\n <div ref={ref} {...rest}>\n {children}\n </div>\n )\n }\n)\n\nEditorCommandEmpty.displayName = \"EditorCommandEmpty\"\n\nexport default EditorCommandItem\n","export { StarterKit } from \"@tiptap/starter-kit\";\nexport { Placeholder } from \"@tiptap/extension-placeholder\";\n\n// Custom\nexport { CodeBlock } from \"./CodeBlock\";\nexport { Link } from \"./Link\";\nexport { ImageBlock } from \"./ImageBlock\";\nexport type { ImageBlockOptions } from \"./ImageBlock\";\nexport { AISuggestion, AISuggestionPluginKey } from \"./AISuggestion\";\nexport type { AISuggestionOptions } from \"./AISuggestion\";\nexport { createMentionExtension, renderMentionSuggestion, MentionCommand } from \"./Mention\";\nexport type { MentionItem, MentionOptions } from \"./Mention\";\nexport { DragHandle, setDragHandleCallbacks } from \"./DragHandle\";\nexport type { DragHandleCallbacks } from \"./DragHandle\";\nexport { TableKit, Table, TableCell, TableHeader, TableRow } from \"./Table\";\nexport { MarkdownPaste } from \"./MarkdownPaste\";\n","import { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\"\nimport { all, createLowlight } from \"lowlight\"\n\nconst lowlight = createLowlight(all)\n\nexport const CodeBlock = CodeBlockLowlight.configure({\n lowlight,\n})\n","import { mergeAttributes } from \"@tiptap/core\"\nimport TiptapLink from \"@tiptap/extension-link\"\nimport { Plugin } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }: any) {\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"link\",\n }),\n 0,\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(((this as any).parent?.() as any[]) || []),\n new Plugin({\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === \"Escape\" && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n },\n }),\n ]\n },\n}).configure({\n openOnClick: false,\n autolink: true,\n enableClickSelection: true,\n})\n\nexport default Link","import { mergeAttributes, Range } from \"@tiptap/core\"\nimport { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageBlockOptions {\n uploadImage?: (file: File) => Promise<string>\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: { src: string }) => ReturnType\n setImageBlockAt: (attributes: {\n src: string\n pos: number | Range\n }) => ReturnType\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setImageBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const ImageBlock = TiptapImage.extend<ImageBlockOptions>({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n inline: false,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n loading: {\n default: false,\n parseHTML: () => false,\n renderHTML: () => ({}),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]:not([src^=\"data:\"])',\n getAttrs: (element) => {\n const el = element as HTMLElement\n return {\n src: el.getAttribute(\"src\"),\n alt: el.getAttribute(\"alt\"),\n width: el.getAttribute(\"data-width\") || \"100%\",\n align: el.getAttribute(\"data-align\") || \"center\",\n }\n },\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"img\", mergeAttributes(HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n // If no custom node view is provided, we fall back to default behavior\n // but avoid the circular dependency require()\n return null\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageBlockDrop\"),\n props: {\n handleDOMEvents: {\n drop: (view: EditorView, event: DragEvent) => {\n const hasFiles =\n event.dataTransfer &&\n event.dataTransfer.files &&\n event.dataTransfer.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.dataTransfer.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n const { schema } = view.state\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!coordinates) return false\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode = schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n const placeholderTr = view.state.tr.insert(\n coordinates.pos,\n placeholderNode\n )\n view.dispatch(placeholderTr)\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = schema.nodes.imageBlock.create({ src: url })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n paste: (view: EditorView, event: ClipboardEvent) => {\n const hasFiles =\n event.clipboardData &&\n event.clipboardData.files &&\n event.clipboardData.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.clipboardData.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode =\n view.state.schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n view.dispatch(\n view.state.tr.replaceSelectionWith(placeholderNode)\n )\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = view.state.schema.nodes.imageBlock.create({\n src: url,\n })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default ImageBlock\n","import { ReactRenderer, ReactNodeViewRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport Mention from \"@tiptap/extension-mention\"\nimport type { SuggestionOptions } from \"@tiptap/suggestion\"\nimport type { RefObject } from \"react\"\nimport { MentionCommand } from \"./mention-command\"\nimport { MentionNodeView } from \"./mention-node-view\"\n\nexport interface MentionItem {\n id: string\n label: string\n avatar?: string\n email?: string\n type?: \"node\" | \"article\" // For reference mentions\n nodeId?: string // For node references (user-facing ID like \"TSK-1\")\n slug?: string // For article references (URL slug)\n}\n\nexport interface MentionOptions {\n /**\n * Function to fetch/filter mentionable items based on query\n */\n items?: (query: string) => MentionItem[] | Promise<MentionItem[]>\n\n /**\n * Custom render function for mention nodes\n */\n renderLabel?: (props: { node: any; options: any }) => string\n\n /**\n * Character that triggers the mention autocomplete (default: @)\n */\n char?: string\n\n /**\n * Custom name for the extension (to avoid duplicates)\n */\n name?: string\n}\n\n/**\n * Create the mention extension with custom suggestion rendering\n */\nexport const createMentionExtension = (options?: MentionOptions) => {\n const extensionName = options?.name ?? \"mention\"\n\n return Mention.extend({\n name: extensionName,\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {}\n }\n return {\n \"data-id\": attributes.id,\n }\n },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) => {\n if (!attributes.label) {\n return {}\n }\n return {\n \"data-label\": attributes.label,\n }\n },\n },\n avatar: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-avatar\"),\n renderHTML: (attributes) => {\n if (!attributes.avatar) {\n return {}\n }\n return {\n \"data-avatar\": attributes.avatar,\n }\n },\n },\n type: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-ref-type\"),\n renderHTML: (attributes) => {\n if (!attributes.type) {\n return {}\n }\n return {\n \"data-ref-type\": attributes.type,\n }\n },\n },\n nodeId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-node-id\"),\n renderHTML: (attributes) => {\n if (!attributes.nodeId) {\n return {}\n }\n return {\n \"data-node-id\": attributes.nodeId,\n }\n },\n },\n slug: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-slug\"),\n renderHTML: (attributes) => {\n if (!attributes.slug) {\n return {}\n }\n return {\n \"data-slug\": attributes.slug,\n }\n },\n },\n }\n },\n addNodeView() {\n return ReactNodeViewRenderer(MentionNodeView)\n },\n }).configure({\n HTMLAttributes: {\n class: \"mention\",\n },\n suggestion: {\n char: options?.char ?? \"@\",\n items: async ({ query }: { query: string }) => {\n if (!options?.items) return []\n const items = await options.items(query)\n return items\n },\n command: ({ editor, range, props: item }: any) => {\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: extensionName,\n attrs: {\n id: item.id,\n label: item.label,\n avatar: item.avatar,\n type: item.type,\n nodeId: item.nodeId,\n slug: item.slug,\n },\n },\n ])\n .run()\n },\n render: renderMentionSuggestion,\n },\n renderLabel: options?.renderLabel ?? ((props) => {\n return `@${props.node.attrs.label ?? props.node.attrs.id}`\n }),\n })\n}\n\n/**\n * Render function for mention suggestions (autocomplete dropdown)\n */\nexport const renderMentionSuggestion = () => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n\n const gap = 8\n const maxDropdownHeight = 300 // Match the maxHeight from MentionCommand\n const spaceBelow = window.innerHeight - clientRect.bottom\n const spaceAbove = clientRect.top\n\n // Position above if not enough space below, otherwise position below\n const shouldPositionAbove = spaceBelow < maxDropdownHeight && spaceAbove > spaceBelow\n\n const left = Math.round(clientRect.left)\n\n if (shouldPositionAbove) {\n const bottom = Math.round(window.innerHeight - clientRect.top + gap)\n container.style.bottom = `${bottom}px`\n container.style.top = 'auto'\n } else {\n const top = Math.round(clientRect.bottom + gap)\n container.style.top = `${top}px`\n container.style.bottom = 'auto'\n }\n\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: any) => {\n component = new ReactRenderer(MentionCommand, {\n props: {\n items: props.items ?? [],\n command: props.command ?? (() => {}),\n query: props.query ?? \"\",\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n document.body.appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: any) => {\n component?.updateProps({\n items: props.items ?? [],\n command: props.command ?? (() => {}),\n query: props.query ?? \"\",\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!component) return false\n\n if (event.key === \"Escape\") {\n event.preventDefault()\n event.stopPropagation()\n destroy()\n return true\n }\n\n // Handle arrow keys and enter\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n event.preventDefault()\n event.stopPropagation()\n // Let the MentionList component handle keyboard navigation\n return (component.ref as any)?.onKeyDown?.({ event }) ?? false\n }\n\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport default createMentionExtension\n","import { forwardRef, useEffect, useImperativeHandle, useState } from \"react\"\nimport type { MentionItem } from \"./mention\"\n\ninterface MentionCommandProps {\n items: MentionItem[]\n command: (item: MentionItem) => void\n query: string\n}\n\n// Simple Avatar component with inline styles\nfunction Avatar({ src, fallback }: { src?: string; fallback: string }) {\n return (\n <div style={{\n position: \"relative\",\n display: \"flex\",\n height: \"24px\",\n width: \"24px\",\n flexShrink: 0,\n overflow: \"hidden\",\n borderRadius: \"9999px\",\n }}>\n {src ? (\n <img\n style={{\n aspectRatio: \"1\",\n height: \"100%\",\n width: \"100%\",\n }}\n src={src}\n alt={fallback}\n />\n ) : (\n <div style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"9999px\",\n backgroundColor: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n fontSize: \"10px\",\n fontWeight: 600,\n }}>\n {fallback}\n </div>\n )}\n </div>\n )\n}\n\n// Icon component for reference types\nfunction ReferenceIcon({ type }: { type: \"node\" | \"article\" }) {\n if (type === \"node\") {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 3l8 4.5v9l-8 4.5l-8-4.5v-9l8-4.5\"></path>\n <path d=\"M12 12l8-4.5\"></path>\n <path d=\"M12 12v9\"></path>\n <path d=\"M12 12l-8-4.5\"></path>\n </svg>\n )\n }\n\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\"></path>\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\"></path>\n <path d=\"M9 9l1 0\"></path>\n <path d=\"M9 13l6 0\"></path>\n <path d=\"M9 17l6 0\"></path>\n </svg>\n )\n}\n\nexport const MentionCommand = forwardRef<any, MentionCommandProps>((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const selectItem = (index: number) => {\n const item = props.items[index]\n if (item) {\n props.command(item)\n }\n }\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length)\n }\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length)\n }\n\n const enterHandler = () => {\n selectItem(selectedIndex)\n }\n\n useEffect(() => setSelectedIndex(0), [props.items])\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler()\n return true\n }\n\n if (event.key === \"ArrowDown\") {\n downHandler()\n return true\n }\n\n if (event.key === \"Enter\") {\n enterHandler()\n return true\n }\n\n return false\n },\n }))\n\n return (\n <div\n id=\"mention-list\"\n style={{\n backgroundColor: \"var(--popover)\",\n color: \"var(--foreground)\",\n maxHeight: \"300px\",\n minWidth: \"280px\",\n overflow: \"hidden\",\n overflowY: \"auto\",\n borderRadius: \"12px\",\n border: \"1px solid var(--border)\",\n padding: \"4px\",\n boxShadow: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n }}\n >\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n style={{\n position: \"relative\",\n display: \"flex\",\n width: \"100%\",\n cursor: \"default\",\n userSelect: \"none\",\n alignItems: \"center\",\n gap: \"8px\",\n borderRadius: \"4px\",\n padding: \"10px 8px\",\n fontSize: \"14px\",\n outline: \"none\",\n backgroundColor: index === selectedIndex ? \"var(--accent)\" : \"transparent\",\n color: index === selectedIndex ? \"var(--accent-foreground)\" : \"inherit\",\n border: \"none\",\n textAlign: \"left\",\n }}\n >\n {item.type ? (\n <ReferenceIcon type={item.type} />\n ) : (\n <Avatar\n src={item.avatar}\n fallback={item.label.slice(0, 2).toUpperCase()}\n />\n )}\n <span style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}>\n {item.label}\n </span>\n </button>\n ))\n ) : (\n <div style={{\n padding: \"24px 0\",\n textAlign: \"center\",\n fontSize: \"14px\",\n color: \"var(--muted-foreground)\",\n }}>\n No results found\n </div>\n )}\n </div>\n )\n})\n\nMentionCommand.displayName = \"MentionCommand\"\n","import { NodeViewWrapper } from \"@tiptap/react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\n\n// Icon components\nfunction NodeIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 3l8 4.5v9l-8 4.5l-8-4.5v-9l8-4.5\"></path>\n <path d=\"M12 12l8-4.5\"></path>\n <path d=\"M12 12v9\"></path>\n <path d=\"M12 12l-8-4.5\"></path>\n </svg>\n )\n}\n\nfunction ArticleIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\"></path>\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\"></path>\n <path d=\"M9 9l1 0\"></path>\n <path d=\"M9 13l6 0\"></path>\n <path d=\"M9 17l6 0\"></path>\n </svg>\n )\n}\n\nexport const MentionNodeView = (props: NodeViewProps) => {\n const { node } = props\n const { id, label, avatar, type } = node.attrs\n\n // Determine styling based on type\n const isNode = type === \"node\"\n const isArticle = type === \"article\"\n const isReference = isNode || isArticle\n\n const backgroundColor = isArticle\n ? \"rgba(249, 115, 22, 0.15)\" // Orange for articles\n : isNode\n ? \"rgba(107, 114, 128, 0.15)\" // Gray for nodes\n : \"var(--accent)\" // Default for user mentions\n\n const color = isArticle\n ? \"rgb(234, 88, 12)\" // Orange text\n : isNode\n ? \"rgb(75, 85, 99)\" // Gray text\n : \"var(--accent-foreground)\" // Default\n\n const border = isArticle\n ? \"1px solid rgba(249, 115, 22, 0.3)\"\n : isNode\n ? \"1px solid rgba(107, 114, 128, 0.3)\"\n : \"none\"\n\n return (\n <NodeViewWrapper\n as=\"span\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"3px\",\n backgroundColor,\n color,\n border,\n padding: isReference ? \"1px 6px\" : \"1px 6px 1px 1px\",\n borderRadius: \"12px\",\n fontSize: \"13px\",\n fontWeight: 500,\n verticalAlign: \"middle\",\n }}\n >\n {/* Show icon for references */}\n {isNode && <NodeIcon />}\n {isArticle && <ArticleIcon />}\n\n {/* Show avatar for user mentions */}\n {!isReference && avatar && (\n <img\n src={avatar}\n alt={label || id}\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n flexShrink: 0,\n }}\n />\n )}\n {!isReference && !avatar && (\n <div\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n backgroundColor: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"10px\",\n fontWeight: 600,\n flexShrink: 0,\n }}\n >\n {(label || id).slice(0, 2).toUpperCase()}\n </div>\n )}\n <span>{label || id}</span>\n </NodeViewWrapper>\n )\n}\n","import BaseDragHandle from \"@tiptap/extension-drag-handle\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport type { Editor } from \"@tiptap/core\"\n\nexport interface DragHandleCallbacks {\n onAddBlock?: (editor: Editor, node: Node | null) => void\n onGripClick?: (editor: Editor, node: Node | null, element: HTMLElement) => void\n}\n\nlet currentCallbacks: DragHandleCallbacks = {}\nlet currentNode: Node | null = null\nlet currentEditor: Editor | null = null\n\nexport function setDragHandleCallbacks(callbacks: DragHandleCallbacks) {\n currentCallbacks = callbacks\n}\n\nfunction createDragHandleElement(): HTMLElement {\n const container = document.createElement(\"div\")\n container.className = \"nph-drag-handle\"\n\n const plusBtn = document.createElement(\"button\")\n plusBtn.className = \"nph-drag-handle__btn\"\n plusBtn.type = \"button\"\n plusBtn.setAttribute(\"aria-label\", \"Add block\")\n plusBtn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"M5 12h14\"/></svg>`\n plusBtn.addEventListener(\"click\", (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (currentEditor) {\n currentCallbacks.onAddBlock?.(currentEditor, currentNode)\n }\n })\n\n const gripBtn = document.createElement(\"button\")\n gripBtn.className = \"nph-drag-handle__btn nph-drag-handle__grip\"\n gripBtn.type = \"button\"\n gripBtn.setAttribute(\"aria-label\", \"Drag to reorder\")\n gripBtn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/></svg>`\n gripBtn.addEventListener(\"click\", (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (currentEditor) {\n currentCallbacks.onGripClick?.(currentEditor, currentNode, container)\n }\n })\n\n container.appendChild(plusBtn)\n container.appendChild(gripBtn)\n\n return container\n}\n\nexport const DragHandle = BaseDragHandle.configure({\n render: createDragHandleElement,\n nested: true,\n onNodeChange: ({ node, editor }) => {\n currentNode = node\n currentEditor = editor\n },\n})\n\nexport default DragHandle\n","export { TableKit } from \"@tiptap/extension-table\"\nexport { Table, TableCell, TableHeader, TableRow } from \"@tiptap/extension-table\"\n","import { Extension } from \"@tiptap/core\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { MarkdownParser, defaultMarkdownParser } from \"@tiptap/pm/markdown\"\n\nconst markdownPastePluginKey = new PluginKey(\"markdownPaste\")\n\n/**\n * Heuristic: does the plain text look like it contains markdown syntax?\n */\nfunction looksLikeMarkdown(text: string): boolean {\n const patterns = [\n /^#{1,6}\\s/m, // headings\n /^\\s*[-*+]\\s/m, // unordered list\n /^\\s*\\d+\\.\\s/m, // ordered list\n /^\\s*>\\s/m, // blockquote\n /\\|.+\\|/m, // table\n /^```/m, // fenced code block\n /\\*\\*.+\\*\\*/, // bold\n /\\*.+\\*/, // italic\n /~~.+~~/, // strikethrough\n /`[^`]+`/, // inline code\n /^\\s*---\\s*$/m, // horizontal rule\n /^\\s*\\*\\*\\*\\s*$/m, // horizontal rule alt\n /\\[.+\\]\\(.+\\)/, // links\n /!\\[.*\\]\\(.+\\)/, // images\n ]\n // Need at least one markdown pattern match and it shouldn't be HTML\n const hasMarkdown = patterns.some((p) => p.test(text))\n const isHtml = /^<[a-z][\\s\\S]*>/i.test(text.trim())\n return hasMarkdown && !isHtml\n}\n\n/**\n * Build a MarkdownParser configured for TipTap's schema node/mark names.\n * Re-uses the markdown-it tokenizer from prosemirror-markdown's default parser.\n */\nfunction buildParser(schema: any): MarkdownParser | null {\n // Grab the markdown-it tokenizer instance from prosemirror-markdown's default parser\n const md = defaultMarkdownParser.tokenizer\n\n const tokens: Record<string, any> = {}\n\n // Block nodes\n if (schema.nodes.paragraph) tokens.paragraph = { block: \"paragraph\" }\n if (schema.nodes.heading) {\n tokens.heading = {\n block: \"heading\",\n getAttrs: (tok: any) => ({ level: Number(tok.tag.slice(1)) }),\n }\n }\n if (schema.nodes.blockquote) tokens.blockquote = { block: \"blockquote\" }\n if (schema.nodes.bulletList) tokens.bullet_list = { block: \"bulletList\" }\n if (schema.nodes.orderedList) {\n tokens.ordered_list = {\n block: \"orderedList\",\n getAttrs: (tok: any) => ({ start: Number(tok.attrGet(\"start\") || 1) }),\n }\n }\n if (schema.nodes.listItem) tokens.list_item = { block: \"listItem\" }\n if (schema.nodes.codeBlock) {\n tokens.code_block = { block: \"codeBlock\", noCloseToken: true }\n tokens.fence = {\n block: \"codeBlock\",\n getAttrs: (tok: any) => ({ language: tok.info || \"\" }),\n noCloseToken: true,\n }\n }\n if (schema.nodes.horizontalRule) {\n tokens.hr = { node: \"horizontalRule\" }\n }\n if (schema.nodes.hardBreak) {\n tokens.hardbreak = { node: \"hardBreak\" }\n }\n if (schema.nodes.image) {\n tokens.image = {\n node: \"image\",\n getAttrs: (tok: any) => ({\n src: tok.attrGet(\"src\"),\n title: tok.attrGet(\"title\") || null,\n alt: tok.children?.[0]?.content || null,\n }),\n }\n }\n\n // Table support — markdown-it needs the table plugin enabled\n if (schema.nodes.table) {\n tokens.table = { block: \"table\" }\n tokens.thead = { ignore: true }\n tokens.tbody = { ignore: true }\n tokens.tr = { block: \"tableRow\" }\n tokens.th = { block: \"tableHeader\" }\n tokens.td = { block: \"tableCell\" }\n }\n\n // Marks\n if (schema.marks.bold || schema.marks.strong) {\n tokens.strong = { mark: schema.marks.bold ? \"bold\" : \"strong\" }\n }\n if (schema.marks.italic || schema.marks.em) {\n tokens.em = { mark: schema.marks.italic ? \"italic\" : \"em\" }\n }\n if (schema.marks.code) {\n tokens.code_inline = { mark: \"code\", noCloseToken: true }\n }\n if (schema.marks.link) {\n tokens.link = {\n mark: \"link\",\n getAttrs: (tok: any) => ({\n href: tok.attrGet(\"href\"),\n title: tok.attrGet(\"title\") || null,\n }),\n }\n }\n if (schema.marks.strike || schema.marks.strikethrough) {\n tokens.s = { mark: schema.marks.strike ? \"strike\" : \"strikethrough\" }\n }\n\n try {\n return new MarkdownParser(schema, md, tokens)\n } catch {\n return null\n }\n}\n\nexport const MarkdownPaste = Extension.create({\n name: \"markdownPaste\",\n\n addProseMirrorPlugins() {\n const schema = this.editor.schema\n let parser: MarkdownParser | null = null\n\n return [\n new Plugin({\n key: markdownPastePluginKey,\n props: {\n handlePaste(view, event) {\n const clipboardData = event.clipboardData\n if (!clipboardData) return false\n\n // If there's HTML content, let ProseMirror handle it normally\n // (the browser/OS already converted rich content)\n const html = clipboardData.getData(\"text/html\")\n if (html && html.trim().length > 0) return false\n\n const text = clipboardData.getData(\"text/plain\")\n if (!text || !looksLikeMarkdown(text)) return false\n\n // Lazily build parser on first use\n if (!parser) {\n parser = buildParser(schema)\n }\n if (!parser) return false\n\n try {\n const doc = parser.parse(text)\n if (!doc || doc.content.size === 0) return false\n\n const { tr } = view.state\n const slice = doc.slice(0, doc.content.size)\n tr.replaceSelection(slice)\n view.dispatch(tr)\n return true\n } catch {\n // Fall back to default paste behavior\n return false\n }\n },\n },\n }),\n ]\n },\n})\n\nexport default MarkdownPaste\n","import Suggestion from \"@tiptap/suggestion\"\nimport { Extension } from \"@tiptap/core\"\nimport type { ReactNode } from \"react\"\nimport { queryAtom, rangeAtom, slashMenuOpenAtom, slashMenuRectAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\n\nexport const Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: (ctx: any) => {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n },\n } as any,\n }\n },\n addProseMirrorPlugins() {\n const base: any = this.options.suggestion ?? {}\n return [\n Suggestion({\n editor: this.editor,\n char: base.char ?? \"/\",\n startOfLine: base.startOfLine ?? true,\n items: base.items ?? (() => [\"/\"] as any),\n command: (ctx: any) => {\n if (typeof ctx?.props?.command === \"function\") {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n }\n },\n ...base,\n render: () => {\n return {\n onStart: (props: any) => {\n const { selection } = props.editor.state\n const parentNode = selection.$from.node(selection.$from.depth)\n const blockType = parentNode.type.name\n\n if (blockType === \"codeBlock\") return false\n\n const { $from } = selection\n const marks = $from.marks()\n if (marks.some((mark: any) => mark.type.name === \"code\" || mark.type.name === \"link\")) {\n return false\n }\n\n novelStore.set(queryAtom, props.query ?? \"\")\n novelStore.set(rangeAtom, props.range ?? null)\n novelStore.set(slashMenuOpenAtom, true)\n\n const rect = typeof props.clientRect === \"function\" ? props.clientRect() : null\n novelStore.set(slashMenuRectAtom, rect)\n },\n onUpdate: (props: any) => {\n novelStore.set(queryAtom, props.query ?? \"\")\n novelStore.set(rangeAtom, props.range ?? null)\n\n const rect = typeof props.clientRect === \"function\" ? props.clientRect() : null\n novelStore.set(slashMenuRectAtom, rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"Escape\") {\n novelStore.set(slashMenuOpenAtom, false)\n return true\n }\n\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) {\n slashCommand.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: event.key,\n cancelable: true,\n bubbles: true,\n })\n )\n return true\n }\n }\n\n return false\n },\n onExit: () => {\n novelStore.set(slashMenuOpenAtom, false)\n novelStore.set(queryAtom, \"\")\n novelStore.set(rangeAtom, null)\n novelStore.set(slashMenuRectAtom, null)\n },\n }\n },\n }),\n ]\n },\n})\n\nexport const renderItems = () => ({\n onStart: () => {},\n onUpdate: () => {},\n onKeyDown: () => false,\n onExit: () => {},\n})\n\nexport interface SuggestionItem {\n title: string\n description: string\n icon: ReactNode\n searchTerms?: string[]\n command?: (props: {\n editor: any\n range: { from: number; to: number }\n }) => void\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items\n\nexport const handleCommandNavigation = (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) return true\n }\n}\n","import Collaboration from \"@tiptap/extension-collaboration\"\nimport CollaborationCaret from \"@tiptap/extension-collaboration-caret\"\nimport { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport Underline from \"@tiptap/extension-underline\"\nimport {\n Command as SlashCommand,\n} from \"./slash-command\"\nimport { ImageBlock } from \"./ImageBlock/ImageBlock\"\nimport { VideoBlock } from \"./VideoBlock/VideoBlock\"\nimport { createMentionExtension } from \"./Mention\"\nimport type { MentionOptions } from \"./Mention\"\nimport { DragHandle, setDragHandleCallbacks } from \"./DragHandle\"\nimport type { DragHandleCallbacks } from \"./DragHandle\"\nimport { TableKit } from \"./Table\"\nimport { MarkdownPaste } from \"./MarkdownPaste\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n provider?: any\n user?: { name: string; color: string; [key: string]: any }\n }\n imageBlockView?: any\n videoBlockView?: any\n mention?: MentionOptions\n reference?: MentionOptions\n slashCommand?: boolean\n dragHandle?: boolean\n dragHandleCallbacks?: DragHandleCallbacks\n table?: boolean\n placeholder?: string\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => {\n const enableSlashCommand = options?.slashCommand !== false // Default to true\n\n const extensions = [\n StarterKit.configure({ codeBlock: false, link: false }),\n CodeBlock,\n Link,\n Underline,\n ImageBlock.configure({\n uploadImage: options?.uploadImage,\n nodeView: options?.imageBlockView,\n }),\n VideoBlock.configure({\n nodeView: options?.videoBlockView,\n }),\n Placeholder.configure({\n placeholder: ({ node }: any) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`\n }\n // Use custom placeholder if provided, otherwise show slash command hint if enabled\n if (options?.placeholder) {\n return options.placeholder\n }\n return enableSlashCommand ? \"Press '/' for commands\" : \"\"\n },\n includeChildren: true,\n }),\n MarkdownPaste,\n ]\n\n // Add Table support if enabled\n if (options?.table !== false) {\n extensions.push(\n TableKit.configure({\n resizable: true,\n lastColumnResizable: true,\n allowTableNodeSelection: true,\n }) as any\n )\n }\n\n // Add DragHandle if enabled\n if (options?.dragHandle !== false) {\n extensions.push(DragHandle as any)\n if (options?.dragHandleCallbacks) {\n setDragHandleCallbacks(options.dragHandleCallbacks)\n }\n }\n\n // Add SlashCommand if enabled\n if (enableSlashCommand) {\n extensions.push(\n SlashCommand.configure({\n suggestion: {\n char: \"/\",\n allowSpaces: true,\n allowedPrefixes: null,\n },\n })\n )\n }\n\n // Add Mention extension if configured\n if (options?.mention) {\n const mentionExt = createMentionExtension(options.mention)\n extensions.push(mentionExt)\n }\n\n // Add Reference extension if configured (uses same Mention extension with different config)\n if (options?.reference) {\n const referenceExt = createMentionExtension({\n ...options.reference,\n name: \"reference\", // Use unique name to avoid conflicts\n })\n extensions.push(referenceExt)\n }\n\n if (options?.collaboration?.doc) {\n extensions.push(\n Collaboration.configure({\n document: options.collaboration.doc,\n field: options.collaboration.field,\n }),\n )\n\n // Add collaboration carets if provider and user are available\n if (options.collaboration.provider && options.collaboration.user) {\n extensions.push(\n CollaborationCaret.configure({\n provider: options.collaboration.provider,\n user: options.collaboration.user,\n render: (user: Record<string, any>) => {\n const cursor = document.createElement(\"span\")\n cursor.classList.add(\"nph-collab-caret\")\n cursor.setAttribute(\"style\", `border-color: ${user.color || \"#3b82f6\"}`)\n\n const label = document.createElement(\"div\")\n label.classList.add(\"nph-collab-caret__label\")\n label.setAttribute(\"style\", `background-color: ${user.color || \"#3b82f6\"}`)\n label.insertBefore(document.createTextNode(user.name || \"Anonymous\"), null)\n\n cursor.insertBefore(label, null)\n return cursor\n },\n selectionRender: (user: Record<string, any>) => ({\n nodeName: \"span\",\n class: \"nph-collab-selection\",\n style: `background-color: ${user.color || \"#3b82f6\"}20`,\n }),\n }) as any\n )\n }\n }\n\n return extensions\n}\n\nexport default ExtensionKit\n","import { mergeAttributes, Node } from \"@tiptap/core\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\n\nexport interface VideoBlockOptions {\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n videoBlock: {\n setVideoBlock: (attributes: { src: string }) => ReturnType\n setVideoBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setVideoBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const VideoBlock = Node.create<VideoBlockOptions>({\n name: \"videoBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n atom: true,\n\n addOptions() {\n return {\n nodeView: undefined,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-src\"),\n renderHTML: (attributes) => ({\n \"data-src\": attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"video-block\"]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, { \"data-type\": \"video-block\" }),\n ]\n },\n\n addCommands() {\n return {\n setVideoBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"videoBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setVideoBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"videoBlock\", { align }),\n\n setVideoBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"videoBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n return null\n },\n})\n\nexport default VideoBlock\n","import { NodeSelection } from \"@tiptap/pm/state\"\nimport { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconUnderline,\n IconStrikethrough,\n IconCode,\n IconArrowBackUp,\n IconLink,\n IconCheck,\n IconX,\n} from \"@tabler/icons-react\"\nimport type { ReactNode } from \"react\"\nimport { Fragment, useState, useRef, useEffect } from \"react\"\nimport { MenuList } from \"./MenuList\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type TextMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nfunction Separator() {\n return <div className=\"nph-bubble-separator\" />\n}\n\nexport function TextMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: TextMenuProps) {\n const { editor } = useCurrentEditor()\n const [isAddingLink, setIsAddingLink] = useState(false)\n const [linkUrl, setLinkUrl] = useState(\"\")\n const linkInputRef = useRef<HTMLInputElement | null>(null)\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n return {\n isBold: ctx.editor.isActive(\"bold\"),\n isItalic: ctx.editor.isActive(\"italic\"),\n isUnderline: ctx.editor.isActive(\"underline\"),\n isStrike: ctx.editor.isActive(\"strike\"),\n isCode: ctx.editor.isActive(\"code\"),\n isCodeBlock: ctx.editor.isActive(\"codeBlock\"),\n isParagraph: ctx.editor.isActive(\"paragraph\"),\n isHeading: ctx.editor.isActive(\"heading\"),\n isList:\n ctx.editor.isActive(\"bulletList\") ||\n ctx.editor.isActive(\"orderedList\"),\n isBlockquote: ctx.editor.isActive(\"blockquote\"),\n }\n },\n })\n\n useEffect(() => {\n if (isAddingLink && linkInputRef.current) {\n linkInputRef.current.focus()\n }\n }, [isAddingLink])\n\n if (!editor || !editorState) return null\n\n const handleSetLink = () => {\n if (!linkUrl) return\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: linkUrl }).run()\n setIsAddingLink(false)\n setLinkUrl(\"\")\n }\n\n const handleCancelLink = () => {\n setIsAddingLink(false)\n setLinkUrl(\"\")\n editor.chain().focus().run()\n }\n\n const hasAnyMarksInSelection = () => {\n const anyEditor: any = editor\n const state = anyEditor.state\n const sel: any = state.selection\n let has = false\n state.doc.nodesBetween(sel.from, sel.to, (node: any) => {\n if (node.isText && node.marks && node.marks.length > 0) {\n has = true\n return false\n }\n return undefined\n })\n if (!has && sel.empty) {\n const marks = state.storedMarks || sel.$from.marks()\n if (marks && marks.length > 0) has = true\n }\n return has\n }\n\n const isInCode = editorState.isCode || editorState.isCodeBlock\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state, from, to, view }) => {\n // Don't show if imageBlock or videoBlock is active\n if (e.isActive(\"imageBlock\")) return false\n if (e.isActive(\"videoBlock\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection instanceof NodeSelection) return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // Don't show if link is active (LinkMenu will handle this)\n if (e.isActive(\"link\")) return false\n\n // Check if the selection contains an imageBlock node\n let hasImage = false\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === \"imageBlock\" || node.type.name === \"videoBlock\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <MenuList editor={editor} />\n <Separator />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isBold ? \" is-active\" : \"\"}`}\n disabled={isInCode}\n aria-disabled={isInCode}\n aria-pressed={editorState.isBold}\n aria-label=\"Toggle bold\"\n >\n <IconBold size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isItalic ? \" is-active\" : \"\"}`}\n disabled={isInCode}\n aria-disabled={isInCode}\n aria-pressed={editorState.isItalic}\n aria-label=\"Toggle italic\"\n >\n <IconItalic size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isUnderline ? \" is-active\" : \"\"}`}\n disabled={isInCode}\n aria-disabled={isInCode}\n aria-pressed={editorState.isUnderline}\n aria-label=\"Toggle underline\"\n >\n <IconUnderline size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isStrike ? \" is-active\" : \"\"}`}\n disabled={isInCode}\n aria-disabled={isInCode}\n aria-pressed={editorState.isStrike}\n aria-label=\"Toggle strike\"\n >\n <IconStrikethrough size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleCode().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isCode ? \" is-active\" : \"\"}`}\n disabled={editorState.isCodeBlock}\n aria-disabled={editorState.isCodeBlock}\n aria-pressed={editorState.isCode}\n aria-label=\"Toggle inline code\"\n >\n <IconCode size={16} />\n </button>\n <Separator />\n {!isAddingLink ? (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setIsAddingLink(true)}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editor.isActive(\"link\") ? \" is-active\" : \"\"}`}\n disabled={isInCode}\n aria-disabled={isInCode}\n aria-pressed={editor.isActive(\"link\")}\n aria-label=\"Add link\"\n >\n <IconLink size={16} />\n </button>\n ) : (\n <>\n <input\n ref={linkInputRef}\n type=\"url\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleSetLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n handleCancelLink()\n }\n }}\n placeholder=\"https://example.com\"\n className=\"nph-link-input\"\n style={{\n padding: \"4px 8px\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n minWidth: \"200px\",\n fontSize: \"14px\",\n }}\n />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleSetLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Apply\"\n title=\"Apply\"\n disabled={!linkUrl}\n >\n <IconCheck size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleCancelLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Cancel\"\n title=\"Cancel\"\n >\n <IconX size={16} />\n </button>\n </>\n )}\n\n {(() => {\n const hasInlineMarks = hasAnyMarksInSelection()\n\n const isPlainParagraph =\n editorState.isParagraph &&\n !editorState.isHeading &&\n !editorState.isList &&\n !editorState.isBlockquote &&\n !editorState.isCodeBlock &&\n !hasInlineMarks\n\n return (\n <>\n <Separator />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .setParagraph()\n .unsetAllMarks()\n .run()\n }\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Revert to paragraph\"\n title=\"Revert to paragraph\"\n disabled={isPlainParagraph}\n aria-disabled={isPlainParagraph}\n >\n <IconArrowBackUp size={16} />\n </button>\n </>\n )\n })()}\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default TextMenu\n","import React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconChevronDown,\n IconSourceCode,\n} from \"@tabler/icons-react\"\n\nexport type MenuListProps = {\n editor: any\n className?: string\n style?: React.CSSProperties\n onSelect?: () => void\n buttonClassName?: string\n}\n\nexport function MenuList({\n editor,\n className,\n style,\n onSelect,\n buttonClassName,\n}: MenuListProps) {\n const [open, setOpen] = useState(false)\n const [label, setLabel] = useState(\"Paragraph\")\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const computeLabel = useCallback(() => {\n if (!editor) return \"Paragraph\"\n if (editor.isActive(\"heading\", { level: 1 })) return \"Heading 1\"\n if (editor.isActive(\"heading\", { level: 2 })) return \"Heading 2\"\n if (editor.isActive(\"heading\", { level: 3 })) return \"Heading 3\"\n if (editor.isActive(\"heading\", { level: 4 })) return \"Heading 4\"\n if (editor.isActive(\"bulletList\")) return \"Bullet list\"\n if (editor.isActive(\"orderedList\")) return \"Ordered list\"\n if (editor.isActive(\"blockquote\")) return \"Quote\"\n if (editor.isActive(\"code\")) return \"Code\"\n if (editor.isActive(\"codeBlock\")) return \"Code Block\"\n return \"Paragraph\"\n }, [editor])\n\n useEffect(() => {\n setLabel(computeLabel())\n if (!editor) return\n const update = () => setLabel(computeLabel())\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor, computeLabel])\n\n useEffect(() => {\n if (!editor) return\n const close = () => setOpen(false)\n editor.on(\"selectionUpdate\", close)\n editor.on(\"blur\", close)\n return () => {\n editor.off(\"selectionUpdate\", close)\n editor.off(\"blur\", close)\n }\n }, [editor])\n\n useEffect(() => {\n const handlePointerDown = (e: MouseEvent) => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n if (!el.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [open])\n\n const handle = (fn: () => void) => () => {\n fn()\n onSelect?.()\n setOpen(false)\n }\n\n const isActive = useCallback((name: string) => label === name, [label])\n\n return (\n <div ref={rootRef} className=\"nph-dropdown\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={\n buttonClassName ??\n `nph-btn nph-btn-ghost nph-btn-xs${open || label !== \"Paragraph\" ? \" is-active\" : \"\"}`\n }\n aria-expanded={open}\n aria-label=\"Change block type\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span style={{ fontSize: 12 }}>{label}</span>\n <IconChevronDown size={16} />\n </span>\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel nph-command\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <div\n className={className ? className : \"nph-command__list\"}\n style={{ maxHeight: 240, ...(style ?? {}) }}\n >\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Paragraph\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Paragraph\")}\n onClick={handle(() =>\n (editor as any).chain().focus().setParagraph().run()\n )}\n >\n <IconTypography size={16} />\n <span>Paragraph</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 1\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 1\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 1 })\n .run()\n )}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 2\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 2\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 2 })\n .run()\n )}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 3\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 3\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 3 })\n .run()\n )}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 4\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 4\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 4 })\n .run()\n )}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Bullet list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Bullet list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBulletList().run()\n )}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Ordered list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Ordered list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleOrderedList().run()\n )}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Quote\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Quote\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBlockquote().run()\n )}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCode().run()\n )}\n >\n <IconCode size={16} />\n <span>Code</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code Block\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code Block\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCodeBlock().run()\n )}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default MenuList\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport {\n EditorCommand,\n EditorCommandList,\n EditorCommandItem,\n} from \"../../headless\"\nimport { queryAtom } from \"../../headless/utils/atoms\"\nimport { novelStore } from \"../../headless/utils/store\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconSourceCode,\n IconPhoto,\n IconVideo,\n IconMinus,\n IconTable,\n IconListCheck,\n} from \"@tabler/icons-react\"\nimport type { ComponentType } from \"react\"\nimport { useMemo } from \"react\"\n\ntype SlashCommandItem = {\n value: string\n label: string\n description: string\n icon: ComponentType<{ size?: number }>\n onCommand: (args: { editor: any; range: { from: number; to: number } }) => void\n}\n\ntype SlashCommandGroup = {\n group: string\n items: SlashCommandItem[]\n}\n\nconst SLASH_COMMANDS: SlashCommandGroup[] = [\n {\n group: \"Format\",\n items: [\n {\n value: \"paragraph text\",\n label: \"Paragraph\",\n description: \"Plain text block\",\n icon: IconTypography,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).setParagraph().run(),\n },\n {\n value: \"heading1 h1\",\n label: \"Heading 1\",\n description: \"Large section heading\",\n icon: IconH1,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleHeading({ level: 1 }).run(),\n },\n {\n value: \"heading2 h2\",\n label: \"Heading 2\",\n description: \"Medium section heading\",\n icon: IconH2,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleHeading({ level: 2 }).run(),\n },\n {\n value: \"heading3 h3\",\n label: \"Heading 3\",\n description: \"Small section heading\",\n icon: IconH3,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleHeading({ level: 3 }).run(),\n },\n {\n value: \"heading4 h4\",\n label: \"Heading 4\",\n description: \"Subsection heading\",\n icon: IconH4,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleHeading({ level: 4 }).run(),\n },\n ],\n },\n {\n group: \"Lists\",\n items: [\n {\n value: \"bullet list ul\",\n label: \"Bullet List\",\n description: \"Unordered list of items\",\n icon: IconList,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleBulletList().run(),\n },\n {\n value: \"ordered list ol numbered\",\n label: \"Numbered List\",\n description: \"Ordered list of items\",\n icon: IconListNumbers,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleOrderedList().run(),\n },\n {\n value: \"task list todo checklist\",\n label: \"Task List\",\n description: \"Checklist of to-do items\",\n icon: IconListCheck,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleTaskList().run(),\n },\n {\n value: \"quote blockquote\",\n label: \"Blockquote\",\n description: \"Highlight a quote or excerpt\",\n icon: IconBlockquote,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleBlockquote().run(),\n },\n ],\n },\n {\n group: \"Insert\",\n items: [\n {\n value: \"image photo picture\",\n label: \"Image\",\n description: \"Upload or embed an image\",\n icon: IconPhoto,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).setImageBlock({ src: \"\" }).run(),\n },\n {\n value: \"video embed youtube vimeo\",\n label: \"Video\",\n description: \"Embed a YouTube or Vimeo video\",\n icon: IconVideo,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).setVideoBlock({ src: \"\" }).run(),\n },\n {\n value: \"table grid\",\n label: \"Table\",\n description: \"Insert a table with rows and columns\",\n icon: IconTable,\n onCommand: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).run()\n if (editor.commands.insertTable) {\n editor.commands.insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n }\n },\n },\n {\n value: \"code block codeblock\",\n label: \"Code Block\",\n description: \"Syntax-highlighted code block\",\n icon: IconSourceCode,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleCodeBlock().run(),\n },\n {\n value: \"code inline\",\n label: \"Inline Code\",\n description: \"Mark text as inline code\",\n icon: IconCode,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleCode().run(),\n },\n {\n value: \"divider horizontal rule separator\",\n label: \"Divider\",\n description: \"Horizontal separator line\",\n icon: IconMinus,\n onCommand: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).setHorizontalRule().run(),\n },\n ],\n },\n]\n\nexport type SlashMenuProps = {\n className?: string\n}\n\nexport function SlashMenu({ className }: SlashMenuProps) {\n const { editor } = useCurrentEditor()\n const query = useAtomValue(queryAtom, { store: novelStore })\n\n // Pre-filter groups to determine if we should show empty state\n const filteredGroups = useMemo(() => {\n if (!query) return SLASH_COMMANDS\n const q = query.toLowerCase()\n return SLASH_COMMANDS.map((group) => ({\n ...group,\n items: group.items.filter((item) => item.value.toLowerCase().includes(q)),\n })).filter((group) => group.items.length > 0)\n }, [query])\n\n if (!editor) return null\n\n return (\n <EditorCommand className={className ?? \"nph-command\"}>\n <EditorCommandList\n className=\"nph-command__list\"\n style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\n >\n {filteredGroups.length === 0 ? (\n <div style={{ padding: \"8px 12px\", fontSize: 14, color: \"var(--muted-foreground, #6b7280)\" }}>\n No commands found\n </div>\n ) : (\n filteredGroups.map((group) => (\n <div key={group.group}>\n <div className=\"nph-command__group-header\">{group.group}</div>\n {group.items.map((item) => {\n const Icon = item.icon\n return (\n <EditorCommandItem\n key={item.value}\n value={item.value}\n className=\"nph-command__item\"\n onCommand={item.onCommand}\n >\n <div className=\"nph-command__item-icon\">\n <Icon size={18} />\n </div>\n <div className=\"nph-command__item-content\">\n <span className=\"nph-command__item-title\">{item.label}</span>\n <span className=\"nph-command__item-description\">{item.description}</span>\n </div>\n </EditorCommandItem>\n )\n })}\n </div>\n ))\n )}\n </EditorCommandList>\n </EditorCommand>\n )\n}\n\nexport default SlashMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useState, useRef, useEffect } from \"react\"\nimport {\n IconLink,\n IconExternalLink,\n IconTrash,\n IconCheck,\n IconX,\n} from \"@tabler/icons-react\"\n\nexport function LinkMenu() {\n const { editor } = useCurrentEditor()\n const [url, setUrl] = useState<string>(\"\")\n const [isEditing, setIsEditing] = useState(false)\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n const currentUrl = editor?.getAttributes(\"link\")?.href || \"\"\n\n useEffect(() => {\n setUrl(currentUrl)\n }, [currentUrl])\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const handleSetLink = useCallback(() => {\n if (!editor || !url) return\n\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run()\n\n setIsEditing(false)\n }, [editor, url])\n\n const handleRemoveLink = useCallback(() => {\n if (!editor) return\n\n editor.chain().focus().unsetLink().run()\n setIsEditing(false)\n }, [editor])\n\n const handleOpenLink = useCallback(() => {\n if (url || currentUrl) {\n window.open(url || currentUrl, \"_blank\", \"noopener,noreferrer\")\n }\n }, [url, currentUrl])\n\n if (!editor) return null\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey=\"linkBubbleMenu\"\n shouldShow={({ editor: e, state }) => {\n // Show when link is active (whether selection is empty or not)\n return e.isActive(\"link\")\n }}\n updateDelay={0}\n >\n <div className=\"bubble-menu\">\n {!isEditing ? (\n <>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setIsEditing(true)}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Edit link\"\n title={currentUrl}\n >\n <IconLink size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleOpenLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Open link\"\n title=\"Open link in new tab\"\n >\n <IconExternalLink size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleRemoveLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Remove link\"\n title=\"Remove link\"\n >\n <IconTrash size={16} />\n </button>\n </>\n ) : (\n <>\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleSetLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setUrl(currentUrl)\n setIsEditing(false)\n }\n }}\n placeholder=\"https://example.com\"\n className=\"nph-link-input\"\n style={{\n padding: \"4px 8px\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n minWidth: \"200px\",\n fontSize: \"14px\",\n }}\n />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleSetLink}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Apply\"\n title=\"Apply\"\n disabled={!url}\n >\n <IconCheck size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setUrl(currentUrl)\n setIsEditing(false)\n }}\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Cancel\"\n title=\"Cancel\"\n >\n <IconX size={16} />\n </button>\n </>\n )}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default LinkMenu\n","import { NodeSelection } from \"@tiptap/pm/state\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { Fragment, useEffect, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type ImageMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function ImageMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: ImageMenuProps) {\n const { editor } = useCurrentEditor()\n const [size, setSize] = useState<number>(100)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"left\")\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\") ?? {\n width: \"\",\n align: \"left\",\n }\n const width = attrs.width ?? \"\"\n if (width.includes(\"%\")) {\n setSize(parseInt(width) || 100)\n } else {\n setSize(100)\n }\n setAlign(attrs.align ?? \"left\")\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor])\n\n if (!editor) return null\n\n const updateImageSize = (newSize: number) => {\n setSize(newSize)\n editor.commands.setImageBlockWidth(newSize)\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.setImageBlockAlign(newAlign)\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n editor.commands.updateAttributes(\"imageBlock\", { src: \"\", loading: false })\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"imageBlock\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection instanceof NodeSelection\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`image-leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\" }}>\n {size}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"5\"\n value={size}\n onChange={(e) => updateImageSize(parseInt(e.target.value))}\n onMouseDown={(e) => e.stopPropagation()}\n style={{ flex: 1 }}\n />\n </div>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"left\")}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"center\")}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"right\")}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Upload new image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={triggerUpload}\n >\n <IconUpload size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeImage}\n >\n <IconTrash size={16} />\n </button>\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`image-trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockMenu } from \"./ImageBlockMenu\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\nimport { ImageResizeHandle } from \"./ImageResizeHandle\"\n\ninterface ImageBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const ImageBlockView = (props: ImageBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n alt?: string\n loading?: boolean\n }\n }\n }\n const imageWrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align, alt, loading } = node.attrs\n\n const handleUpload = useCallback(\n (url: string) => {\n updateAttributes({ src: url, loading: false })\n },\n [updateAttributes]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n const handleResize = useCallback(\n (widthPercent: number) => {\n updateAttributes({ width: `${widthPercent}%` })\n },\n [updateAttributes]\n )\n\n // Calculate wrapper style based on alignment and width\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // The inner content wrapper for positioning the menu\n const getContentStyle = (): React.CSSProperties => ({\n position: \"relative\" as const,\n })\n\n // Show uploader if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper style={{ width: \"100%\", marginTop: \"0.5rem\", marginBottom: \"0.5rem\" }}>\n <div ref={imageWrapperRef}>\n <ImageUploader onUpload={handleUpload} editor={editor} />\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show loading placeholder\n if (loading) {\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageBlockLoading />\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the actual image\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={getContentStyle()}>\n <ImageResizeHandle onResize={handleResize} currentWidth={width}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n className=\"nph-image-block\"\n />\n </ImageResizeHandle>\n <ImageBlockMenu editor={editor} getPos={getPos} appendTo={imageWrapperRef} />\n </div>\n </NodeViewWrapper>\n )\n}\n\nexport default ImageBlockView\n","import { NodeSelection } from \"@tiptap/pm/state\"\nimport { Editor, useEditorState } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockWidth } from \"./ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type ImageBlockMenuProps = {\n editor: Editor\n getPos: () => number\n appendTo?: React.RefObject<HTMLElement | null>\n}\n\nexport const ImageBlockMenu = ({ editor, getPos, appendTo }: ImageBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n\n const { isVisible, align, width } = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return { isVisible: false, align: \"center\" as const, width: 100 }\n const { state } = ctx.editor\n const { selection } = state\n const isNodeSel = selection instanceof NodeSelection\n const isThisNode = isNodeSel && selection.from === getPos()\n const visible = isThisNode\n\n let currentAlign: \"left\" | \"center\" | \"right\" = \"center\"\n let currentWidth = 100\n if (visible) {\n const attrs = ctx.editor.getAttributes(\"imageBlock\")\n currentAlign = attrs.align || \"center\"\n const widthStr = attrs.width || \"100%\"\n currentWidth = parseInt(widthStr) || 100\n }\n return { isVisible: visible, align: currentAlign, width: currentWidth }\n },\n })\n\n const onAlignImageLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignImageCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignImageRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemoveImage = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n if (!isVisible) return null\n\n return (\n <div\n className=\"bubble-menu\"\n ref={menuRef}\n style={{\n position: \"absolute\",\n top: \"-40px\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: \"var(--nph-z, 50)\",\n }}\n >\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemoveImage}\n >\n <IconTrash size={16} />\n </button>\n </div>\n )\n}\n\nexport default ImageBlockMenu\n","import { memo, useCallback, useEffect, useState } from \"react\"\n\nexport type ImageBlockWidthProps = {\n onChange: (value: number) => void\n value: number\n}\n\nexport const ImageBlockWidth = memo(\n ({ onChange, value }: ImageBlockWidthProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = parseInt(e.target.value)\n onChange(nextValue)\n setCurrentValue(nextValue)\n },\n [onChange]\n )\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\", width: 40 }}>\n {currentValue}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"25\"\n value={currentValue}\n onChange={handleChange}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n height: 3,\n borderRadius: 9999,\n appearance: \"none\",\n background: \"linear-gradient(to right, #333 0%, #333 \" + currentValue + \"%, #ddd \" + currentValue + \"%, #ddd 100%)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n className=\"nph-image-width-slider\"\n />\n </div>\n )\n }\n)\n\nImageBlockWidth.displayName = \"ImageBlockWidth\"\n\nexport default ImageBlockWidth\n","import { IconPhoto, IconUpload } from \"@tabler/icons-react\"\nimport { ChangeEvent, useCallback, useRef, useState, DragEvent } from \"react\"\nimport { Editor } from \"@tiptap/react\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\nexport type ImageUploaderProps = {\n onUpload: (url: string) => void\n editor: Editor\n}\n\nexport const ImageUploader = ({ onUpload, editor }: ImageUploaderProps) => {\n const [loading, setLoading] = useState(false)\n const [draggedInside, setDraggedInside] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\n // Get the upload handler from the editor\n const imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const uploadImage = (imageExtension?.options as any)?.uploadImage\n\n if (uploadImage) {\n const url = await uploadImage(file)\n onUpload(url)\n } else {\n console.error(\"No uploadImage handler provided\")\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n } finally {\n setLoading(false)\n }\n },\n [editor, onUpload]\n )\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const onFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n\n const file = e.dataTransfer.files[0]\n if (file && /image/i.test(file.type)) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(true)\n }, [])\n\n const onDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n }, [])\n\n if (loading) {\n return <ImageBlockLoading />\n }\n\n return (\n <div\n className={`nph-image-uploader${draggedInside ? \" nph-image-uploader--dragging\" : \"\"}`}\n onDrop={onDrop}\n onDragOver={onDragEnter}\n onDragLeave={onDragLeave}\n contentEditable={false}\n >\n <IconPhoto size={48} className=\"nph-image-uploader__icon\" />\n <div className=\"nph-image-uploader__content\">\n <div className=\"nph-image-uploader__text\">\n {draggedInside ? \"Drop image here\" : \"Drag and drop or\"}\n </div>\n <div>\n <button\n type=\"button\"\n disabled={draggedInside}\n onClick={handleUploadClick}\n className=\"nph-btn nph-btn-ghost nph-btn-sm nph-image-uploader__button\"\n >\n <IconUpload size={16} />\n Upload an image\n </button>\n </div>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".jpg,.jpeg,.png,.webp,.gif\"\n onChange={onFileChange}\n className=\"nph-image-uploader__input\"\n />\n </div>\n )\n}\n\nexport default ImageUploader\n","import { IconLoader2 } from \"@tabler/icons-react\"\n\nexport const ImageBlockLoading = () => {\n return (\n <div className=\"nph-image-block-loading\">\n <div className=\"nph-image-block-loading__overlay\">\n <div className=\"nph-image-block-loading__content\">\n <IconLoader2 size={24} className=\"nph-image-block-loading__spinner\" />\n <p className=\"nph-image-block-loading__text\">Uploading image...</p>\n </div>\n </div>\n <div className=\"nph-image-block-loading__placeholder\" />\n </div>\n )\n}\n\nexport default ImageBlockLoading\n","import { useCallback, useRef, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\nexport type ImageResizeHandleProps = {\n children: ReactNode\n onResize: (widthPercent: number) => void\n currentWidth?: string\n}\n\nexport function ImageResizeHandle({\n children,\n onResize,\n currentWidth,\n}: ImageResizeHandleProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isResizing, setIsResizing] = useState(false)\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent, side: \"left\" | \"right\") => {\n e.preventDefault()\n e.stopPropagation()\n setIsResizing(true)\n\n const startX = e.clientX\n const containerEl = containerRef.current\n if (!containerEl) return\n\n const editorEl = containerEl.closest(\".nph-editor\") || containerEl.parentElement\n if (!editorEl) return\n\n const editorWidth = editorEl.getBoundingClientRect().width\n const startWidth = containerEl.getBoundingClientRect().width\n const startPercent = (startWidth / editorWidth) * 100\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = moveEvent.clientX - startX\n const direction = side === \"right\" ? 1 : -1\n const deltaPercent = (deltaX * direction / editorWidth) * 100 * 2 // *2 because resizing from center\n const newPercent = Math.max(10, Math.min(100, startPercent + deltaPercent))\n onResize(Math.round(newPercent))\n }\n\n const handleMouseUp = () => {\n setIsResizing(false)\n document.removeEventListener(\"mousemove\", handleMouseMove)\n document.removeEventListener(\"mouseup\", handleMouseUp)\n }\n\n document.addEventListener(\"mousemove\", handleMouseMove)\n document.addEventListener(\"mouseup\", handleMouseUp)\n },\n [onResize]\n )\n\n return (\n <div\n ref={containerRef}\n className={`nph-resize-wrapper${isResizing ? \" nph-resize-wrapper--active\" : \"\"}`}\n >\n {children}\n <div\n className=\"nph-resize-handle nph-resize-handle--left\"\n onMouseDown={(e) => handleMouseDown(e, \"left\")}\n />\n <div\n className=\"nph-resize-handle nph-resize-handle--right\"\n onMouseDown={(e) => handleMouseDown(e, \"right\")}\n />\n </div>\n )\n}\n\nexport default ImageResizeHandle\n","import { Node } from \"@tiptap/pm/model\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\nimport { Editor, NodeViewWrapper, useEditorState } from \"@tiptap/react\"\nimport { useCallback, useRef, useState } from \"react\"\nimport { VideoBlockMenu } from \"./VideoBlockMenu\"\nimport { IconVideo } from \"@tabler/icons-react\"\n\nfunction toEmbedUrl(url: string): string {\n // YouTube: youtube.com/watch?v=ID or youtu.be/ID\n const ytMatch = url.match(\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([\\w-]+)/\n )\n if (ytMatch) {\n return `https://www.youtube.com/embed/${ytMatch[1]}`\n }\n\n // Vimeo: vimeo.com/ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(\\d+)/)\n if (vimeoMatch) {\n return `https://player.vimeo.com/video/${vimeoMatch[1]}`\n }\n\n return url\n}\n\ninterface VideoBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const VideoBlockView = (props: VideoBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as VideoBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n }\n }\n }\n const wrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align } = node.attrs\n const [inputUrl, setInputUrl] = useState(\"\")\n\n const isSelected = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return false\n const { selection } = ctx.editor.state\n return selection instanceof NodeSelection && selection.from === getPos()\n },\n })\n\n const handleEmbed = useCallback(() => {\n if (!inputUrl.trim()) return\n const embedUrl = toEmbedUrl(inputUrl.trim())\n updateAttributes({ src: embedUrl })\n }, [inputUrl, updateAttributes])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleEmbed()\n }\n },\n [handleEmbed]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: \"fit-content\",\n maxWidth: width || \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show URL input if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div ref={wrapperRef}>\n <div className=\"nph-video-input\">\n <div className=\"nph-video-input__icon\">\n <IconVideo size={24} />\n </div>\n <div className=\"nph-video-input__content\">\n <input\n type=\"text\"\n className=\"nph-video-input__field\"\n placeholder=\"Paste a YouTube, Vimeo, or video URL...\"\n value={inputUrl}\n onChange={(e) => setInputUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <button\n type=\"button\"\n className=\"nph-video-input__button\"\n onClick={handleEmbed}\n disabled={!inputUrl.trim()}\n >\n Embed\n </button>\n </div>\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the embedded video\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div\n contentEditable={false}\n ref={wrapperRef}\n style={{ position: \"relative\" }}\n >\n <div className=\"nph-video-block\">\n <iframe\n src={src}\n className=\"nph-video-block__iframe\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n {!isSelected && (\n <div\n className=\"nph-video-block__overlay\"\n onClick={onClick}\n />\n )}\n </div>\n <VideoBlockMenu editor={editor} getPos={getPos} />\n </div>\n </NodeViewWrapper>\n )\n}\n\nexport default VideoBlockView\n","import { NodeSelection } from \"@tiptap/pm/state\"\nimport { Editor, useEditorState } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockWidth } from \"../ImageBlock/ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type VideoBlockMenuProps = {\n editor: Editor\n getPos: () => number\n}\n\nexport const VideoBlockMenu = ({ editor, getPos }: VideoBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n\n const { isVisible, align, width } = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return { isVisible: false, align: \"center\" as const, width: 100 }\n const { state } = ctx.editor\n const { selection } = state\n const isNodeSel = selection instanceof NodeSelection\n const isThisNode = isNodeSel && selection.from === getPos()\n\n let currentAlign: \"left\" | \"center\" | \"right\" = \"center\"\n let currentWidth = 100\n if (isThisNode) {\n const attrs = ctx.editor.getAttributes(\"videoBlock\")\n currentAlign = attrs.align || \"center\"\n const widthStr = attrs.width || \"100%\"\n currentWidth = parseInt(widthStr) || 100\n }\n return { isVisible: isThisNode, align: currentAlign, width: currentWidth }\n },\n })\n\n const onAlignLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setVideoBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemove = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n if (!isVisible) return null\n\n return (\n <div\n className=\"bubble-menu\"\n ref={menuRef}\n style={{\n position: \"absolute\",\n top: \"-40px\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: \"var(--nph-z, 50)\",\n }}\n >\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove video\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemove}\n >\n <IconTrash size={16} />\n </button>\n </div>\n )\n}\n\nexport default VideoBlockMenu\n","import type { Editor } from \"@tiptap/react\"\nimport {\n IconCopy,\n IconTrash,\n IconArrowUp,\n IconArrowDown,\n IconClipboard,\n} from \"@tabler/icons-react\"\nimport { useCallback } from \"react\"\n\nexport type BlockActionMenuProps = {\n editor: Editor\n onClose: () => void\n}\n\nexport function BlockActionMenu({ editor, onClose }: BlockActionMenuProps) {\n const executeAndClose = useCallback(\n (fn: () => void) => {\n fn()\n onClose()\n },\n [onClose]\n )\n\n const handleDelete = useCallback(() => {\n executeAndClose(() => {\n editor.commands.deleteSelection()\n })\n }, [editor, executeAndClose])\n\n const handleDuplicate = useCallback(() => {\n executeAndClose(() => {\n const { state } = editor\n const { selection } = state\n const { $anchor } = selection\n\n // Find the top-level block\n const depth = $anchor.depth > 0 ? 1 : 0\n const start = $anchor.start(depth)\n const end = $anchor.end(depth)\n const node = state.doc.nodeAt(start - 1)\n\n if (node) {\n const insertPos = end + 1\n editor\n .chain()\n .focus()\n .insertContentAt(insertPos, node.toJSON())\n .run()\n }\n })\n }, [editor, executeAndClose])\n\n const handleMoveUp = useCallback(() => {\n executeAndClose(() => {\n const { state } = editor\n const { selection } = state\n const { $anchor } = selection\n const depth = $anchor.depth > 0 ? 1 : 0\n const blockStart = $anchor.start(depth) - 1\n\n if (blockStart <= 0) return // Already at top\n\n const node = state.doc.nodeAt(blockStart)\n if (!node) return\n\n // Find previous sibling\n const $pos = state.doc.resolve(blockStart)\n const index = $pos.index($pos.depth)\n if (index === 0) return // First child\n\n const prevNode = $pos.node($pos.depth).child(index - 1)\n const prevStart = blockStart - prevNode.nodeSize\n\n editor.chain().focus()\n .command(({ tr }) => {\n const currentSlice = state.doc.slice(blockStart, blockStart + node.nodeSize)\n tr.delete(blockStart, blockStart + node.nodeSize)\n tr.insert(prevStart, currentSlice.content)\n return true\n })\n .run()\n })\n }, [editor, executeAndClose])\n\n const handleMoveDown = useCallback(() => {\n executeAndClose(() => {\n const { state } = editor\n const { selection } = state\n const { $anchor } = selection\n const depth = $anchor.depth > 0 ? 1 : 0\n const blockStart = $anchor.start(depth) - 1\n\n const node = state.doc.nodeAt(blockStart)\n if (!node) return\n const blockEnd = blockStart + node.nodeSize\n\n // Check if there's a next sibling\n const $pos = state.doc.resolve(blockStart)\n const parent = $pos.node($pos.depth)\n const index = $pos.index($pos.depth)\n if (index >= parent.childCount - 1) return // Last child\n\n const nextNode = parent.child(index + 1)\n const nextEnd = blockEnd + nextNode.nodeSize\n\n editor.chain().focus()\n .command(({ tr }) => {\n const currentSlice = state.doc.slice(blockStart, blockEnd)\n tr.delete(blockStart, blockEnd)\n const insertPos = blockStart + nextNode.nodeSize\n tr.insert(insertPos, currentSlice.content)\n return true\n })\n .run()\n })\n }, [editor, executeAndClose])\n\n const handleCopyToClipboard = useCallback(() => {\n executeAndClose(() => {\n const { state } = editor\n const { selection } = state\n const { $anchor } = selection\n const depth = $anchor.depth > 0 ? 1 : 0\n const start = $anchor.start(depth) - 1\n const node = state.doc.nodeAt(start)\n if (node) {\n const text = node.textContent\n navigator.clipboard.writeText(text).catch(() => {\n // Fallback: silently fail\n })\n }\n })\n }, [editor, executeAndClose])\n\n return (\n <div className=\"nph-block-action-menu nph-command\">\n <div className=\"nph-command__list\" style={{ maxHeight: \"none\" }}>\n <button\n type=\"button\"\n className=\"nph-command__item\"\n onClick={handleDelete}\n onMouseDown={(e) => e.preventDefault()}\n >\n <IconTrash size={16} />\n <span>Delete</span>\n </button>\n <button\n type=\"button\"\n className=\"nph-command__item\"\n onClick={handleDuplicate}\n onMouseDown={(e) => e.preventDefault()}\n >\n <IconCopy size={16} />\n <span>Duplicate</span>\n </button>\n <button\n type=\"button\"\n className=\"nph-command__item\"\n onClick={handleCopyToClipboard}\n onMouseDown={(e) => e.preventDefault()}\n >\n <IconClipboard size={16} />\n <span>Copy to clipboard</span>\n </button>\n <button\n type=\"button\"\n className=\"nph-command__item\"\n onClick={handleMoveUp}\n onMouseDown={(e) => e.preventDefault()}\n >\n <IconArrowUp size={16} />\n <span>Move up</span>\n </button>\n <button\n type=\"button\"\n className=\"nph-command__item\"\n onClick={handleMoveDown}\n onMouseDown={(e) => e.preventDefault()}\n >\n <IconArrowDown size={16} />\n <span>Move down</span>\n </button>\n </div>\n </div>\n )\n}\n\nexport default BlockActionMenu\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport {\n IconRowInsertBottom,\n IconColumnInsertRight,\n IconColumnInsertLeft,\n IconRowRemove,\n IconColumnRemove,\n IconTableRow,\n IconTableColumn,\n IconArrowMerge,\n IconArrowsSplit,\n IconTableOff,\n IconGripVertical,\n IconGripHorizontal,\n IconRowInsertTop,\n IconTrash,\n IconCopy,\n} from \"@tabler/icons-react\"\nimport {\n useState,\n useEffect,\n useRef,\n useCallback,\n type ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\n\ntype GripPosition = {\n left: number\n top: number\n width: number\n height: number\n}\n\ntype DropdownState = {\n type: \"column\" | \"row\"\n index: number\n x: number\n y: number\n} | null\n\ntype DragState = {\n type: \"column\" | \"row\"\n fromIndex: number\n toIndex: number\n} | null\n\nexport type TableMenuProps = {\n className?: string\n}\n\nexport function TableMenu({ className: _className }: TableMenuProps) {\n const { editor } = useCurrentEditor()\n\n const tableInfo = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n const { $from } = ctx.editor.state.selection\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === \"table\") {\n return { pos: $from.start(d) - 1, depth: d }\n }\n }\n return null\n },\n })\n\n const [colGrips, setColGrips] = useState<GripPosition[]>([])\n const [rowGrips, setRowGrips] = useState<GripPosition[]>([])\n const [dropdown, setDropdown] = useState<DropdownState>(null)\n const [tableRect, setTableRect] = useState<DOMRect | null>(null)\n const [isHovering, setIsHovering] = useState(false)\n const [drag, setDrag] = useState<DragState>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const dragRef = useRef<DragState>(null)\n\n // Find the table DOM element\n const getTableDom = useCallback(() => {\n if (!editor || !tableInfo) return null\n return editor.view.nodeDOM(tableInfo.pos) as HTMLElement | null\n }, [editor, tableInfo])\n\n // Measure grip positions from the table DOM\n const measureGrips = useCallback(() => {\n const tableDom = getTableDom()\n if (!tableDom) {\n setColGrips([])\n setRowGrips([])\n setTableRect(null)\n return\n }\n\n const rect = tableDom.getBoundingClientRect()\n setTableRect(rect)\n\n // Get first row cells for column positions\n const firstRow = tableDom.querySelector(\"tr\")\n if (!firstRow) return\n\n const cells = firstRow.querySelectorAll(\"th, td\")\n const newColGrips: GripPosition[] = []\n cells.forEach((cell) => {\n const cellRect = cell.getBoundingClientRect()\n newColGrips.push({\n left: cellRect.left,\n top: rect.top,\n width: cellRect.width,\n height: 0,\n })\n })\n setColGrips(newColGrips)\n\n // Get all rows for row positions\n const rows = tableDom.querySelectorAll(\"tr\")\n const newRowGrips: GripPosition[] = []\n rows.forEach((row) => {\n const rowRect = row.getBoundingClientRect()\n newRowGrips.push({\n left: rect.left,\n top: rowRect.top,\n width: 0,\n height: rowRect.height,\n })\n })\n setRowGrips(newRowGrips)\n }, [getTableDom])\n\n // Observe table geometry changes\n useEffect(() => {\n if (!tableInfo) {\n setColGrips([])\n setRowGrips([])\n setTableRect(null)\n setDropdown(null)\n return\n }\n\n measureGrips()\n\n const tableDom = getTableDom()\n if (!tableDom) return\n\n const ro = new ResizeObserver(() => measureGrips())\n ro.observe(tableDom)\n\n // Track hover state — expand hit area to include grip zones around the table\n const HOVER_PAD = 32 // px beyond table edges to keep grips visible\n const handleMouseMove = (e: MouseEvent) => {\n const r = tableDom.getBoundingClientRect()\n const inside =\n e.clientX >= r.left - HOVER_PAD &&\n e.clientX <= r.right + HOVER_PAD &&\n e.clientY >= r.top - HOVER_PAD &&\n e.clientY <= r.bottom + HOVER_PAD\n setIsHovering(inside)\n }\n document.addEventListener(\"mousemove\", handleMouseMove, { passive: true })\n\n // Also re-measure on scroll\n const scrollParent = tableDom.closest(\".nph-editor\") || window\n const handleScroll = () => {\n measureGrips()\n setDropdown(null)\n }\n scrollParent.addEventListener(\"scroll\", handleScroll, { passive: true })\n window.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n return () => {\n ro.disconnect()\n document.removeEventListener(\"mousemove\", handleMouseMove)\n scrollParent.removeEventListener(\"scroll\", handleScroll)\n window.removeEventListener(\"scroll\", handleScroll)\n }\n }, [tableInfo, getTableDom, measureGrips])\n\n // Close dropdown on click outside\n useEffect(() => {\n if (!dropdown) return\n const handlePointerDown = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setDropdown(null)\n }\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [dropdown])\n\n // Close dropdown on editor transaction (typing, etc.)\n useEffect(() => {\n if (!editor || !dropdown) return\n const handleTransaction = () => setDropdown(null)\n editor.on(\"transaction\", handleTransaction)\n return () => { editor.off(\"transaction\", handleTransaction) }\n }, [editor, dropdown])\n\n const handleColGripClick = useCallback(\n (index: number, e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!editor || !tableInfo) return\n\n // Select the column by clicking the first cell in this column\n const tableDom = getTableDom()\n if (!tableDom) return\n const firstRow = tableDom.querySelector(\"tr\")\n if (!firstRow) return\n const cells = firstRow.querySelectorAll(\"th, td\")\n const cell = cells[index] as HTMLElement | undefined\n if (!cell) return\n\n // Find ProseMirror position for this cell\n const pos = editor.view.posAtDOM(cell, 0)\n editor.chain().focus().setTextSelection(pos).run()\n\n const rect = cell.getBoundingClientRect()\n setDropdown({\n type: \"column\",\n index,\n x: rect.left,\n y: rect.top - 4,\n })\n },\n [editor, tableInfo, getTableDom]\n )\n\n const handleRowGripClick = useCallback(\n (index: number, e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!editor || !tableInfo) return\n\n // Select the row by clicking the first cell in this row\n const tableDom = getTableDom()\n if (!tableDom) return\n const rows = tableDom.querySelectorAll(\"tr\")\n const row = rows[index] as HTMLElement | undefined\n if (!row) return\n const firstCell = row.querySelector(\"th, td\") as HTMLElement | undefined\n if (!firstCell) return\n\n const pos = editor.view.posAtDOM(firstCell, 0)\n editor.chain().focus().setTextSelection(pos).run()\n\n // Position dropdown below the grip button\n const gripEl = e.currentTarget as HTMLElement\n const gripRect = gripEl.getBoundingClientRect()\n setDropdown({\n type: \"row\",\n index,\n x: gripRect.left,\n y: gripRect.bottom + 4,\n })\n },\n [editor, tableInfo, getTableDom]\n )\n\n // --- Drag-to-reorder logic ---\n const moveColumn = useCallback(\n (from: number, to: number) => {\n if (!editor || !tableInfo || from === to) return\n const { state } = editor\n const tableStart = tableInfo.pos\n const tableNode = state.doc.nodeAt(tableStart)\n if (!tableNode) return\n\n const tr = state.tr\n // For each row, move the cell from `from` to `to`\n tableNode.forEach((row, rowOffset) => {\n if (row.type.name !== \"tableRow\") return\n const cells: { node: any; pos: number }[] = []\n row.forEach((cell, cellOffset) => {\n cells.push({ node: cell, pos: tableStart + 1 + rowOffset + 1 + cellOffset })\n })\n if (from >= cells.length || to >= cells.length) return\n\n // Build new row content with reordered cells\n const reordered = [...cells]\n const [moved] = reordered.splice(from, 1)\n reordered.splice(to, 0, moved)\n\n const rowPos = tableStart + 1 + rowOffset\n const mappedRowPos = tr.mapping.map(rowPos)\n // Replace the row content\n const newRow = row.type.create(row.attrs, reordered.map((c) => c.node))\n tr.replaceWith(mappedRowPos, mappedRowPos + row.nodeSize, newRow)\n })\n\n editor.view.dispatch(tr)\n },\n [editor, tableInfo]\n )\n\n const moveRow = useCallback(\n (from: number, to: number) => {\n if (!editor || !tableInfo || from === to) return\n const { state } = editor\n const tableStart = tableInfo.pos\n const tableNode = state.doc.nodeAt(tableStart)\n if (!tableNode) return\n\n const rows: any[] = []\n tableNode.forEach((row) => rows.push(row))\n if (from >= rows.length || to >= rows.length) return\n\n const reordered = [...rows]\n const [moved] = reordered.splice(from, 1)\n reordered.splice(to, 0, moved)\n\n const tr = state.tr\n tr.replaceWith(\n tableStart + 1,\n tableStart + 1 + tableNode.content.size,\n reordered\n )\n editor.view.dispatch(tr)\n },\n [editor, tableInfo]\n )\n\n const handleGripDragStart = useCallback(\n (type: \"column\" | \"row\", index: number, e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDropdown(null)\n\n const startX = e.clientX\n const startY = e.clientY\n let hasMoved = false\n const dragState: DragState = { type, fromIndex: index, toIndex: index }\n dragRef.current = dragState\n setDrag(dragState)\n\n const handleMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX\n const dy = ev.clientY - startY\n if (!hasMoved && Math.abs(type === \"column\" ? dx : dy) < 5) return\n hasMoved = true\n\n let newIndex = index\n if (type === \"column\") {\n for (let i = 0; i < colGrips.length; i++) {\n const mid = colGrips[i].left + colGrips[i].width / 2\n if (ev.clientX < mid) {\n newIndex = i\n break\n }\n newIndex = i\n }\n } else {\n for (let i = 0; i < rowGrips.length; i++) {\n const mid = rowGrips[i].top + rowGrips[i].height / 2\n if (ev.clientY < mid) {\n newIndex = i\n break\n }\n newIndex = i\n }\n }\n\n const updated = { type, fromIndex: index, toIndex: newIndex }\n dragRef.current = updated\n setDrag(updated)\n }\n\n const handleMouseUp = () => {\n document.removeEventListener(\"mousemove\", handleMouseMove)\n document.removeEventListener(\"mouseup\", handleMouseUp)\n\n const finalDrag = dragRef.current\n dragRef.current = null\n setDrag(null)\n\n if (finalDrag && hasMoved && finalDrag.fromIndex !== finalDrag.toIndex) {\n if (type === \"column\") {\n moveColumn(finalDrag.fromIndex, finalDrag.toIndex)\n } else {\n moveRow(finalDrag.fromIndex, finalDrag.toIndex)\n }\n }\n }\n\n document.addEventListener(\"mousemove\", handleMouseMove)\n document.addEventListener(\"mouseup\", handleMouseUp)\n },\n [colGrips, rowGrips, moveColumn, moveRow]\n )\n\n if (!editor || !tableInfo || colGrips.length === 0) return null\n\n const GRIP_SIZE = 20\n const GRIP_GAP = 4\n const gripsVisible = isHovering || !!dropdown\n\n const columnDropdownItems: {\n label: string\n icon: ReactNode\n action: () => void\n destructive?: boolean\n separator?: boolean\n }[] = [\n {\n label: \"Toggle header column\",\n icon: <IconTableColumn size={16} />,\n action: () => {\n editor.chain().focus().toggleHeaderColumn().run()\n setDropdown(null)\n },\n },\n {\n label: \"Insert column before\",\n icon: <IconColumnInsertLeft size={16} />,\n action: () => {\n editor.chain().focus().addColumnBefore().run()\n setDropdown(null)\n },\n separator: true,\n },\n {\n label: \"Insert column after\",\n icon: <IconColumnInsertRight size={16} />,\n action: () => {\n editor.chain().focus().addColumnAfter().run()\n setDropdown(null)\n },\n },\n {\n label: \"Merge cells\",\n icon: <IconArrowMerge size={16} />,\n action: () => {\n editor.chain().focus().mergeCells().run()\n setDropdown(null)\n },\n separator: true,\n },\n {\n label: \"Split cell\",\n icon: <IconArrowsSplit size={16} />,\n action: () => {\n editor.chain().focus().splitCell().run()\n setDropdown(null)\n },\n },\n {\n label: \"Delete column\",\n icon: <IconColumnRemove size={16} />,\n action: () => {\n editor.chain().focus().deleteColumn().run()\n setDropdown(null)\n },\n destructive: true,\n separator: true,\n },\n ]\n\n const rowDropdownItems: {\n label: string\n icon: ReactNode\n action: () => void\n destructive?: boolean\n separator?: boolean\n }[] = [\n {\n label: \"Toggle header row\",\n icon: <IconTableRow size={16} />,\n action: () => {\n editor.chain().focus().toggleHeaderRow().run()\n setDropdown(null)\n },\n },\n {\n label: \"Insert row above\",\n icon: <IconRowInsertTop size={16} />,\n action: () => {\n editor.chain().focus().addRowBefore().run()\n setDropdown(null)\n },\n separator: true,\n },\n {\n label: \"Insert row below\",\n icon: <IconRowInsertBottom size={16} />,\n action: () => {\n editor.chain().focus().addRowAfter().run()\n setDropdown(null)\n },\n },\n {\n label: \"Merge cells\",\n icon: <IconArrowMerge size={16} />,\n action: () => {\n editor.chain().focus().mergeCells().run()\n setDropdown(null)\n },\n separator: true,\n },\n {\n label: \"Split cell\",\n icon: <IconArrowsSplit size={16} />,\n action: () => {\n editor.chain().focus().splitCell().run()\n setDropdown(null)\n },\n },\n {\n label: \"Delete row\",\n icon: <IconRowRemove size={16} />,\n action: () => {\n editor.chain().focus().deleteRow().run()\n setDropdown(null)\n },\n destructive: true,\n separator: true,\n },\n ]\n\n const dropdownItems = dropdown?.type === \"column\" ? columnDropdownItems : rowDropdownItems\n\n return createPortal(\n <>\n {/* Column grips — above each column */}\n {colGrips.map((grip, i) => (\n <button\n key={`col-${i}`}\n type=\"button\"\n className={`nph-table-grip nph-table-grip--col${gripsVisible ? \" nph-table-grip--visible\" : \"\"}${drag?.type === \"column\" && drag.fromIndex === i ? \" nph-table-grip--dragging\" : \"\"}`}\n style={{\n position: \"fixed\",\n left: grip.left + grip.width / 2 - GRIP_SIZE / 2,\n top: grip.top - GRIP_SIZE - GRIP_GAP,\n width: GRIP_SIZE,\n height: GRIP_SIZE,\n cursor: \"grab\",\n }}\n onMouseDown={(e) => handleGripDragStart(\"column\", i, e)}\n onClick={(e) => handleColGripClick(i, e)}\n aria-label={`Column ${i + 1} options`}\n >\n <IconGripHorizontal size={14} />\n </button>\n ))}\n\n {/* Row grips — to the left of each row */}\n {rowGrips.map((grip, i) => (\n <button\n key={`row-${i}`}\n type=\"button\"\n className={`nph-table-grip nph-table-grip--row${gripsVisible ? \" nph-table-grip--visible\" : \"\"}${drag?.type === \"row\" && drag.fromIndex === i ? \" nph-table-grip--dragging\" : \"\"}`}\n style={{\n position: \"fixed\",\n left: grip.left - GRIP_SIZE - GRIP_GAP,\n top: grip.top + grip.height / 2 - GRIP_SIZE / 2,\n width: GRIP_SIZE,\n height: GRIP_SIZE,\n cursor: \"grab\",\n }}\n onMouseDown={(e) => handleGripDragStart(\"row\", i, e)}\n onClick={(e) => handleRowGripClick(i, e)}\n aria-label={`Row ${i + 1} options`}\n >\n <IconGripVertical size={14} />\n </button>\n ))}\n\n {/* Delete table button — below the table */}\n {tableRect && (\n <button\n type=\"button\"\n className={`nph-table-grip nph-table-grip--delete${gripsVisible ? \" nph-table-grip--visible\" : \"\"}`}\n style={{\n position: \"fixed\",\n left: tableRect.left + tableRect.width / 2 - 60,\n top: tableRect.bottom + GRIP_GAP,\n width: 120,\n height: 24,\n }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n editor.chain().focus().deleteTable().run()\n }}\n aria-label=\"Delete table\"\n >\n <IconTableOff size={14} />\n <span style={{ fontSize: 12 }}>Delete table</span>\n </button>\n )}\n\n {/* Dropdown menu */}\n {dropdown && (\n <div\n ref={dropdownRef}\n className=\"nph-table-dropdown\"\n style={{\n position: \"fixed\",\n left: dropdown.x,\n top: dropdown.y,\n transform: dropdown.type === \"column\" ? \"translateY(-100%)\" : undefined,\n }}\n >\n {dropdownItems.map((item, i) => (\n <div key={i}>\n {item.separator && i > 0 && <div className=\"nph-table-dropdown__separator\" />}\n <button\n type=\"button\"\n className={`nph-table-dropdown__item ${item.destructive ? \"nph-table-dropdown__item--destructive\" : \"\"}`}\n onMouseDown={(e) => e.preventDefault()}\n onClick={item.action}\n >\n {item.icon}\n <span>{item.label}</span>\n </button>\n </div>\n ))}\n </div>\n )}\n {/* Drag drop indicator */}\n {drag && drag.fromIndex !== drag.toIndex && tableRect && (\n drag.type === \"column\" ? (\n <div\n className=\"nph-table-drop-indicator nph-table-drop-indicator--col\"\n style={{\n position: \"fixed\",\n left: drag.toIndex < colGrips.length\n ? colGrips[drag.toIndex].left - 1\n : colGrips[colGrips.length - 1].left + colGrips[colGrips.length - 1].width,\n top: tableRect.top,\n width: 2,\n height: tableRect.height,\n }}\n />\n ) : (\n <div\n className=\"nph-table-drop-indicator nph-table-drop-indicator--row\"\n style={{\n position: \"fixed\",\n left: tableRect.left,\n top: drag.toIndex < rowGrips.length\n ? rowGrips[drag.toIndex].top - 1\n : rowGrips[rowGrips.length - 1].top + rowGrips[rowGrips.length - 1].height,\n width: tableRect.width,\n height: 2,\n }}\n />\n )\n )}\n </>,\n document.body\n )\n}\n\nexport default TableMenu\n","import {\n EditorRoot,\n EditorContent,\n handleCommandNavigation,\n type EditorContentProps,\n} from \"../headless\"\nimport ExtensionKit from \"../headless/extensions/extension-kit\"\nimport type { MentionOptions } from \"../headless/extensions\"\nimport { SlashMenu, TextMenu } from \"./menus\"\nimport { ImageMenu } from \"./menus/ImageMenu\"\nimport { LinkMenu } from \"./menus/LinkMenu\"\nimport { ImageBlockView } from \"./menus/ImageBlock/ImageBlockView\"\nimport { VideoBlockView } from \"./menus/VideoBlock/VideoBlockView\"\nimport type { ReactNode } from \"react\"\nimport { useMemo, useState, useCallback, useRef, useEffect } from \"react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BlockActionMenu } from \"./menus/DragHandle/BlockActionMenu\"\nimport { TableMenu } from \"./menus/TableMenu\"\n\nexport type BubbleMenuExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type BubbleMenuExtra =\n | BubbleMenuExtraRenderer\n | {\n render: BubbleMenuExtraRenderer\n align?: \"start\" | \"end\"\n }\n\nexport type BubbleMenuExtras = Partial<{\n text: BubbleMenuExtra | BubbleMenuExtra[]\n image: BubbleMenuExtra | BubbleMenuExtra[]\n}>\n\nexport type NeuphloEditorProps = {\n content?: string\n className?: string\n editable?: boolean\n immediatelyRender?: boolean\n showTextMenu?: boolean\n showSlashMenu?: boolean\n showImageMenu?: boolean\n showDragHandle?: boolean\n extensions?: any[]\n bubbleMenuExtras?: BubbleMenuExtras\n onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n }\n mentionOptions?: MentionOptions\n referenceOptions?: MentionOptions\n slashCommand?: boolean\n placeholder?: string\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = false,\n showDragHandle = true,\n extensions,\n bubbleMenuExtras,\n onUpdate,\n onCreate,\n uploadImage,\n collaboration,\n mentionOptions,\n referenceOptions,\n slashCommand,\n placeholder,\n}: NeuphloEditorProps) {\n const [actionMenuAnchor, setActionMenuAnchor] = useState<HTMLElement | null>(null)\n const [actionMenuEditor, setActionMenuEditor] = useState<TiptapEditor | null>(null)\n const actionMenuRef = useRef<HTMLDivElement>(null)\n\n // Close action menu on click outside\n useEffect(() => {\n if (!actionMenuAnchor) return\n const handlePointerDown = (e: MouseEvent) => {\n if (actionMenuRef.current && !actionMenuRef.current.contains(e.target as HTMLElement)) {\n setActionMenuAnchor(null)\n }\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [actionMenuAnchor])\n\n const dragHandleCallbacks = useMemo(\n () => ({\n onAddBlock: (editor: any) => {\n const { state } = editor\n const { selection } = state\n const { $anchor } = selection\n\n // Find the top-level block node (depth 1) and insert after it\n const topDepth = Math.min($anchor.depth, 1)\n const endOfBlock = $anchor.end(topDepth)\n const insertPos = endOfBlock + 1\n\n editor\n .chain()\n .focus()\n .insertContentAt(insertPos, { type: \"paragraph\" })\n .focus(insertPos + 1)\n .run()\n // Insert \"/\" to trigger slash command menu after the new paragraph is focused\n requestAnimationFrame(() => {\n editor.commands.insertContent(\"/\")\n })\n },\n onGripClick: (editor: any, _node: any, element: HTMLElement) => {\n setActionMenuEditor(editor)\n setActionMenuAnchor((prev) => (prev === element ? null : element))\n },\n }),\n []\n )\n\n const enableDragHandle = showDragHandle && editable\n\n const normalizeExtras = (extras?: BubbleMenuExtra | BubbleMenuExtra[]) => {\n const result: {\n start: BubbleMenuExtraRenderer[]\n end: BubbleMenuExtraRenderer[]\n } = {\n start: [],\n end: [],\n }\n if (!extras) return result\n\n const list = Array.isArray(extras) ? extras : [extras]\n list.forEach((item) => {\n const config =\n typeof item === \"function\"\n ? { render: item, align: \"end\" as const }\n : item\n const slot = config.align === \"start\" ? \"start\" : \"end\"\n result[slot].push(config.render)\n })\n return result\n }\n\n const textExtras = normalizeExtras(bubbleMenuExtras?.text)\n const imageExtras = normalizeExtras(bubbleMenuExtras?.image)\n\n const handleCloseActionMenu = useCallback(() => {\n setActionMenuAnchor(null)\n }, [])\n\n return (\n <div className={className}>\n <EditorRoot>\n <EditorContent\n onUpdate={onUpdate}\n onCreate={onCreate}\n immediatelyRender={immediatelyRender}\n editable={editable}\n content={content}\n extensions={[\n ...\n ExtensionKit({\n uploadImage: uploadImage,\n collaboration: collaboration,\n imageBlockView: ImageBlockView,\n videoBlockView: VideoBlockView,\n mention: mentionOptions,\n reference: referenceOptions,\n slashCommand: slashCommand,\n dragHandle: enableDragHandle,\n dragHandleCallbacks: enableDragHandle ? dragHandleCallbacks : undefined,\n placeholder: placeholder,\n }),\n ...(extensions ?? []),\n ]}\n editorProps={{\n attributes: {\n class: \"nph-editor max-w-none outline-none\",\n },\n handleKeyDown: (view, event) => {\n return !!handleCommandNavigation?.(event as any)\n },\n }}\n >\n {showTextMenu ? (\n <TextMenu\n leadingExtras={textExtras.start}\n trailingExtras={textExtras.end}\n />\n ) : null}\n {showImageMenu ? (\n <ImageMenu\n leadingExtras={imageExtras.start}\n trailingExtras={imageExtras.end}\n />\n ) : null}\n <LinkMenu />\n <TableMenu />\n {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n {actionMenuAnchor && actionMenuEditor && (\n <div\n ref={actionMenuRef}\n style={{\n position: \"fixed\",\n zIndex: 10000,\n top: actionMenuAnchor.getBoundingClientRect().bottom + 4,\n left: actionMenuAnchor.getBoundingClientRect().left,\n }}\n >\n <BlockActionMenu\n editor={actionMenuEditor}\n onClose={handleCloseActionMenu}\n />\n </div>\n )}\n </div>\n )\n}\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\ninterface TocItem {\n id: string\n level: number\n text: string\n pos: number\n}\n\nexport type TableOfContentsProps = {\n className?: string\n itemClassName?: string\n activeClassName?: string\n}\n\nexport function TableOfContents({\n className,\n itemClassName,\n activeClassName,\n}: TableOfContentsProps) {\n const { editor } = useCurrentEditor()\n const [activeId, setActiveId] = useState<string | null>(null)\n const observerRef = useRef<IntersectionObserver | null>(null)\n\n const headings = useEditorState({\n editor,\n selector: (ctx): TocItem[] => {\n if (!ctx.editor) return []\n const items: TocItem[] = []\n ctx.editor.state.doc.descendants((node, pos) => {\n if (node.type.name === \"heading\") {\n const id = `heading-${pos}`\n items.push({\n id,\n level: node.attrs.level as number,\n text: node.textContent,\n pos,\n })\n }\n })\n return items\n },\n })\n\n // Set up IntersectionObserver to track which heading is in view\n useEffect(() => {\n if (!editor || !headings || headings.length === 0) return\n\n // Clean up old observer\n observerRef.current?.disconnect()\n\n const callback: IntersectionObserverCallback = (entries) => {\n // Find the first visible heading\n const visibleEntries = entries.filter((e) => e.isIntersecting)\n if (visibleEntries.length > 0) {\n const firstVisible = visibleEntries[0]\n const id = firstVisible.target.getAttribute(\"data-toc-id\")\n if (id) setActiveId(id)\n }\n }\n\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"-80px 0px -70% 0px\",\n threshold: 0,\n })\n\n observerRef.current = observer\n\n // Observe heading DOM elements\n const editorEl = editor.view.dom\n headings.forEach((heading) => {\n // Find heading element by position\n try {\n const domNode = editor.view.nodeDOM(heading.pos)\n if (domNode && domNode instanceof HTMLElement) {\n domNode.setAttribute(\"data-toc-id\", heading.id)\n observer.observe(domNode)\n }\n } catch {\n // Position may be invalid after edits\n }\n })\n\n return () => {\n observer.disconnect()\n }\n }, [editor, headings])\n\n const handleClick = useCallback(\n (pos: number) => {\n if (!editor) return\n editor.chain().focus().setTextSelection(pos + 1).run()\n\n // Scroll into view\n try {\n const domNode = editor.view.nodeDOM(pos)\n if (domNode && domNode instanceof HTMLElement) {\n domNode.scrollIntoView({ behavior: \"smooth\", block: \"start\" })\n }\n } catch {\n // Ignore if DOM node not found\n }\n },\n [editor]\n )\n\n if (!editor || !headings || headings.length === 0) return null\n\n return (\n <nav className={className ?? \"nph-toc\"}>\n {headings.map((heading) => {\n const isActive = activeId === heading.id\n const itemClass = [\n itemClassName ?? \"nph-toc__item\",\n isActive ? (activeClassName ?? \"nph-toc__item--active\") : \"\",\n ]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <button\n key={heading.id}\n type=\"button\"\n className={itemClass}\n style={{ paddingLeft: `${(heading.level - 1) * 12 + 8}px` }}\n onClick={() => handleClick(heading.pos)}\n title={heading.text}\n >\n {heading.text || `Heading ${heading.level}`}\n </button>\n )\n })}\n </nav>\n )\n}\n\nexport default TableOfContents\n"],"mappings":"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","names":["Editor","import_react","import_react","import_jotai","import_jotai","import_react","import_jotai","import_jsx_runtime","import_react","import_jotai","import_jsx_runtime","TiptapLink","import_core","import_react","import_state","TiptapImage","node","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Mention","BaseDragHandle","import_extension_table","import_core","import_state","import_core","Suggestion","import_core","import_react","Underline","Collaboration","CollaborationCaret","import_state","import_react","import_icons_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jotai","import_icons_react","import_react","import_jsx_runtime","import_react","import_menus","import_icons_react","import_jsx_runtime","import_state","import_react","import_menus","import_icons_react","import_jsx_runtime","import_react","import_state","import_react","import_react","import_jsx_runtime","import_icons_react","import_jsx_runtime","import_icons_react","import_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_state","import_react","import_state","import_react","import_icons_react","import_jsx_runtime","import_icons_react","import_jsx_runtime","import_icons_react","import_react","import_jsx_runtime","import_react","import_icons_react","import_react_dom","import_jsx_runtime","import_react","import_jsx_runtime","Editor","import_react","import_jsx_runtime"]}