neuphlo-editor 2.2.0 → 2.3.1
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 -7
- 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 -7
- package/dist/react/index.js.map +1 -1
- package/dist/styles.css +89 -4
- package/package.json +1 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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":["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":["IconCode","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","IconCode","useCurrentEditor","IconTypography","IconH1","IconH2","IconH3","IconH4","IconList","IconListNumbers","IconBlockquote","IconCode","IconSourceCode","jsx","jsxs","useCurrentEditor","useCurrentEditor","BubbleMenu","useCallback","useState","useRef","useEffect","IconLink","IconCheck","IconX","Fragment","jsx","jsxs","NodeSelection","useCurrentEditor","BubbleMenu","IconTrash","Fragment","useEffect","useState","jsx","jsxs","useCallback","useRef","useState","NodeSelection","useEditorState","useCallback","useRef","useCallback","useEffect","useState","jsx","jsxs","IconAlignLeft","IconAlignCenter","IconAlignRight","IconTrash","jsx","jsxs","useRef","useEditorState","NodeSelection","useCallback","IconPhoto","IconUpload","useCallback","useRef","useState","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","IconPhoto","IconUpload","useCallback","useRef","useState","jsx","jsxs","jsx","jsxs","useRef","useState","useCallback","NodeSelection","NodeViewWrapper","useEditorState","useCallback","useRef","useState","NodeSelection","useEditorState","useCallback","useRef","IconAlignLeft","IconAlignCenter","IconAlignRight","IconTrash","jsx","jsxs","useRef","useEditorState","NodeSelection","useCallback","IconVideo","jsx","jsxs","useRef","useState","useEditorState","NodeSelection","useCallback","NodeViewWrapper","IconTrash","useCallback","jsx","jsxs","useCurrentEditor","useEditorState","useState","useEffect","useRef","useCallback","Fragment","jsx","jsxs","useMemo","useState","useCallback","useRef","useEffect","jsx","jsxs","Editor","useState","useRef","useEffect","useMemo","useCallback","useCurrentEditor","useEditorState","useCallback","useEffect","useRef","useState","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../../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":["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 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":["IconCode","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","IconCode","useCurrentEditor","IconTypography","IconH1","IconH2","IconH3","IconH4","IconList","IconListNumbers","IconBlockquote","IconCode","IconSourceCode","jsx","jsxs","useCurrentEditor","useCurrentEditor","BubbleMenu","useCallback","useState","useRef","useEffect","IconLink","IconCheck","IconX","Fragment","jsx","jsxs","NodeSelection","useCurrentEditor","BubbleMenu","IconTrash","Fragment","useEffect","useState","jsx","jsxs","useCallback","useRef","useState","NodeSelection","useEditorState","useCallback","useRef","useCallback","useEffect","useState","jsx","jsxs","IconAlignLeft","IconAlignCenter","IconAlignRight","IconTrash","jsx","jsxs","useRef","useEditorState","NodeSelection","useCallback","IconPhoto","IconUpload","useCallback","useRef","useState","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","IconPhoto","IconUpload","useCallback","useRef","useState","jsx","jsxs","jsx","jsxs","useRef","useState","useCallback","NodeSelection","NodeViewWrapper","useEditorState","useCallback","useRef","useState","NodeSelection","useEditorState","useCallback","useRef","IconAlignLeft","IconAlignCenter","IconAlignRight","IconTrash","jsx","jsxs","useRef","useEditorState","NodeSelection","useCallback","IconVideo","jsx","jsxs","useRef","useState","useEditorState","NodeSelection","useCallback","NodeViewWrapper","IconTrash","useCallback","jsx","jsxs","useCurrentEditor","useEditorState","useState","useEffect","useRef","useCallback","Fragment","jsx","jsxs","useMemo","useState","useCallback","useRef","useEffect","jsx","jsxs","Editor","useState","useRef","useEffect","useMemo","useCallback","useCurrentEditor","useEditorState","useCallback","useEffect","useRef","useState","jsx"]}
|