neuphlo-editor 1.1.1 → 1.1.3
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/README.md +52 -0
- package/dist/react/index.cjs +5 -2
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +5 -2
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -141,6 +141,58 @@ const handleImageUpload = async (file: File): Promise<string> => {
|
|
|
141
141
|
}
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
+
### Convex
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
import { useMutation } from 'convex/react'
|
|
148
|
+
import { api } from '../convex/_generated/api'
|
|
149
|
+
|
|
150
|
+
function MyEditor() {
|
|
151
|
+
const generateUploadUrl = useMutation(api.files.generateUploadUrl)
|
|
152
|
+
|
|
153
|
+
const handleImageUpload = async (file: File): Promise<string> => {
|
|
154
|
+
// Step 1: Get a short-lived upload URL
|
|
155
|
+
const uploadUrl = await generateUploadUrl()
|
|
156
|
+
|
|
157
|
+
// Step 2: POST the file to the URL
|
|
158
|
+
const result = await fetch(uploadUrl, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: { 'Content-Type': file.type },
|
|
161
|
+
body: file,
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
const { storageId } = await result.json()
|
|
165
|
+
|
|
166
|
+
// Step 3: Save the storage ID to your database (optional)
|
|
167
|
+
// await saveImage({ storageId, name: file.name })
|
|
168
|
+
|
|
169
|
+
// Step 4: Return the public URL
|
|
170
|
+
// You can use getUrl mutation or construct the URL
|
|
171
|
+
const imageUrl = `${process.env.NEXT_PUBLIC_CONVEX_URL}/api/storage/${storageId}`
|
|
172
|
+
return imageUrl
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return <Editor uploadImage={handleImageUpload} />
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Convex backend (convex/files.ts):**
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
import { mutation } from './_generated/server'
|
|
183
|
+
|
|
184
|
+
export const generateUploadUrl = mutation(async (ctx) => {
|
|
185
|
+
return await ctx.storage.generateUploadUrl()
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
export const getUrl = mutation({
|
|
189
|
+
args: { storageId: v.string() },
|
|
190
|
+
handler: async (ctx, { storageId }) => {
|
|
191
|
+
return await ctx.storage.getUrl(storageId)
|
|
192
|
+
},
|
|
193
|
+
})
|
|
194
|
+
```
|
|
195
|
+
|
|
144
196
|
### Custom Backend
|
|
145
197
|
|
|
146
198
|
```tsx
|
package/dist/react/index.cjs
CHANGED
|
@@ -372,9 +372,12 @@ var Image = import_extension_image.Image.extend({
|
|
|
372
372
|
}
|
|
373
373
|
},
|
|
374
374
|
align: {
|
|
375
|
-
default:
|
|
376
|
-
parseHTML: (element) => element.getAttribute("data-align")
|
|
375
|
+
default: null,
|
|
376
|
+
parseHTML: (element) => element.getAttribute("data-align"),
|
|
377
377
|
renderHTML: (attributes) => {
|
|
378
|
+
if (!attributes.align) {
|
|
379
|
+
return {};
|
|
380
|
+
}
|
|
378
381
|
return {
|
|
379
382
|
"data-align": attributes.align
|
|
380
383
|
};
|
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/slash-command.tsx","../../src/headless/extensions/Image/Image.ts","../../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/Editor.tsx"],"sourcesContent":["// Auto-apply default styles when consuming the React entry\nimport \"../styles.css\";\n\nexport { Editor } from \"./Editor\";\nexport type { NeuphloEditorProps as EditorProps } 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 { EditorCommandItem } 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\"\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 { 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 { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageOptions {\n uploadImage?: (file: File) => Promise<string>\n allowBase64?: boolean\n}\n\nexport const Image = TiptapImage.extend<ImageOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n allowBase64: false,\n }\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"width\"),\n renderHTML: (attributes) => {\n if (!attributes.width) {\n return {}\n }\n return {\n width: attributes.width,\n }\n },\n },\n height: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"height\"),\n renderHTML: (attributes) => {\n if (!attributes.height) {\n return {}\n }\n return {\n height: attributes.height,\n }\n },\n },\n align: {\n default: \"left\",\n parseHTML: (element) => element.getAttribute(\"data-align\") || \"left\",\n renderHTML: (attributes) => {\n return {\n \"data-align\": attributes.align,\n }\n },\n },\n }\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setImage:\n (options: {\n src: string\n alt?: string\n title?: string\n width?: string | number\n height?: string | number\n align?: \"left\" | \"center\" | \"right\"\n }) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n uploadImage:\n () =>\n ({ editor }: { editor: any }) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.accept = \"image/*\"\n\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n // Check if uploadImage handler is provided\n if (this.options.uploadImage) {\n try {\n const url = await this.options.uploadImage(file)\n editor.chain().focus().setImage({ src: url }).run()\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n // Fallback to base64 if no upload handler provided\n const reader = new FileReader()\n reader.onload = () => {\n const url = reader.result as string\n editor.chain().focus().setImage({ src: url }).run()\n }\n reader.readAsDataURL(file)\n } else {\n console.warn(\n \"No upload handler provided. Please provide uploadImage option or enable allowBase64.\"\n )\n }\n }\n\n input.click()\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageDrop\"),\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 const url = await this.options.uploadImage(image)\n const node = schema.nodes.image.create({ src: url })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n const node = schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n }\n reader.readAsDataURL(image)\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 const url = await this.options.uploadImage(image)\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({ src: url })\n )\n )\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n )\n )\n }\n reader.readAsDataURL(image)\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default Image\n","import { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { Image } from \"./Image/Image\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => [\n StarterKit.configure({}),\n CodeBlock,\n Link,\n Image.configure({\n uploadImage: options?.uploadImage,\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 },\n }),\n]\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\nexport type TextMenuProps = {\n className?: string\n}\n\nexport function TextMenu({ className }: 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={({ from, to }) => {\n return from !== to\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </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} 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 <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\"\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).chain().focus().deleteRange(range).run()\n ;(editor as any).chain().focus().uploadImage().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 { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { useEffect, useState } from \"react\"\n\nexport type ImageMenuProps = {\n className?: string\n}\n\nexport function ImageMenu({ className }: 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(\"image\")) return\n const attrs = editor.getAttributes(\"image\") ?? {\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.updateAttributes(\"image\", {\n width: `${newSize}%`,\n })\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.updateAttributes(\"image\", { align: newAlign })\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n ;(editor as any).chain().focus().uploadImage().run()\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e }) => {\n return e.isActive(\"image\")\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\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\"\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 onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n onUpdate,\n onCreate,\n uploadImage,\n}: NeuphloEditorProps) {\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={[...ExtensionKit({ uploadImage }), ...(extensions ?? [])]}\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 ? <TextMenu /> : null}\n {showImageMenu ? <ImageMenu /> : null}\n {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["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_react","import_core","Command","Suggestion","import_state","TiptapImage","Command","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_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/headless/index.ts","../../src/headless/components/editor.tsx","../../src/headless/utils/store.ts","../../src/headless/components/editor-command.tsx","../../src/headless/utils/atoms.ts","../../src/headless/components/editor-command-item.tsx","../../src/headless/extensions/index.ts","../../src/headless/extensions/CodeBlock/CodeBlock.ts","../../src/headless/extensions/Link/Link.ts","../../src/headless/extensions/slash-command.tsx","../../src/headless/extensions/Image/Image.ts","../../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/Editor.tsx"],"sourcesContent":["// Auto-apply default styles when consuming the React entry\nimport \"../styles.css\";\n\nexport { Editor } from \"./Editor\";\nexport type { NeuphloEditorProps as EditorProps } 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 { EditorCommandItem } 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\"\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 { 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 { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageOptions {\n uploadImage?: (file: File) => Promise<string>\n allowBase64?: boolean\n}\n\nexport const Image = TiptapImage.extend<ImageOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n allowBase64: false,\n }\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"width\"),\n renderHTML: (attributes) => {\n if (!attributes.width) {\n return {}\n }\n return {\n width: attributes.width,\n }\n },\n },\n height: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"height\"),\n renderHTML: (attributes) => {\n if (!attributes.height) {\n return {}\n }\n return {\n height: attributes.height,\n }\n },\n },\n align: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => {\n if (!attributes.align) {\n return {}\n }\n return {\n \"data-align\": attributes.align,\n }\n },\n },\n }\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setImage:\n (options: {\n src: string\n alt?: string\n title?: string\n width?: string | number\n height?: string | number\n align?: \"left\" | \"center\" | \"right\"\n }) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n uploadImage:\n () =>\n ({ editor }: { editor: any }) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.accept = \"image/*\"\n\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n // Check if uploadImage handler is provided\n if (this.options.uploadImage) {\n try {\n const url = await this.options.uploadImage(file)\n editor.chain().focus().setImage({ src: url }).run()\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n // Fallback to base64 if no upload handler provided\n const reader = new FileReader()\n reader.onload = () => {\n const url = reader.result as string\n editor.chain().focus().setImage({ src: url }).run()\n }\n reader.readAsDataURL(file)\n } else {\n console.warn(\n \"No upload handler provided. Please provide uploadImage option or enable allowBase64.\"\n )\n }\n }\n\n input.click()\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageDrop\"),\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 const url = await this.options.uploadImage(image)\n const node = schema.nodes.image.create({ src: url })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n const node = schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n }\n reader.readAsDataURL(image)\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 const url = await this.options.uploadImage(image)\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({ src: url })\n )\n )\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n )\n )\n }\n reader.readAsDataURL(image)\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default Image\n","import { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { Image } from \"./Image/Image\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => [\n StarterKit.configure({}),\n CodeBlock,\n Link,\n Image.configure({\n uploadImage: options?.uploadImage,\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 },\n }),\n]\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\nexport type TextMenuProps = {\n className?: string\n}\n\nexport function TextMenu({ className }: 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={({ from, to }) => {\n return from !== to\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </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} 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 <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\"\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).chain().focus().deleteRange(range).run()\n ;(editor as any).chain().focus().uploadImage().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 { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { useEffect, useState } from \"react\"\n\nexport type ImageMenuProps = {\n className?: string\n}\n\nexport function ImageMenu({ className }: 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(\"image\")) return\n const attrs = editor.getAttributes(\"image\") ?? {\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.updateAttributes(\"image\", {\n width: `${newSize}%`,\n })\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.updateAttributes(\"image\", { align: newAlign })\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n ;(editor as any).chain().focus().uploadImage().run()\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e }) => {\n return e.isActive(\"image\")\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\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\"\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 onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n onUpdate,\n onCreate,\n uploadImage,\n}: NeuphloEditorProps) {\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={[...ExtensionKit({ uploadImage }), ...(extensions ?? [])]}\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 ? <TextMenu /> : null}\n {showImageMenu ? <ImageMenu /> : null}\n {showSlashMenu ? <SlashMenu /> : null}\n </EditorContent>\n </EditorRoot>\n </div>\n )\n}\n"],"mappings":"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","names":["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_react","import_core","Command","Suggestion","import_state","TiptapImage","Command","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_jsx_runtime"]}
|
package/dist/react/index.js
CHANGED
|
@@ -61,9 +61,12 @@ var Image = TiptapImage.extend({
|
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
63
|
align: {
|
|
64
|
-
default:
|
|
65
|
-
parseHTML: (element) => element.getAttribute("data-align")
|
|
64
|
+
default: null,
|
|
65
|
+
parseHTML: (element) => element.getAttribute("data-align"),
|
|
66
66
|
renderHTML: (attributes) => {
|
|
67
|
+
if (!attributes.align) {
|
|
68
|
+
return {};
|
|
69
|
+
}
|
|
67
70
|
return {
|
|
68
71
|
"data-align": attributes.align
|
|
69
72
|
};
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/headless/extensions/Image/Image.ts","../../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/Editor.tsx"],"sourcesContent":["import { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageOptions {\n uploadImage?: (file: File) => Promise<string>\n allowBase64?: boolean\n}\n\nexport const Image = TiptapImage.extend<ImageOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n allowBase64: false,\n }\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"width\"),\n renderHTML: (attributes) => {\n if (!attributes.width) {\n return {}\n }\n return {\n width: attributes.width,\n }\n },\n },\n height: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"height\"),\n renderHTML: (attributes) => {\n if (!attributes.height) {\n return {}\n }\n return {\n height: attributes.height,\n }\n },\n },\n align: {\n default: \"left\",\n parseHTML: (element) => element.getAttribute(\"data-align\") || \"left\",\n renderHTML: (attributes) => {\n return {\n \"data-align\": attributes.align,\n }\n },\n },\n }\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setImage:\n (options: {\n src: string\n alt?: string\n title?: string\n width?: string | number\n height?: string | number\n align?: \"left\" | \"center\" | \"right\"\n }) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n uploadImage:\n () =>\n ({ editor }: { editor: any }) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.accept = \"image/*\"\n\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n // Check if uploadImage handler is provided\n if (this.options.uploadImage) {\n try {\n const url = await this.options.uploadImage(file)\n editor.chain().focus().setImage({ src: url }).run()\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n // Fallback to base64 if no upload handler provided\n const reader = new FileReader()\n reader.onload = () => {\n const url = reader.result as string\n editor.chain().focus().setImage({ src: url }).run()\n }\n reader.readAsDataURL(file)\n } else {\n console.warn(\n \"No upload handler provided. Please provide uploadImage option or enable allowBase64.\"\n )\n }\n }\n\n input.click()\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageDrop\"),\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 const url = await this.options.uploadImage(image)\n const node = schema.nodes.image.create({ src: url })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n const node = schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n }\n reader.readAsDataURL(image)\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 const url = await this.options.uploadImage(image)\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({ src: url })\n )\n )\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n )\n )\n }\n reader.readAsDataURL(image)\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default Image\n","import { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { Image } from \"./Image/Image\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => [\n StarterKit.configure({}),\n CodeBlock,\n Link,\n Image.configure({\n uploadImage: options?.uploadImage,\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 },\n }),\n]\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\nexport type TextMenuProps = {\n className?: string\n}\n\nexport function TextMenu({ className }: 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={({ from, to }) => {\n return from !== to\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </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} 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 <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\"\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).chain().focus().deleteRange(range).run()\n ;(editor as any).chain().focus().uploadImage().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 { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { useEffect, useState } from \"react\"\n\nexport type ImageMenuProps = {\n className?: string\n}\n\nexport function ImageMenu({ className }: 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(\"image\")) return\n const attrs = editor.getAttributes(\"image\") ?? {\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.updateAttributes(\"image\", {\n width: `${newSize}%`,\n })\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.updateAttributes(\"image\", { align: newAlign })\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n ;(editor as any).chain().focus().uploadImage().run()\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e }) => {\n return e.isActive(\"image\")\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\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\"\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 onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n onUpdate,\n onCreate,\n uploadImage,\n}: NeuphloEditorProps) {\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={[...ExtensionKit({ uploadImage }), ...(extensions ?? [])]}\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 ? <TextMenu /> : null}\n {showImageMenu ? <ImageMenu /> : 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","useEffect","useState","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/headless/extensions/Image/Image.ts","../../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/Editor.tsx"],"sourcesContent":["import { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { EditorView } from \"@tiptap/pm/view\"\n\nexport interface ImageOptions {\n uploadImage?: (file: File) => Promise<string>\n allowBase64?: boolean\n}\n\nexport const Image = TiptapImage.extend<ImageOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n uploadImage: undefined,\n allowBase64: false,\n }\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"width\"),\n renderHTML: (attributes) => {\n if (!attributes.width) {\n return {}\n }\n return {\n width: attributes.width,\n }\n },\n },\n height: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"height\"),\n renderHTML: (attributes) => {\n if (!attributes.height) {\n return {}\n }\n return {\n height: attributes.height,\n }\n },\n },\n align: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => {\n if (!attributes.align) {\n return {}\n }\n return {\n \"data-align\": attributes.align,\n }\n },\n },\n }\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setImage:\n (options: {\n src: string\n alt?: string\n title?: string\n width?: string | number\n height?: string | number\n align?: \"left\" | \"center\" | \"right\"\n }) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n uploadImage:\n () =>\n ({ editor }: { editor: any }) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.accept = \"image/*\"\n\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) return\n\n // Check if uploadImage handler is provided\n if (this.options.uploadImage) {\n try {\n const url = await this.options.uploadImage(file)\n editor.chain().focus().setImage({ src: url }).run()\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n // Fallback to base64 if no upload handler provided\n const reader = new FileReader()\n reader.onload = () => {\n const url = reader.result as string\n editor.chain().focus().setImage({ src: url }).run()\n }\n reader.readAsDataURL(file)\n } else {\n console.warn(\n \"No upload handler provided. Please provide uploadImage option or enable allowBase64.\"\n )\n }\n }\n\n input.click()\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey(\"imageDrop\"),\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 const url = await this.options.uploadImage(image)\n const node = schema.nodes.image.create({ src: url })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n const node = schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n const transaction = view.state.tr.insert(\n coordinates.pos,\n node\n )\n view.dispatch(transaction)\n }\n reader.readAsDataURL(image)\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 const url = await this.options.uploadImage(image)\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({ src: url })\n )\n )\n } catch (error) {\n console.error(\"Failed to upload image:\", error)\n }\n } else if (this.options.allowBase64) {\n const reader = new FileReader()\n reader.onload = (readerEvent) => {\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({\n src: readerEvent.target?.result,\n })\n )\n )\n }\n reader.readAsDataURL(image)\n }\n })\n\n return true\n },\n },\n },\n }),\n ]\n },\n})\n\nexport default Image\n","import { StarterKit, Placeholder, CodeBlock, Link } from \".\"\nimport {\n Command as SlashCommand,\n renderItems as renderSlashItems,\n} from \"./slash-command\"\nimport { Image } from \"./Image/Image\"\n\nexport interface ExtensionKitOptions {\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport const ExtensionKit = (options?: ExtensionKitOptions) => [\n StarterKit.configure({}),\n CodeBlock,\n Link,\n Image.configure({\n uploadImage: options?.uploadImage,\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 },\n }),\n]\n\nexport default ExtensionKit\n","import { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconBold,\n IconItalic,\n IconStrikethrough,\n IconArrowBackUp,\n} from \"@tabler/icons-react\"\nimport { MenuList } from \"./MenuList\"\nimport { LinkPopover } from \"./LinkPopover\"\n\nexport type TextMenuProps = {\n className?: string\n}\n\nexport function TextMenu({ className }: 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={({ from, to }) => {\n return from !== to\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </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} 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 <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\"\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).chain().focus().deleteRange(range).run()\n ;(editor as any).chain().focus().uploadImage().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 { BubbleMenu } from \"@tiptap/react/menus\"\nimport {\n IconUpload,\n IconTrash,\n IconAlignLeft,\n IconAlignCenter,\n IconAlignRight,\n} from \"@tabler/icons-react\"\nimport { useEffect, useState } from \"react\"\n\nexport type ImageMenuProps = {\n className?: string\n}\n\nexport function ImageMenu({ className }: 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(\"image\")) return\n const attrs = editor.getAttributes(\"image\") ?? {\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.updateAttributes(\"image\", {\n width: `${newSize}%`,\n })\n }\n\n const updateImageAlign = (newAlign: \"left\" | \"center\" | \"right\") => {\n setAlign(newAlign)\n editor.commands.updateAttributes(\"image\", { align: newAlign })\n }\n\n const removeImage = () => {\n editor.chain().focus().deleteSelection().run()\n }\n\n const triggerUpload = () => {\n ;(editor as any).chain().focus().uploadImage().run()\n }\n\n return (\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor: e }) => {\n return e.isActive(\"image\")\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\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 </div>\n </BubbleMenu>\n )\n}\n\nexport default ImageMenu\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\"\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 onUpdate?: EditorContentProps[\"onUpdate\"]\n onCreate?: EditorContentProps[\"onCreate\"]\n uploadImage?: (file: File) => Promise<string>\n}\n\nexport function Editor({\n content,\n className,\n editable = true,\n immediatelyRender = false,\n showTextMenu = true,\n showSlashMenu = true,\n showImageMenu = true,\n extensions,\n onUpdate,\n onCreate,\n uploadImage,\n}: NeuphloEditorProps) {\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={[...ExtensionKit({ uploadImage }), ...(extensions ?? [])]}\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 ? <TextMenu /> : null}\n {showImageMenu ? <ImageMenu /> : 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","useEffect","useState","jsx","jsxs","jsx","jsxs"]}
|