neuphlo-editor 1.4.5 → 1.4.7
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
CHANGED
|
@@ -574,7 +574,6 @@ var handleCommandNavigation = (event) => {
|
|
|
574
574
|
|
|
575
575
|
// src/headless/extensions/extension-kit.ts
|
|
576
576
|
var import_extension_collaboration = __toESM(require("@tiptap/extension-collaboration"), 1);
|
|
577
|
-
var import_extension_collaboration_cursor = __toESM(require("@tiptap/extension-collaboration-cursor"), 1);
|
|
578
577
|
var ExtensionKit = (options) => {
|
|
579
578
|
const extensions = [
|
|
580
579
|
import_starter_kit.StarterKit.configure({ codeBlock: false, link: false }),
|
|
@@ -609,13 +608,6 @@ var ExtensionKit = (options) => {
|
|
|
609
608
|
field: options.collaboration.field
|
|
610
609
|
})
|
|
611
610
|
);
|
|
612
|
-
if (options.collaboration.awareness) {
|
|
613
|
-
extensions.push(
|
|
614
|
-
import_extension_collaboration_cursor.default.configure({
|
|
615
|
-
provider: options.collaboration.awareness
|
|
616
|
-
})
|
|
617
|
-
);
|
|
618
|
-
}
|
|
619
611
|
}
|
|
620
612
|
return extensions;
|
|
621
613
|
};
|
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.ts","../../src/headless/index.ts","../../src/headless/components/editor.tsx","../../src/headless/utils/store.ts","../../src/headless/components/editor-command.tsx","../../src/headless/utils/atoms.ts","../../src/headless/components/editor-command-item.tsx","../../src/headless/extensions/index.ts","../../src/headless/extensions/CodeBlock/CodeBlock.ts","../../src/headless/extensions/Link/Link.ts","../../src/headless/extensions/ImageBlock/ImageBlock.ts","../../src/headless/extensions/slash-command.tsx","../../src/headless/extensions/extension-kit.ts","../../src/react/menus/TextMenu.tsx","../../src/react/menus/MenuList.tsx","../../src/react/menus/LinkPopover.tsx","../../src/react/menus/SlashMenu.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/Editor.tsx"],"sourcesContent":["// Auto-apply default styles when consuming the React entry\nimport \"../styles.css\";\n\nexport { Editor } from \"./Editor\";\nexport type {\n NeuphloEditorProps as EditorProps,\n BubbleMenuExtras,\n BubbleMenuExtraRenderer,\n BubbleMenuExtra,\n} from \"./Editor\";\nexport { TextMenu } from \"./menus\";\nexport type { TextMenuProps } from \"./menus\";\n","export { useCurrentEditor as useEditor } from \"@tiptap/react\"\n\nexport {\n EditorRoot,\n EditorContent,\n type EditorContentProps,\n} from \"./components/editor\"\n\nexport { EditorBubble } from \"./components/editor-bubble\"\nexport { EditorBubbleItem } from \"./components/editor-bubble-item\"\nexport {\n EditorCommand,\n EditorCommandList,\n EditorCommandOut,\n} from \"./components/editor-command\"\nexport {\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"./components/editor-command-item\"\n\nexport { Placeholder, StarterKit } from \"./extensions\"\nexport {\n Command as SlashCommand,\n renderItems as renderSlashCommandItems,\n createSuggestionItems,\n handleCommandNavigation,\n} from \"./extensions/slash-command\"\n// Path without extension to satisfy TS/tsup\n// (the file is at ./extensions/slash-command.tsx)\n// eslint-disable-next-line\n","import { EditorProvider } from \"@tiptap/react\"\nimport type { EditorProviderProps } from \"@tiptap/react\"\nimport { forwardRef } from \"react\"\nimport type { FC, ReactNode } from \"react\"\nimport { Provider } from \"jotai\"\nimport { novelStore } from \"../utils/store\"\n\nexport interface EditorRootProps {\n readonly children: ReactNode\n}\n\nexport const EditorRoot: FC<EditorRootProps> = ({ children }) => {\n return (\n <Provider store={novelStore as any}>\n {children as any}\n </Provider>\n )\n}\n\nexport type EditorContentProps = EditorProviderProps & {\n readonly children?: ReactNode\n readonly className?: string\n readonly initialContent?: any\n}\n\nexport const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(\n ({ className, children, initialContent, content, ...rest }, ref) => {\n const effectiveContent = content ?? initialContent\n return (\n <div ref={ref} className={className}>\n <EditorProvider {...rest} content={effectiveContent}>\n {children}\n </EditorProvider>\n </div>\n )\n }\n)\n\nEditorContent.displayName = \"EditorContent\"\n","import { createStore } from \"jotai\";\n\n// biome-ignore lint/suspicious/noExplicitAny: store is opaque to consumers\nexport const novelStore: any = createStore();\nexport * from \"jotai\";\n\n","import { useAtom, useSetAtom } from \"jotai\"\nimport { useEffect, forwardRef } from \"react\"\nimport { Command } from \"cmdk\"\nimport { queryAtom, rangeAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\nimport type { FC } from \"react\"\nimport type { Range } from \"@tiptap/core\"\nimport tunnel from \"tunnel-rat\"\n\nconst commandTunnel: any = (tunnel as any)()\n\ninterface EditorCommandOutProps {\n readonly query: string\n readonly range: Range\n}\n\nexport const EditorCommandOut: FC<EditorCommandOutProps> = ({\n query,\n range,\n}) => {\n const setQuery = useSetAtom(queryAtom, { store: novelStore })\n const setRange = useSetAtom(rangeAtom, { store: novelStore })\n\n useEffect(() => {\n setQuery(query)\n }, [query, setQuery])\n\n useEffect(() => {\n setRange(range)\n }, [range, setRange])\n\n useEffect(() => {\n const navigationKeys = [\"ArrowUp\", \"ArrowDown\", \"Enter\"]\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault()\n const commandRef = document.querySelector(\"#slash-command\")\n\n if (commandRef)\n commandRef.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: e.key,\n cancelable: true,\n bubbles: true,\n })\n )\n\n return false\n }\n }\n document.addEventListener(\"keydown\", onKeyDown)\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown)\n }\n }, [])\n\n return <commandTunnel.Out />\n}\n\nconst CommandAny: any = Command\nexport const EditorCommand = forwardRef<HTMLDivElement, any>(\n ({ children, className, ...rest }, ref) => {\n const [query, setQuery] = useAtom(queryAtom)\n\n return (\n <commandTunnel.In>\n <CommandAny\n ref={ref}\n onKeyDown={(e: any) => {\n e.stopPropagation()\n }}\n id=\"slash-command\"\n className={className}\n {...rest}\n >\n <CommandAny.Input\n value={query}\n onValueChange={setQuery}\n style={{ display: \"none\" }}\n />\n {children}\n </CommandAny>\n </commandTunnel.In>\n )\n }\n)\nexport const EditorCommandList: any = Command.List\n\nEditorCommand.displayName = \"EditorCommand\"\n","import { atom } from \"jotai\"\nimport type { Range } from \"@tiptap/core\"\n\nexport const queryAtom = atom(\"\")\nexport const rangeAtom = atom<Range | null>(null)\n\n","import { forwardRef } from \"react\"\nimport { CommandEmpty, CommandItem } from \"cmdk\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport { rangeAtom } from \"../utils/atoms\"\nimport type { Editor, Range } from \"@tiptap/core\"\n\ninterface EditorCommandItemProps {\n readonly onCommand: ({\n editor,\n range,\n }: {\n editor: Editor\n range: Range\n }) => void\n}\n\nconst CommandItemAny: any = CommandItem\nconst CommandEmptyAny: any = CommandEmpty\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & any\n>(({ children, onCommand, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n const range = useAtomValue(rangeAtom)\n\n if (!editor || !range) return null\n\n return (\n <CommandItemAny\n ref={ref}\n {...(rest as any)}\n onSelect={() => onCommand({ editor, range })}\n >\n {children}\n </CommandItemAny>\n )\n})\n\nEditorCommandItem.displayName = \"EditorCommandItem\"\n\nexport const EditorCommandEmpty: any = CommandEmptyAny\n\nexport default EditorCommandItem\n","export { StarterKit } from \"@tiptap/starter-kit\"\nexport { Placeholder } from \"@tiptap/extension-placeholder\"\n\n// Custom\nexport { CodeBlock } from \"./CodeBlock\"\nexport { Link } from \"./Link\"\nexport { ImageBlock } from \"./ImageBlock\"\nexport type { ImageBlockOptions } from \"./ImageBlock\"\n","import { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\"\nimport { all, createLowlight } from \"lowlight\"\n\nconst lowlight = createLowlight(all)\n\nexport const CodeBlock = CodeBlockLowlight.configure({\n lowlight,\n})\n","import { mergeAttributes } from \"@tiptap/core\"\nimport TiptapLink from \"@tiptap/extension-link\"\nimport { Plugin } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }: any) {\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"link\",\n }),\n 0,\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(((this as any).parent?.() as any[]) || []),\n new Plugin({\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === \"Escape\" && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n },\n }),\n ]\n },\n})\n\nexport default Link\n","import { mergeAttributes, Range } from \"@tiptap/core\"\nimport { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageBlockOptions {\n uploadImage?: (file: File) => Promise<string>\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: { src: string }) => ReturnType\n setImageBlockAt: (attributes: {\n src: string\n pos: number | Range\n }) => ReturnType\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setImageBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const ImageBlock = TiptapImage.extend<ImageBlockOptions>({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n inline: false,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n loading: {\n default: false,\n parseHTML: () => false,\n renderHTML: () => ({}),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]:not([src^=\"data:\"])',\n getAttrs: (element) => {\n const el = element as HTMLElement\n return {\n src: el.getAttribute(\"src\"),\n alt: el.getAttribute(\"alt\"),\n width: el.getAttribute(\"data-width\") || \"100%\",\n align: el.getAttribute(\"data-align\") || \"center\",\n }\n },\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"img\", mergeAttributes(HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n // If no custom node view is provided, we fall back to default behavior\n // but avoid the circular dependency require()\n return null\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageBlockDrop\"),\n props: {\n handleDOMEvents: {\n drop: (view: EditorView, event: DragEvent) => {\n const hasFiles =\n event.dataTransfer &&\n event.dataTransfer.files &&\n event.dataTransfer.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.dataTransfer.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n const { schema } = view.state\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!coordinates) return false\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode = schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n const placeholderTr = view.state.tr.insert(\n coordinates.pos,\n placeholderNode\n )\n view.dispatch(placeholderTr)\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = schema.nodes.imageBlock.create({ src: url })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n paste: (view: EditorView, event: ClipboardEvent) => {\n const hasFiles =\n event.clipboardData &&\n event.clipboardData.files &&\n event.clipboardData.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.clipboardData.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode =\n view.state.schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n view.dispatch(\n view.state.tr.replaceSelectionWith(placeholderNode)\n )\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = view.state.schema.nodes.imageBlock.create({\n src: url,\n })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default ImageBlock\n","import { ReactRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport { Extension } from \"@tiptap/core\"\nimport type { RefObject, ReactNode } from \"react\"\nimport { EditorCommandOut } from \"../components/editor-command\"\n\nexport const Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: (ctx: any) => {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n },\n } as any,\n }\n },\n addProseMirrorPlugins() {\n const base: any = this.options.suggestion ?? {}\n return [\n Suggestion({\n editor: this.editor,\n char: base.char ?? \"/\",\n items: base.items ?? (() => [\"/\"] as any),\n command: (ctx: any) => {\n if (typeof ctx?.props?.command === \"function\") {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n }\n },\n ...base,\n }),\n ]\n },\n})\n\nexport const renderItems = (elementRef?: RefObject<Element> | null) => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n const top = Math.round(clientRect.bottom + 8)\n const left = Math.round(clientRect.left)\n container.style.top = `${top}px`\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n const { selection } = props.editor.state\n const parentNode = selection.$from.node(selection.$from.depth)\n const blockType = parentNode.type.name\n if (blockType === \"codeBlock\") return false\n\n component = new ReactRenderer(EditorCommandOut, {\n props: {\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n container.style.minWidth = \"240px\"\n ;(elementRef?.current ?? document.body).appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n component?.updateProps({\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"Escape\") {\n destroy()\n return true\n }\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport interface SuggestionItem {\n title: string\n description: string\n icon: ReactNode\n searchTerms?: string[]\n command?: (props: {\n editor: any\n range: { from: number; to: number }\n }) => void\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items\n\nexport const handleCommandNavigation = (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) return true\n }\n}\n","import Collaboration from \"@tiptap/extension-collaboration\"\nimport CollaborationCursor from \"@tiptap/extension-collaboration-cursor\"\nimport { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { ImageBlock } from \"./ImageBlock/ImageBlock\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n user?: any\n }\n imageBlockView?: any\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => {\n const extensions = [\n StarterKit.configure({ codeBlock: false, link: false }),\n CodeBlock,\n Link,\n ImageBlock.configure({\n uploadImage: options?.uploadImage,\n nodeView: options?.imageBlockView,\n }),\n Placeholder.configure({\n placeholder: ({ node }: any) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`\n }\n return \"Press '/' for commands\"\n },\n includeChildren: true,\n }),\n SlashCommand.configure({\n suggestion: {\n char: \"/\",\n render: renderSlashItems,\n allowSpaces: true,\n allowedPrefixes: null,\n },\n }),\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 if (options.collaboration.awareness) {\n extensions.push(\n CollaborationCursor.configure({\n provider: options.collaboration.awareness,\n }),\n )\n }\n }\n\n return extensions\n}\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport type { ReactNode } from \"react\"\nimport { Fragment } from \"react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type TextMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function TextMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: TextMenuProps) {\n const { editor } = useCurrentEditor()\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n return {\n isBold: ctx.editor.isActive(\"bold\"),\n isItalic: ctx.editor.isActive(\"italic\"),\n isStrike: ctx.editor.isActive(\"strike\"),\n isCode: ctx.editor.isActive(\"code\"),\n isCodeBlock: ctx.editor.isActive(\"codeBlock\"),\n isParagraph: ctx.editor.isActive(\"paragraph\"),\n isHeading: ctx.editor.isActive(\"heading\"),\n isList:\n ctx.editor.isActive(\"bulletList\") ||\n ctx.editor.isActive(\"orderedList\"),\n isBlockquote: ctx.editor.isActive(\"blockquote\"),\n }\n },\n })\n\n if (!editor || !editorState) return null\n\n const hasAnyMarksInSelection = () => {\n const anyEditor: any = editor\n const state = anyEditor.state\n const sel: any = state.selection\n let has = false\n state.doc.nodesBetween(sel.from, sel.to, (node: any) => {\n if (node.isText && node.marks && node.marks.length > 0) {\n has = true\n return false\n }\n return undefined\n })\n if (!has && sel.empty) {\n const marks = state.storedMarks || sel.$from.marks()\n if (marks && marks.length > 0) has = true\n }\n return has\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state, from, to, view }) => {\n // Don't show if imageBlock is active\n if (e.isActive(\"imageBlock\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // 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\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <MenuList editor={editor} />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isBold ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isBold}\n aria-label=\"Toggle bold\"\n >\n <IconBold size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isItalic ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isItalic}\n aria-label=\"Toggle italic\"\n >\n <IconItalic size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isStrike ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isStrike}\n aria-label=\"Toggle strike\"\n >\n <IconStrikethrough size={16} />\n </button>\n\n <LinkPopover editor={editor} hideWhenUnavailable={false} />\n\n {(() => {\n const hasInlineMarks = hasAnyMarksInSelection()\n\n const isPlainParagraph =\n editorState.isParagraph &&\n !editorState.isHeading &&\n !editorState.isList &&\n !editorState.isBlockquote &&\n !editorState.isCodeBlock &&\n !hasInlineMarks\n\n return (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .setParagraph()\n .unsetAllMarks()\n .run()\n }\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Revert to paragraph\"\n title=\"Revert to paragraph\"\n disabled={isPlainParagraph}\n aria-disabled={isPlainParagraph}\n >\n <IconArrowBackUp size={16} />\n </button>\n )\n })()}\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default TextMenu\n","import React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconChevronDown,\n IconSourceCode,\n} from \"@tabler/icons-react\"\n\nexport type MenuListProps = {\n editor: any\n className?: string\n style?: React.CSSProperties\n onSelect?: () => void\n buttonClassName?: string\n}\n\nexport function MenuList({\n editor,\n className,\n style,\n onSelect,\n buttonClassName,\n}: MenuListProps) {\n const [open, setOpen] = useState(false)\n const [label, setLabel] = useState(\"Paragraph\")\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const computeLabel = useCallback(() => {\n if (!editor) return \"Paragraph\"\n if (editor.isActive(\"heading\", { level: 1 })) return \"Heading 1\"\n if (editor.isActive(\"heading\", { level: 2 })) return \"Heading 2\"\n if (editor.isActive(\"heading\", { level: 3 })) return \"Heading 3\"\n if (editor.isActive(\"heading\", { level: 4 })) return \"Heading 4\"\n if (editor.isActive(\"bulletList\")) return \"Bullet list\"\n if (editor.isActive(\"orderedList\")) return \"Ordered list\"\n if (editor.isActive(\"blockquote\")) return \"Quote\"\n if (editor.isActive(\"code\")) return \"Code\"\n if (editor.isActive(\"codeBlock\")) return \"Code Block\"\n return \"Paragraph\"\n }, [editor])\n\n useEffect(() => {\n setLabel(computeLabel())\n if (!editor) return\n const update = () => setLabel(computeLabel())\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor, computeLabel])\n\n useEffect(() => {\n if (!editor) return\n const close = () => setOpen(false)\n editor.on(\"selectionUpdate\", close)\n editor.on(\"blur\", close)\n return () => {\n editor.off(\"selectionUpdate\", close)\n editor.off(\"blur\", close)\n }\n }, [editor])\n\n useEffect(() => {\n const handlePointerDown = (e: MouseEvent) => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n if (!el.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [open])\n\n const handle = (fn: () => void) => () => {\n fn()\n onSelect?.()\n setOpen(false)\n }\n\n const isActive = useCallback((name: string) => label === name, [label])\n\n return (\n <div ref={rootRef} className=\"nph-dropdown\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={\n buttonClassName ??\n `nph-btn nph-btn-ghost nph-btn-xs${open || label !== \"Paragraph\" ? \" is-active\" : \"\"}`\n }\n aria-expanded={open}\n aria-label=\"Change block type\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span style={{ fontSize: 12 }}>{label}</span>\n <IconChevronDown size={16} />\n </span>\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel nph-command\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <div\n className={className ? className : \"nph-command__list\"}\n style={{ maxHeight: 240, ...(style ?? {}) }}\n >\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Paragraph\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Paragraph\")}\n onClick={handle(() =>\n (editor as any).chain().focus().setParagraph().run()\n )}\n >\n <IconTypography size={16} />\n <span>Paragraph</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 1\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 1\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 1 })\n .run()\n )}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 2\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 2\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 2 })\n .run()\n )}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 3\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 3\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 3 })\n .run()\n )}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 4\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 4\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 4 })\n .run()\n )}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Bullet list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Bullet list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBulletList().run()\n )}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Ordered list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Ordered list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleOrderedList().run()\n )}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Quote\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Quote\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBlockquote().run()\n )}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCode().run()\n )}\n >\n <IconCode size={16} />\n <span>Code</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code Block\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code Block\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCodeBlock().run()\n )}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default MenuList\n","import React, { useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n IconLink,\n IconExternalLink,\n IconTrash,\n IconCornerDownLeft,\n} from \"@tabler/icons-react\"\n\nexport type LinkPopoverProps = {\n editor: any | null\n hideWhenUnavailable?: boolean\n autoOpenOnLinkActive?: boolean\n onSetLink?: () => void\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function LinkPopover({\n editor,\n hideWhenUnavailable = false,\n autoOpenOnLinkActive = true,\n onSetLink,\n onOpenChange,\n}: LinkPopoverProps) {\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState<string>(\"\")\n const inputRef = useRef<HTMLInputElement | null>(null)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const isInCode =\n !!editor?.isActive?.(\"code\") || !!editor?.isActive?.(\"codeBlock\")\n const isActive = !!editor?.isActive?.(\"link\")\n const currentHref: string = useMemo(\n () =>\n editor?.getAttributes ? (editor.getAttributes(\"link\")?.href ?? \"\") : \"\",\n [editor, editor?.state?.selection?.from, editor?.state?.selection?.to]\n )\n\n const canSet = useMemo(() => {\n if (!editor || isInCode) return false\n try {\n return editor\n .can()\n .chain()\n .focus()\n .setLink({ href: \"https://example.com\" })\n .run()\n } catch (_) {\n return false\n }\n }, [editor, isInCode])\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n const next = editor.getAttributes(\"link\")?.href ?? \"\"\n setUrl(next)\n const linkActive = editor.isActive(\"link\")\n if (autoOpenOnLinkActive && editor.isFocused && linkActive) setOpen(true)\n if (!linkActive) setOpen(false)\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, autoOpenOnLinkActive])\n\n useEffect(() => {\n if (open) inputRef.current?.focus()\n onOpenChange?.(open)\n }, [open, onOpenChange])\n\n if (!editor) return null\n if (hideWhenUnavailable && !canSet && !isActive) return null\n\n const applyLink = () => {\n if (!url) return\n ;(editor as any)\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run()\n onSetLink?.()\n setOpen(false)\n }\n\n const removeLink = () => {\n ;(editor as any).chain().focus().unsetLink().run()\n setOpen(false)\n }\n\n // Close when clicking outside of the popover/button container\n useEffect(() => {\n const handler = (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\", handler)\n return () => document.removeEventListener(\"pointerdown\", handler)\n }, [open])\n\n return (\n <div\n ref={rootRef}\n className=\"nph-dropdown\"\n style={{ position: \"relative\" }}\n >\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${isActive ? \" is-active\" : \"\"}`}\n aria-label={isActive ? \"Edit link\" : \"Add link\"}\n aria-pressed={isActive}\n aria-expanded={open}\n disabled={isInCode}\n aria-disabled={isInCode}\n title={isActive ? currentHref || \"Edit link\" : \"Add link\"}\n >\n <IconLink size={16} />\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel\"\n style={{\n padding: 0,\n minWidth: 320,\n background: \"transparent\",\n boxShadow: \"none\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n }}\n role=\"dialog\"\n aria-label=\"Link editor\"\n >\n <div className=\"nph-link-popover\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://example.com\"\n className=\"nph-link-popover__input\"\n onMouseDown={(e) => {\n e.stopPropagation()\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n applyLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setOpen(false)\n }\n }}\n />\n <div className=\"nph-link-popover__divider\" />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Apply\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={applyLink}\n disabled={!url}\n >\n <IconCornerDownLeft size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Open in new tab\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const target = url || currentHref\n if (target) window.open(target, \"_blank\", \"noopener,noreferrer\")\n }}\n disabled={!url && !currentHref}\n >\n <IconExternalLink 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 link\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeLink}\n disabled={!isActive}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default LinkPopover\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport {\n EditorCommand,\n EditorCommandList,\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"../../headless\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconSourceCode,\n IconPhoto,\n} from \"@tabler/icons-react\"\n\nexport type SlashMenuProps = {\n className?: string\n}\n\nexport function SlashMenu({ className }: SlashMenuProps) {\n const { editor } = useCurrentEditor()\n if (!editor) return null\n\n return (\n <EditorCommand className={className ?? \"nph-command\"}>\n <EditorCommandList\n className=\"nph-command__list\"\n style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\n >\n <EditorCommandEmpty style={{ padding: \"8px 12px\", fontSize: 14 }}>\n No commands found\n </EditorCommandEmpty>\n <EditorCommandItem\n value=\"bold\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBold()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBold size={16} />\n <span>Bold</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"italic\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleItalic()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconItalic size={16} />\n <span>Italic</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"strike\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleStrike()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconStrikethrough size={16} />\n <span>Strike</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading1 h1\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 1 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading2 h2\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 2 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading3 h3\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 3 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading4 h4\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 4 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"bullet list ul\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBulletList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"ordered list ol\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleOrderedList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"quote blockquote\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBlockquote()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code inline\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCode()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconCode size={16} />\n <span>Code</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code block codeblock\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCodeBlock()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"image photo picture block\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) => {\n ;(editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .setImageBlock({ src: \"\" })\n .run()\n }}\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconPhoto size={16} />\n <span>Image</span>\n </span>\n </EditorCommandItem>\n </EditorCommandList>\n </EditorCommand>\n )\n}\n\nexport default SlashMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { Fragment, useEffect, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type ImageMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function ImageMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: ImageMenuProps) {\n const { editor } = useCurrentEditor()\n const [size, setSize] = useState<number>(100)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"left\")\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\") ?? {\n width: \"\",\n align: \"left\",\n }\n const width = attrs.width ?? \"\"\n if (width.includes(\"%\")) {\n setSize(parseInt(width) || 100)\n } else {\n setSize(100)\n }\n setAlign(attrs.align ?? \"left\")\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor])\n\n if (!editor) return null\n\n const updateImageSize = (newSize: number) => {\n setSize(newSize)\n editor.commands.setImageBlockWidth(newSize)\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.setImageBlockAlign(newAlign)\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n editor.commands.updateAttributes(\"imageBlock\", { src: \"\", loading: false })\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"imageBlock\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`image-leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\" }}>\n {size}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"5\"\n value={size}\n onChange={(e) => updateImageSize(parseInt(e.target.value))}\n onMouseDown={(e) => e.stopPropagation()}\n style={{ flex: 1 }}\n />\n </div>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"left\")}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"center\")}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"right\")}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Upload new image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={triggerUpload}\n >\n <IconUpload size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeImage}\n >\n <IconTrash size={16} />\n </button>\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`image-trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockMenu } from \"./ImageBlockMenu\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\ninterface ImageBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const ImageBlockView = (props: ImageBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n alt?: string\n loading?: boolean\n }\n }\n }\n const imageWrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align, alt, loading } = node.attrs\n\n const handleUpload = useCallback(\n (url: string) => {\n updateAttributes({ src: url, loading: false })\n },\n [updateAttributes]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n // Calculate wrapper class based on alignment\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show uploader if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageUploader onUpload={handleUpload} editor={editor} />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show loading placeholder\n if (loading) {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageBlockLoading />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the actual image\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={{ position: \"relative\" }}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n className=\"nph-image-block\"\n />\n </div>\n </div>\n <ImageBlockMenu editor={editor} appendTo={imageWrapperRef} />\n </NodeViewWrapper>\n )\n}\n\nexport default ImageBlockView\n","import { Editor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useRef, useState, useEffect } from \"react\"\nimport { ImageBlockWidth } from \"./ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type ImageBlockMenuProps = {\n editor: Editor\n appendTo?: React.RefObject<HTMLElement | null>\n}\n\nexport const ImageBlockMenu = ({ editor, appendTo }: ImageBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"center\")\n const [width, setWidth] = useState<number>(100)\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\")\n setAlign(attrs.align || \"center\")\n const widthStr = attrs.width || \"100%\"\n setWidth(parseInt(widthStr) || 100)\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n }\n }, [editor])\n\n const getReferenceClientRect = useCallback(() => {\n if (!editor) return new DOMRect(-1000, -1000, 0, 0)\n\n const { view } = editor\n const { state } = view\n const { selection } = state\n\n // Get the node at the current selection\n const node = selection instanceof (window as any).ProseMirror?.state?.NodeSelection\n ? (selection as any).node\n : null\n\n if (node && node.type.name === \"imageBlock\") {\n const nodePos = (selection as any).from\n const domNode = view.nodeDOM(nodePos)\n if (domNode && domNode instanceof HTMLElement) {\n return domNode.getBoundingClientRect()\n }\n }\n\n // Fallback: try to find the image block element\n const imageBlockElements = document.querySelectorAll('[data-node-view-wrapper]')\n for (const el of Array.from(imageBlockElements)) {\n if (el.querySelector(\"img\")) {\n return el.getBoundingClientRect()\n }\n }\n\n return new DOMRect(-1000, -1000, 0, 0)\n }, [editor])\n\n const shouldShow = useCallback(() => {\n if (!editor) return false\n const isActive = editor.isActive(\"imageBlock\")\n if (!isActive) return false\n\n // Check if it's a node selection\n const { state } = editor\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n return isNodeSelection\n }, [editor])\n\n const onAlignImageLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignImageCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignImageRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemoveImage = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n updateDelay={0}\n >\n <div className=\"bubble-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemoveImage}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageBlockMenu\n","import { memo, useCallback, useEffect, useState } from \"react\"\n\nexport type ImageBlockWidthProps = {\n onChange: (value: number) => void\n value: number\n}\n\nexport const ImageBlockWidth = memo(\n ({ onChange, value }: ImageBlockWidthProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = parseInt(e.target.value)\n onChange(nextValue)\n setCurrentValue(nextValue)\n },\n [onChange]\n )\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\", width: 40 }}>\n {currentValue}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"25\"\n value={currentValue}\n onChange={handleChange}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n height: 3,\n borderRadius: 9999,\n appearance: \"none\",\n background: \"linear-gradient(to right, #333 0%, #333 \" + currentValue + \"%, #ddd \" + currentValue + \"%, #ddd 100%)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n className=\"nph-image-width-slider\"\n />\n </div>\n )\n }\n)\n\nImageBlockWidth.displayName = \"ImageBlockWidth\"\n\nexport default ImageBlockWidth\n","import { IconPhoto, IconUpload } from \"@tabler/icons-react\"\nimport { ChangeEvent, useCallback, useRef, useState, DragEvent } from \"react\"\nimport { Editor } from \"@tiptap/react\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\nexport type ImageUploaderProps = {\n onUpload: (url: string) => void\n editor: Editor\n}\n\nexport const ImageUploader = ({ onUpload, editor }: ImageUploaderProps) => {\n const [loading, setLoading] = useState(false)\n const [draggedInside, setDraggedInside] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\n // Get the upload handler from the editor\n const imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const uploadImage = (imageExtension?.options as any)?.uploadImage\n\n if (uploadImage) {\n const url = await uploadImage(file)\n onUpload(url)\n } else {\n console.error(\"No uploadImage handler provided\")\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n } finally {\n setLoading(false)\n }\n },\n [editor, onUpload]\n )\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const onFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n\n const file = e.dataTransfer.files[0]\n if (file && /image/i.test(file.type)) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(true)\n }, [])\n\n const onDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n }, [])\n\n if (loading) {\n return <ImageBlockLoading />\n }\n\n return (\n <div\n className={`nph-image-uploader${draggedInside ? \" nph-image-uploader--dragging\" : \"\"}`}\n onDrop={onDrop}\n onDragOver={onDragEnter}\n onDragLeave={onDragLeave}\n contentEditable={false}\n >\n <IconPhoto size={48} className=\"nph-image-uploader__icon\" />\n <div className=\"nph-image-uploader__content\">\n <div className=\"nph-image-uploader__text\">\n {draggedInside ? \"Drop image here\" : \"Drag and drop or\"}\n </div>\n <div>\n <button\n type=\"button\"\n disabled={draggedInside}\n onClick={handleUploadClick}\n className=\"nph-btn nph-btn-ghost nph-btn-sm nph-image-uploader__button\"\n >\n <IconUpload size={16} />\n Upload an image\n </button>\n </div>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".jpg,.jpeg,.png,.webp,.gif\"\n onChange={onFileChange}\n className=\"nph-image-uploader__input\"\n />\n </div>\n )\n}\n\nexport default ImageUploader\n","import { IconLoader2 } from \"@tabler/icons-react\"\n\nexport const ImageBlockLoading = () => {\n return (\n <div className=\"nph-image-block-loading\">\n <div className=\"nph-image-block-loading__overlay\">\n <div className=\"nph-image-block-loading__content\">\n <IconLoader2 size={24} className=\"nph-image-block-loading__spinner\" />\n <p className=\"nph-image-block-loading__text\">Uploading image...</p>\n </div>\n </div>\n <div className=\"nph-image-block-loading__placeholder\" />\n </div>\n )\n}\n\nexport default ImageBlockLoading\n","import {\n EditorRoot,\n EditorContent,\n handleCommandNavigation,\n type EditorContentProps,\n} from \"../headless\"\nimport ExtensionKit from \"../headless/extensions/extension-kit\"\nimport { SlashMenu, TextMenu, ImageMenu } from \"./menus\"\nimport { ImageBlockView } from \"./menus/ImageBlock/ImageBlockView\"\nimport type { ReactNode } from \"react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\nexport type BubbleMenuExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type BubbleMenuExtra =\n | BubbleMenuExtraRenderer\n | {\n render: BubbleMenuExtraRenderer\n align?: \"start\" | \"end\"\n }\n\nexport type BubbleMenuExtras = Partial<{\n text: BubbleMenuExtra | BubbleMenuExtra[]\n image: BubbleMenuExtra | BubbleMenuExtra[]\n}>\n\nexport type NeuphloEditorProps = {\n content?: string\n className?: string\n editable?: boolean\n immediatelyRender?: boolean\n showTextMenu?: boolean\n showSlashMenu?: boolean\n showImageMenu?: boolean\n extensions?: any[]\n bubbleMenuExtras?: BubbleMenuExtras\n onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n }\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n bubbleMenuExtras,\n onUpdate,\n onCreate,\n uploadImage,\n collaboration,\n}: NeuphloEditorProps) {\n const normalizeExtras = (extras?: BubbleMenuExtra | BubbleMenuExtra[]) => {\n const result: {\n start: BubbleMenuExtraRenderer[]\n end: BubbleMenuExtraRenderer[]\n } = {\n start: [],\n end: [],\n }\n if (!extras) return result\n\n const list = Array.isArray(extras) ? extras : [extras]\n list.forEach((item) => {\n const config =\n typeof item === \"function\"\n ? { render: item, align: \"end\" as const }\n : item\n const slot = config.align === \"start\" ? \"start\" : \"end\"\n result[slot].push(config.render)\n })\n return result\n }\n\n const textExtras = normalizeExtras(bubbleMenuExtras?.text)\n const imageExtras = normalizeExtras(bubbleMenuExtras?.image)\n\n return (\n <div className={className}>\n <EditorRoot>\n <EditorContent\n onUpdate={onUpdate}\n onCreate={onCreate}\n immediatelyRender={immediatelyRender}\n editable={editable}\n content={content}\n extensions={[\n ...ExtensionKit({\n uploadImage: uploadImage,\n collaboration: collaboration,\n imageBlockView: ImageBlockView,\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 {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["Editor","import_react","import_react","import_jotai","import_jotai","import_react","import_jotai","import_jsx_runtime","tunnel","import_react","import_cmdk","import_jotai","import_jsx_runtime","TiptapLink","import_core","import_react","import_state","TiptapImage","node","import_react","import_core","Command","Suggestion","Command","Collaboration","CollaborationCursor","import_react","import_icons_react","import_react","import_jsx_runtime","import_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_react","import_icons_react","import_jsx_runtime","editor","import_react","import_menus","import_icons_react","import_jsx_runtime","import_react","import_menus","import_react","import_react","import_jsx_runtime","import_icons_react","import_jsx_runtime","import_icons_react","import_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Editor"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/headless/index.ts","../../src/headless/components/editor.tsx","../../src/headless/utils/store.ts","../../src/headless/components/editor-command.tsx","../../src/headless/utils/atoms.ts","../../src/headless/components/editor-command-item.tsx","../../src/headless/extensions/index.ts","../../src/headless/extensions/CodeBlock/CodeBlock.ts","../../src/headless/extensions/Link/Link.ts","../../src/headless/extensions/ImageBlock/ImageBlock.ts","../../src/headless/extensions/slash-command.tsx","../../src/headless/extensions/extension-kit.ts","../../src/react/menus/TextMenu.tsx","../../src/react/menus/MenuList.tsx","../../src/react/menus/LinkPopover.tsx","../../src/react/menus/SlashMenu.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/Editor.tsx"],"sourcesContent":["// Auto-apply default styles when consuming the React entry\nimport \"../styles.css\";\n\nexport { Editor } from \"./Editor\";\nexport type {\n NeuphloEditorProps as EditorProps,\n BubbleMenuExtras,\n BubbleMenuExtraRenderer,\n BubbleMenuExtra,\n} from \"./Editor\";\nexport { TextMenu } from \"./menus\";\nexport type { TextMenuProps } from \"./menus\";\n","export { useCurrentEditor as useEditor } from \"@tiptap/react\"\n\nexport {\n EditorRoot,\n EditorContent,\n type EditorContentProps,\n} from \"./components/editor\"\n\nexport { EditorBubble } from \"./components/editor-bubble\"\nexport { EditorBubbleItem } from \"./components/editor-bubble-item\"\nexport {\n EditorCommand,\n EditorCommandList,\n EditorCommandOut,\n} from \"./components/editor-command\"\nexport {\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"./components/editor-command-item\"\n\nexport { Placeholder, StarterKit } from \"./extensions\"\nexport {\n Command as SlashCommand,\n renderItems as renderSlashCommandItems,\n createSuggestionItems,\n handleCommandNavigation,\n} from \"./extensions/slash-command\"\n// Path without extension to satisfy TS/tsup\n// (the file is at ./extensions/slash-command.tsx)\n// eslint-disable-next-line\n","import { EditorProvider } from \"@tiptap/react\"\nimport type { EditorProviderProps } from \"@tiptap/react\"\nimport { forwardRef } from \"react\"\nimport type { FC, ReactNode } from \"react\"\nimport { Provider } from \"jotai\"\nimport { novelStore } from \"../utils/store\"\n\nexport interface EditorRootProps {\n readonly children: ReactNode\n}\n\nexport const EditorRoot: FC<EditorRootProps> = ({ children }) => {\n return (\n <Provider store={novelStore as any}>\n {children as any}\n </Provider>\n )\n}\n\nexport type EditorContentProps = EditorProviderProps & {\n readonly children?: ReactNode\n readonly className?: string\n readonly initialContent?: any\n}\n\nexport const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(\n ({ className, children, initialContent, content, ...rest }, ref) => {\n const effectiveContent = content ?? initialContent\n return (\n <div ref={ref} className={className}>\n <EditorProvider {...rest} content={effectiveContent}>\n {children}\n </EditorProvider>\n </div>\n )\n }\n)\n\nEditorContent.displayName = \"EditorContent\"\n","import { createStore } from \"jotai\";\n\n// biome-ignore lint/suspicious/noExplicitAny: store is opaque to consumers\nexport const novelStore: any = createStore();\nexport * from \"jotai\";\n\n","import { useAtom, useSetAtom } from \"jotai\"\nimport { useEffect, forwardRef } from \"react\"\nimport { Command } from \"cmdk\"\nimport { queryAtom, rangeAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\nimport type { FC } from \"react\"\nimport type { Range } from \"@tiptap/core\"\nimport tunnel from \"tunnel-rat\"\n\nconst commandTunnel: any = (tunnel as any)()\n\ninterface EditorCommandOutProps {\n readonly query: string\n readonly range: Range\n}\n\nexport const EditorCommandOut: FC<EditorCommandOutProps> = ({\n query,\n range,\n}) => {\n const setQuery = useSetAtom(queryAtom, { store: novelStore })\n const setRange = useSetAtom(rangeAtom, { store: novelStore })\n\n useEffect(() => {\n setQuery(query)\n }, [query, setQuery])\n\n useEffect(() => {\n setRange(range)\n }, [range, setRange])\n\n useEffect(() => {\n const navigationKeys = [\"ArrowUp\", \"ArrowDown\", \"Enter\"]\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault()\n const commandRef = document.querySelector(\"#slash-command\")\n\n if (commandRef)\n commandRef.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: e.key,\n cancelable: true,\n bubbles: true,\n })\n )\n\n return false\n }\n }\n document.addEventListener(\"keydown\", onKeyDown)\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown)\n }\n }, [])\n\n return <commandTunnel.Out />\n}\n\nconst CommandAny: any = Command\nexport const EditorCommand = forwardRef<HTMLDivElement, any>(\n ({ children, className, ...rest }, ref) => {\n const [query, setQuery] = useAtom(queryAtom)\n\n return (\n <commandTunnel.In>\n <CommandAny\n ref={ref}\n onKeyDown={(e: any) => {\n e.stopPropagation()\n }}\n id=\"slash-command\"\n className={className}\n {...rest}\n >\n <CommandAny.Input\n value={query}\n onValueChange={setQuery}\n style={{ display: \"none\" }}\n />\n {children}\n </CommandAny>\n </commandTunnel.In>\n )\n }\n)\nexport const EditorCommandList: any = Command.List\n\nEditorCommand.displayName = \"EditorCommand\"\n","import { atom } from \"jotai\"\nimport type { Range } from \"@tiptap/core\"\n\nexport const queryAtom = atom(\"\")\nexport const rangeAtom = atom<Range | null>(null)\n\n","import { forwardRef } from \"react\"\nimport { CommandEmpty, CommandItem } from \"cmdk\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport { rangeAtom } from \"../utils/atoms\"\nimport type { Editor, Range } from \"@tiptap/core\"\n\ninterface EditorCommandItemProps {\n readonly onCommand: ({\n editor,\n range,\n }: {\n editor: Editor\n range: Range\n }) => void\n}\n\nconst CommandItemAny: any = CommandItem\nconst CommandEmptyAny: any = CommandEmpty\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & any\n>(({ children, onCommand, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n const range = useAtomValue(rangeAtom)\n\n if (!editor || !range) return null\n\n return (\n <CommandItemAny\n ref={ref}\n {...(rest as any)}\n onSelect={() => onCommand({ editor, range })}\n >\n {children}\n </CommandItemAny>\n )\n})\n\nEditorCommandItem.displayName = \"EditorCommandItem\"\n\nexport const EditorCommandEmpty: any = CommandEmptyAny\n\nexport default EditorCommandItem\n","export { StarterKit } from \"@tiptap/starter-kit\"\nexport { Placeholder } from \"@tiptap/extension-placeholder\"\n\n// Custom\nexport { CodeBlock } from \"./CodeBlock\"\nexport { Link } from \"./Link\"\nexport { ImageBlock } from \"./ImageBlock\"\nexport type { ImageBlockOptions } from \"./ImageBlock\"\n","import { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\"\nimport { all, createLowlight } from \"lowlight\"\n\nconst lowlight = createLowlight(all)\n\nexport const CodeBlock = CodeBlockLowlight.configure({\n lowlight,\n})\n","import { mergeAttributes } from \"@tiptap/core\"\nimport TiptapLink from \"@tiptap/extension-link\"\nimport { Plugin } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }: any) {\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"link\",\n }),\n 0,\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(((this as any).parent?.() as any[]) || []),\n new Plugin({\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === \"Escape\" && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n },\n }),\n ]\n },\n})\n\nexport default Link\n","import { mergeAttributes, Range } from \"@tiptap/core\"\nimport { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageBlockOptions {\n uploadImage?: (file: File) => Promise<string>\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: { src: string }) => ReturnType\n setImageBlockAt: (attributes: {\n src: string\n pos: number | Range\n }) => ReturnType\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setImageBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const ImageBlock = TiptapImage.extend<ImageBlockOptions>({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n inline: false,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n loading: {\n default: false,\n parseHTML: () => false,\n renderHTML: () => ({}),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]:not([src^=\"data:\"])',\n getAttrs: (element) => {\n const el = element as HTMLElement\n return {\n src: el.getAttribute(\"src\"),\n alt: el.getAttribute(\"alt\"),\n width: el.getAttribute(\"data-width\") || \"100%\",\n align: el.getAttribute(\"data-align\") || \"center\",\n }\n },\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"img\", mergeAttributes(HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n // If no custom node view is provided, we fall back to default behavior\n // but avoid the circular dependency require()\n return null\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageBlockDrop\"),\n props: {\n handleDOMEvents: {\n drop: (view: EditorView, event: DragEvent) => {\n const hasFiles =\n event.dataTransfer &&\n event.dataTransfer.files &&\n event.dataTransfer.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.dataTransfer.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n const { schema } = view.state\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!coordinates) return false\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode = schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n const placeholderTr = view.state.tr.insert(\n coordinates.pos,\n placeholderNode\n )\n view.dispatch(placeholderTr)\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = schema.nodes.imageBlock.create({ src: url })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n paste: (view: EditorView, event: ClipboardEvent) => {\n const hasFiles =\n event.clipboardData &&\n event.clipboardData.files &&\n event.clipboardData.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.clipboardData.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode =\n view.state.schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n view.dispatch(\n view.state.tr.replaceSelectionWith(placeholderNode)\n )\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = view.state.schema.nodes.imageBlock.create({\n src: url,\n })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default ImageBlock\n","import { ReactRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport { Extension } from \"@tiptap/core\"\nimport type { RefObject, ReactNode } from \"react\"\nimport { EditorCommandOut } from \"../components/editor-command\"\n\nexport const Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: (ctx: any) => {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n },\n } as any,\n }\n },\n addProseMirrorPlugins() {\n const base: any = this.options.suggestion ?? {}\n return [\n Suggestion({\n editor: this.editor,\n char: base.char ?? \"/\",\n items: base.items ?? (() => [\"/\"] as any),\n command: (ctx: any) => {\n if (typeof ctx?.props?.command === \"function\") {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n }\n },\n ...base,\n }),\n ]\n },\n})\n\nexport const renderItems = (elementRef?: RefObject<Element> | null) => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n const top = Math.round(clientRect.bottom + 8)\n const left = Math.round(clientRect.left)\n container.style.top = `${top}px`\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n const { selection } = props.editor.state\n const parentNode = selection.$from.node(selection.$from.depth)\n const blockType = parentNode.type.name\n if (blockType === \"codeBlock\") return false\n\n component = new ReactRenderer(EditorCommandOut, {\n props: {\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n container.style.minWidth = \"240px\"\n ;(elementRef?.current ?? document.body).appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: {\n editor: any\n clientRect: (() => DOMRect | null) | null\n query?: string\n range?: any\n }) => {\n component?.updateProps({\n query: (props as any).query ?? \"\",\n range: (props as any).range,\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"Escape\") {\n destroy()\n return true\n }\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport interface SuggestionItem {\n title: string\n description: string\n icon: ReactNode\n searchTerms?: string[]\n command?: (props: {\n editor: any\n range: { from: number; to: number }\n }) => void\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items\n\nexport const handleCommandNavigation = (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) return true\n }\n}\n","import Collaboration from \"@tiptap/extension-collaboration\"\n// import CollaborationCursor from \"@tiptap/extension-collaboration-cursor\" // Temporarily disabled\nimport { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { ImageBlock } from \"./ImageBlock/ImageBlock\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n user?: any\n }\n imageBlockView?: any\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => {\n const extensions = [\n StarterKit.configure({ codeBlock: false, link: false }),\n CodeBlock,\n Link,\n ImageBlock.configure({\n uploadImage: options?.uploadImage,\n nodeView: options?.imageBlockView,\n }),\n Placeholder.configure({\n placeholder: ({ node }: any) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`\n }\n return \"Press '/' for commands\"\n },\n includeChildren: true,\n }),\n SlashCommand.configure({\n suggestion: {\n char: \"/\",\n render: renderSlashItems,\n allowSpaces: true,\n allowedPrefixes: null,\n },\n }),\n ]\n\n if (options?.collaboration?.doc) {\n extensions.push(\n Collaboration.configure({\n document: options.collaboration.doc,\n field: options.collaboration.field,\n }),\n )\n\n // Note: CollaborationCursor is temporarily disabled due to compatibility issues\n // Collaboration (document syncing) still works without it\n // TODO: Fix CollaborationCursor integration\n }\n\n return extensions\n}\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport type { ReactNode } from \"react\"\nimport { Fragment } from \"react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type TextMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function TextMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: TextMenuProps) {\n const { editor } = useCurrentEditor()\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n return {\n isBold: ctx.editor.isActive(\"bold\"),\n isItalic: ctx.editor.isActive(\"italic\"),\n isStrike: ctx.editor.isActive(\"strike\"),\n isCode: ctx.editor.isActive(\"code\"),\n isCodeBlock: ctx.editor.isActive(\"codeBlock\"),\n isParagraph: ctx.editor.isActive(\"paragraph\"),\n isHeading: ctx.editor.isActive(\"heading\"),\n isList:\n ctx.editor.isActive(\"bulletList\") ||\n ctx.editor.isActive(\"orderedList\"),\n isBlockquote: ctx.editor.isActive(\"blockquote\"),\n }\n },\n })\n\n if (!editor || !editorState) return null\n\n const hasAnyMarksInSelection = () => {\n const anyEditor: any = editor\n const state = anyEditor.state\n const sel: any = state.selection\n let has = false\n state.doc.nodesBetween(sel.from, sel.to, (node: any) => {\n if (node.isText && node.marks && node.marks.length > 0) {\n has = true\n return false\n }\n return undefined\n })\n if (!has && sel.empty) {\n const marks = state.storedMarks || sel.$from.marks()\n if (marks && marks.length > 0) has = true\n }\n return has\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state, from, to, view }) => {\n // Don't show if imageBlock is active\n if (e.isActive(\"imageBlock\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // 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\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <MenuList editor={editor} />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isBold ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isBold}\n aria-label=\"Toggle bold\"\n >\n <IconBold size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isItalic ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isItalic}\n aria-label=\"Toggle italic\"\n >\n <IconItalic size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isStrike ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isStrike}\n aria-label=\"Toggle strike\"\n >\n <IconStrikethrough size={16} />\n </button>\n\n <LinkPopover editor={editor} hideWhenUnavailable={false} />\n\n {(() => {\n const hasInlineMarks = hasAnyMarksInSelection()\n\n const isPlainParagraph =\n editorState.isParagraph &&\n !editorState.isHeading &&\n !editorState.isList &&\n !editorState.isBlockquote &&\n !editorState.isCodeBlock &&\n !hasInlineMarks\n\n return (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .setParagraph()\n .unsetAllMarks()\n .run()\n }\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Revert to paragraph\"\n title=\"Revert to paragraph\"\n disabled={isPlainParagraph}\n aria-disabled={isPlainParagraph}\n >\n <IconArrowBackUp size={16} />\n </button>\n )\n })()}\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default TextMenu\n","import React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconChevronDown,\n IconSourceCode,\n} from \"@tabler/icons-react\"\n\nexport type MenuListProps = {\n editor: any\n className?: string\n style?: React.CSSProperties\n onSelect?: () => void\n buttonClassName?: string\n}\n\nexport function MenuList({\n editor,\n className,\n style,\n onSelect,\n buttonClassName,\n}: MenuListProps) {\n const [open, setOpen] = useState(false)\n const [label, setLabel] = useState(\"Paragraph\")\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const computeLabel = useCallback(() => {\n if (!editor) return \"Paragraph\"\n if (editor.isActive(\"heading\", { level: 1 })) return \"Heading 1\"\n if (editor.isActive(\"heading\", { level: 2 })) return \"Heading 2\"\n if (editor.isActive(\"heading\", { level: 3 })) return \"Heading 3\"\n if (editor.isActive(\"heading\", { level: 4 })) return \"Heading 4\"\n if (editor.isActive(\"bulletList\")) return \"Bullet list\"\n if (editor.isActive(\"orderedList\")) return \"Ordered list\"\n if (editor.isActive(\"blockquote\")) return \"Quote\"\n if (editor.isActive(\"code\")) return \"Code\"\n if (editor.isActive(\"codeBlock\")) return \"Code Block\"\n return \"Paragraph\"\n }, [editor])\n\n useEffect(() => {\n setLabel(computeLabel())\n if (!editor) return\n const update = () => setLabel(computeLabel())\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor, computeLabel])\n\n useEffect(() => {\n if (!editor) return\n const close = () => setOpen(false)\n editor.on(\"selectionUpdate\", close)\n editor.on(\"blur\", close)\n return () => {\n editor.off(\"selectionUpdate\", close)\n editor.off(\"blur\", close)\n }\n }, [editor])\n\n useEffect(() => {\n const handlePointerDown = (e: MouseEvent) => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n if (!el.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [open])\n\n const handle = (fn: () => void) => () => {\n fn()\n onSelect?.()\n setOpen(false)\n }\n\n const isActive = useCallback((name: string) => label === name, [label])\n\n return (\n <div ref={rootRef} className=\"nph-dropdown\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={\n buttonClassName ??\n `nph-btn nph-btn-ghost nph-btn-xs${open || label !== \"Paragraph\" ? \" is-active\" : \"\"}`\n }\n aria-expanded={open}\n aria-label=\"Change block type\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span style={{ fontSize: 12 }}>{label}</span>\n <IconChevronDown size={16} />\n </span>\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel nph-command\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <div\n className={className ? className : \"nph-command__list\"}\n style={{ maxHeight: 240, ...(style ?? {}) }}\n >\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Paragraph\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Paragraph\")}\n onClick={handle(() =>\n (editor as any).chain().focus().setParagraph().run()\n )}\n >\n <IconTypography size={16} />\n <span>Paragraph</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 1\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 1\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 1 })\n .run()\n )}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 2\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 2\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 2 })\n .run()\n )}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 3\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 3\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 3 })\n .run()\n )}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 4\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 4\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 4 })\n .run()\n )}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Bullet list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Bullet list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBulletList().run()\n )}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Ordered list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Ordered list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleOrderedList().run()\n )}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Quote\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Quote\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBlockquote().run()\n )}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCode().run()\n )}\n >\n <IconCode size={16} />\n <span>Code</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code Block\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code Block\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCodeBlock().run()\n )}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default MenuList\n","import React, { useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n IconLink,\n IconExternalLink,\n IconTrash,\n IconCornerDownLeft,\n} from \"@tabler/icons-react\"\n\nexport type LinkPopoverProps = {\n editor: any | null\n hideWhenUnavailable?: boolean\n autoOpenOnLinkActive?: boolean\n onSetLink?: () => void\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function LinkPopover({\n editor,\n hideWhenUnavailable = false,\n autoOpenOnLinkActive = true,\n onSetLink,\n onOpenChange,\n}: LinkPopoverProps) {\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState<string>(\"\")\n const inputRef = useRef<HTMLInputElement | null>(null)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const isInCode =\n !!editor?.isActive?.(\"code\") || !!editor?.isActive?.(\"codeBlock\")\n const isActive = !!editor?.isActive?.(\"link\")\n const currentHref: string = useMemo(\n () =>\n editor?.getAttributes ? (editor.getAttributes(\"link\")?.href ?? \"\") : \"\",\n [editor, editor?.state?.selection?.from, editor?.state?.selection?.to]\n )\n\n const canSet = useMemo(() => {\n if (!editor || isInCode) return false\n try {\n return editor\n .can()\n .chain()\n .focus()\n .setLink({ href: \"https://example.com\" })\n .run()\n } catch (_) {\n return false\n }\n }, [editor, isInCode])\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n const next = editor.getAttributes(\"link\")?.href ?? \"\"\n setUrl(next)\n const linkActive = editor.isActive(\"link\")\n if (autoOpenOnLinkActive && editor.isFocused && linkActive) setOpen(true)\n if (!linkActive) setOpen(false)\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, autoOpenOnLinkActive])\n\n useEffect(() => {\n if (open) inputRef.current?.focus()\n onOpenChange?.(open)\n }, [open, onOpenChange])\n\n if (!editor) return null\n if (hideWhenUnavailable && !canSet && !isActive) return null\n\n const applyLink = () => {\n if (!url) return\n ;(editor as any)\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run()\n onSetLink?.()\n setOpen(false)\n }\n\n const removeLink = () => {\n ;(editor as any).chain().focus().unsetLink().run()\n setOpen(false)\n }\n\n // Close when clicking outside of the popover/button container\n useEffect(() => {\n const handler = (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\", handler)\n return () => document.removeEventListener(\"pointerdown\", handler)\n }, [open])\n\n return (\n <div\n ref={rootRef}\n className=\"nph-dropdown\"\n style={{ position: \"relative\" }}\n >\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${isActive ? \" is-active\" : \"\"}`}\n aria-label={isActive ? \"Edit link\" : \"Add link\"}\n aria-pressed={isActive}\n aria-expanded={open}\n disabled={isInCode}\n aria-disabled={isInCode}\n title={isActive ? currentHref || \"Edit link\" : \"Add link\"}\n >\n <IconLink size={16} />\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel\"\n style={{\n padding: 0,\n minWidth: 320,\n background: \"transparent\",\n boxShadow: \"none\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n }}\n role=\"dialog\"\n aria-label=\"Link editor\"\n >\n <div className=\"nph-link-popover\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://example.com\"\n className=\"nph-link-popover__input\"\n onMouseDown={(e) => {\n e.stopPropagation()\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n applyLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setOpen(false)\n }\n }}\n />\n <div className=\"nph-link-popover__divider\" />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Apply\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={applyLink}\n disabled={!url}\n >\n <IconCornerDownLeft size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Open in new tab\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const target = url || currentHref\n if (target) window.open(target, \"_blank\", \"noopener,noreferrer\")\n }}\n disabled={!url && !currentHref}\n >\n <IconExternalLink 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 link\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeLink}\n disabled={!isActive}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default LinkPopover\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport {\n EditorCommand,\n EditorCommandList,\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"../../headless\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconSourceCode,\n IconPhoto,\n} from \"@tabler/icons-react\"\n\nexport type SlashMenuProps = {\n className?: string\n}\n\nexport function SlashMenu({ className }: SlashMenuProps) {\n const { editor } = useCurrentEditor()\n if (!editor) return null\n\n return (\n <EditorCommand className={className ?? \"nph-command\"}>\n <EditorCommandList\n className=\"nph-command__list\"\n style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\n >\n <EditorCommandEmpty style={{ padding: \"8px 12px\", fontSize: 14 }}>\n No commands found\n </EditorCommandEmpty>\n <EditorCommandItem\n value=\"bold\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBold()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBold size={16} />\n <span>Bold</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"italic\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleItalic()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconItalic size={16} />\n <span>Italic</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"strike\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleStrike()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconStrikethrough size={16} />\n <span>Strike</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading1 h1\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 1 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading2 h2\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 2 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading3 h3\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 3 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading4 h4\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 4 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"bullet list ul\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBulletList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"ordered list ol\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleOrderedList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"quote blockquote\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBlockquote()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code inline\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCode()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconCode size={16} />\n <span>Code</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code block codeblock\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCodeBlock()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"image photo picture block\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) => {\n ;(editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .setImageBlock({ src: \"\" })\n .run()\n }}\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconPhoto size={16} />\n <span>Image</span>\n </span>\n </EditorCommandItem>\n </EditorCommandList>\n </EditorCommand>\n )\n}\n\nexport default SlashMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { Fragment, useEffect, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type ImageMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function ImageMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: ImageMenuProps) {\n const { editor } = useCurrentEditor()\n const [size, setSize] = useState<number>(100)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"left\")\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\") ?? {\n width: \"\",\n align: \"left\",\n }\n const width = attrs.width ?? \"\"\n if (width.includes(\"%\")) {\n setSize(parseInt(width) || 100)\n } else {\n setSize(100)\n }\n setAlign(attrs.align ?? \"left\")\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor])\n\n if (!editor) return null\n\n const updateImageSize = (newSize: number) => {\n setSize(newSize)\n editor.commands.setImageBlockWidth(newSize)\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.setImageBlockAlign(newAlign)\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n editor.commands.updateAttributes(\"imageBlock\", { src: \"\", loading: false })\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"imageBlock\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`image-leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\" }}>\n {size}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"5\"\n value={size}\n onChange={(e) => updateImageSize(parseInt(e.target.value))}\n onMouseDown={(e) => e.stopPropagation()}\n style={{ flex: 1 }}\n />\n </div>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"left\")}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"center\")}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"right\")}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Upload new image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={triggerUpload}\n >\n <IconUpload size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeImage}\n >\n <IconTrash size={16} />\n </button>\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`image-trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockMenu } from \"./ImageBlockMenu\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\ninterface ImageBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const ImageBlockView = (props: ImageBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n alt?: string\n loading?: boolean\n }\n }\n }\n const imageWrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align, alt, loading } = node.attrs\n\n const handleUpload = useCallback(\n (url: string) => {\n updateAttributes({ src: url, loading: false })\n },\n [updateAttributes]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n // Calculate wrapper class based on alignment\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show uploader if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageUploader onUpload={handleUpload} editor={editor} />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show loading placeholder\n if (loading) {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageBlockLoading />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the actual image\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={{ position: \"relative\" }}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n className=\"nph-image-block\"\n />\n </div>\n </div>\n <ImageBlockMenu editor={editor} appendTo={imageWrapperRef} />\n </NodeViewWrapper>\n )\n}\n\nexport default ImageBlockView\n","import { Editor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useRef, useState, useEffect } from \"react\"\nimport { ImageBlockWidth } from \"./ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type ImageBlockMenuProps = {\n editor: Editor\n appendTo?: React.RefObject<HTMLElement | null>\n}\n\nexport const ImageBlockMenu = ({ editor, appendTo }: ImageBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"center\")\n const [width, setWidth] = useState<number>(100)\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\")\n setAlign(attrs.align || \"center\")\n const widthStr = attrs.width || \"100%\"\n setWidth(parseInt(widthStr) || 100)\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n }\n }, [editor])\n\n const getReferenceClientRect = useCallback(() => {\n if (!editor) return new DOMRect(-1000, -1000, 0, 0)\n\n const { view } = editor\n const { state } = view\n const { selection } = state\n\n // Get the node at the current selection\n const node = selection instanceof (window as any).ProseMirror?.state?.NodeSelection\n ? (selection as any).node\n : null\n\n if (node && node.type.name === \"imageBlock\") {\n const nodePos = (selection as any).from\n const domNode = view.nodeDOM(nodePos)\n if (domNode && domNode instanceof HTMLElement) {\n return domNode.getBoundingClientRect()\n }\n }\n\n // Fallback: try to find the image block element\n const imageBlockElements = document.querySelectorAll('[data-node-view-wrapper]')\n for (const el of Array.from(imageBlockElements)) {\n if (el.querySelector(\"img\")) {\n return el.getBoundingClientRect()\n }\n }\n\n return new DOMRect(-1000, -1000, 0, 0)\n }, [editor])\n\n const shouldShow = useCallback(() => {\n if (!editor) return false\n const isActive = editor.isActive(\"imageBlock\")\n if (!isActive) return false\n\n // Check if it's a node selection\n const { state } = editor\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n return isNodeSelection\n }, [editor])\n\n const onAlignImageLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignImageCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignImageRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemoveImage = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n updateDelay={0}\n >\n <div className=\"bubble-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemoveImage}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageBlockMenu\n","import { memo, useCallback, useEffect, useState } from \"react\"\n\nexport type ImageBlockWidthProps = {\n onChange: (value: number) => void\n value: number\n}\n\nexport const ImageBlockWidth = memo(\n ({ onChange, value }: ImageBlockWidthProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = parseInt(e.target.value)\n onChange(nextValue)\n setCurrentValue(nextValue)\n },\n [onChange]\n )\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\", width: 40 }}>\n {currentValue}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"25\"\n value={currentValue}\n onChange={handleChange}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n height: 3,\n borderRadius: 9999,\n appearance: \"none\",\n background: \"linear-gradient(to right, #333 0%, #333 \" + currentValue + \"%, #ddd \" + currentValue + \"%, #ddd 100%)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n className=\"nph-image-width-slider\"\n />\n </div>\n )\n }\n)\n\nImageBlockWidth.displayName = \"ImageBlockWidth\"\n\nexport default ImageBlockWidth\n","import { IconPhoto, IconUpload } from \"@tabler/icons-react\"\nimport { ChangeEvent, useCallback, useRef, useState, DragEvent } from \"react\"\nimport { Editor } from \"@tiptap/react\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\nexport type ImageUploaderProps = {\n onUpload: (url: string) => void\n editor: Editor\n}\n\nexport const ImageUploader = ({ onUpload, editor }: ImageUploaderProps) => {\n const [loading, setLoading] = useState(false)\n const [draggedInside, setDraggedInside] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\n // Get the upload handler from the editor\n const imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const uploadImage = (imageExtension?.options as any)?.uploadImage\n\n if (uploadImage) {\n const url = await uploadImage(file)\n onUpload(url)\n } else {\n console.error(\"No uploadImage handler provided\")\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n } finally {\n setLoading(false)\n }\n },\n [editor, onUpload]\n )\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const onFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n\n const file = e.dataTransfer.files[0]\n if (file && /image/i.test(file.type)) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(true)\n }, [])\n\n const onDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n }, [])\n\n if (loading) {\n return <ImageBlockLoading />\n }\n\n return (\n <div\n className={`nph-image-uploader${draggedInside ? \" nph-image-uploader--dragging\" : \"\"}`}\n onDrop={onDrop}\n onDragOver={onDragEnter}\n onDragLeave={onDragLeave}\n contentEditable={false}\n >\n <IconPhoto size={48} className=\"nph-image-uploader__icon\" />\n <div className=\"nph-image-uploader__content\">\n <div className=\"nph-image-uploader__text\">\n {draggedInside ? \"Drop image here\" : \"Drag and drop or\"}\n </div>\n <div>\n <button\n type=\"button\"\n disabled={draggedInside}\n onClick={handleUploadClick}\n className=\"nph-btn nph-btn-ghost nph-btn-sm nph-image-uploader__button\"\n >\n <IconUpload size={16} />\n Upload an image\n </button>\n </div>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".jpg,.jpeg,.png,.webp,.gif\"\n onChange={onFileChange}\n className=\"nph-image-uploader__input\"\n />\n </div>\n )\n}\n\nexport default ImageUploader\n","import { IconLoader2 } from \"@tabler/icons-react\"\n\nexport const ImageBlockLoading = () => {\n return (\n <div className=\"nph-image-block-loading\">\n <div className=\"nph-image-block-loading__overlay\">\n <div className=\"nph-image-block-loading__content\">\n <IconLoader2 size={24} className=\"nph-image-block-loading__spinner\" />\n <p className=\"nph-image-block-loading__text\">Uploading image...</p>\n </div>\n </div>\n <div className=\"nph-image-block-loading__placeholder\" />\n </div>\n )\n}\n\nexport default ImageBlockLoading\n","import {\n EditorRoot,\n EditorContent,\n handleCommandNavigation,\n type EditorContentProps,\n} from \"../headless\"\nimport ExtensionKit from \"../headless/extensions/extension-kit\"\nimport { SlashMenu, TextMenu, ImageMenu } from \"./menus\"\nimport { ImageBlockView } from \"./menus/ImageBlock/ImageBlockView\"\nimport type { ReactNode } from \"react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\nexport type BubbleMenuExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type BubbleMenuExtra =\n | BubbleMenuExtraRenderer\n | {\n render: BubbleMenuExtraRenderer\n align?: \"start\" | \"end\"\n }\n\nexport type BubbleMenuExtras = Partial<{\n text: BubbleMenuExtra | BubbleMenuExtra[]\n image: BubbleMenuExtra | BubbleMenuExtra[]\n}>\n\nexport type NeuphloEditorProps = {\n content?: string\n className?: string\n editable?: boolean\n immediatelyRender?: boolean\n showTextMenu?: boolean\n showSlashMenu?: boolean\n showImageMenu?: boolean\n extensions?: any[]\n bubbleMenuExtras?: BubbleMenuExtras\n onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n }\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n bubbleMenuExtras,\n onUpdate,\n onCreate,\n uploadImage,\n collaboration,\n}: NeuphloEditorProps) {\n const normalizeExtras = (extras?: BubbleMenuExtra | BubbleMenuExtra[]) => {\n const result: {\n start: BubbleMenuExtraRenderer[]\n end: BubbleMenuExtraRenderer[]\n } = {\n start: [],\n end: [],\n }\n if (!extras) return result\n\n const list = Array.isArray(extras) ? extras : [extras]\n list.forEach((item) => {\n const config =\n typeof item === \"function\"\n ? { render: item, align: \"end\" as const }\n : item\n const slot = config.align === \"start\" ? \"start\" : \"end\"\n result[slot].push(config.render)\n })\n return result\n }\n\n const textExtras = normalizeExtras(bubbleMenuExtras?.text)\n const imageExtras = normalizeExtras(bubbleMenuExtras?.image)\n\n return (\n <div className={className}>\n <EditorRoot>\n <EditorContent\n onUpdate={onUpdate}\n onCreate={onCreate}\n immediatelyRender={immediatelyRender}\n editable={editable}\n content={content}\n extensions={[\n ...ExtensionKit({\n uploadImage: uploadImage,\n collaboration: collaboration,\n imageBlockView: ImageBlockView,\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 {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["Editor","import_react","import_react","import_jotai","import_jotai","import_react","import_jotai","import_jsx_runtime","tunnel","import_react","import_cmdk","import_jotai","import_jsx_runtime","TiptapLink","import_core","import_react","import_state","TiptapImage","node","import_react","import_core","Command","Suggestion","Command","Collaboration","import_react","import_icons_react","import_react","import_jsx_runtime","import_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_react","import_icons_react","import_jsx_runtime","editor","import_react","import_menus","import_icons_react","import_jsx_runtime","import_react","import_menus","import_react","import_react","import_jsx_runtime","import_icons_react","import_jsx_runtime","import_icons_react","import_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Editor"]}
|
package/dist/react/index.js
CHANGED
|
@@ -17,7 +17,6 @@ import {
|
|
|
17
17
|
|
|
18
18
|
// src/headless/extensions/extension-kit.ts
|
|
19
19
|
import Collaboration from "@tiptap/extension-collaboration";
|
|
20
|
-
import CollaborationCursor from "@tiptap/extension-collaboration-cursor";
|
|
21
20
|
var ExtensionKit = (options) => {
|
|
22
21
|
const extensions = [
|
|
23
22
|
StarterKit.configure({ codeBlock: false, link: false }),
|
|
@@ -52,13 +51,6 @@ var ExtensionKit = (options) => {
|
|
|
52
51
|
field: options.collaboration.field
|
|
53
52
|
})
|
|
54
53
|
);
|
|
55
|
-
if (options.collaboration.awareness) {
|
|
56
|
-
extensions.push(
|
|
57
|
-
CollaborationCursor.configure({
|
|
58
|
-
provider: options.collaboration.awareness
|
|
59
|
-
})
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
54
|
}
|
|
63
55
|
return extensions;
|
|
64
56
|
};
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/headless/extensions/extension-kit.ts","../../src/react/menus/TextMenu.tsx","../../src/react/menus/MenuList.tsx","../../src/react/menus/LinkPopover.tsx","../../src/react/menus/SlashMenu.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/Editor.tsx"],"sourcesContent":["import Collaboration from \"@tiptap/extension-collaboration\"\nimport CollaborationCursor from \"@tiptap/extension-collaboration-cursor\"\nimport { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { ImageBlock } from \"./ImageBlock/ImageBlock\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n user?: any\n }\n imageBlockView?: any\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => {\n const extensions = [\n StarterKit.configure({ codeBlock: false, link: false }),\n CodeBlock,\n Link,\n ImageBlock.configure({\n uploadImage: options?.uploadImage,\n nodeView: options?.imageBlockView,\n }),\n Placeholder.configure({\n placeholder: ({ node }: any) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`\n }\n return \"Press '/' for commands\"\n },\n includeChildren: true,\n }),\n SlashCommand.configure({\n suggestion: {\n char: \"/\",\n render: renderSlashItems,\n allowSpaces: true,\n allowedPrefixes: null,\n },\n }),\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 if (options.collaboration.awareness) {\n extensions.push(\n CollaborationCursor.configure({\n provider: options.collaboration.awareness,\n }),\n )\n }\n }\n\n return extensions\n}\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport type { ReactNode } from \"react\"\nimport { Fragment } from \"react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type TextMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function TextMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: TextMenuProps) {\n const { editor } = useCurrentEditor()\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n return {\n isBold: ctx.editor.isActive(\"bold\"),\n isItalic: ctx.editor.isActive(\"italic\"),\n isStrike: ctx.editor.isActive(\"strike\"),\n isCode: ctx.editor.isActive(\"code\"),\n isCodeBlock: ctx.editor.isActive(\"codeBlock\"),\n isParagraph: ctx.editor.isActive(\"paragraph\"),\n isHeading: ctx.editor.isActive(\"heading\"),\n isList:\n ctx.editor.isActive(\"bulletList\") ||\n ctx.editor.isActive(\"orderedList\"),\n isBlockquote: ctx.editor.isActive(\"blockquote\"),\n }\n },\n })\n\n if (!editor || !editorState) return null\n\n const hasAnyMarksInSelection = () => {\n const anyEditor: any = editor\n const state = anyEditor.state\n const sel: any = state.selection\n let has = false\n state.doc.nodesBetween(sel.from, sel.to, (node: any) => {\n if (node.isText && node.marks && node.marks.length > 0) {\n has = true\n return false\n }\n return undefined\n })\n if (!has && sel.empty) {\n const marks = state.storedMarks || sel.$from.marks()\n if (marks && marks.length > 0) has = true\n }\n return has\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state, from, to, view }) => {\n // Don't show if imageBlock is active\n if (e.isActive(\"imageBlock\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // 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\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <MenuList editor={editor} />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isBold ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isBold}\n aria-label=\"Toggle bold\"\n >\n <IconBold size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isItalic ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isItalic}\n aria-label=\"Toggle italic\"\n >\n <IconItalic size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isStrike ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isStrike}\n aria-label=\"Toggle strike\"\n >\n <IconStrikethrough size={16} />\n </button>\n\n <LinkPopover editor={editor} hideWhenUnavailable={false} />\n\n {(() => {\n const hasInlineMarks = hasAnyMarksInSelection()\n\n const isPlainParagraph =\n editorState.isParagraph &&\n !editorState.isHeading &&\n !editorState.isList &&\n !editorState.isBlockquote &&\n !editorState.isCodeBlock &&\n !hasInlineMarks\n\n return (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .setParagraph()\n .unsetAllMarks()\n .run()\n }\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Revert to paragraph\"\n title=\"Revert to paragraph\"\n disabled={isPlainParagraph}\n aria-disabled={isPlainParagraph}\n >\n <IconArrowBackUp size={16} />\n </button>\n )\n })()}\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default TextMenu\n","import React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconChevronDown,\n IconSourceCode,\n} from \"@tabler/icons-react\"\n\nexport type MenuListProps = {\n editor: any\n className?: string\n style?: React.CSSProperties\n onSelect?: () => void\n buttonClassName?: string\n}\n\nexport function MenuList({\n editor,\n className,\n style,\n onSelect,\n buttonClassName,\n}: MenuListProps) {\n const [open, setOpen] = useState(false)\n const [label, setLabel] = useState(\"Paragraph\")\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const computeLabel = useCallback(() => {\n if (!editor) return \"Paragraph\"\n if (editor.isActive(\"heading\", { level: 1 })) return \"Heading 1\"\n if (editor.isActive(\"heading\", { level: 2 })) return \"Heading 2\"\n if (editor.isActive(\"heading\", { level: 3 })) return \"Heading 3\"\n if (editor.isActive(\"heading\", { level: 4 })) return \"Heading 4\"\n if (editor.isActive(\"bulletList\")) return \"Bullet list\"\n if (editor.isActive(\"orderedList\")) return \"Ordered list\"\n if (editor.isActive(\"blockquote\")) return \"Quote\"\n if (editor.isActive(\"code\")) return \"Code\"\n if (editor.isActive(\"codeBlock\")) return \"Code Block\"\n return \"Paragraph\"\n }, [editor])\n\n useEffect(() => {\n setLabel(computeLabel())\n if (!editor) return\n const update = () => setLabel(computeLabel())\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor, computeLabel])\n\n useEffect(() => {\n if (!editor) return\n const close = () => setOpen(false)\n editor.on(\"selectionUpdate\", close)\n editor.on(\"blur\", close)\n return () => {\n editor.off(\"selectionUpdate\", close)\n editor.off(\"blur\", close)\n }\n }, [editor])\n\n useEffect(() => {\n const handlePointerDown = (e: MouseEvent) => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n if (!el.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [open])\n\n const handle = (fn: () => void) => () => {\n fn()\n onSelect?.()\n setOpen(false)\n }\n\n const isActive = useCallback((name: string) => label === name, [label])\n\n return (\n <div ref={rootRef} className=\"nph-dropdown\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={\n buttonClassName ??\n `nph-btn nph-btn-ghost nph-btn-xs${open || label !== \"Paragraph\" ? \" is-active\" : \"\"}`\n }\n aria-expanded={open}\n aria-label=\"Change block type\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span style={{ fontSize: 12 }}>{label}</span>\n <IconChevronDown size={16} />\n </span>\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel nph-command\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <div\n className={className ? className : \"nph-command__list\"}\n style={{ maxHeight: 240, ...(style ?? {}) }}\n >\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Paragraph\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Paragraph\")}\n onClick={handle(() =>\n (editor as any).chain().focus().setParagraph().run()\n )}\n >\n <IconTypography size={16} />\n <span>Paragraph</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 1\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 1\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 1 })\n .run()\n )}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 2\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 2\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 2 })\n .run()\n )}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 3\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 3\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 3 })\n .run()\n )}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 4\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 4\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 4 })\n .run()\n )}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Bullet list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Bullet list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBulletList().run()\n )}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Ordered list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Ordered list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleOrderedList().run()\n )}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Quote\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Quote\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBlockquote().run()\n )}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCode().run()\n )}\n >\n <IconCode size={16} />\n <span>Code</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code Block\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code Block\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCodeBlock().run()\n )}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default MenuList\n","import React, { useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n IconLink,\n IconExternalLink,\n IconTrash,\n IconCornerDownLeft,\n} from \"@tabler/icons-react\"\n\nexport type LinkPopoverProps = {\n editor: any | null\n hideWhenUnavailable?: boolean\n autoOpenOnLinkActive?: boolean\n onSetLink?: () => void\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function LinkPopover({\n editor,\n hideWhenUnavailable = false,\n autoOpenOnLinkActive = true,\n onSetLink,\n onOpenChange,\n}: LinkPopoverProps) {\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState<string>(\"\")\n const inputRef = useRef<HTMLInputElement | null>(null)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const isInCode =\n !!editor?.isActive?.(\"code\") || !!editor?.isActive?.(\"codeBlock\")\n const isActive = !!editor?.isActive?.(\"link\")\n const currentHref: string = useMemo(\n () =>\n editor?.getAttributes ? (editor.getAttributes(\"link\")?.href ?? \"\") : \"\",\n [editor, editor?.state?.selection?.from, editor?.state?.selection?.to]\n )\n\n const canSet = useMemo(() => {\n if (!editor || isInCode) return false\n try {\n return editor\n .can()\n .chain()\n .focus()\n .setLink({ href: \"https://example.com\" })\n .run()\n } catch (_) {\n return false\n }\n }, [editor, isInCode])\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n const next = editor.getAttributes(\"link\")?.href ?? \"\"\n setUrl(next)\n const linkActive = editor.isActive(\"link\")\n if (autoOpenOnLinkActive && editor.isFocused && linkActive) setOpen(true)\n if (!linkActive) setOpen(false)\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, autoOpenOnLinkActive])\n\n useEffect(() => {\n if (open) inputRef.current?.focus()\n onOpenChange?.(open)\n }, [open, onOpenChange])\n\n if (!editor) return null\n if (hideWhenUnavailable && !canSet && !isActive) return null\n\n const applyLink = () => {\n if (!url) return\n ;(editor as any)\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run()\n onSetLink?.()\n setOpen(false)\n }\n\n const removeLink = () => {\n ;(editor as any).chain().focus().unsetLink().run()\n setOpen(false)\n }\n\n // Close when clicking outside of the popover/button container\n useEffect(() => {\n const handler = (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\", handler)\n return () => document.removeEventListener(\"pointerdown\", handler)\n }, [open])\n\n return (\n <div\n ref={rootRef}\n className=\"nph-dropdown\"\n style={{ position: \"relative\" }}\n >\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${isActive ? \" is-active\" : \"\"}`}\n aria-label={isActive ? \"Edit link\" : \"Add link\"}\n aria-pressed={isActive}\n aria-expanded={open}\n disabled={isInCode}\n aria-disabled={isInCode}\n title={isActive ? currentHref || \"Edit link\" : \"Add link\"}\n >\n <IconLink size={16} />\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel\"\n style={{\n padding: 0,\n minWidth: 320,\n background: \"transparent\",\n boxShadow: \"none\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n }}\n role=\"dialog\"\n aria-label=\"Link editor\"\n >\n <div className=\"nph-link-popover\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://example.com\"\n className=\"nph-link-popover__input\"\n onMouseDown={(e) => {\n e.stopPropagation()\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n applyLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setOpen(false)\n }\n }}\n />\n <div className=\"nph-link-popover__divider\" />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Apply\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={applyLink}\n disabled={!url}\n >\n <IconCornerDownLeft size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Open in new tab\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const target = url || currentHref\n if (target) window.open(target, \"_blank\", \"noopener,noreferrer\")\n }}\n disabled={!url && !currentHref}\n >\n <IconExternalLink 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 link\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeLink}\n disabled={!isActive}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default LinkPopover\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport {\n EditorCommand,\n EditorCommandList,\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"../../headless\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconSourceCode,\n IconPhoto,\n} from \"@tabler/icons-react\"\n\nexport type SlashMenuProps = {\n className?: string\n}\n\nexport function SlashMenu({ className }: SlashMenuProps) {\n const { editor } = useCurrentEditor()\n if (!editor) return null\n\n return (\n <EditorCommand className={className ?? \"nph-command\"}>\n <EditorCommandList\n className=\"nph-command__list\"\n style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\n >\n <EditorCommandEmpty style={{ padding: \"8px 12px\", fontSize: 14 }}>\n No commands found\n </EditorCommandEmpty>\n <EditorCommandItem\n value=\"bold\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBold()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBold size={16} />\n <span>Bold</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"italic\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleItalic()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconItalic size={16} />\n <span>Italic</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"strike\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleStrike()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconStrikethrough size={16} />\n <span>Strike</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading1 h1\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 1 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading2 h2\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 2 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading3 h3\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 3 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading4 h4\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 4 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"bullet list ul\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBulletList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"ordered list ol\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleOrderedList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"quote blockquote\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBlockquote()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code inline\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCode()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconCode size={16} />\n <span>Code</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code block codeblock\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCodeBlock()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"image photo picture block\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) => {\n ;(editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .setImageBlock({ src: \"\" })\n .run()\n }}\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconPhoto size={16} />\n <span>Image</span>\n </span>\n </EditorCommandItem>\n </EditorCommandList>\n </EditorCommand>\n )\n}\n\nexport default SlashMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { Fragment, useEffect, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type ImageMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function ImageMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: ImageMenuProps) {\n const { editor } = useCurrentEditor()\n const [size, setSize] = useState<number>(100)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"left\")\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\") ?? {\n width: \"\",\n align: \"left\",\n }\n const width = attrs.width ?? \"\"\n if (width.includes(\"%\")) {\n setSize(parseInt(width) || 100)\n } else {\n setSize(100)\n }\n setAlign(attrs.align ?? \"left\")\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor])\n\n if (!editor) return null\n\n const updateImageSize = (newSize: number) => {\n setSize(newSize)\n editor.commands.setImageBlockWidth(newSize)\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.setImageBlockAlign(newAlign)\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n editor.commands.updateAttributes(\"imageBlock\", { src: \"\", loading: false })\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"imageBlock\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`image-leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\" }}>\n {size}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"5\"\n value={size}\n onChange={(e) => updateImageSize(parseInt(e.target.value))}\n onMouseDown={(e) => e.stopPropagation()}\n style={{ flex: 1 }}\n />\n </div>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"left\")}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"center\")}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"right\")}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Upload new image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={triggerUpload}\n >\n <IconUpload size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeImage}\n >\n <IconTrash size={16} />\n </button>\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`image-trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockMenu } from \"./ImageBlockMenu\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\ninterface ImageBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const ImageBlockView = (props: ImageBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n alt?: string\n loading?: boolean\n }\n }\n }\n const imageWrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align, alt, loading } = node.attrs\n\n const handleUpload = useCallback(\n (url: string) => {\n updateAttributes({ src: url, loading: false })\n },\n [updateAttributes]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n // Calculate wrapper class based on alignment\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show uploader if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageUploader onUpload={handleUpload} editor={editor} />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show loading placeholder\n if (loading) {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageBlockLoading />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the actual image\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={{ position: \"relative\" }}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n className=\"nph-image-block\"\n />\n </div>\n </div>\n <ImageBlockMenu editor={editor} appendTo={imageWrapperRef} />\n </NodeViewWrapper>\n )\n}\n\nexport default ImageBlockView\n","import { Editor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useRef, useState, useEffect } from \"react\"\nimport { ImageBlockWidth } from \"./ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type ImageBlockMenuProps = {\n editor: Editor\n appendTo?: React.RefObject<HTMLElement | null>\n}\n\nexport const ImageBlockMenu = ({ editor, appendTo }: ImageBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"center\")\n const [width, setWidth] = useState<number>(100)\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\")\n setAlign(attrs.align || \"center\")\n const widthStr = attrs.width || \"100%\"\n setWidth(parseInt(widthStr) || 100)\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n }\n }, [editor])\n\n const getReferenceClientRect = useCallback(() => {\n if (!editor) return new DOMRect(-1000, -1000, 0, 0)\n\n const { view } = editor\n const { state } = view\n const { selection } = state\n\n // Get the node at the current selection\n const node = selection instanceof (window as any).ProseMirror?.state?.NodeSelection\n ? (selection as any).node\n : null\n\n if (node && node.type.name === \"imageBlock\") {\n const nodePos = (selection as any).from\n const domNode = view.nodeDOM(nodePos)\n if (domNode && domNode instanceof HTMLElement) {\n return domNode.getBoundingClientRect()\n }\n }\n\n // Fallback: try to find the image block element\n const imageBlockElements = document.querySelectorAll('[data-node-view-wrapper]')\n for (const el of Array.from(imageBlockElements)) {\n if (el.querySelector(\"img\")) {\n return el.getBoundingClientRect()\n }\n }\n\n return new DOMRect(-1000, -1000, 0, 0)\n }, [editor])\n\n const shouldShow = useCallback(() => {\n if (!editor) return false\n const isActive = editor.isActive(\"imageBlock\")\n if (!isActive) return false\n\n // Check if it's a node selection\n const { state } = editor\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n return isNodeSelection\n }, [editor])\n\n const onAlignImageLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignImageCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignImageRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemoveImage = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n updateDelay={0}\n >\n <div className=\"bubble-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemoveImage}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageBlockMenu\n","import { memo, useCallback, useEffect, useState } from \"react\"\n\nexport type ImageBlockWidthProps = {\n onChange: (value: number) => void\n value: number\n}\n\nexport const ImageBlockWidth = memo(\n ({ onChange, value }: ImageBlockWidthProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = parseInt(e.target.value)\n onChange(nextValue)\n setCurrentValue(nextValue)\n },\n [onChange]\n )\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\", width: 40 }}>\n {currentValue}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"25\"\n value={currentValue}\n onChange={handleChange}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n height: 3,\n borderRadius: 9999,\n appearance: \"none\",\n background: \"linear-gradient(to right, #333 0%, #333 \" + currentValue + \"%, #ddd \" + currentValue + \"%, #ddd 100%)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n className=\"nph-image-width-slider\"\n />\n </div>\n )\n }\n)\n\nImageBlockWidth.displayName = \"ImageBlockWidth\"\n\nexport default ImageBlockWidth\n","import { IconPhoto, IconUpload } from \"@tabler/icons-react\"\nimport { ChangeEvent, useCallback, useRef, useState, DragEvent } from \"react\"\nimport { Editor } from \"@tiptap/react\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\nexport type ImageUploaderProps = {\n onUpload: (url: string) => void\n editor: Editor\n}\n\nexport const ImageUploader = ({ onUpload, editor }: ImageUploaderProps) => {\n const [loading, setLoading] = useState(false)\n const [draggedInside, setDraggedInside] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\n // Get the upload handler from the editor\n const imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const uploadImage = (imageExtension?.options as any)?.uploadImage\n\n if (uploadImage) {\n const url = await uploadImage(file)\n onUpload(url)\n } else {\n console.error(\"No uploadImage handler provided\")\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n } finally {\n setLoading(false)\n }\n },\n [editor, onUpload]\n )\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const onFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n\n const file = e.dataTransfer.files[0]\n if (file && /image/i.test(file.type)) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(true)\n }, [])\n\n const onDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n }, [])\n\n if (loading) {\n return <ImageBlockLoading />\n }\n\n return (\n <div\n className={`nph-image-uploader${draggedInside ? \" nph-image-uploader--dragging\" : \"\"}`}\n onDrop={onDrop}\n onDragOver={onDragEnter}\n onDragLeave={onDragLeave}\n contentEditable={false}\n >\n <IconPhoto size={48} className=\"nph-image-uploader__icon\" />\n <div className=\"nph-image-uploader__content\">\n <div className=\"nph-image-uploader__text\">\n {draggedInside ? \"Drop image here\" : \"Drag and drop or\"}\n </div>\n <div>\n <button\n type=\"button\"\n disabled={draggedInside}\n onClick={handleUploadClick}\n className=\"nph-btn nph-btn-ghost nph-btn-sm nph-image-uploader__button\"\n >\n <IconUpload size={16} />\n Upload an image\n </button>\n </div>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".jpg,.jpeg,.png,.webp,.gif\"\n onChange={onFileChange}\n className=\"nph-image-uploader__input\"\n />\n </div>\n )\n}\n\nexport default ImageUploader\n","import { IconLoader2 } from \"@tabler/icons-react\"\n\nexport const ImageBlockLoading = () => {\n return (\n <div className=\"nph-image-block-loading\">\n <div className=\"nph-image-block-loading__overlay\">\n <div className=\"nph-image-block-loading__content\">\n <IconLoader2 size={24} className=\"nph-image-block-loading__spinner\" />\n <p className=\"nph-image-block-loading__text\">Uploading image...</p>\n </div>\n </div>\n <div className=\"nph-image-block-loading__placeholder\" />\n </div>\n )\n}\n\nexport default ImageBlockLoading\n","import {\n EditorRoot,\n EditorContent,\n handleCommandNavigation,\n type EditorContentProps,\n} from \"../headless\"\nimport ExtensionKit from \"../headless/extensions/extension-kit\"\nimport { SlashMenu, TextMenu, ImageMenu } from \"./menus\"\nimport { ImageBlockView } from \"./menus/ImageBlock/ImageBlockView\"\nimport type { ReactNode } from \"react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\nexport type BubbleMenuExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type BubbleMenuExtra =\n | BubbleMenuExtraRenderer\n | {\n render: BubbleMenuExtraRenderer\n align?: \"start\" | \"end\"\n }\n\nexport type BubbleMenuExtras = Partial<{\n text: BubbleMenuExtra | BubbleMenuExtra[]\n image: BubbleMenuExtra | BubbleMenuExtra[]\n}>\n\nexport type NeuphloEditorProps = {\n content?: string\n className?: string\n editable?: boolean\n immediatelyRender?: boolean\n showTextMenu?: boolean\n showSlashMenu?: boolean\n showImageMenu?: boolean\n extensions?: any[]\n bubbleMenuExtras?: BubbleMenuExtras\n onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n }\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n bubbleMenuExtras,\n onUpdate,\n onCreate,\n uploadImage,\n collaboration,\n}: NeuphloEditorProps) {\n const normalizeExtras = (extras?: BubbleMenuExtra | BubbleMenuExtra[]) => {\n const result: {\n start: BubbleMenuExtraRenderer[]\n end: BubbleMenuExtraRenderer[]\n } = {\n start: [],\n end: [],\n }\n if (!extras) return result\n\n const list = Array.isArray(extras) ? extras : [extras]\n list.forEach((item) => {\n const config =\n typeof item === \"function\"\n ? { render: item, align: \"end\" as const }\n : item\n const slot = config.align === \"start\" ? \"start\" : \"end\"\n result[slot].push(config.render)\n })\n return result\n }\n\n const textExtras = normalizeExtras(bubbleMenuExtras?.text)\n const imageExtras = normalizeExtras(bubbleMenuExtras?.image)\n\n return (\n <div className={className}>\n <EditorRoot>\n <EditorContent\n onUpdate={onUpdate}\n onCreate={onCreate}\n immediatelyRender={immediatelyRender}\n editable={editable}\n content={content}\n extensions={[\n ...ExtensionKit({\n uploadImage: uploadImage,\n collaboration: collaboration,\n imageBlockView: ImageBlockView,\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 {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","useCurrentEditor","IconBold","IconItalic","IconStrikethrough","IconH1","IconH2","IconH3","IconH4","IconList","IconListNumbers","IconBlockquote","IconCode","IconSourceCode","jsx","jsxs","useCurrentEditor","editor","useCurrentEditor","BubbleMenu","IconTrash","Fragment","useEffect","useState","jsx","jsxs","useCallback","useRef","BubbleMenu","useCallback","useRef","useState","useEffect","useCallback","useEffect","useState","jsx","jsxs","IconAlignLeft","IconAlignCenter","IconAlignRight","IconTrash","jsx","jsxs","useRef","useState","useEffect","useCallback","BubbleMenu","IconPhoto","IconUpload","useCallback","useRef","useState","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","IconPhoto","IconUpload","jsx","jsxs","useRef","useCallback","jsx","jsxs","Editor"]}
|
|
1
|
+
{"version":3,"sources":["../../src/headless/extensions/extension-kit.ts","../../src/react/menus/TextMenu.tsx","../../src/react/menus/MenuList.tsx","../../src/react/menus/LinkPopover.tsx","../../src/react/menus/SlashMenu.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/Editor.tsx"],"sourcesContent":["import Collaboration from \"@tiptap/extension-collaboration\"\n// import CollaborationCursor from \"@tiptap/extension-collaboration-cursor\" // Temporarily disabled\nimport { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { ImageBlock } from \"./ImageBlock/ImageBlock\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n user?: any\n }\n imageBlockView?: any\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => {\n const extensions = [\n StarterKit.configure({ codeBlock: false, link: false }),\n CodeBlock,\n Link,\n ImageBlock.configure({\n uploadImage: options?.uploadImage,\n nodeView: options?.imageBlockView,\n }),\n Placeholder.configure({\n placeholder: ({ node }: any) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`\n }\n return \"Press '/' for commands\"\n },\n includeChildren: true,\n }),\n SlashCommand.configure({\n suggestion: {\n char: \"/\",\n render: renderSlashItems,\n allowSpaces: true,\n allowedPrefixes: null,\n },\n }),\n ]\n\n if (options?.collaboration?.doc) {\n extensions.push(\n Collaboration.configure({\n document: options.collaboration.doc,\n field: options.collaboration.field,\n }),\n )\n\n // Note: CollaborationCursor is temporarily disabled due to compatibility issues\n // Collaboration (document syncing) still works without it\n // TODO: Fix CollaborationCursor integration\n }\n\n return extensions\n}\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport type { ReactNode } from \"react\"\nimport { Fragment } from \"react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type TextMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function TextMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: TextMenuProps) {\n const { editor } = useCurrentEditor()\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx.editor) return null\n return {\n isBold: ctx.editor.isActive(\"bold\"),\n isItalic: ctx.editor.isActive(\"italic\"),\n isStrike: ctx.editor.isActive(\"strike\"),\n isCode: ctx.editor.isActive(\"code\"),\n isCodeBlock: ctx.editor.isActive(\"codeBlock\"),\n isParagraph: ctx.editor.isActive(\"paragraph\"),\n isHeading: ctx.editor.isActive(\"heading\"),\n isList:\n ctx.editor.isActive(\"bulletList\") ||\n ctx.editor.isActive(\"orderedList\"),\n isBlockquote: ctx.editor.isActive(\"blockquote\"),\n }\n },\n })\n\n if (!editor || !editorState) return null\n\n const hasAnyMarksInSelection = () => {\n const anyEditor: any = editor\n const state = anyEditor.state\n const sel: any = state.selection\n let has = false\n state.doc.nodesBetween(sel.from, sel.to, (node: any) => {\n if (node.isText && node.marks && node.marks.length > 0) {\n has = true\n return false\n }\n return undefined\n })\n if (!has && sel.empty) {\n const marks = state.storedMarks || sel.$from.marks()\n if (marks && marks.length > 0) has = true\n }\n return has\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state, from, to, view }) => {\n // Don't show if imageBlock is active\n if (e.isActive(\"imageBlock\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // 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\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <MenuList editor={editor} />\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isBold ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isBold}\n aria-label=\"Toggle bold\"\n >\n <IconBold size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isItalic ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isItalic}\n aria-label=\"Toggle italic\"\n >\n <IconItalic size={16} />\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${editorState.isStrike ? \" is-active\" : \"\"}`}\n disabled={editorState.isCode || editorState.isCodeBlock}\n aria-disabled={editorState.isCode || editorState.isCodeBlock}\n aria-pressed={editorState.isStrike}\n aria-label=\"Toggle strike\"\n >\n <IconStrikethrough size={16} />\n </button>\n\n <LinkPopover editor={editor} hideWhenUnavailable={false} />\n\n {(() => {\n const hasInlineMarks = hasAnyMarksInSelection()\n\n const isPlainParagraph =\n editorState.isParagraph &&\n !editorState.isHeading &&\n !editorState.isList &&\n !editorState.isBlockquote &&\n !editorState.isCodeBlock &&\n !hasInlineMarks\n\n return (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n editor\n .chain()\n .focus()\n .clearNodes()\n .setParagraph()\n .unsetAllMarks()\n .run()\n }\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n aria-label=\"Revert to paragraph\"\n title=\"Revert to paragraph\"\n disabled={isPlainParagraph}\n aria-disabled={isPlainParagraph}\n >\n <IconArrowBackUp size={16} />\n </button>\n )\n })()}\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default TextMenu\n","import React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport {\n IconTypography,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconChevronDown,\n IconSourceCode,\n} from \"@tabler/icons-react\"\n\nexport type MenuListProps = {\n editor: any\n className?: string\n style?: React.CSSProperties\n onSelect?: () => void\n buttonClassName?: string\n}\n\nexport function MenuList({\n editor,\n className,\n style,\n onSelect,\n buttonClassName,\n}: MenuListProps) {\n const [open, setOpen] = useState(false)\n const [label, setLabel] = useState(\"Paragraph\")\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const computeLabel = useCallback(() => {\n if (!editor) return \"Paragraph\"\n if (editor.isActive(\"heading\", { level: 1 })) return \"Heading 1\"\n if (editor.isActive(\"heading\", { level: 2 })) return \"Heading 2\"\n if (editor.isActive(\"heading\", { level: 3 })) return \"Heading 3\"\n if (editor.isActive(\"heading\", { level: 4 })) return \"Heading 4\"\n if (editor.isActive(\"bulletList\")) return \"Bullet list\"\n if (editor.isActive(\"orderedList\")) return \"Ordered list\"\n if (editor.isActive(\"blockquote\")) return \"Quote\"\n if (editor.isActive(\"code\")) return \"Code\"\n if (editor.isActive(\"codeBlock\")) return \"Code Block\"\n return \"Paragraph\"\n }, [editor])\n\n useEffect(() => {\n setLabel(computeLabel())\n if (!editor) return\n const update = () => setLabel(computeLabel())\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor, computeLabel])\n\n useEffect(() => {\n if (!editor) return\n const close = () => setOpen(false)\n editor.on(\"selectionUpdate\", close)\n editor.on(\"blur\", close)\n return () => {\n editor.off(\"selectionUpdate\", close)\n editor.off(\"blur\", close)\n }\n }, [editor])\n\n useEffect(() => {\n const handlePointerDown = (e: MouseEvent) => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n if (!el.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener(\"pointerdown\", handlePointerDown)\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown)\n }, [open])\n\n const handle = (fn: () => void) => () => {\n fn()\n onSelect?.()\n setOpen(false)\n }\n\n const isActive = useCallback((name: string) => label === name, [label])\n\n return (\n <div ref={rootRef} className=\"nph-dropdown\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={\n buttonClassName ??\n `nph-btn nph-btn-ghost nph-btn-xs${open || label !== \"Paragraph\" ? \" is-active\" : \"\"}`\n }\n aria-expanded={open}\n aria-label=\"Change block type\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span style={{ fontSize: 12 }}>{label}</span>\n <IconChevronDown size={16} />\n </span>\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel nph-command\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <div\n className={className ? className : \"nph-command__list\"}\n style={{ maxHeight: 240, ...(style ?? {}) }}\n >\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Paragraph\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Paragraph\")}\n onClick={handle(() =>\n (editor as any).chain().focus().setParagraph().run()\n )}\n >\n <IconTypography size={16} />\n <span>Paragraph</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 1\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 1\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 1 })\n .run()\n )}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 2\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 2\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 2 })\n .run()\n )}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 3\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 3\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 3 })\n .run()\n )}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Heading 4\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Heading 4\")}\n onClick={handle(() =>\n (editor as any)\n .chain()\n .focus()\n .toggleHeading({ level: 4 })\n .run()\n )}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Bullet list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Bullet list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBulletList().run()\n )}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Ordered list\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Ordered list\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleOrderedList().run()\n )}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Quote\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Quote\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleBlockquote().run()\n )}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCode().run()\n )}\n >\n <IconCode size={16} />\n <span>Code</span>\n </button>\n\n <button\n type=\"button\"\n className={`nph-command__item${isActive(\"Code Block\") ? \" is-active\" : \"\"}`}\n aria-selected={isActive(\"Code Block\")}\n onClick={handle(() =>\n (editor as any).chain().focus().toggleCodeBlock().run()\n )}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default MenuList\n","import React, { useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n IconLink,\n IconExternalLink,\n IconTrash,\n IconCornerDownLeft,\n} from \"@tabler/icons-react\"\n\nexport type LinkPopoverProps = {\n editor: any | null\n hideWhenUnavailable?: boolean\n autoOpenOnLinkActive?: boolean\n onSetLink?: () => void\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function LinkPopover({\n editor,\n hideWhenUnavailable = false,\n autoOpenOnLinkActive = true,\n onSetLink,\n onOpenChange,\n}: LinkPopoverProps) {\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState<string>(\"\")\n const inputRef = useRef<HTMLInputElement | null>(null)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const isInCode =\n !!editor?.isActive?.(\"code\") || !!editor?.isActive?.(\"codeBlock\")\n const isActive = !!editor?.isActive?.(\"link\")\n const currentHref: string = useMemo(\n () =>\n editor?.getAttributes ? (editor.getAttributes(\"link\")?.href ?? \"\") : \"\",\n [editor, editor?.state?.selection?.from, editor?.state?.selection?.to]\n )\n\n const canSet = useMemo(() => {\n if (!editor || isInCode) return false\n try {\n return editor\n .can()\n .chain()\n .focus()\n .setLink({ href: \"https://example.com\" })\n .run()\n } catch (_) {\n return false\n }\n }, [editor, isInCode])\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n const next = editor.getAttributes(\"link\")?.href ?? \"\"\n setUrl(next)\n const linkActive = editor.isActive(\"link\")\n if (autoOpenOnLinkActive && editor.isFocused && linkActive) setOpen(true)\n if (!linkActive) setOpen(false)\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, autoOpenOnLinkActive])\n\n useEffect(() => {\n if (open) inputRef.current?.focus()\n onOpenChange?.(open)\n }, [open, onOpenChange])\n\n if (!editor) return null\n if (hideWhenUnavailable && !canSet && !isActive) return null\n\n const applyLink = () => {\n if (!url) return\n ;(editor as any)\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run()\n onSetLink?.()\n setOpen(false)\n }\n\n const removeLink = () => {\n ;(editor as any).chain().focus().unsetLink().run()\n setOpen(false)\n }\n\n // Close when clicking outside of the popover/button container\n useEffect(() => {\n const handler = (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\", handler)\n return () => document.removeEventListener(\"pointerdown\", handler)\n }, [open])\n\n return (\n <div\n ref={rootRef}\n className=\"nph-dropdown\"\n style={{ position: \"relative\" }}\n >\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${isActive ? \" is-active\" : \"\"}`}\n aria-label={isActive ? \"Edit link\" : \"Add link\"}\n aria-pressed={isActive}\n aria-expanded={open}\n disabled={isInCode}\n aria-disabled={isInCode}\n title={isActive ? currentHref || \"Edit link\" : \"Add link\"}\n >\n <IconLink size={16} />\n </button>\n\n {open ? (\n <div\n className=\"nph-dropdown__panel\"\n style={{\n padding: 0,\n minWidth: 320,\n background: \"transparent\",\n boxShadow: \"none\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n }}\n role=\"dialog\"\n aria-label=\"Link editor\"\n >\n <div className=\"nph-link-popover\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://example.com\"\n className=\"nph-link-popover__input\"\n onMouseDown={(e) => {\n e.stopPropagation()\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n applyLink()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setOpen(false)\n }\n }}\n />\n <div className=\"nph-link-popover__divider\" />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Apply\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={applyLink}\n disabled={!url}\n >\n <IconCornerDownLeft size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Open in new tab\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const target = url || currentHref\n if (target) window.open(target, \"_blank\", \"noopener,noreferrer\")\n }}\n disabled={!url && !currentHref}\n >\n <IconExternalLink 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 link\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeLink}\n disabled={!isActive}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default LinkPopover\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport {\n EditorCommand,\n EditorCommandList,\n EditorCommandItem,\n EditorCommandEmpty,\n} from \"../../headless\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconH1,\n IconH2,\n IconH3,\n IconH4,\n IconList,\n IconListNumbers,\n IconBlockquote,\n IconCode,\n IconSourceCode,\n IconPhoto,\n} from \"@tabler/icons-react\"\n\nexport type SlashMenuProps = {\n className?: string\n}\n\nexport function SlashMenu({ className }: SlashMenuProps) {\n const { editor } = useCurrentEditor()\n if (!editor) return null\n\n return (\n <EditorCommand className={className ?? \"nph-command\"}>\n <EditorCommandList\n className=\"nph-command__list\"\n style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\n >\n <EditorCommandEmpty style={{ padding: \"8px 12px\", fontSize: 14 }}>\n No commands found\n </EditorCommandEmpty>\n <EditorCommandItem\n value=\"bold\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBold()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBold size={16} />\n <span>Bold</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"italic\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleItalic()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconItalic size={16} />\n <span>Italic</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"strike\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleStrike()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconStrikethrough size={16} />\n <span>Strike</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading1 h1\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 1 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH1 size={16} />\n <span>Heading 1</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading2 h2\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 2 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH2 size={16} />\n <span>Heading 2</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading3 h3\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 3 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH3 size={16} />\n <span>Heading 3</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"heading4 h4\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleHeading({ level: 4 })\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconH4 size={16} />\n <span>Heading 4</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"bullet list ul\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBulletList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconList size={16} />\n <span>Bullet list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"ordered list ol\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleOrderedList()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconListNumbers size={16} />\n <span>Ordered list</span>\n </span>\n </EditorCommandItem>\n <EditorCommandItem\n value=\"quote blockquote\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleBlockquote()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconBlockquote size={16} />\n <span>Quote</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code inline\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCode()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconCode size={16} />\n <span>Code</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"code block codeblock\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) =>\n (editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .toggleCodeBlock()\n .run()\n }\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconSourceCode size={16} />\n <span>Code Block</span>\n </span>\n </EditorCommandItem>\n\n <EditorCommandItem\n value=\"image photo picture block\"\n className=\"nph-command__item\"\n onCommand={({\n editor,\n range,\n }: {\n editor: any\n range: { from: number; to: number }\n }) => {\n ;(editor as any)\n .chain()\n .focus()\n .deleteRange(range)\n .setImageBlock({ src: \"\" })\n .run()\n }}\n >\n <span\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}\n >\n <IconPhoto size={16} />\n <span>Image</span>\n </span>\n </EditorCommandItem>\n </EditorCommandList>\n </EditorCommand>\n )\n}\n\nexport default SlashMenu\n","import { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { Fragment, useEffect, useState } from \"react\"\nimport type { ReactNode } from \"react\"\n\ntype ExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type ImageMenuProps = {\n className?: string\n leadingExtras?: ExtraRenderer[]\n trailingExtras?: ExtraRenderer[]\n}\n\nexport function ImageMenu({\n className,\n leadingExtras,\n trailingExtras,\n}: ImageMenuProps) {\n const { editor } = useCurrentEditor()\n const [size, setSize] = useState<number>(100)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"left\")\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\") ?? {\n width: \"\",\n align: \"left\",\n }\n const width = attrs.width ?? \"\"\n if (width.includes(\"%\")) {\n setSize(parseInt(width) || 100)\n } else {\n setSize(100)\n }\n setAlign(attrs.align ?? \"left\")\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n editor.on(\"update\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n editor.off(\"update\", update)\n }\n }, [editor])\n\n if (!editor) return null\n\n const updateImageSize = (newSize: number) => {\n setSize(newSize)\n editor.commands.setImageBlockWidth(newSize)\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.setImageBlockAlign(newAlign)\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n editor.commands.updateAttributes(\"imageBlock\", { src: \"\", loading: false })\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"imageBlock\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n {leadingExtras && editor\n ? leadingExtras.map((renderExtra, index) => (\n <Fragment key={`image-leading-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\" }}>\n {size}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"5\"\n value={size}\n onChange={(e) => updateImageSize(parseInt(e.target.value))}\n onMouseDown={(e) => e.stopPropagation()}\n style={{ flex: 1 }}\n />\n </div>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"left\")}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"center\")}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => updateImageAlign(\"right\")}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Upload new image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={triggerUpload}\n >\n <IconUpload size={16} />\n </button>\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={removeImage}\n >\n <IconTrash size={16} />\n </button>\n {trailingExtras && editor\n ? trailingExtras.map((renderExtra, index) => (\n <Fragment key={`image-trailing-extra-${index}`}>\n {renderExtra(editor)}\n </Fragment>\n ))\n : null}\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\n","import { Node } from \"@tiptap/pm/model\"\nimport { Editor, NodeViewWrapper } from \"@tiptap/react\"\nimport { useCallback, useRef } from \"react\"\nimport { ImageBlockMenu } from \"./ImageBlockMenu\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\ninterface ImageBlockViewProps {\n editor: Editor\n getPos: () => number\n node: Node\n updateAttributes: (attrs: Record<string, any>) => void\n}\n\nexport const ImageBlockView = (props: ImageBlockViewProps) => {\n const { editor, getPos, node, updateAttributes } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string\n width: string\n align: \"left\" | \"center\" | \"right\"\n alt?: string\n loading?: boolean\n }\n }\n }\n const imageWrapperRef = useRef<HTMLDivElement>(null)\n const { src, width, align, alt, loading } = node.attrs\n\n const handleUpload = useCallback(\n (url: string) => {\n updateAttributes({ src: url, loading: false })\n },\n [updateAttributes]\n )\n\n const onClick = useCallback(() => {\n editor.commands.setNodeSelection(getPos())\n }, [getPos, editor.commands])\n\n // Calculate wrapper class based on alignment\n const getWrapperStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: width || \"100%\",\n maxWidth: \"100%\",\n }\n\n if (align === \"left\") {\n return { ...baseStyle, marginLeft: 0, marginRight: \"auto\" }\n } else if (align === \"right\") {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: 0 }\n } else {\n return { ...baseStyle, marginLeft: \"auto\", marginRight: \"auto\" }\n }\n }\n\n // Show uploader if no src\n if (!src || src === \"\") {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageUploader onUpload={handleUpload} editor={editor} />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show loading placeholder\n if (loading) {\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div ref={imageWrapperRef}>\n <ImageBlockLoading />\n </div>\n </div>\n </NodeViewWrapper>\n )\n }\n\n // Show the actual image\n return (\n <NodeViewWrapper>\n <div style={getWrapperStyle()}>\n <div contentEditable={false} ref={imageWrapperRef} style={{ position: \"relative\" }}>\n <img\n src={src}\n alt={alt || \"\"}\n onClick={onClick}\n className=\"nph-image-block\"\n />\n </div>\n </div>\n <ImageBlockMenu editor={editor} appendTo={imageWrapperRef} />\n </NodeViewWrapper>\n )\n}\n\nexport default ImageBlockView\n","import { Editor } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport { useCallback, useRef, useState, useEffect } from \"react\"\nimport { ImageBlockWidth } from \"./ImageBlockWidth\"\nimport {\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nexport type ImageBlockMenuProps = {\n editor: Editor\n appendTo?: React.RefObject<HTMLElement | null>\n}\n\nexport const ImageBlockMenu = ({ editor, appendTo }: ImageBlockMenuProps) => {\n const menuRef = useRef<HTMLDivElement>(null)\n const [align, setAlign] = useState<\"left\" | \"center\" | \"right\">(\"center\")\n const [width, setWidth] = useState<number>(100)\n\n useEffect(() => {\n if (!editor) return\n const update = () => {\n if (!editor.isActive(\"imageBlock\")) return\n const attrs = editor.getAttributes(\"imageBlock\")\n setAlign(attrs.align || \"center\")\n const widthStr = attrs.width || \"100%\"\n setWidth(parseInt(widthStr) || 100)\n }\n update()\n editor.on(\"selectionUpdate\", update)\n editor.on(\"transaction\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n editor.off(\"transaction\", update)\n }\n }, [editor])\n\n const getReferenceClientRect = useCallback(() => {\n if (!editor) return new DOMRect(-1000, -1000, 0, 0)\n\n const { view } = editor\n const { state } = view\n const { selection } = state\n\n // Get the node at the current selection\n const node = selection instanceof (window as any).ProseMirror?.state?.NodeSelection\n ? (selection as any).node\n : null\n\n if (node && node.type.name === \"imageBlock\") {\n const nodePos = (selection as any).from\n const domNode = view.nodeDOM(nodePos)\n if (domNode && domNode instanceof HTMLElement) {\n return domNode.getBoundingClientRect()\n }\n }\n\n // Fallback: try to find the image block element\n const imageBlockElements = document.querySelectorAll('[data-node-view-wrapper]')\n for (const el of Array.from(imageBlockElements)) {\n if (el.querySelector(\"img\")) {\n return el.getBoundingClientRect()\n }\n }\n\n return new DOMRect(-1000, -1000, 0, 0)\n }, [editor])\n\n const shouldShow = useCallback(() => {\n if (!editor) return false\n const isActive = editor.isActive(\"imageBlock\")\n if (!isActive) return false\n\n // Check if it's a node selection\n const { state } = editor\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n return isNodeSelection\n }, [editor])\n\n const onAlignImageLeft = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"left\")\n .run()\n }, [editor])\n\n const onAlignImageCenter = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"center\")\n .run()\n }, [editor])\n\n const onAlignImageRight = useCallback(() => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockAlign(\"right\")\n .run()\n }, [editor])\n\n const onWidthChange = useCallback(\n (value: number) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockWidth(value)\n .run()\n },\n [editor]\n )\n\n const onRemoveImage = useCallback(() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run()\n }, [editor])\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n updateDelay={0}\n >\n <div className=\"bubble-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"left\" ? \" is-active\" : \"\"}`}\n title=\"Align left\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageLeft}\n >\n <IconAlignLeft size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"center\" ? \" is-active\" : \"\"}`}\n title=\"Align center\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageCenter}\n >\n <IconAlignCenter size={16} />\n </button>\n <button\n type=\"button\"\n className={`nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === \"right\" ? \" is-active\" : \"\"}`}\n title=\"Align right\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onAlignImageRight}\n >\n <IconAlignRight size={16} />\n </button>\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <ImageBlockWidth onChange={onWidthChange} value={width} />\n <div\n className=\"nph-link-popover__divider\"\n style={{ margin: \"0 4px\" }}\n />\n <button\n type=\"button\"\n className=\"nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon\"\n title=\"Remove image\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemoveImage}\n >\n <IconTrash size={16} />\n </button>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageBlockMenu\n","import { memo, useCallback, useEffect, useState } from \"react\"\n\nexport type ImageBlockWidthProps = {\n onChange: (value: number) => void\n value: number\n}\n\nexport const ImageBlockWidth = memo(\n ({ onChange, value }: ImageBlockWidthProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = parseInt(e.target.value)\n onChange(nextValue)\n setCurrentValue(nextValue)\n },\n [onChange]\n )\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 140,\n }}\n >\n <span style={{ fontSize: \"12px\", whiteSpace: \"nowrap\", width: 40 }}>\n {currentValue}%\n </span>\n <input\n type=\"range\"\n min=\"25\"\n max=\"100\"\n step=\"25\"\n value={currentValue}\n onChange={handleChange}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n height: 3,\n borderRadius: 9999,\n appearance: \"none\",\n background: \"linear-gradient(to right, #333 0%, #333 \" + currentValue + \"%, #ddd \" + currentValue + \"%, #ddd 100%)\",\n outline: \"none\",\n cursor: \"pointer\",\n }}\n className=\"nph-image-width-slider\"\n />\n </div>\n )\n }\n)\n\nImageBlockWidth.displayName = \"ImageBlockWidth\"\n\nexport default ImageBlockWidth\n","import { IconPhoto, IconUpload } from \"@tabler/icons-react\"\nimport { ChangeEvent, useCallback, useRef, useState, DragEvent } from \"react\"\nimport { Editor } from \"@tiptap/react\"\nimport { ImageBlockLoading } from \"./ImageBlockLoading\"\n\nexport type ImageUploaderProps = {\n onUpload: (url: string) => void\n editor: Editor\n}\n\nexport const ImageUploader = ({ onUpload, editor }: ImageUploaderProps) => {\n const [loading, setLoading] = useState(false)\n const [draggedInside, setDraggedInside] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const uploadFile = useCallback(\n async (file: File) => {\n setLoading(true)\n try {\n // Get the upload handler from the editor\n const imageExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"imageBlock\"\n )\n const uploadImage = (imageExtension?.options as any)?.uploadImage\n\n if (uploadImage) {\n const url = await uploadImage(file)\n onUpload(url)\n } else {\n console.error(\"No uploadImage handler provided\")\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n } finally {\n setLoading(false)\n }\n },\n [editor, onUpload]\n )\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const onFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n\n const file = e.dataTransfer.files[0]\n if (file && /image/i.test(file.type)) {\n uploadFile(file)\n }\n },\n [uploadFile]\n )\n\n const onDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(true)\n }, [])\n\n const onDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDraggedInside(false)\n }, [])\n\n if (loading) {\n return <ImageBlockLoading />\n }\n\n return (\n <div\n className={`nph-image-uploader${draggedInside ? \" nph-image-uploader--dragging\" : \"\"}`}\n onDrop={onDrop}\n onDragOver={onDragEnter}\n onDragLeave={onDragLeave}\n contentEditable={false}\n >\n <IconPhoto size={48} className=\"nph-image-uploader__icon\" />\n <div className=\"nph-image-uploader__content\">\n <div className=\"nph-image-uploader__text\">\n {draggedInside ? \"Drop image here\" : \"Drag and drop or\"}\n </div>\n <div>\n <button\n type=\"button\"\n disabled={draggedInside}\n onClick={handleUploadClick}\n className=\"nph-btn nph-btn-ghost nph-btn-sm nph-image-uploader__button\"\n >\n <IconUpload size={16} />\n Upload an image\n </button>\n </div>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".jpg,.jpeg,.png,.webp,.gif\"\n onChange={onFileChange}\n className=\"nph-image-uploader__input\"\n />\n </div>\n )\n}\n\nexport default ImageUploader\n","import { IconLoader2 } from \"@tabler/icons-react\"\n\nexport const ImageBlockLoading = () => {\n return (\n <div className=\"nph-image-block-loading\">\n <div className=\"nph-image-block-loading__overlay\">\n <div className=\"nph-image-block-loading__content\">\n <IconLoader2 size={24} className=\"nph-image-block-loading__spinner\" />\n <p className=\"nph-image-block-loading__text\">Uploading image...</p>\n </div>\n </div>\n <div className=\"nph-image-block-loading__placeholder\" />\n </div>\n )\n}\n\nexport default ImageBlockLoading\n","import {\n EditorRoot,\n EditorContent,\n handleCommandNavigation,\n type EditorContentProps,\n} from \"../headless\"\nimport ExtensionKit from \"../headless/extensions/extension-kit\"\nimport { SlashMenu, TextMenu, ImageMenu } from \"./menus\"\nimport { ImageBlockView } from \"./menus/ImageBlock/ImageBlockView\"\nimport type { ReactNode } from \"react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\nexport type BubbleMenuExtraRenderer = (editor: TiptapEditor) => ReactNode\n\nexport type BubbleMenuExtra =\n | BubbleMenuExtraRenderer\n | {\n render: BubbleMenuExtraRenderer\n align?: \"start\" | \"end\"\n }\n\nexport type BubbleMenuExtras = Partial<{\n text: BubbleMenuExtra | BubbleMenuExtra[]\n image: BubbleMenuExtra | BubbleMenuExtra[]\n}>\n\nexport type NeuphloEditorProps = {\n content?: string\n className?: string\n editable?: boolean\n immediatelyRender?: boolean\n showTextMenu?: boolean\n showSlashMenu?: boolean\n showImageMenu?: boolean\n extensions?: any[]\n bubbleMenuExtras?: BubbleMenuExtras\n onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n collaboration?: {\n doc: any\n field: string\n awareness?: any\n }\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n bubbleMenuExtras,\n onUpdate,\n onCreate,\n uploadImage,\n collaboration,\n}: NeuphloEditorProps) {\n const normalizeExtras = (extras?: BubbleMenuExtra | BubbleMenuExtra[]) => {\n const result: {\n start: BubbleMenuExtraRenderer[]\n end: BubbleMenuExtraRenderer[]\n } = {\n start: [],\n end: [],\n }\n if (!extras) return result\n\n const list = Array.isArray(extras) ? extras : [extras]\n list.forEach((item) => {\n const config =\n typeof item === \"function\"\n ? { render: item, align: \"end\" as const }\n : item\n const slot = config.align === \"start\" ? \"start\" : \"end\"\n result[slot].push(config.render)\n })\n return result\n }\n\n const textExtras = normalizeExtras(bubbleMenuExtras?.text)\n const imageExtras = normalizeExtras(bubbleMenuExtras?.image)\n\n return (\n <div className={className}>\n <EditorRoot>\n <EditorContent\n onUpdate={onUpdate}\n onCreate={onCreate}\n immediatelyRender={immediatelyRender}\n editable={editable}\n content={content}\n extensions={[\n ...ExtensionKit({\n uploadImage: uploadImage,\n collaboration: collaboration,\n imageBlockView: ImageBlockView,\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 {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","useCurrentEditor","IconBold","IconItalic","IconStrikethrough","IconH1","IconH2","IconH3","IconH4","IconList","IconListNumbers","IconBlockquote","IconCode","IconSourceCode","jsx","jsxs","useCurrentEditor","editor","useCurrentEditor","BubbleMenu","IconTrash","Fragment","useEffect","useState","jsx","jsxs","useCallback","useRef","BubbleMenu","useCallback","useRef","useState","useEffect","useCallback","useEffect","useState","jsx","jsxs","IconAlignLeft","IconAlignCenter","IconAlignRight","IconTrash","jsx","jsxs","useRef","useState","useEffect","useCallback","BubbleMenu","IconPhoto","IconUpload","useCallback","useRef","useState","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","IconPhoto","IconUpload","jsx","jsxs","useRef","useCallback","jsx","jsxs","Editor"]}
|