neuphlo-editor 2.2.0 → 2.3.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.
- package/dist/react/index.cjs +14 -6
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.css +76 -4
- package/dist/react/index.css.map +1 -1
- package/dist/react/index.js +14 -6
- package/dist/react/index.js.map +1 -1
- package/dist/styles.css +89 -4
- package/package.json +1 -1
package/dist/react/index.cjs.map
CHANGED
|
@@ -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/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 browseAssets?: (onSelect: (url: string) => void) => void\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 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 browseAssets?: (onSelect: (url: string) => void) => void\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 browseAssets: options?.browseAssets,\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 as any)\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 as any)\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 console.log(\"[VideoBlock] addNodeView called, options:\", Object.keys(this.options), \"hasNodeView:\", !!this.options.nodeView)\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n return undefined as any\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, useState } from \"react\"\nimport { IconPhotoOff } from \"@tabler/icons-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 [imageError, setImageError] = useState(false)\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 (only when editable)\n if (!src || src === \"\") {\n if (!editor.isEditable) return <NodeViewWrapper />\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 error state for broken images\n if (imageError) {\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={getContentStyle()}>\n <div className=\"nph-image-block-error\" onClick={onClick}>\n <IconPhotoOff size={32} />\n <span>Image could not be loaded</span>\n </div>\n {editor.isEditable && <ImageBlockMenu editor={editor} getPos={getPos} appendTo={imageWrapperRef} />}\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 {editor.isEditable ? (\n <ImageResizeHandle onResize={handleResize} currentWidth={width}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n onError={() => setImageError(true)}\n className=\"nph-image-block\"\n />\n </ImageResizeHandle>\n ) : (\n <img\n src={src}\n alt={alt || \"\"}\n onError={() => setImageError(true)}\n className=\"nph-image-block\"\n />\n )}\n {editor.isEditable && <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 if (!ctx.editor.isEditable) return { isVisible: false, align: \"center\" as const, width: 100 }\n if (!ctx.editor.isFocused) return { isVisible: false, align: \"center\" as const, width: 100 }\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 imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const browseAssets = (imageExtension?.options as any)?.browseAssets\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\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 [imageExtension, 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 // When browseAssets is provided, show a clean asset browser CTA\n if (browseAssets) {\n return (\n <div\n className=\"nph-image-uploader nph-image-uploader--browse-only\"\n contentEditable={false}\n onClick={() => browseAssets(onUpload)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n browseAssets(onUpload)\n }\n }}\n >\n <div className=\"nph-image-uploader__browse-cta\">\n <div className=\"nph-image-uploader__browse-icon-wrapper\">\n <IconPhoto size={28} />\n </div>\n <div className=\"nph-image-uploader__browse-text\">\n <span className=\"nph-image-uploader__browse-title\">Choose from assets</span>\n <span className=\"nph-image-uploader__browse-subtitle\">Select an image from your library</span>\n </div>\n </div>\n </div>\n )\n }\n\n // Fallback: standard drag-and-drop / upload flow\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 className=\"nph-image-uploader__actions\">\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, IconVideoOff } from \"@tabler/icons-react\"\n\nfunction toEmbedUrl(url: string): string {\n // Already an embed URL — return as-is\n if (url.includes(\"/embed/\") || url.includes(\"player.vimeo.com\") || url.includes(\"loom.com/embed\")) {\n return url\n }\n\n // YouTube: youtube.com/watch?v=ID, youtu.be/ID, youtube.com/shorts/ID\n const ytMatch = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|shorts\\/)|youtu\\.be\\/)([\\w-]+)/\n )\n if (ytMatch) {\n return `https://www.youtube.com/embed/${ytMatch[1]}`\n }\n\n // Vimeo: vimeo.com/ID or vimeo.com/channels/.../ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(?:channels\\/[\\w-]+\\/)?(\\d+)/)\n if (vimeoMatch) {\n return `https://player.vimeo.com/video/${vimeoMatch[1]}`\n }\n\n // Loom: loom.com/share/ID\n const loomMatch = url.match(/loom\\.com\\/share\\/([\\w-]+)/)\n if (loomMatch) {\n return `https://www.loom.com/embed/${loomMatch[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 const [videoError, setVideoError] = useState(false)\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: 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 (only when editable)\n if (!src || src === \"\") {\n if (!editor.isEditable) return <NodeViewWrapper />\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 error state for broken video\n if (videoError) {\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div contentEditable={false} ref={wrapperRef} style={{ position: \"relative\" }}>\n <div className=\"nph-video-block-error\" onClick={onClick}>\n <IconVideoOff size={32} />\n <span>Video could not be loaded</span>\n <span className=\"nph-video-block-error__url\">{src}</span>\n </div>\n {editor.isEditable && <VideoBlockMenu editor={editor} getPos={getPos} />}\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 onError={() => setVideoError(true)}\n />\n {!isSelected && (\n <div\n className=\"nph-video-block__overlay\"\n onClick={onClick}\n />\n )}\n </div>\n {editor.isEditable && <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 if (!ctx.editor.isEditable) return { isVisible: false, align: \"center\" as const, width: 100 }\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 browseAssets?: (onSelect: (url: string) => void) => void\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 browseAssets,\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 browseAssets: browseAssets,\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_icons_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"]}
|
|
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 browseAssets?: (onSelect: (url: string) => void) => void\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 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 browseAssets?: (onSelect: (url: string) => void) => void\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 browseAssets: options?.browseAssets,\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 as any)\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 as any)\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 console.log(\"[VideoBlock] addNodeView called, options:\", Object.keys(this.options), \"hasNodeView:\", !!this.options.nodeView)\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n return undefined as any\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, useState } from \"react\"\nimport { IconPhotoOff } from \"@tabler/icons-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 [imageError, setImageError] = useState(false)\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 (only when editable)\n if (!src || src === \"\") {\n if (!editor.isEditable) return <NodeViewWrapper />\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 error state for broken images\n if (imageError) {\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={getContentStyle()}>\n <div className=\"nph-image-block-error\" onClick={onClick}>\n <IconPhotoOff size={32} />\n <span>Image could not be loaded</span>\n </div>\n {editor.isEditable && <ImageBlockMenu editor={editor} getPos={getPos} appendTo={imageWrapperRef} />}\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 {editor.isEditable ? (\n <ImageResizeHandle onResize={handleResize} currentWidth={width}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n onError={() => setImageError(true)}\n className=\"nph-image-block\"\n />\n </ImageResizeHandle>\n ) : (\n <img\n src={src}\n alt={alt || \"\"}\n onError={() => setImageError(true)}\n className=\"nph-image-block\"\n />\n )}\n {editor.isEditable && <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 if (!ctx.editor.isEditable) return { isVisible: false, align: \"center\" as const, width: 100 }\n if (!ctx.editor.isFocused) return { isVisible: false, align: \"center\" as const, width: 100 }\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 imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const browseAssets = (imageExtension?.options as any)?.browseAssets\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\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 [imageExtension, 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 // When browseAssets is provided, show a clean asset browser CTA\n if (browseAssets) {\n return (\n <div\n className=\"nph-image-uploader nph-image-uploader--browse-only\"\n contentEditable={false}\n onClick={() => browseAssets(onUpload)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n browseAssets(onUpload)\n }\n }}\n >\n <div className=\"nph-image-uploader__browse-cta\">\n <div className=\"nph-image-uploader__browse-icon-wrapper\">\n <IconPhoto size={28} />\n </div>\n <div className=\"nph-image-uploader__browse-text\">\n <span className=\"nph-image-uploader__browse-title\">Choose from assets</span>\n <span className=\"nph-image-uploader__browse-subtitle\">Select an image from your library</span>\n </div>\n </div>\n </div>\n )\n }\n\n // Fallback: standard drag-and-drop / upload flow\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 className=\"nph-image-uploader__actions\">\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, IconVideoOff } from \"@tabler/icons-react\"\n\nfunction toEmbedUrl(url: string): string {\n // Already an embed URL — return as-is\n if (url.includes(\"/embed/\") || url.includes(\"player.vimeo.com\") || url.includes(\"loom.com/embed\")) {\n return url\n }\n\n // YouTube: youtube.com/watch?v=ID, youtu.be/ID, youtube.com/shorts/ID\n const ytMatch = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|shorts\\/)|youtu\\.be\\/)([\\w-]+)/\n )\n if (ytMatch) {\n return `https://www.youtube.com/embed/${ytMatch[1]}`\n }\n\n // Vimeo: vimeo.com/ID or vimeo.com/channels/.../ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(?:channels\\/[\\w-]+\\/)?(\\d+)/)\n if (vimeoMatch) {\n return `https://player.vimeo.com/video/${vimeoMatch[1]}`\n }\n\n // Loom: loom.com/share/ID\n const loomMatch = url.match(/loom\\.com\\/share\\/([\\w-]+)/)\n if (loomMatch) {\n return `https://www.loom.com/embed/${loomMatch[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 const [videoError, setVideoError] = useState(false)\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: 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 (only when editable)\n if (!src || src === \"\") {\n if (!editor.isEditable) return <NodeViewWrapper />\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div ref={wrapperRef}>\n <div className=\"nph-video-placeholder\" onClick={onClick}>\n <div className=\"nph-video-placeholder__icon\">\n <IconVideo size={28} stroke={1.5} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: \"2px\" }}>\n <div style={{ fontSize: \"14px\", fontWeight: 600, lineHeight: \"20px\" }}>Add a video</div>\n <div style={{ fontSize: \"13px\", opacity: 0.5, lineHeight: \"18px\" }}>Paste a URL to embed</div>\n </div>\n <div className=\"nph-video-placeholder__input\">\n <input\n type=\"text\"\n className=\"nph-video-input__field\"\n placeholder=\"YouTube, Vimeo, or Loom URL...\"\n value={inputUrl}\n onChange={(e) => setInputUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n />\n <button\n type=\"button\"\n className=\"nph-video-input__button\"\n onClick={(e) => { e.stopPropagation(); handleEmbed() }}\n disabled={!inputUrl.trim()}\n >\n Embed\n </button>\n </div>\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show error state for broken video\n if (videoError) {\n return (\n <NodeViewWrapper style={getWrapperStyle()}>\n <div contentEditable={false} ref={wrapperRef} style={{ position: \"relative\" }}>\n <div className=\"nph-video-block-error\" onClick={onClick}>\n <IconVideoOff size={32} />\n <span>Video could not be loaded</span>\n <span className=\"nph-video-block-error__url\">{src}</span>\n </div>\n {editor.isEditable && <VideoBlockMenu editor={editor} getPos={getPos} />}\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 onError={() => setVideoError(true)}\n />\n {!isSelected && (\n <div\n className=\"nph-video-block__overlay\"\n onClick={onClick}\n />\n )}\n </div>\n {editor.isEditable && <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 if (!ctx.editor.isEditable) return { isVisible: false, align: \"center\" as const, width: 100 }\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 browseAssets?: (onSelect: (url: string) => void) => void\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 browseAssets,\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 browseAssets: browseAssets,\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_icons_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"]}
|