neuphlo-editor 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/Markdown-BAW0cb-U.d.cts +153 -0
  2. package/dist/Markdown-BAW0cb-U.d.ts +153 -0
  3. package/dist/chunk-ABL4D65Z.js +1454 -0
  4. package/dist/chunk-ABL4D65Z.js.map +1 -0
  5. package/dist/chunk-Z2DR2FK3.js +1582 -0
  6. package/dist/chunk-Z2DR2FK3.js.map +1 -0
  7. package/dist/headless/components/editor-bubble-item.d.ts +9 -0
  8. package/dist/headless/components/editor-bubble-item.js +29 -0
  9. package/dist/headless/components/editor-bubble.d.ts +9 -0
  10. package/dist/headless/components/editor-bubble.js +9 -0
  11. package/dist/headless/components/editor-command-item.d.ts +3 -0
  12. package/dist/headless/components/editor-command-item.js +27 -0
  13. package/dist/headless/components/editor-command.d.ts +3 -0
  14. package/dist/headless/components/editor-command.js +136 -0
  15. package/dist/headless/components/editor.d.ts +24 -0
  16. package/dist/headless/components/editor.js +13 -0
  17. package/dist/headless/extensions/AISuggestion/AISuggestion.d.ts +82 -0
  18. package/dist/headless/extensions/AISuggestion/AISuggestion.js +244 -0
  19. package/dist/headless/extensions/AISuggestion/index.d.ts +2 -0
  20. package/dist/headless/extensions/AISuggestion/index.js +1 -0
  21. package/dist/headless/extensions/CodeBlock/CodeBlock.d.ts +1 -0
  22. package/dist/headless/extensions/CodeBlock/CodeBlock.js +6 -0
  23. package/dist/headless/extensions/CodeBlock/index.d.ts +1 -0
  24. package/dist/headless/extensions/CodeBlock/index.js +1 -0
  25. package/dist/headless/extensions/DragHandle/DragHandle.d.ts +9 -0
  26. package/dist/headless/extensions/DragHandle/DragHandle.js +47 -0
  27. package/dist/headless/extensions/DragHandle/index.d.ts +2 -0
  28. package/dist/headless/extensions/DragHandle/index.js +1 -0
  29. package/dist/headless/extensions/Image/Image.d.ts +6 -0
  30. package/dist/headless/extensions/Image/Image.js +197 -0
  31. package/dist/headless/extensions/ImageBlock/ImageBlock.d.ts +23 -0
  32. package/dist/headless/extensions/ImageBlock/ImageBlock.js +242 -0
  33. package/dist/headless/extensions/ImageBlock/index.d.ts +2 -0
  34. package/dist/headless/extensions/ImageBlock/index.js +1 -0
  35. package/dist/headless/extensions/Link/Link.d.ts +2 -0
  36. package/dist/headless/extensions/Link/Link.js +44 -0
  37. package/dist/headless/extensions/Link/index.d.ts +1 -0
  38. package/dist/headless/extensions/Link/index.js +1 -0
  39. package/dist/headless/extensions/Markdown.d.ts +9 -0
  40. package/dist/headless/extensions/Markdown.js +138 -0
  41. package/dist/headless/extensions/MarkdownPaste.d.ts +3 -0
  42. package/dist/headless/extensions/MarkdownPaste.js +168 -0
  43. package/dist/headless/extensions/Mention/index.d.ts +4 -0
  44. package/dist/headless/extensions/Mention/index.js +3 -0
  45. package/dist/headless/extensions/Mention/mention-command.d.ts +8 -0
  46. package/dist/headless/extensions/Mention/mention-command.js +165 -0
  47. package/dist/headless/extensions/Mention/mention-list.d.ts +8 -0
  48. package/dist/headless/extensions/Mention/mention-list.js +150 -0
  49. package/dist/headless/extensions/Mention/mention-node-view.d.ts +2 -0
  50. package/dist/headless/extensions/Mention/mention-node-view.js +92 -0
  51. package/dist/headless/extensions/Mention/mention.d.ts +46 -0
  52. package/dist/headless/extensions/Mention/mention.js +218 -0
  53. package/dist/headless/extensions/Table/index.d.ts +2 -0
  54. package/dist/headless/extensions/Table/index.js +2 -0
  55. package/dist/headless/extensions/VideoBlock/VideoBlock.d.ts +17 -0
  56. package/dist/headless/extensions/VideoBlock/VideoBlock.js +73 -0
  57. package/dist/headless/extensions/VideoBlock/index.d.ts +2 -0
  58. package/dist/headless/extensions/VideoBlock/index.js +1 -0
  59. package/dist/headless/extensions/extension-kit.d.ts +29 -0
  60. package/dist/headless/extensions/extension-kit.js +132 -0
  61. package/dist/headless/extensions/index.d.ts +16 -0
  62. package/dist/headless/extensions/index.js +12 -0
  63. package/dist/headless/extensions/slash-command.d.ts +24 -0
  64. package/dist/headless/extensions/slash-command.js +99 -0
  65. package/dist/headless/index.cjs +143 -2
  66. package/dist/headless/index.cjs.map +1 -1
  67. package/dist/headless/index.d.cts +3 -2
  68. package/dist/headless/index.d.ts +3 -2
  69. package/dist/headless/index.js +5 -1
  70. package/dist/headless/utils/atoms.d.ts +13 -0
  71. package/dist/headless/utils/atoms.js +5 -0
  72. package/dist/headless/utils/store.d.ts +2 -0
  73. package/dist/headless/utils/store.js +4 -0
  74. package/dist/highlight.css +0 -6
  75. package/dist/react/Editor.d.ts +43 -0
  76. package/dist/react/Editor.js +119 -0
  77. package/dist/react/TableOfContents.d.ts +7 -0
  78. package/dist/react/TableOfContents.js +96 -0
  79. package/dist/react/index.cjs +156 -9
  80. package/dist/react/index.cjs.map +1 -1
  81. package/dist/react/index.d.cts +5 -2
  82. package/dist/react/index.d.ts +5 -2
  83. package/dist/react/index.js +14 -4
  84. package/dist/react/index.js.map +1 -1
  85. package/dist/react/menus/DragHandle/BlockActionMenu.d.ts +7 -0
  86. package/dist/react/menus/DragHandle/BlockActionMenu.js +111 -0
  87. package/dist/react/menus/DragHandle/DragHandleMenu.d.ts +7 -0
  88. package/dist/react/menus/DragHandle/DragHandleMenu.js +97 -0
  89. package/dist/react/menus/ImageBlock/ImageBlockLoading.d.ts +2 -0
  90. package/dist/react/menus/ImageBlock/ImageBlockLoading.js +6 -0
  91. package/dist/react/menus/ImageBlock/ImageBlockMenu.d.ts +8 -0
  92. package/dist/react/menus/ImageBlock/ImageBlockMenu.js +75 -0
  93. package/dist/react/menus/ImageBlock/ImageBlockView.d.ts +10 -0
  94. package/dist/react/menus/ImageBlock/ImageBlockView.js +60 -0
  95. package/dist/react/menus/ImageBlock/ImageBlockWidth.d.ts +6 -0
  96. package/dist/react/menus/ImageBlock/ImageBlockWidth.js +29 -0
  97. package/dist/react/menus/ImageBlock/ImageResizeHandle.d.ts +8 -0
  98. package/dist/react/menus/ImageBlock/ImageResizeHandle.js +37 -0
  99. package/dist/react/menus/ImageBlock/ImageUploader.d.ts +7 -0
  100. package/dist/react/menus/ImageBlock/ImageUploader.js +73 -0
  101. package/dist/react/menus/ImageBlock/index.d.ts +4 -0
  102. package/dist/react/menus/ImageBlock/index.js +4 -0
  103. package/dist/react/menus/ImageMenu.d.ts +10 -0
  104. package/dist/react/menus/ImageMenu.js +77 -0
  105. package/dist/react/menus/ImagePopover.d.ts +8 -0
  106. package/dist/react/menus/ImagePopover.js +146 -0
  107. package/dist/react/menus/LinkMenu.d.ts +2 -0
  108. package/dist/react/menus/LinkMenu.js +69 -0
  109. package/dist/react/menus/MenuList.d.ts +10 -0
  110. package/dist/react/menus/MenuList.js +94 -0
  111. package/dist/react/menus/SlashMenu.d.ts +5 -0
  112. package/dist/react/menus/SlashMenu.js +156 -0
  113. package/dist/react/menus/TableMenu.d.ts +5 -0
  114. package/dist/react/menus/TableMenu.js +462 -0
  115. package/dist/react/menus/TaskItem/TaskItemView.d.ts +12 -0
  116. package/dist/react/menus/TaskItem/TaskItemView.js +11 -0
  117. package/dist/react/menus/TextMenu.d.ts +10 -0
  118. package/dist/react/menus/TextMenu.js +139 -0
  119. package/dist/react/menus/VideoBlock/VideoBlockMenu.d.ts +7 -0
  120. package/dist/react/menus/VideoBlock/VideoBlockMenu.js +72 -0
  121. package/dist/react/menus/VideoBlock/VideoBlockView.d.ts +10 -0
  122. package/dist/react/menus/VideoBlock/VideoBlockView.js +87 -0
  123. package/dist/react/menus/VideoBlock/index.d.ts +2 -0
  124. package/dist/react/menus/VideoBlock/index.js +2 -0
  125. package/dist/react/menus/index.d.ts +15 -0
  126. package/dist/react/menus/index.js +9 -0
  127. package/package.json +13 -9
  128. package/LICENSE +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/headless/index.ts","../src/headless/components/editor.tsx","../src/headless/utils/store.ts","../src/headless/components/editor-bubble.tsx","../src/headless/components/editor-bubble-item.tsx","../src/headless/components/editor-command.tsx","../src/headless/utils/atoms.ts","../src/headless/components/editor-command-item.tsx","../src/headless/extensions/index.ts","../src/headless/extensions/CodeBlock/CodeBlock.ts","../src/headless/extensions/Link/Link.ts","../src/headless/extensions/ImageBlock/ImageBlock.ts","../src/headless/extensions/Mention/mention.tsx","../src/headless/extensions/Mention/mention-command.tsx","../src/headless/extensions/Mention/mention-node-view.tsx","../src/headless/extensions/DragHandle/DragHandle.ts","../src/headless/extensions/Table/index.ts","../src/headless/extensions/MarkdownPaste.ts","../src/headless/extensions/Markdown.ts","../src/headless/extensions/slash-command.tsx"],"sourcesContent":["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 { Markdown, markdownToHtml } from \"./extensions\"\nexport type { MarkdownStorage } from \"./extensions\"\nexport {\n Command as SlashCommand,\n renderItems as renderSlashCommandItems,\n createSuggestionItems,\n handleCommandNavigation,\n} from \"./extensions/slash-command\"\nexport {\n createMentionExtension,\n renderMentionSuggestion,\n MentionCommand,\n type MentionItem,\n type MentionOptions,\n} from \"./extensions/Mention\"\n// Path without extension to satisfy TS/tsup\n// (the file is at ./extensions/slash-command.tsx)\n// eslint-disable-next-line\n","import { EditorProvider } from \"@tiptap/react\"\nimport type { EditorProviderProps } from \"@tiptap/react\"\nimport { forwardRef } from \"react\"\nimport type { FC, ReactNode } from \"react\"\nimport { Provider } from \"jotai\"\nimport { novelStore } from \"../utils/store\"\n\nexport interface EditorRootProps {\n readonly children: ReactNode\n}\n\nexport const EditorRoot: FC<EditorRootProps> = ({ children }) => {\n return (\n <Provider store={novelStore as any}>\n {children as any}\n </Provider>\n )\n}\n\nexport type EditorContentProps = EditorProviderProps & {\n readonly children?: ReactNode\n readonly className?: string\n readonly initialContent?: any\n}\n\nexport const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(\n ({ className, children, initialContent, content, ...rest }, ref) => {\n const effectiveContent = content ?? initialContent\n return (\n <div ref={ref} className={className}>\n <EditorProvider {...rest} content={effectiveContent}>\n {children}\n </EditorProvider>\n </div>\n )\n }\n)\n\nEditorContent.displayName = \"EditorContent\"\n","import { createStore } from \"jotai\";\n\n// biome-ignore lint/suspicious/noExplicitAny: store is opaque to consumers\nexport const novelStore: any = createStore();\nexport * from \"jotai\";\n\n","import { useCurrentEditor } from \"@tiptap/react\";\nimport { BubbleMenu as BubbleMenuReact } from \"@tiptap/react/menus\";\nimport type { BubbleMenuProps } from \"@tiptap/react/menus\";\nimport type { ReactNode } from \"react\";\n\ntype ForwardedBubbleProps = Omit<BubbleMenuProps, \"editor\" | \"children\" | \"className\">;\n\nexport interface EditorBubbleProps extends ForwardedBubbleProps {\n readonly className?: string;\n readonly children: ReactNode;\n}\n\nexport function EditorBubble({ className, children, ...rest }: EditorBubbleProps) {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n return (\n <BubbleMenuReact editor={editor} {...rest}>\n <div className={className}>{children}</div>\n </BubbleMenuReact>\n );\n}\n","import { forwardRef, isValidElement, cloneElement } from \"react\"\nimport type { ComponentPropsWithoutRef, ReactElement, ReactNode } from \"react\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport type { Editor as TiptapEditor } from \"@tiptap/react\"\n\ninterface EditorBubbleItemProps {\n readonly children: ReactNode\n readonly asChild?: boolean\n readonly onSelect?: (editor: TiptapEditor) => void\n}\n\nexport const EditorBubbleItem = forwardRef<\n HTMLDivElement,\n EditorBubbleItemProps & Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\">\n>(({ children, asChild, onSelect, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n\n if (!editor) return null\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n onSelect?.(editor)\n }\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<any>\n const childOnClick = (child.props as any)?.onClick as\n | ((e: any) => void)\n | undefined\n const mergedOnClick = (e: any) => {\n childOnClick?.(e)\n if (!e?.defaultPrevented) onSelect?.(editor)\n }\n\n return cloneElement(child, {\n ...rest,\n ref: (child as any).ref ?? ref,\n onClick: mergedOnClick,\n })\n }\n\n return (\n <div ref={ref} {...rest} onClick={handleClick}>\n {children}\n </div>\n )\n})\n\nEditorBubbleItem.displayName = \"EditorBubbleItem\"\n\nexport default EditorBubbleItem\n","import { useAtomValue } from \"jotai\"\nimport { forwardRef, useRef, useEffect, useLayoutEffect, useState, useCallback } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { queryAtom, slashMenuOpenAtom, slashMenuRectAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\n\n// EditorCommandOut is no longer needed — kept as a no-op for backward compatibility\nexport const EditorCommandOut = () => null\n\nexport const EditorCommand = forwardRef<HTMLDivElement, any>(\n ({ children, className, ...rest }, ref) => {\n const isOpen = useAtomValue(slashMenuOpenAtom, { store: novelStore })\n const rect = useAtomValue(slashMenuRectAtom, { store: novelStore })\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const contentRef = useRef<HTMLDivElement | null>(null)\n\n // Reset active index when query changes\n const query = useAtomValue(queryAtom, { store: novelStore })\n useEffect(() => {\n setActiveIndex(0)\n }, [query])\n\n // Create portal container once\n if (typeof document !== \"undefined\" && !containerRef.current) {\n const el = document.createElement(\"div\")\n el.style.position = \"fixed\"\n el.style.zIndex = \"9999\"\n el.style.minWidth = \"240px\"\n el.style.display = \"none\"\n containerRef.current = el\n }\n\n // Manage DOM attachment\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n document.body.appendChild(el)\n return () => {\n el.remove()\n }\n }, [])\n\n // Show/hide and position\n useLayoutEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n if (!isOpen || !rect) {\n container.style.display = \"none\"\n return\n }\n\n container.style.display = \"\"\n\n const menuHeight = container.offsetHeight || 360\n const viewportHeight = window.innerHeight\n const spaceBelow = viewportHeight - rect.bottom\n const spaceAbove = rect.top\n\n let top: number\n if (spaceBelow < menuHeight + 16 && spaceAbove > spaceBelow) {\n top = Math.round(rect.top - menuHeight - 8)\n if (top < 8) top = 8\n } else {\n top = Math.round(rect.bottom + 8)\n }\n\n let left = Math.round(rect.left)\n const menuWidth = container.offsetWidth || 280\n if (left + menuWidth > window.innerWidth - 8) {\n left = window.innerWidth - menuWidth - 8\n }\n if (left < 8) left = 8\n\n container.style.top = `${top}px`\n container.style.left = `${left}px`\n }, [isOpen, rect])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen || !contentRef.current) return\n\n const items = contentRef.current.querySelectorAll(\"[role='option']\")\n if (items.length === 0) return\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n setActiveIndex((prev) => {\n const next = Math.min(prev + 1, items.length - 1)\n items[next]?.scrollIntoView({ block: \"nearest\" })\n return next\n })\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n setActiveIndex((prev) => {\n const next = Math.max(prev - 1, 0)\n items[next]?.scrollIntoView({ block: \"nearest\" })\n return next\n })\n } else if (e.key === \"Enter\") {\n e.preventDefault()\n const activeItem = items[activeIndex] as HTMLElement | undefined\n activeItem?.click()\n }\n },\n [isOpen, activeIndex]\n )\n\n useEffect(() => {\n if (!isOpen) return\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [isOpen, handleKeyDown])\n\n // Apply active styling\n useEffect(() => {\n if (!contentRef.current) return\n const items = contentRef.current.querySelectorAll(\"[role='option']\")\n items.forEach((item, i) => {\n if (i === activeIndex) {\n item.setAttribute(\"aria-selected\", \"true\")\n } else {\n item.removeAttribute(\"aria-selected\")\n }\n })\n })\n\n if (!isOpen || !containerRef.current) return null\n\n return createPortal(\n <div\n ref={(el) => {\n contentRef.current = el\n if (typeof ref === \"function\") ref(el)\n else if (ref) ref.current = el\n }}\n id=\"slash-command\"\n className={className}\n {...rest}\n >\n {children}\n </div>,\n containerRef.current\n )\n }\n)\n\n// Simple list wrapper\nexport const EditorCommandList = forwardRef<HTMLDivElement, any>(\n ({ children, ...rest }, ref) => {\n return (\n <div ref={ref} role=\"listbox\" {...rest}>\n {children}\n </div>\n )\n }\n)\n\nEditorCommand.displayName = \"EditorCommand\"\nEditorCommandList.displayName = \"EditorCommandList\"\n","import { atom } from \"jotai\"\nimport type { Range } from \"@tiptap/core\"\n\nexport const queryAtom = atom(\"\")\nexport const rangeAtom = atom<Range | null>(null)\nexport const slashMenuOpenAtom = atom(false)\nexport const slashMenuRectAtom = atom<DOMRect | null>(null)\n","import { forwardRef } from \"react\"\nimport { useCurrentEditor } from \"@tiptap/react\"\nimport { useAtomValue } from \"jotai\"\nimport { rangeAtom, queryAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\nimport type { Editor, Range } from \"@tiptap/core\"\n\ninterface EditorCommandItemProps {\n readonly onCommand: ({\n editor,\n range,\n }: {\n editor: Editor\n range: Range\n }) => void\n readonly value?: string\n}\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & any\n>(({ children, onCommand, value, className, ...rest }, ref) => {\n const { editor } = useCurrentEditor()\n const range = useAtomValue(rangeAtom, { store: novelStore })\n const query = useAtomValue(queryAtom, { store: novelStore })\n\n if (!editor || !range) return null\n\n // Filter: if query is set, check if this item matches\n if (query && value) {\n const searchText = value.toLowerCase()\n const q = query.toLowerCase()\n if (!searchText.includes(q)) return null\n }\n\n return (\n <div\n ref={ref}\n role=\"option\"\n className={className}\n onClick={() => onCommand({ editor, range })}\n {...rest}\n >\n {children}\n </div>\n )\n})\n\nEditorCommandItem.displayName = \"EditorCommandItem\"\n\nexport const EditorCommandEmpty = forwardRef<HTMLDivElement, any>(\n ({ children, ...rest }, ref) => {\n return (\n <div ref={ref} {...rest}>\n {children}\n </div>\n )\n }\n)\n\nEditorCommandEmpty.displayName = \"EditorCommandEmpty\"\n\nexport default EditorCommandItem\n","export { StarterKit } from \"@tiptap/starter-kit\";\nexport { Placeholder } from \"@tiptap/extension-placeholder\";\n\n// Custom\nexport { CodeBlock } from \"./CodeBlock\";\nexport { Link } from \"./Link\";\nexport { ImageBlock } from \"./ImageBlock\";\nexport type { ImageBlockOptions } from \"./ImageBlock\";\nexport { AISuggestion, AISuggestionPluginKey } from \"./AISuggestion\";\nexport type { AISuggestionOptions } from \"./AISuggestion\";\nexport { createMentionExtension, renderMentionSuggestion, MentionCommand } from \"./Mention\";\nexport type { MentionItem, MentionOptions } from \"./Mention\";\nexport { DragHandle, setDragHandleCallbacks } from \"./DragHandle\";\nexport type { DragHandleCallbacks } from \"./DragHandle\";\nexport { TableKit, Table, TableCell, TableHeader, TableRow } from \"./Table\";\nexport { MarkdownPaste } from \"./MarkdownPaste\";\nexport { Markdown, markdownToHtml } from \"./Markdown\";\nexport type { MarkdownStorage } from \"./Markdown\";\n","import { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\"\nimport { all, createLowlight } from \"lowlight\"\n\nconst lowlight = createLowlight(all)\n\nexport const CodeBlock = CodeBlockLowlight.configure({\n lowlight,\n})\n","import { mergeAttributes } from \"@tiptap/core\"\nimport TiptapLink from \"@tiptap/extension-link\"\nimport { Plugin } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }: any) {\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"link\",\n }),\n 0,\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(((this as any).parent?.() as any[]) || []),\n new Plugin({\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === \"Escape\" && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n },\n }),\n ]\n },\n}).configure({\n openOnClick: false,\n autolink: true,\n enableClickSelection: true,\n})\n\nexport default Link","import { mergeAttributes, Range } from \"@tiptap/core\"\nimport { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageBlockOptions {\n uploadImage?: (file: File) => Promise<string>\n browseAssets?: (onSelect: (url: string) => void) => void\n nodeView?: any\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: { src: string }) => ReturnType\n setImageBlockAt: (attributes: {\n src: string\n pos: number | Range\n }) => ReturnType\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType\n setImageBlockWidth: (width: number) => ReturnType\n }\n }\n}\n\nexport const ImageBlock = TiptapImage.extend<ImageBlockOptions>({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n inline: false,\n }\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n loading: {\n default: false,\n parseHTML: () => false,\n renderHTML: () => ({}),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]:not([src^=\"data:\"])',\n getAttrs: (element) => {\n const el = element as HTMLElement\n return {\n src: el.getAttribute(\"src\"),\n alt: el.getAttribute(\"alt\"),\n width: el.getAttribute(\"data-width\") || \"100%\",\n align: el.getAttribute(\"data-align\") || \"center\",\n }\n },\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"img\", mergeAttributes(HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src },\n })\n },\n\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n }\n },\n\n addNodeView() {\n if (this.options.nodeView) {\n return ReactNodeViewRenderer(this.options.nodeView)\n }\n // If no custom node view is provided, we fall back to default behavior\n // but avoid the circular dependency require()\n return null\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageBlockDrop\"),\n props: {\n handleDOMEvents: {\n drop: (view: EditorView, event: DragEvent) => {\n const hasFiles =\n event.dataTransfer &&\n event.dataTransfer.files &&\n event.dataTransfer.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.dataTransfer.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n const { schema } = view.state\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!coordinates) return false\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode = schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n const placeholderTr = view.state.tr.insert(\n coordinates.pos,\n placeholderNode\n )\n view.dispatch(placeholderTr)\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = schema.nodes.imageBlock.create({ src: url })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n paste: (view: EditorView, event: ClipboardEvent) => {\n const hasFiles =\n event.clipboardData &&\n event.clipboardData.files &&\n event.clipboardData.files.length\n\n if (!hasFiles) {\n return false\n }\n\n const images = Array.from(event.clipboardData.files).filter(\n (file) => /image/i.test(file.type)\n )\n\n if (images.length === 0) {\n return false\n }\n\n event.preventDefault()\n\n images.forEach(async (image) => {\n if (this.options.uploadImage) {\n try {\n // Insert placeholder first\n const placeholderNode =\n view.state.schema.nodes.imageBlock.create({\n src: \"\",\n loading: true,\n })\n view.dispatch(\n view.state.tr.replaceSelectionWith(placeholderNode)\n )\n\n // Upload and replace\n const url = await this.options.uploadImage(image)\n const node = view.state.schema.nodes.imageBlock.create({\n src: url,\n })\n\n // Find and replace the placeholder\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.replaceWith(\n foundPos,\n foundPos + 1,\n node\n )\n view.dispatch(transaction)\n }\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n // Remove placeholder on error\n const currentState = view.state\n let foundPos = -1\n currentState.doc.descendants((node, pos) => {\n if (\n node.type.name === \"imageBlock\" &&\n node.attrs.loading\n ) {\n foundPos = pos\n return false\n }\n })\n\n if (foundPos !== -1) {\n const transaction = view.state.tr.delete(\n foundPos,\n foundPos + 1\n )\n view.dispatch(transaction)\n }\n }\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default ImageBlock\n","import { ReactRenderer, ReactNodeViewRenderer } from \"@tiptap/react\"\nimport Suggestion from \"@tiptap/suggestion\"\nimport Mention from \"@tiptap/extension-mention\"\nimport type { SuggestionOptions } from \"@tiptap/suggestion\"\nimport type { RefObject } from \"react\"\nimport { MentionCommand } from \"./mention-command\"\nimport { MentionNodeView } from \"./mention-node-view\"\n\nexport interface MentionItem {\n id: string\n label: string\n avatar?: string\n email?: string\n type?: \"node\" | \"article\" // For reference mentions\n nodeId?: string // For node references (user-facing ID like \"TSK-1\")\n slug?: string // For article references (URL slug)\n}\n\nexport interface MentionOptions {\n /**\n * Function to fetch/filter mentionable items based on query\n */\n items?: (query: string) => MentionItem[] | Promise<MentionItem[]>\n\n /**\n * Custom render function for mention nodes\n */\n renderLabel?: (props: { node: any; options: any }) => string\n\n /**\n * Character that triggers the mention autocomplete (default: @)\n */\n char?: string\n\n /**\n * Custom name for the extension (to avoid duplicates)\n */\n name?: string\n}\n\n/**\n * Create the mention extension with custom suggestion rendering\n */\nexport const createMentionExtension = (options?: MentionOptions) => {\n const extensionName = options?.name ?? \"mention\"\n\n return Mention.extend({\n name: extensionName,\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {}\n }\n return {\n \"data-id\": attributes.id,\n }\n },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) => {\n if (!attributes.label) {\n return {}\n }\n return {\n \"data-label\": attributes.label,\n }\n },\n },\n avatar: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-avatar\"),\n renderHTML: (attributes) => {\n if (!attributes.avatar) {\n return {}\n }\n return {\n \"data-avatar\": attributes.avatar,\n }\n },\n },\n type: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-ref-type\"),\n renderHTML: (attributes) => {\n if (!attributes.type) {\n return {}\n }\n return {\n \"data-ref-type\": attributes.type,\n }\n },\n },\n nodeId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-node-id\"),\n renderHTML: (attributes) => {\n if (!attributes.nodeId) {\n return {}\n }\n return {\n \"data-node-id\": attributes.nodeId,\n }\n },\n },\n slug: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-slug\"),\n renderHTML: (attributes) => {\n if (!attributes.slug) {\n return {}\n }\n return {\n \"data-slug\": attributes.slug,\n }\n },\n },\n }\n },\n addNodeView() {\n return ReactNodeViewRenderer(MentionNodeView)\n },\n }).configure({\n HTMLAttributes: {\n class: \"mention\",\n },\n suggestion: {\n char: options?.char ?? \"@\",\n items: async ({ query }: { query: string }) => {\n if (!options?.items) return []\n const items = await options.items(query)\n return items\n },\n command: ({ editor, range, props: item }: any) => {\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: extensionName,\n attrs: {\n id: item.id,\n label: item.label,\n avatar: item.avatar,\n type: item.type,\n nodeId: item.nodeId,\n slug: item.slug,\n },\n },\n { type: \"text\", text: \" \" },\n ])\n .run()\n },\n render: renderMentionSuggestion,\n },\n renderLabel: options?.renderLabel ?? ((props) => {\n return `@${props.node.attrs.label ?? props.node.attrs.id}`\n }),\n })\n}\n\n/**\n * Render function for mention suggestions (autocomplete dropdown)\n */\nexport const renderMentionSuggestion = () => {\n let component: ReactRenderer | null = null\n let container: HTMLElement | null = null\n\n const destroy = () => {\n component?.destroy()\n component = null\n if (container) {\n container.remove()\n container = null\n }\n }\n\n const updatePosition = (clientRect?: DOMRect | null) => {\n if (!container || !clientRect) return\n\n const gap = 8\n const maxDropdownHeight = 300 // Match the maxHeight from MentionCommand\n const spaceBelow = window.innerHeight - clientRect.bottom\n const spaceAbove = clientRect.top\n\n // Position above if not enough space below, otherwise position below\n const shouldPositionAbove = spaceBelow < maxDropdownHeight && spaceAbove > spaceBelow\n\n const left = Math.round(clientRect.left)\n\n if (shouldPositionAbove) {\n const bottom = Math.round(window.innerHeight - clientRect.top + gap)\n container.style.bottom = `${bottom}px`\n container.style.top = 'auto'\n } else {\n const top = Math.round(clientRect.bottom + gap)\n container.style.top = `${top}px`\n container.style.bottom = 'auto'\n }\n\n container.style.left = `${left}px`\n }\n\n return {\n onStart: (props: any) => {\n component = new ReactRenderer(MentionCommand, {\n props: {\n items: props.items ?? [],\n command: props.command ?? (() => {}),\n query: props.query ?? \"\",\n },\n editor: props.editor,\n })\n\n container = document.createElement(\"div\")\n container.style.position = \"fixed\"\n container.style.zIndex = \"9999\"\n document.body.appendChild(container)\n container.appendChild(component.element)\n\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onUpdate: (props: any) => {\n component?.updateProps({\n items: props.items ?? [],\n command: props.command ?? (() => {}),\n query: props.query ?? \"\",\n })\n const rect =\n typeof props.clientRect === \"function\" ? props.clientRect() : null\n if (rect) updatePosition(rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!component) return false\n\n if (event.key === \"Escape\") {\n event.preventDefault()\n event.stopPropagation()\n destroy()\n return true\n }\n\n // Handle arrow keys and enter\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n event.preventDefault()\n event.stopPropagation()\n // Let the MentionList component handle keyboard navigation\n return (component.ref as any)?.onKeyDown?.({ event }) ?? false\n }\n\n return false\n },\n onExit: () => {\n destroy()\n },\n }\n}\n\nexport default createMentionExtension\n","import { forwardRef, useEffect, useImperativeHandle, useState } from \"react\"\nimport type { MentionItem } from \"./mention\"\n\nconst GRADIENT_MAP: Record<string, string> = {\n red: \"linear-gradient(135deg, #ef4444, #fb7185)\",\n coral: \"linear-gradient(135deg, #f87171, #fb923c)\",\n orange: \"linear-gradient(135deg, #f97316, #fbbf24)\",\n amber: \"linear-gradient(135deg, #f59e0b, #facc15)\",\n lime: \"linear-gradient(135deg, #84cc16, #4ade80)\",\n green: \"linear-gradient(135deg, #10b981, #2dd4bf)\",\n teal: \"linear-gradient(135deg, #14b8a6, #22d3ee)\",\n cyan: \"linear-gradient(135deg, #06b6d4, #60a5fa)\",\n blue: \"linear-gradient(135deg, #3b82f6, #818cf8)\",\n indigo: \"linear-gradient(135deg, #6366f1, #a78bfa)\",\n violet: \"linear-gradient(135deg, #8b5cf6, #a855f7)\",\n purple: \"linear-gradient(135deg, #a855f7, #d946ef)\",\n fuchsia: \"linear-gradient(135deg, #d946ef, #f472b6)\",\n pink: \"linear-gradient(135deg, #ec4899, #fb7185)\",\n slate: \"linear-gradient(135deg, #64748b, #71717a)\",\n stone: \"linear-gradient(135deg, #78716c, #a3a3a3)\",\n}\n\nfunction isGradientKey(avatar?: string): boolean {\n return !!avatar && avatar in GRADIENT_MAP\n}\n\nfunction isAgentItem(item: MentionItem): boolean {\n return !!item.email?.endsWith(\"@ai.neuphlo.local\")\n}\n\nfunction getInitials(name: string): string {\n if (!name) return \"AG\"\n return name.split(/\\s+/).map((w: string) => w[0]).join(\"\").slice(0, 2).toUpperCase()\n}\n\ninterface MentionCommandProps {\n items: MentionItem[]\n command: (item: MentionItem) => void\n query: string\n}\n\n// Simple Avatar component with inline styles\nfunction Avatar({ src, fallback, isAgent }: { src?: string; fallback: string; isAgent?: boolean }) {\n const gradient = src && isGradientKey(src) ? GRADIENT_MAP[src] : isAgent ? GRADIENT_MAP.violet : null\n\n return (\n <div style={{\n position: \"relative\",\n display: \"flex\",\n height: \"24px\",\n width: \"24px\",\n flexShrink: 0,\n overflow: \"hidden\",\n borderRadius: \"9999px\",\n }}>\n {gradient ? (\n <div style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"9999px\",\n background: gradient,\n color: \"#ffffff\",\n fontSize: \"10px\",\n fontWeight: 600,\n }}>\n {fallback}\n </div>\n ) : src ? (\n <img\n style={{\n aspectRatio: \"1\",\n height: \"100%\",\n width: \"100%\",\n }}\n src={src}\n alt={fallback}\n />\n ) : (\n <div style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"9999px\",\n backgroundColor: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n fontSize: \"10px\",\n fontWeight: 600,\n }}>\n {fallback}\n </div>\n )}\n </div>\n )\n}\n\n// Icon component for reference types\nfunction ReferenceIcon({ type }: { type: \"node\" | \"article\" }) {\n if (type === \"node\") {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 3l8 4.5v9l-8 4.5l-8-4.5v-9l8-4.5\"></path>\n <path d=\"M12 12l8-4.5\"></path>\n <path d=\"M12 12v9\"></path>\n <path d=\"M12 12l-8-4.5\"></path>\n </svg>\n )\n }\n\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\"></path>\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\"></path>\n <path d=\"M9 9l1 0\"></path>\n <path d=\"M9 13l6 0\"></path>\n <path d=\"M9 17l6 0\"></path>\n </svg>\n )\n}\n\nexport const MentionCommand = forwardRef<any, MentionCommandProps>((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const selectItem = (index: number) => {\n const item = props.items[index]\n if (item) {\n props.command(item)\n }\n }\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length)\n }\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length)\n }\n\n const enterHandler = () => {\n selectItem(selectedIndex)\n }\n\n useEffect(() => setSelectedIndex(0), [props.items])\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler()\n return true\n }\n\n if (event.key === \"ArrowDown\") {\n downHandler()\n return true\n }\n\n if (event.key === \"Enter\") {\n enterHandler()\n return true\n }\n\n return false\n },\n }))\n\n return (\n <div\n id=\"mention-list\"\n style={{\n backgroundColor: \"var(--popover)\",\n color: \"var(--foreground)\",\n maxHeight: \"300px\",\n minWidth: \"280px\",\n overflow: \"hidden\",\n overflowY: \"auto\",\n borderRadius: \"12px\",\n border: \"1px solid var(--border)\",\n padding: \"4px\",\n boxShadow: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n }}\n >\n {props.items.length ? (\n (() => {\n const agents = props.items.filter(i => !i.type && isAgentItem(i))\n const others = props.items.filter(i => i.type || !isAgentItem(i))\n const sections: Array<{ label: string | null; items: typeof props.items; startIndex: number }> = []\n if (agents.length) sections.push({ label: \"Agents\", items: agents, startIndex: 0 })\n if (others.length) sections.push({ label: agents.length ? \"Members\" : null, items: others, startIndex: agents.length })\n\n return sections.map((section) => (\n <div key={section.label ?? \"default\"}>\n {section.label && (\n <div style={{ padding: \"6px 8px 2px\", fontSize: \"11px\", fontWeight: 600, color: \"var(--muted-foreground)\", textTransform: \"uppercase\", letterSpacing: \"0.05em\" }}>\n {section.label}\n </div>\n )}\n {section.items.map((item, i) => {\n const index = section.startIndex + i\n const agent = isAgentItem(item)\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n style={{\n position: \"relative\",\n display: \"flex\",\n width: \"100%\",\n cursor: \"default\",\n userSelect: \"none\",\n alignItems: \"center\",\n gap: \"8px\",\n borderRadius: \"4px\",\n padding: \"10px 8px\",\n fontSize: \"14px\",\n outline: \"none\",\n backgroundColor: index === selectedIndex ? \"var(--accent)\" : \"transparent\",\n color: index === selectedIndex ? \"var(--accent-foreground)\" : \"inherit\",\n border: \"none\",\n textAlign: \"left\",\n }}\n >\n {item.type ? (\n <ReferenceIcon type={item.type} />\n ) : (\n <Avatar\n src={item.avatar}\n fallback={getInitials(item.label)}\n isAgent={agent}\n />\n )}\n <span style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}>\n {item.label}\n </span>\n </button>\n )\n })}\n </div>\n ))\n })()\n ) : (\n <div style={{\n padding: \"24px 0\",\n textAlign: \"center\",\n fontSize: \"14px\",\n color: \"var(--muted-foreground)\",\n }}>\n No results found\n </div>\n )}\n </div>\n )\n})\n\nMentionCommand.displayName = \"MentionCommand\"\n","import { NodeViewWrapper } from \"@tiptap/react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\n\nconst GRADIENT_MAP: Record<string, string> = {\n red: \"linear-gradient(135deg, #ef4444, #fb7185)\",\n coral: \"linear-gradient(135deg, #f87171, #fb923c)\",\n orange: \"linear-gradient(135deg, #f97316, #fbbf24)\",\n amber: \"linear-gradient(135deg, #f59e0b, #facc15)\",\n lime: \"linear-gradient(135deg, #84cc16, #4ade80)\",\n green: \"linear-gradient(135deg, #10b981, #2dd4bf)\",\n teal: \"linear-gradient(135deg, #14b8a6, #22d3ee)\",\n cyan: \"linear-gradient(135deg, #06b6d4, #60a5fa)\",\n blue: \"linear-gradient(135deg, #3b82f6, #818cf8)\",\n indigo: \"linear-gradient(135deg, #6366f1, #a78bfa)\",\n violet: \"linear-gradient(135deg, #8b5cf6, #a855f7)\",\n purple: \"linear-gradient(135deg, #a855f7, #d946ef)\",\n fuchsia: \"linear-gradient(135deg, #d946ef, #f472b6)\",\n pink: \"linear-gradient(135deg, #ec4899, #fb7185)\",\n slate: \"linear-gradient(135deg, #64748b, #71717a)\",\n stone: \"linear-gradient(135deg, #78716c, #a3a3a3)\",\n}\n\n// Icon components\nfunction NodeIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M12 3l8 4.5v9l-8 4.5l-8-4.5v-9l8-4.5\"></path>\n <path d=\"M12 12l8-4.5\"></path>\n <path d=\"M12 12v9\"></path>\n <path d=\"M12 12l-8-4.5\"></path>\n </svg>\n )\n}\n\nfunction ArticleIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\"></path>\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\"></path>\n <path d=\"M9 9l1 0\"></path>\n <path d=\"M9 13l6 0\"></path>\n <path d=\"M9 17l6 0\"></path>\n </svg>\n )\n}\n\nexport const MentionNodeView = (props: NodeViewProps) => {\n const { node } = props\n const { id, label, avatar, type } = node.attrs\n\n // Determine styling based on type\n const isNode = type === \"node\"\n const isArticle = type === \"article\"\n const isReference = isNode || isArticle\n\n const backgroundColor = isArticle\n ? \"rgba(249, 115, 22, 0.15)\" // Orange for articles\n : isNode\n ? \"rgba(107, 114, 128, 0.15)\" // Gray for nodes\n : \"var(--accent)\" // Default for user mentions\n\n const color = isArticle\n ? \"rgb(234, 88, 12)\" // Orange text\n : isNode\n ? \"rgb(75, 85, 99)\" // Gray text\n : \"var(--accent-foreground)\" // Default\n\n const border = isArticle\n ? \"1px solid rgba(249, 115, 22, 0.3)\"\n : isNode\n ? \"1px solid rgba(107, 114, 128, 0.3)\"\n : \"none\"\n\n return (\n <NodeViewWrapper\n as=\"span\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"3px\",\n backgroundColor,\n color,\n border,\n padding: isReference ? \"1px 6px\" : \"1px 6px 1px 1px\",\n borderRadius: \"12px\",\n fontSize: \"13px\",\n fontWeight: 500,\n verticalAlign: \"middle\",\n }}\n >\n {/* Show icon for references */}\n {isNode && <NodeIcon />}\n {isArticle && <ArticleIcon />}\n\n {/* Show avatar for user mentions */}\n {!isReference && avatar && avatar in GRADIENT_MAP && (\n <div\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n background: GRADIENT_MAP[avatar],\n color: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"8px\",\n fontWeight: 600,\n flexShrink: 0,\n }}\n >\n {(label || id).split(/\\s+/).map((w: string) => w[0]).join(\"\").slice(0, 2).toUpperCase()}\n </div>\n )}\n {!isReference && avatar && !(avatar in GRADIENT_MAP) && (\n <img\n src={avatar}\n alt={label || id}\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n flexShrink: 0,\n }}\n />\n )}\n {!isReference && !avatar && (\n <div\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"50%\",\n backgroundColor: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"10px\",\n fontWeight: 600,\n flexShrink: 0,\n }}\n >\n {(label || id).slice(0, 2).toUpperCase()}\n </div>\n )}\n <span>{label || id}</span>\n </NodeViewWrapper>\n )\n}\n","import BaseDragHandle from \"@tiptap/extension-drag-handle\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport type { Editor } from \"@tiptap/core\"\n\nexport interface DragHandleCallbacks {\n onAddBlock?: (editor: Editor, node: Node | null) => void\n onGripClick?: (editor: Editor, node: Node | null, element: HTMLElement) => void\n}\n\nlet currentCallbacks: DragHandleCallbacks = {}\nlet currentNode: Node | null = null\nlet currentEditor: Editor | null = null\n\nexport function setDragHandleCallbacks(callbacks: DragHandleCallbacks) {\n currentCallbacks = callbacks\n}\n\nfunction createDragHandleElement(): HTMLElement {\n const container = document.createElement(\"div\")\n container.className = \"nph-drag-handle\"\n\n const plusBtn = document.createElement(\"button\")\n plusBtn.className = \"nph-drag-handle__btn\"\n plusBtn.type = \"button\"\n plusBtn.setAttribute(\"aria-label\", \"Add block\")\n plusBtn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"M5 12h14\"/></svg>`\n plusBtn.addEventListener(\"click\", (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (currentEditor) {\n currentCallbacks.onAddBlock?.(currentEditor, currentNode)\n }\n })\n\n const gripBtn = document.createElement(\"button\")\n gripBtn.className = \"nph-drag-handle__btn nph-drag-handle__grip\"\n gripBtn.type = \"button\"\n gripBtn.setAttribute(\"aria-label\", \"Drag to reorder\")\n gripBtn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/></svg>`\n gripBtn.addEventListener(\"click\", (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (currentEditor) {\n currentCallbacks.onGripClick?.(currentEditor, currentNode, container)\n }\n })\n\n container.appendChild(plusBtn)\n container.appendChild(gripBtn)\n\n return container\n}\n\nexport const DragHandle = BaseDragHandle.configure({\n render: createDragHandleElement,\n nested: true,\n onNodeChange: ({ node, editor }) => {\n currentNode = node\n currentEditor = editor\n },\n})\n\nexport default DragHandle\n","export { TableKit } from \"@tiptap/extension-table\"\nexport { Table, TableCell, TableHeader, TableRow } from \"@tiptap/extension-table\"\n","import { Extension } from \"@tiptap/core\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { MarkdownParser, defaultMarkdownParser } from \"@tiptap/pm/markdown\"\n\nconst markdownPastePluginKey = new PluginKey(\"markdownPaste\")\n\n/**\n * Heuristic: does the plain text look like it contains markdown syntax?\n */\nfunction looksLikeMarkdown(text: string): boolean {\n const patterns = [\n /^#{1,6}\\s/m, // headings\n /^\\s*[-*+]\\s/m, // unordered list\n /^\\s*\\d+\\.\\s/m, // ordered list\n /^\\s*>\\s/m, // blockquote\n /\\|.+\\|/m, // table\n /^```/m, // fenced code block\n /\\*\\*.+\\*\\*/, // bold\n /\\*.+\\*/, // italic\n /~~.+~~/, // strikethrough\n /`[^`]+`/, // inline code\n /^\\s*---\\s*$/m, // horizontal rule\n /^\\s*\\*\\*\\*\\s*$/m, // horizontal rule alt\n /\\[.+\\]\\(.+\\)/, // links\n /!\\[.*\\]\\(.+\\)/, // images\n ]\n // Need at least one markdown pattern match and it shouldn't be HTML\n const hasMarkdown = patterns.some((p) => p.test(text))\n const isHtml = /^<[a-z][\\s\\S]*>/i.test(text.trim())\n return hasMarkdown && !isHtml\n}\n\n/**\n * Build a MarkdownParser configured for TipTap's schema node/mark names.\n * Re-uses the markdown-it tokenizer from prosemirror-markdown's default parser.\n */\nfunction buildParser(schema: any): MarkdownParser | null {\n // Grab the markdown-it tokenizer instance from prosemirror-markdown's default parser\n const md = defaultMarkdownParser.tokenizer\n\n const tokens: Record<string, any> = {}\n\n // Block nodes\n if (schema.nodes.paragraph) tokens.paragraph = { block: \"paragraph\" }\n if (schema.nodes.heading) {\n tokens.heading = {\n block: \"heading\",\n getAttrs: (tok: any) => ({ level: Number(tok.tag.slice(1)) }),\n }\n }\n if (schema.nodes.blockquote) tokens.blockquote = { block: \"blockquote\" }\n if (schema.nodes.bulletList) tokens.bullet_list = { block: \"bulletList\" }\n if (schema.nodes.orderedList) {\n tokens.ordered_list = {\n block: \"orderedList\",\n getAttrs: (tok: any) => ({ start: Number(tok.attrGet(\"start\") || 1) }),\n }\n }\n if (schema.nodes.listItem) tokens.list_item = { block: \"listItem\" }\n if (schema.nodes.codeBlock) {\n tokens.code_block = { block: \"codeBlock\", noCloseToken: true }\n tokens.fence = {\n block: \"codeBlock\",\n getAttrs: (tok: any) => ({ language: tok.info || \"\" }),\n noCloseToken: true,\n }\n }\n if (schema.nodes.horizontalRule) {\n tokens.hr = { node: \"horizontalRule\" }\n }\n if (schema.nodes.hardBreak) {\n tokens.hardbreak = { node: \"hardBreak\" }\n }\n if (schema.nodes.image) {\n tokens.image = {\n node: \"image\",\n getAttrs: (tok: any) => ({\n src: tok.attrGet(\"src\"),\n title: tok.attrGet(\"title\") || null,\n alt: tok.children?.[0]?.content || null,\n }),\n }\n }\n\n // Table support — markdown-it needs the table plugin enabled\n if (schema.nodes.table) {\n tokens.table = { block: \"table\" }\n tokens.thead = { ignore: true }\n tokens.tbody = { ignore: true }\n tokens.tr = { block: \"tableRow\" }\n tokens.th = { block: \"tableHeader\" }\n tokens.td = { block: \"tableCell\" }\n }\n\n // Marks\n if (schema.marks.bold || schema.marks.strong) {\n tokens.strong = { mark: schema.marks.bold ? \"bold\" : \"strong\" }\n }\n if (schema.marks.italic || schema.marks.em) {\n tokens.em = { mark: schema.marks.italic ? \"italic\" : \"em\" }\n }\n if (schema.marks.code) {\n tokens.code_inline = { mark: \"code\", noCloseToken: true }\n }\n if (schema.marks.link) {\n tokens.link = {\n mark: \"link\",\n getAttrs: (tok: any) => ({\n href: tok.attrGet(\"href\"),\n title: tok.attrGet(\"title\") || null,\n }),\n }\n }\n if (schema.marks.strike || schema.marks.strikethrough) {\n tokens.s = { mark: schema.marks.strike ? \"strike\" : \"strikethrough\" }\n }\n\n try {\n return new MarkdownParser(schema, md, tokens)\n } catch {\n return null\n }\n}\n\nexport const MarkdownPaste = Extension.create({\n name: \"markdownPaste\",\n\n addProseMirrorPlugins() {\n const schema = this.editor.schema\n let parser: MarkdownParser | null = null\n\n return [\n new Plugin({\n key: markdownPastePluginKey,\n props: {\n handlePaste(view, event) {\n const clipboardData = event.clipboardData\n if (!clipboardData) return false\n\n // If there's HTML content, let ProseMirror handle it normally\n // (the browser/OS already converted rich content)\n const html = clipboardData.getData(\"text/html\")\n if (html && html.trim().length > 0) return false\n\n const text = clipboardData.getData(\"text/plain\")\n if (!text || !looksLikeMarkdown(text)) return false\n\n // Lazily build parser on first use\n if (!parser) {\n parser = buildParser(schema)\n }\n if (!parser) return false\n\n try {\n const doc = parser.parse(text)\n if (!doc || doc.content.size === 0) return false\n\n const { tr } = view.state\n const slice = doc.slice(0, doc.content.size)\n tr.replaceSelection(slice)\n view.dispatch(tr)\n return true\n } catch {\n // Fall back to default paste behavior\n return false\n }\n },\n },\n }),\n ]\n },\n})\n\nexport default MarkdownPaste\n","import { Extension } from \"@tiptap/core\"\nimport { MarkdownSerializer } from \"@tiptap/pm/markdown\"\nimport { DOMSerializer, type Node as PMNode, type Schema } from \"@tiptap/pm/model\"\nimport MarkdownIt from \"markdown-it\"\n\nconst markdownIt = new MarkdownIt({ html: true, linkify: false, breaks: false })\n\nexport function markdownToHtml(input: string | null | undefined): string {\n if (!input) return \"\"\n return markdownIt.render(input)\n}\n\nfunction nodeToHtml(node: PMNode, schema: Schema): string {\n if (typeof document === \"undefined\") return \"\"\n const dom = DOMSerializer.fromSchema(schema).serializeNode(node)\n const container = document.createElement(\"div\")\n container.appendChild(dom)\n return container.innerHTML\n}\n\ntype NodeSerializer = (state: any, node: PMNode, parent: PMNode, index: number) => void\n\nconst specificNodes: Record<string, NodeSerializer> = {\n text: (state, node) => {\n state.text(node.text ?? \"\")\n },\n paragraph: (state, node) => {\n state.renderInline(node)\n state.closeBlock(node)\n },\n heading: (state, node) => {\n state.write(`${state.repeat(\"#\", node.attrs.level)} `)\n state.renderInline(node)\n state.closeBlock(node)\n },\n blockquote: (state, node) => {\n state.wrapBlock(\"> \", null, node, () => state.renderContent(node))\n },\n horizontalRule: (state, node) => {\n state.write(node.attrs.markup || \"---\")\n state.closeBlock(node)\n },\n bulletList: (state, node) => {\n state.renderList(node, \" \", () => `${node.attrs.bullet || \"-\"} `)\n },\n orderedList: (state, node) => {\n const start = node.attrs.start || 1\n const maxWidth = String(start + node.childCount - 1).length\n const space = state.repeat(\" \", maxWidth + 2)\n state.renderList(node, space, (index: number) => {\n const label = String(start + index)\n return `${state.repeat(\" \", maxWidth - label.length)}${label}. `\n })\n },\n listItem: (state, node) => {\n state.renderContent(node)\n },\n codeBlock: (state, node) => {\n state.write(`\\`\\`\\`${node.attrs.language || \"\"}\\n`)\n state.text(node.textContent, false)\n state.ensureNewLine()\n state.write(\"```\")\n state.closeBlock(node)\n },\n hardBreak: (state, node, parent, index) => {\n for (let i = index + 1; i < parent.childCount; i += 1) {\n if (parent.child(i).type !== node.type) {\n state.write(\"\\\\\\n\")\n return\n }\n }\n },\n}\n\nconst inlineHtmlNodes = new Set([\"mention\", \"reference\"])\n\ntype MarkSerializer = {\n open: string | ((state: any, mark: any, parent: PMNode, index: number) => string)\n close: string | ((state: any, mark: any, parent: PMNode, index: number) => string)\n mixable?: boolean\n expelEnclosingWhitespace?: boolean\n escape?: boolean\n}\n\nconst specificMarks: Record<string, MarkSerializer> = {\n bold: { open: \"**\", close: \"**\", mixable: true, expelEnclosingWhitespace: true },\n italic: { open: \"*\", close: \"*\", mixable: true, expelEnclosingWhitespace: true },\n strike: { open: \"~~\", close: \"~~\", mixable: true, expelEnclosingWhitespace: true },\n underline: { open: \"<u>\", close: \"</u>\", mixable: true },\n code: { open: \"`\", close: \"`\", escape: false },\n link: {\n open: \"[\",\n close: (_state, mark) => {\n const href = mark.attrs.href || \"\"\n const title = mark.attrs.title ? ` \"${mark.attrs.title}\"` : \"\"\n return `](${href}${title})`\n },\n },\n}\n\nfunction buildSerializer(schema: Schema): MarkdownSerializer {\n const nodes: Record<string, NodeSerializer> = {}\n for (const name of Object.keys(schema.nodes)) {\n if (specificNodes[name]) {\n nodes[name] = specificNodes[name]\n continue\n }\n const type = schema.nodes[name]\n if (type.isText) {\n nodes[name] = specificNodes.text\n continue\n }\n if (type.isInline || inlineHtmlNodes.has(name)) {\n nodes[name] = (state, node) => {\n state.text(nodeToHtml(node, schema), false)\n }\n continue\n }\n nodes[name] = (state, node) => {\n state.write(nodeToHtml(node, schema))\n state.closeBlock(node)\n }\n }\n\n const marks: Record<string, MarkSerializer> = {}\n for (const name of Object.keys(schema.marks)) {\n marks[name] = specificMarks[name] || { open: \"\", close: \"\", mixable: true }\n }\n\n return new MarkdownSerializer(nodes as any, marks as any)\n}\n\nexport interface MarkdownStorage {\n serializer: MarkdownSerializer | null\n getMarkdown: () => string\n}\n\nexport const Markdown = Extension.create({\n name: \"markdown\",\n\n addStorage(): MarkdownStorage {\n return {\n serializer: null,\n getMarkdown: () => \"\",\n }\n },\n\n onBeforeCreate() {\n const storage = this.storage as MarkdownStorage\n storage.serializer = buildSerializer(this.editor.schema)\n storage.getMarkdown = () => {\n try {\n return storage.serializer!.serialize(this.editor.state.doc, {\n tightLists: true,\n })\n } catch {\n return this.editor.getHTML()\n }\n }\n },\n})\n\nexport default Markdown\n","import Suggestion from \"@tiptap/suggestion\"\nimport { Extension } from \"@tiptap/core\"\nimport type { ReactNode } from \"react\"\nimport { queryAtom, rangeAtom, slashMenuOpenAtom, slashMenuRectAtom } from \"../utils/atoms\"\nimport { novelStore } from \"../utils/store\"\n\nexport const Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: (ctx: any) => {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n },\n } as any,\n }\n },\n addProseMirrorPlugins() {\n const base: any = this.options.suggestion ?? {}\n return [\n Suggestion({\n editor: this.editor,\n char: base.char ?? \"/\",\n startOfLine: base.startOfLine ?? true,\n items: base.items ?? (() => [\"/\"] as any),\n command: (ctx: any) => {\n if (typeof ctx?.props?.command === \"function\") {\n ctx.props.command({ editor: ctx.editor, range: ctx.range })\n }\n },\n ...base,\n render: () => {\n return {\n onStart: (props: any) => {\n const { selection } = props.editor.state\n const parentNode = selection.$from.node(selection.$from.depth)\n const blockType = parentNode.type.name\n\n if (blockType === \"codeBlock\") return false\n\n const { $from } = selection\n const marks = $from.marks()\n if (marks.some((mark: any) => mark.type.name === \"code\" || mark.type.name === \"link\")) {\n return false\n }\n\n novelStore.set(queryAtom, props.query ?? \"\")\n novelStore.set(rangeAtom, props.range ?? null)\n novelStore.set(slashMenuOpenAtom, true)\n\n const rect = typeof props.clientRect === \"function\" ? props.clientRect() : null\n novelStore.set(slashMenuRectAtom, rect)\n },\n onUpdate: (props: any) => {\n novelStore.set(queryAtom, props.query ?? \"\")\n novelStore.set(rangeAtom, props.range ?? null)\n\n const rect = typeof props.clientRect === \"function\" ? props.clientRect() : null\n novelStore.set(slashMenuRectAtom, rect)\n },\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"Escape\") {\n novelStore.set(slashMenuOpenAtom, false)\n return true\n }\n\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) {\n slashCommand.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: event.key,\n cancelable: true,\n bubbles: true,\n })\n )\n return true\n }\n }\n\n return false\n },\n onExit: () => {\n novelStore.set(slashMenuOpenAtom, false)\n novelStore.set(queryAtom, \"\")\n novelStore.set(rangeAtom, null)\n novelStore.set(slashMenuRectAtom, null)\n },\n }\n },\n }),\n ]\n },\n})\n\nexport const renderItems = () => ({\n onStart: () => {},\n onUpdate: () => {},\n onKeyDown: () => false,\n onExit: () => {},\n})\n\nexport interface SuggestionItem {\n title: string\n description: string\n icon: ReactNode\n searchTerms?: string[]\n command?: (props: {\n editor: any\n range: { from: number; to: number }\n }) => void\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items\n\nexport const handleCommandNavigation = (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\")\n if (slashCommand) return true\n }\n}\n"],"mappings":"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","names":["useCurrentEditor","jsx","forwardRef","useCurrentEditor","jsx","forwardRef","jsx","forwardRef","forwardRef","useCurrentEditor","useAtomValue","jsx","forwardRef","useCurrentEditor","useAtomValue","mergeAttributes","Plugin","node","ReactNodeViewRenderer","forwardRef","useEffect","useState","jsx","jsx","jsxs","GRADIENT_MAP","ReactNodeViewRenderer","Plugin","PluginKey","Extension","Extension","Extension"]}
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from "react";
2
+ import type { Editor as TiptapEditor } from "@tiptap/react";
3
+ interface EditorBubbleItemProps {
4
+ readonly children: ReactNode;
5
+ readonly asChild?: boolean;
6
+ readonly onSelect?: (editor: TiptapEditor) => void;
7
+ }
8
+ export declare const EditorBubbleItem: import("react").ForwardRefExoticComponent<EditorBubbleItemProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "onSelect"> & import("react").RefAttributes<HTMLDivElement>>;
9
+ export default EditorBubbleItem;
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef, isValidElement, cloneElement } from "react";
3
+ import { useCurrentEditor } from "@tiptap/react";
4
+ export const EditorBubbleItem = forwardRef(({ children, asChild, onSelect, ...rest }, ref) => {
5
+ const { editor } = useCurrentEditor();
6
+ if (!editor)
7
+ return null;
8
+ const handleClick = (e) => {
9
+ e.preventDefault();
10
+ onSelect?.(editor);
11
+ };
12
+ if (asChild && isValidElement(children)) {
13
+ const child = children;
14
+ const childOnClick = child.props?.onClick;
15
+ const mergedOnClick = (e) => {
16
+ childOnClick?.(e);
17
+ if (!e?.defaultPrevented)
18
+ onSelect?.(editor);
19
+ };
20
+ return cloneElement(child, {
21
+ ...rest,
22
+ ref: child.ref ?? ref,
23
+ onClick: mergedOnClick,
24
+ });
25
+ }
26
+ return (_jsx("div", { ref: ref, ...rest, onClick: handleClick, children: children }));
27
+ });
28
+ EditorBubbleItem.displayName = "EditorBubbleItem";
29
+ export default EditorBubbleItem;
@@ -0,0 +1,9 @@
1
+ import type { BubbleMenuProps } from "@tiptap/react/menus";
2
+ import type { ReactNode } from "react";
3
+ type ForwardedBubbleProps = Omit<BubbleMenuProps, "editor" | "children" | "className">;
4
+ export interface EditorBubbleProps extends ForwardedBubbleProps {
5
+ readonly className?: string;
6
+ readonly children: ReactNode;
7
+ }
8
+ export declare function EditorBubble({ className, children, ...rest }: EditorBubbleProps): import("react/jsx-runtime").JSX.Element | null;
9
+ export {};
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCurrentEditor } from "@tiptap/react";
3
+ import { BubbleMenu as BubbleMenuReact } from "@tiptap/react/menus";
4
+ export function EditorBubble({ className, children, ...rest }) {
5
+ const { editor } = useCurrentEditor();
6
+ if (!editor)
7
+ return null;
8
+ return (_jsx(BubbleMenuReact, { editor: editor, ...rest, children: _jsx("div", { className: className, children: children }) }));
9
+ }
@@ -0,0 +1,3 @@
1
+ export declare const EditorCommandItem: import("react").ForwardRefExoticComponent<Omit<any, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
2
+ export declare const EditorCommandEmpty: import("react").ForwardRefExoticComponent<Omit<any, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
3
+ export default EditorCommandItem;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { useCurrentEditor } from "@tiptap/react";
4
+ import { useAtomValue } from "jotai";
5
+ import { rangeAtom, queryAtom } from "../utils/atoms";
6
+ import { novelStore } from "../utils/store";
7
+ export const EditorCommandItem = forwardRef(({ children, onCommand, value, className, ...rest }, ref) => {
8
+ const { editor } = useCurrentEditor();
9
+ const range = useAtomValue(rangeAtom, { store: novelStore });
10
+ const query = useAtomValue(queryAtom, { store: novelStore });
11
+ if (!editor || !range)
12
+ return null;
13
+ // Filter: if query is set, check if this item matches
14
+ if (query && value) {
15
+ const searchText = value.toLowerCase();
16
+ const q = query.toLowerCase();
17
+ if (!searchText.includes(q))
18
+ return null;
19
+ }
20
+ return (_jsx("div", { ref: ref, role: "option", className: className, onClick: () => onCommand({ editor, range }), ...rest, children: children }));
21
+ });
22
+ EditorCommandItem.displayName = "EditorCommandItem";
23
+ export const EditorCommandEmpty = forwardRef(({ children, ...rest }, ref) => {
24
+ return (_jsx("div", { ref: ref, ...rest, children: children }));
25
+ });
26
+ EditorCommandEmpty.displayName = "EditorCommandEmpty";
27
+ export default EditorCommandItem;
@@ -0,0 +1,3 @@
1
+ export declare const EditorCommandOut: () => null;
2
+ export declare const EditorCommand: import("react").ForwardRefExoticComponent<Omit<any, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
3
+ export declare const EditorCommandList: import("react").ForwardRefExoticComponent<Omit<any, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useAtomValue } from "jotai";
3
+ import { forwardRef, useRef, useEffect, useLayoutEffect, useState, useCallback } from "react";
4
+ import { createPortal } from "react-dom";
5
+ import { queryAtom, slashMenuOpenAtom, slashMenuRectAtom } from "../utils/atoms";
6
+ import { novelStore } from "../utils/store";
7
+ // EditorCommandOut is no longer needed — kept as a no-op for backward compatibility
8
+ export const EditorCommandOut = () => null;
9
+ export const EditorCommand = forwardRef(({ children, className, ...rest }, ref) => {
10
+ const isOpen = useAtomValue(slashMenuOpenAtom, { store: novelStore });
11
+ const rect = useAtomValue(slashMenuRectAtom, { store: novelStore });
12
+ const containerRef = useRef(null);
13
+ const [activeIndex, setActiveIndex] = useState(0);
14
+ const contentRef = useRef(null);
15
+ // Reset active index when query changes
16
+ const query = useAtomValue(queryAtom, { store: novelStore });
17
+ useEffect(() => {
18
+ setActiveIndex(0);
19
+ }, [query]);
20
+ // Create portal container once
21
+ if (typeof document !== "undefined" && !containerRef.current) {
22
+ const el = document.createElement("div");
23
+ el.style.position = "fixed";
24
+ el.style.zIndex = "9999";
25
+ el.style.minWidth = "240px";
26
+ el.style.display = "none";
27
+ containerRef.current = el;
28
+ }
29
+ // Manage DOM attachment
30
+ useEffect(() => {
31
+ const el = containerRef.current;
32
+ if (!el)
33
+ return;
34
+ document.body.appendChild(el);
35
+ return () => {
36
+ el.remove();
37
+ };
38
+ }, []);
39
+ // Show/hide and position
40
+ useLayoutEffect(() => {
41
+ const container = containerRef.current;
42
+ if (!container)
43
+ return;
44
+ if (!isOpen || !rect) {
45
+ container.style.display = "none";
46
+ return;
47
+ }
48
+ container.style.display = "";
49
+ const menuHeight = container.offsetHeight || 360;
50
+ const viewportHeight = window.innerHeight;
51
+ const spaceBelow = viewportHeight - rect.bottom;
52
+ const spaceAbove = rect.top;
53
+ let top;
54
+ if (spaceBelow < menuHeight + 16 && spaceAbove > spaceBelow) {
55
+ top = Math.round(rect.top - menuHeight - 8);
56
+ if (top < 8)
57
+ top = 8;
58
+ }
59
+ else {
60
+ top = Math.round(rect.bottom + 8);
61
+ }
62
+ let left = Math.round(rect.left);
63
+ const menuWidth = container.offsetWidth || 280;
64
+ if (left + menuWidth > window.innerWidth - 8) {
65
+ left = window.innerWidth - menuWidth - 8;
66
+ }
67
+ if (left < 8)
68
+ left = 8;
69
+ container.style.top = `${top}px`;
70
+ container.style.left = `${left}px`;
71
+ }, [isOpen, rect]);
72
+ // Keyboard navigation
73
+ const handleKeyDown = useCallback((e) => {
74
+ if (!isOpen || !contentRef.current)
75
+ return;
76
+ const items = contentRef.current.querySelectorAll("[role='option']");
77
+ if (items.length === 0)
78
+ return;
79
+ if (e.key === "ArrowDown") {
80
+ e.preventDefault();
81
+ setActiveIndex((prev) => {
82
+ const next = Math.min(prev + 1, items.length - 1);
83
+ items[next]?.scrollIntoView({ block: "nearest" });
84
+ return next;
85
+ });
86
+ }
87
+ else if (e.key === "ArrowUp") {
88
+ e.preventDefault();
89
+ setActiveIndex((prev) => {
90
+ const next = Math.max(prev - 1, 0);
91
+ items[next]?.scrollIntoView({ block: "nearest" });
92
+ return next;
93
+ });
94
+ }
95
+ else if (e.key === "Enter") {
96
+ e.preventDefault();
97
+ const activeItem = items[activeIndex];
98
+ activeItem?.click();
99
+ }
100
+ }, [isOpen, activeIndex]);
101
+ useEffect(() => {
102
+ if (!isOpen)
103
+ return;
104
+ document.addEventListener("keydown", handleKeyDown);
105
+ return () => document.removeEventListener("keydown", handleKeyDown);
106
+ }, [isOpen, handleKeyDown]);
107
+ // Apply active styling
108
+ useEffect(() => {
109
+ if (!contentRef.current)
110
+ return;
111
+ const items = contentRef.current.querySelectorAll("[role='option']");
112
+ items.forEach((item, i) => {
113
+ if (i === activeIndex) {
114
+ item.setAttribute("aria-selected", "true");
115
+ }
116
+ else {
117
+ item.removeAttribute("aria-selected");
118
+ }
119
+ });
120
+ });
121
+ if (!isOpen || !containerRef.current)
122
+ return null;
123
+ return createPortal(_jsx("div", { ref: (el) => {
124
+ contentRef.current = el;
125
+ if (typeof ref === "function")
126
+ ref(el);
127
+ else if (ref)
128
+ ref.current = el;
129
+ }, id: "slash-command", className: className, ...rest, children: children }), containerRef.current);
130
+ });
131
+ // Simple list wrapper
132
+ export const EditorCommandList = forwardRef(({ children, ...rest }, ref) => {
133
+ return (_jsx("div", { ref: ref, role: "listbox", ...rest, children: children }));
134
+ });
135
+ EditorCommand.displayName = "EditorCommand";
136
+ EditorCommandList.displayName = "EditorCommandList";
@@ -0,0 +1,24 @@
1
+ import type { EditorProviderProps } from "@tiptap/react";
2
+ import type { FC, ReactNode } from "react";
3
+ export interface EditorRootProps {
4
+ readonly children: ReactNode;
5
+ }
6
+ export declare const EditorRoot: FC<EditorRootProps>;
7
+ export type EditorContentProps = EditorProviderProps & {
8
+ readonly children?: ReactNode;
9
+ readonly className?: string;
10
+ readonly initialContent?: any;
11
+ };
12
+ export declare const EditorContent: import("react").ForwardRefExoticComponent<{
13
+ children?: ReactNode;
14
+ slotBefore?: ReactNode;
15
+ slotAfter?: ReactNode;
16
+ editorContainerProps?: import("react").HTMLAttributes<HTMLDivElement>;
17
+ } & Partial<import("@tiptap/core").EditorOptions> & {
18
+ immediatelyRender?: boolean;
19
+ shouldRerenderOnTransaction?: boolean;
20
+ } & {
21
+ readonly children?: ReactNode;
22
+ readonly className?: string;
23
+ readonly initialContent?: any;
24
+ } & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { EditorProvider } from "@tiptap/react";
3
+ import { forwardRef } from "react";
4
+ import { Provider } from "jotai";
5
+ import { novelStore } from "../utils/store";
6
+ export const EditorRoot = ({ children }) => {
7
+ return (_jsx(Provider, { store: novelStore, children: children }));
8
+ };
9
+ export const EditorContent = forwardRef(({ className, children, initialContent, content, ...rest }, ref) => {
10
+ const effectiveContent = content ?? initialContent;
11
+ return (_jsx("div", { ref: ref, className: className, children: _jsx(EditorProvider, { ...rest, content: effectiveContent, children: children }) }));
12
+ });
13
+ EditorContent.displayName = "EditorContent";
@@ -0,0 +1,82 @@
1
+ /**
2
+ * TipTap AI Suggestion Extension
3
+ *
4
+ * This extension provides inline AI-powered text completions that appear
5
+ * as ghost text at the cursor position.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * import { AISuggestion } from 'neuphlo-editor'
10
+ *
11
+ * const editor = new Editor({
12
+ * extensions: [
13
+ * AISuggestion.configure({
14
+ * onFetchSuggestion: async (context) => {
15
+ * // Call your AI API here
16
+ * const response = await fetch('/api/complete', {
17
+ * method: 'POST',
18
+ * body: JSON.stringify({ text: context }),
19
+ * })
20
+ * const data = await response.json()
21
+ * return data.completion
22
+ * },
23
+ * debounceMs: 2000,
24
+ * }),
25
+ * ],
26
+ * })
27
+ * ```
28
+ */
29
+ import { Extension } from "@tiptap/core";
30
+ import { PluginKey } from "@tiptap/pm/state";
31
+ export interface AISuggestionOptions {
32
+ /**
33
+ * Function to fetch AI suggestion based on text context
34
+ * Return null or empty string to show no suggestion
35
+ */
36
+ onFetchSuggestion: (context: string) => Promise<string | null>;
37
+ /**
38
+ * Delay in ms after typing stops before fetching suggestion
39
+ * @default 2000
40
+ */
41
+ debounceMs?: number;
42
+ /**
43
+ * Minimum characters required before fetching suggestions
44
+ * @default 10
45
+ */
46
+ minChars?: number;
47
+ /**
48
+ * CSS class for the ghost text element
49
+ * @default 'ai-suggestion'
50
+ */
51
+ suggestionClass?: string;
52
+ /**
53
+ * Whether the extension is enabled
54
+ * @default true
55
+ */
56
+ enabled?: boolean;
57
+ }
58
+ declare module "@tiptap/core" {
59
+ interface Commands<ReturnType> {
60
+ aiSuggestion: {
61
+ /**
62
+ * Accept the current AI suggestion
63
+ */
64
+ acceptAISuggestion: () => ReturnType;
65
+ /**
66
+ * Dismiss the current AI suggestion
67
+ */
68
+ dismissAISuggestion: () => ReturnType;
69
+ /**
70
+ * Manually trigger a suggestion fetch
71
+ */
72
+ triggerAISuggestion: () => ReturnType;
73
+ /**
74
+ * Set a suggestion programmatically
75
+ */
76
+ setAISuggestion: (text: string) => ReturnType;
77
+ };
78
+ }
79
+ }
80
+ export declare const AISuggestionPluginKey: PluginKey<any>;
81
+ export declare const AISuggestion: Extension<AISuggestionOptions, any>;
82
+ export default AISuggestion;