neuphlo-editor 1.1.4 → 1.1.6

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.
@@ -1037,8 +1037,20 @@ function TextMenu({ className }) {
1037
1037
  import_menus.BubbleMenu,
1038
1038
  {
1039
1039
  editor,
1040
- shouldShow: ({ from, to }) => {
1041
- return from !== to;
1040
+ shouldShow: ({ editor: e, state, from, to, view }) => {
1041
+ if (e.isActive("image")) return false;
1042
+ const { selection } = state;
1043
+ if (selection.constructor.name === "NodeSelection") return false;
1044
+ if (from === to) return false;
1045
+ let hasImage = false;
1046
+ state.doc.nodesBetween(from, to, (node) => {
1047
+ if (node.type.name === "image") {
1048
+ hasImage = true;
1049
+ return false;
1050
+ }
1051
+ });
1052
+ if (hasImage) return false;
1053
+ return true;
1042
1054
  },
1043
1055
  children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: className ? `bubble-menu ${className}` : "bubble-menu", children: [
1044
1056
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MenuList, { editor }),
@@ -1461,9 +1473,13 @@ function ImageMenu({ className }) {
1461
1473
  import_menus2.BubbleMenu,
1462
1474
  {
1463
1475
  editor,
1464
- shouldShow: ({ editor: e }) => {
1465
- return e.isActive("image");
1476
+ shouldShow: ({ editor: e, state }) => {
1477
+ if (!e.isActive("image")) return false;
1478
+ const { selection } = state;
1479
+ const isNodeSelection = selection.constructor.name === "NodeSelection";
1480
+ return isNodeSelection;
1466
1481
  },
1482
+ updateDelay: 0,
1467
1483
  children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: className ? `bubble-menu ${className}` : "bubble-menu", children: [
1468
1484
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1469
1485
  "div",
@@ -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: 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAA8C;;;ACA9C,mBAA+B;AAE/B,IAAAC,gBAA2B;AAE3B,IAAAC,gBAAyB;;;ACJzB;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAI5B,0BAAc;AADP,IAAM,iBAAkB,0BAAY;;;ADUvC;AAFG,IAAM,aAAkC,CAAC,EAAE,SAAS,MAAM;AAC/D,SACE,4CAAC,0BAAS,OAAO,YACd,UACH;AAEJ;AAQO,IAAM,oBAAgB;AAAA,EAC3B,CAAC,EAAE,WAAW,UAAU,gBAAgB,SAAS,GAAG,KAAK,GAAG,QAAQ;AAClE,UAAM,mBAAmB,WAAW;AACpC,WACE,4CAAC,SAAI,KAAU,WACb,sDAAC,+BAAgB,GAAG,MAAM,SAAS,kBAChC,UACH,GACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;;;AEtC5B,IAAAC,gBAAoC;AACpC,IAAAC,gBAAsC;AACtC,kBAAwB;;;ACFxB,IAAAC,gBAAqB;AAGd,IAAM,gBAAY,oBAAK,EAAE;AACzB,IAAM,gBAAY,oBAAmB,IAAI;;;ADGhD,wBAAmB;AAiDV,IAAAC,sBAAA;AA/CT,IAAM,oBAAsB,kBAAAC,SAAe;AAOpC,IAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAW,0BAAW,WAAW,EAAE,OAAO,WAAW,CAAC;AAC5D,QAAM,eAAW,0BAAW,WAAW,EAAE,OAAO,WAAW,CAAC;AAE5D,+BAAU,MAAM;AACd,aAAS,KAAK;AAAA,EAChB,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,+BAAU,MAAM;AACd,aAAS,KAAK;AAAA,EAChB,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,+BAAU,MAAM;AACd,UAAM,iBAAiB,CAAC,WAAW,aAAa,OAAO;AACvD,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,eAAe,SAAS,EAAE,GAAG,GAAG;AAClC,UAAE,eAAe;AACjB,cAAM,aAAa,SAAS,cAAc,gBAAgB;AAE1D,YAAI;AACF,qBAAW;AAAA,YACT,IAAI,cAAc,WAAW;AAAA,cAC3B,KAAK,EAAE;AAAA,cACP,YAAY;AAAA,cACZ,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAEF,eAAO;AAAA,MACT;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,6CAAC,cAAc,KAAd,EAAkB;AAC5B;AAEA,IAAM,aAAkB;AACjB,IAAM,oBAAgB;AAAA,EAC3B,CAAC,EAAE,UAAU,WAAW,GAAG,KAAK,GAAG,QAAQ;AACzC,UAAM,CAAC,OAAO,QAAQ,QAAI,uBAAQ,SAAS;AAE3C,WACE,6CAAC,cAAc,IAAd,EACC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,CAAC,MAAW;AACrB,YAAE,gBAAgB;AAAA,QACpB;AAAA,QACA,IAAG;AAAA,QACH;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC,WAAW;AAAA,YAAX;AAAA,cACC,OAAO;AAAA,cACP,eAAe;AAAA,cACf,OAAO,EAAE,SAAS,OAAO;AAAA;AAAA,UAC3B;AAAA,UACC;AAAA;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACF;AACO,IAAM,oBAAyB,oBAAQ;AAE9C,cAAc,cAAc;;;AExF5B,IAAAC,gBAA2B;AAC3B,IAAAC,eAA0C;AAC1C,IAAAD,gBAAiC;AACjC,IAAAE,gBAA6B;AA2BzB,IAAAC,sBAAA;AAbJ,IAAM,iBAAsB;AAGrB,IAAM,wBAAoB,0BAG/B,CAAC,EAAE,UAAU,WAAW,GAAG,KAAK,GAAG,QAAQ;AAC3C,QAAM,EAAE,OAAO,QAAI,gCAAiB;AACpC,QAAM,YAAQ,4BAAa,SAAS;AAEpC,MAAI,CAAC,UAAU,CAAC,MAAO,QAAO;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACC,GAAI;AAAA,MACL,UAAU,MAAM,UAAU,EAAE,QAAQ,MAAM,CAAC;AAAA,MAE1C;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,kBAAkB,cAAc;;;ACxChC,yBAA2B;AAC3B,mCAA4B;;;ACD5B,2CAAkC;AAClC,sBAAoC;AAEpC,IAAM,eAAW,gCAAe,mBAAG;AAE5B,IAAM,YAAY,uDAAkB,UAAU;AAAA,EACnD;AACF,CAAC;;;ACPD,kBAAgC;AAChC,4BAAuB;AACvB,mBAAuB;AAGhB,IAAM,OAAO,sBAAAC,QAAW,OAAO;AAAA,EACpC,WAAW;AAAA,EAEX,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,eAAe,GAAQ;AAClC,WAAO;AAAA,MACL;AAAA,UACA,6BAAgB,KAAK,QAAQ,gBAAgB,gBAAgB;AAAA,QAC3D,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,wBAAwB;AACtB,UAAM,EAAE,OAAO,IAAI;AAEnB,WAAO;AAAA,MACL,GAAM,KAAa,SAAS,KAAe,CAAC;AAAA,MAC5C,IAAI,oBAAO;AAAA,QACT,OAAO;AAAA,UACL,eAAe,CAAC,MAAkB,UAAyB;AACzD,kBAAM,EAAE,UAAU,IAAI,OAAO;AAE7B,gBAAI,MAAM,QAAQ,YAAY,UAAU,UAAU,MAAM;AACtD,qBAAO,SAAS,MAAM,UAAU,IAAI,EAAE,gBAAgB,MAAM,CAAC;AAAA,YAC/D;AAEA,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;AC9CD,IAAAC,gBAA8B;AAC9B,wBAAuB;AACvB,IAAAC,eAA0B;AAInB,IAAMC,WAAU,uBAAU,OAAO;AAAA,EACtC,MAAM;AAAA,EACN,aAAa;AACX,WAAO;AAAA,MACL,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS,CAAC,QAAa;AACrB,cAAI,MAAM,QAAQ,EAAE,QAAQ,IAAI,QAAQ,OAAO,IAAI,MAAM,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,wBAAwB;AACtB,UAAM,OAAY,KAAK,QAAQ,cAAc,CAAC;AAC9C,WAAO;AAAA,UACL,kBAAAC,SAAW;AAAA,QACT,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK,QAAQ;AAAA,QACnB,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG;AAAA,QAChC,SAAS,CAAC,QAAa;AACrB,cAAI,OAAO,KAAK,OAAO,YAAY,YAAY;AAC7C,gBAAI,MAAM,QAAQ,EAAE,QAAQ,IAAI,QAAQ,OAAO,IAAI,MAAM,CAAC;AAAA,UAC5D;AAAA,QACF;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,IAAM,cAAc,CAAC,eAA2C;AACrE,MAAI,YAAkC;AACtC,MAAI,YAAgC;AAEpC,QAAM,UAAU,MAAM;AACpB,eAAW,QAAQ;AACnB,gBAAY;AACZ,QAAI,WAAW;AACb,gBAAU,OAAO;AACjB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,eAAgC;AACtD,QAAI,CAAC,aAAa,CAAC,WAAY;AAC/B,UAAM,MAAM,KAAK,MAAM,WAAW,SAAS,CAAC;AAC5C,UAAM,OAAO,KAAK,MAAM,WAAW,IAAI;AACvC,cAAU,MAAM,MAAM,GAAG,GAAG;AAC5B,cAAU,MAAM,OAAO,GAAG,IAAI;AAAA,EAChC;AAEA,SAAO;AAAA,IACL,SAAS,CAAC,UAKJ;AACJ,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO;AACnC,YAAM,aAAa,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK;AAC7D,YAAM,YAAY,WAAW,KAAK;AAClC,UAAI,cAAc,YAAa,QAAO;AAEtC,kBAAY,IAAI,4BAAc,kBAAkB;AAAA,QAC9C,OAAO;AAAA,UACL,OAAQ,MAAc,SAAS;AAAA,UAC/B,OAAQ,MAAc;AAAA,QACxB;AAAA,QACA,QAAQ,MAAM;AAAA,MAChB,CAAC;AAED,kBAAY,SAAS,cAAc,KAAK;AACxC,gBAAU,MAAM,WAAW;AAC3B,gBAAU,MAAM,SAAS;AACzB,gBAAU,MAAM,WAAW;AAC1B,OAAC,YAAY,WAAW,SAAS,MAAM,YAAY,SAAS;AAC7D,gBAAU,YAAY,UAAU,OAAO;AAEvC,YAAM,OACJ,OAAO,MAAM,eAAe,aAAa,MAAM,WAAW,IAAI;AAChE,UAAI,KAAM,gBAAe,IAAI;AAAA,IAC/B;AAAA,IACA,UAAU,CAAC,UAKL;AACJ,iBAAW,YAAY;AAAA,QACrB,OAAQ,MAAc,SAAS;AAAA,QAC/B,OAAQ,MAAc;AAAA,MACxB,CAAC;AACD,YAAM,OACJ,OAAO,MAAM,eAAe,aAAa,MAAM,WAAW,IAAI;AAChE,UAAI,KAAM,gBAAe,IAAI;AAAA,IAC/B;AAAA,IACA,WAAW,CAAC,EAAE,MAAM,MAAgC;AAClD,UAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAQ;AACR,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,MAAM;AACZ,cAAQ;AAAA,IACV;AAAA,EACF;AACF;AAeO,IAAM,0BAA0B,CAAC,UAAyB;AAC/D,MAAI,CAAC,WAAW,aAAa,OAAO,EAAE,SAAS,MAAM,GAAG,GAAG;AACzD,UAAM,eAAe,SAAS,cAAc,gBAAgB;AAC5D,QAAI,aAAc,QAAO;AAAA,EAC3B;AACF;;;ACrIA,6BAAqC;AACrC,IAAAC,gBAAkC;AAQ3B,IAAM,QAAQ,uBAAAC,MAAY,OAAqB;AAAA,EACpD,aAAa;AACX,WAAO;AAAA,MACL,GAAG,KAAK,SAAS;AAAA,MACjB,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,GAAG,KAAK,SAAS;AAAA,MACjB,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MACA,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,OAAO;AAAA,QACpD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,OAAO,WAAW;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,QAAQ;AAAA,QACrD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,QAAQ;AACtB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,QAAQ,WAAW;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,YAAY;AAAA,QACzD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,cAAc,WAAW;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,GAAG,KAAK,SAAS;AAAA,MACjB,UACE,CAAC,YAQD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACF,aACE,MACA,CAAC,EAAE,OAAO,MAAuB;AAC/B,cAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,cAAM,OAAO;AACb,cAAM,SAAS;AAEf,cAAM,WAAW,OAAO,MAAM;AAC5B,gBAAM,OAAQ,EAAE,OAA4B,QAAQ,CAAC;AACrD,cAAI,CAAC,KAAM;AAGX,cAAI,KAAK,QAAQ,aAAa;AAC5B,gBAAI;AACF,oBAAM,MAAM,MAAM,KAAK,QAAQ,YAAY,IAAI;AAC/C,qBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,YACpD,SAAS,OAAO;AACd,sBAAQ,MAAM,2BAA2B,KAAK;AAAA,YAChD;AAAA,UACF,WAAW,KAAK,QAAQ,aAAa;AAEnC,kBAAM,SAAS,IAAI,WAAW;AAC9B,mBAAO,SAAS,MAAM;AACpB,oBAAM,MAAM,OAAO;AACnB,qBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,YACpD;AACA,mBAAO,cAAc,IAAI;AAAA,UAC3B,OAAO;AACL,oBAAQ;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,MAAM;AACZ,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,wBAAwB;AACtB,WAAO;AAAA,MACL,IAAI,qBAAO;AAAA,QACT,KAAK,IAAI,wBAAU,WAAW;AAAA,QAC9B,OAAO;AAAA,UACL,iBAAiB;AAAA,YACf,MAAM,CAAC,MAAkB,UAAqB;AAC5C,oBAAM,WACJ,MAAM,gBACN,MAAM,aAAa,SACnB,MAAM,aAAa,MAAM;AAE3B,kBAAI,CAAC,UAAU;AACb,uBAAO;AAAA,cACT;AAEA,oBAAM,SAAS,MAAM,KAAK,MAAM,aAAa,KAAK,EAAE;AAAA,gBAClD,CAAC,SAAS,SAAS,KAAK,KAAK,IAAI;AAAA,cACnC;AAEA,kBAAI,OAAO,WAAW,GAAG;AACvB,uBAAO;AAAA,cACT;AAEA,oBAAM,eAAe;AAErB,oBAAM,EAAE,OAAO,IAAI,KAAK;AACxB,oBAAM,cAAc,KAAK,YAAY;AAAA,gBACnC,MAAM,MAAM;AAAA,gBACZ,KAAK,MAAM;AAAA,cACb,CAAC;AAED,kBAAI,CAAC,YAAa,QAAO;AAEzB,qBAAO,QAAQ,OAAO,UAAU;AAC9B,oBAAI,KAAK,QAAQ,aAAa;AAC5B,sBAAI;AACF,0BAAM,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAK;AAChD,0BAAM,OAAO,OAAO,MAAM,MAAM,OAAO,EAAE,KAAK,IAAI,CAAC;AACnD,0BAAM,cAAc,KAAK,MAAM,GAAG;AAAA,sBAChC,YAAY;AAAA,sBACZ;AAAA,oBACF;AACA,yBAAK,SAAS,WAAW;AAAA,kBAC3B,SAAS,OAAO;AACd,4BAAQ,MAAM,2BAA2B,KAAK;AAAA,kBAChD;AAAA,gBACF,WAAW,KAAK,QAAQ,aAAa;AACnC,wBAAM,SAAS,IAAI,WAAW;AAC9B,yBAAO,SAAS,CAAC,gBAAgB;AAC/B,0BAAM,OAAO,OAAO,MAAM,MAAM,OAAO;AAAA,sBACrC,KAAK,YAAY,QAAQ;AAAA,oBAC3B,CAAC;AACD,0BAAM,cAAc,KAAK,MAAM,GAAG;AAAA,sBAChC,YAAY;AAAA,sBACZ;AAAA,oBACF;AACA,yBAAK,SAAS,WAAW;AAAA,kBAC3B;AACA,yBAAO,cAAc,KAAK;AAAA,gBAC5B;AAAA,cACF,CAAC;AAED,qBAAO;AAAA,YACT;AAAA,YACA,OAAO,CAAC,MAAkB,UAA0B;AAClD,oBAAM,WACJ,MAAM,iBACN,MAAM,cAAc,SACpB,MAAM,cAAc,MAAM;AAE5B,kBAAI,CAAC,UAAU;AACb,uBAAO;AAAA,cACT;AAEA,oBAAM,SAAS,MAAM,KAAK,MAAM,cAAc,KAAK,EAAE;AAAA,gBACnD,CAAC,SAAS,SAAS,KAAK,KAAK,IAAI;AAAA,cACnC;AAEA,kBAAI,OAAO,WAAW,GAAG;AACvB,uBAAO;AAAA,cACT;AAEA,oBAAM,eAAe;AAErB,qBAAO,QAAQ,OAAO,UAAU;AAC9B,oBAAI,KAAK,QAAQ,aAAa;AAC5B,sBAAI;AACF,0BAAM,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAK;AAChD,yBAAK;AAAA,sBACH,KAAK,MAAM,GAAG;AAAA,wBACZ,KAAK,MAAM,OAAO,MAAM,MAAM,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,sBACnD;AAAA,oBACF;AAAA,kBACF,SAAS,OAAO;AACd,4BAAQ,MAAM,2BAA2B,KAAK;AAAA,kBAChD;AAAA,gBACF,WAAW,KAAK,QAAQ,aAAa;AACnC,wBAAM,SAAS,IAAI,WAAW;AAC9B,yBAAO,SAAS,CAAC,gBAAgB;AAC/B,yBAAK;AAAA,sBACH,KAAK,MAAM,GAAG;AAAA,wBACZ,KAAK,MAAM,OAAO,MAAM,MAAM,OAAO;AAAA,0BACnC,KAAK,YAAY,QAAQ;AAAA,wBAC3B,CAAC;AAAA,sBACH;AAAA,oBACF;AAAA,kBACF;AACA,yBAAO,cAAc,KAAK;AAAA,gBAC5B;AAAA,cACF,CAAC;AAED,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;AC3OM,IAAM,eAAe,CAAC,YAAkC;AAAA,EAC7D,8BAAW,UAAU,CAAC,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA,MAAM,UAAU;AAAA,IACd,aAAa,SAAS;AAAA,EACxB,CAAC;AAAA,EACD,yCAAY,UAAU;AAAA,IACpB,aAAa,CAAC,EAAE,KAAK,MAAW;AAC9B,UAAI,KAAK,KAAK,SAAS,WAAW;AAChC,eAAO,WAAW,KAAK,MAAM,KAAK;AAAA,MACpC;AACA,aAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,EACnB,CAAC;AAAA,EACDC,SAAa,UAAU;AAAA,IACrB,YAAY;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,IAAO,wBAAQ;;;ACnCf,IAAAC,iBAAiD;AACjD,mBAA2B;AAC3B,IAAAC,sBAKO;;;ACPP,IAAAC,gBAAgE;AAChE,yBAYO;AA4FC,IAAAC,sBAAA;AAlFD,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,WAAW;AAC9C,QAAM,cAAU,sBAA8B,IAAI;AAElD,QAAM,mBAAe,2BAAY,MAAM;AACrC,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAG,QAAO;AACrD,QAAI,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAG,QAAO;AACrD,QAAI,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAG,QAAO;AACrD,QAAI,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAG,QAAO;AACrD,QAAI,OAAO,SAAS,YAAY,EAAG,QAAO;AAC1C,QAAI,OAAO,SAAS,aAAa,EAAG,QAAO;AAC3C,QAAI,OAAO,SAAS,YAAY,EAAG,QAAO;AAC1C,QAAI,OAAO,SAAS,MAAM,EAAG,QAAO;AACpC,QAAI,OAAO,SAAS,WAAW,EAAG,QAAO;AACzC,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,+BAAU,MAAM;AACd,aAAS,aAAa,CAAC;AACvB,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,MAAM,SAAS,aAAa,CAAC;AAC5C,WAAO,GAAG,mBAAmB,MAAM;AACnC,WAAO,GAAG,eAAe,MAAM;AAC/B,WAAO,GAAG,UAAU,MAAM;AAC1B,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,MAAM;AACpC,aAAO,IAAI,eAAe,MAAM;AAChC,aAAO,IAAI,UAAU,MAAM;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,+BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,WAAO,GAAG,mBAAmB,KAAK;AAClC,WAAO,GAAG,QAAQ,KAAK;AACvB,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,KAAK;AACnC,aAAO,IAAI,QAAQ,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,+BAAU,MAAM;AACd,UAAM,oBAAoB,CAAC,MAAkB;AAC3C,UAAI,CAAC,KAAM;AACX,YAAM,KAAK,QAAQ;AACnB,UAAI,CAAC,GAAI;AACT,UAAI,CAAC,GAAG,SAAS,EAAE,MAAc,EAAG,SAAQ,KAAK;AAAA,IACnD;AACA,aAAS,iBAAiB,eAAe,iBAAiB;AAC1D,WAAO,MAAM,SAAS,oBAAoB,eAAe,iBAAiB;AAAA,EAC5E,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,SAAS,CAAC,OAAmB,MAAM;AACvC,OAAG;AACH,eAAW;AACX,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,eAAW,2BAAY,CAAC,SAAiB,UAAU,MAAM,CAAC,KAAK,CAAC;AAEtE,SACE,8CAAC,SAAI,KAAK,SAAS,WAAU,gBAC3B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,QACrC,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,WACE,mBACA,mCAAmC,QAAQ,UAAU,cAAc,eAAe,EAAE;AAAA,QAEtF,iBAAe;AAAA,QACf,cAAW;AAAA,QAEX,wDAAC,UAAK,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE,GAClE;AAAA,uDAAC,UAAK,OAAO,EAAE,UAAU,GAAG,GAAI,iBAAM;AAAA,UACtC,6CAAC,sCAAgB,MAAM,IAAI;AAAA,WAC7B;AAAA;AAAA,IACF;AAAA,IAEC,OACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,QAErC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,YAAY,YAAY;AAAA,YACnC,OAAO,EAAE,WAAW,KAAK,GAAI,SAAS,CAAC,EAAG;AAAA,YAE1C;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,WAAW,IAAI,eAAe,EAAE;AAAA,kBACxE,iBAAe,SAAS,WAAW;AAAA,kBACnC,SAAS;AAAA,oBAAO,MACb,OAAe,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,kBACrD;AAAA,kBAEA;AAAA,iEAAC,qCAAe,MAAM,IAAI;AAAA,oBAC1B,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,WAAW,IAAI,eAAe,EAAE;AAAA,kBACxE,iBAAe,SAAS,WAAW;AAAA,kBACnC,SAAS;AAAA,oBAAO,MACb,OACE,MAAM,EACN,MAAM,EACN,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,kBACT;AAAA,kBAEA;AAAA,iEAAC,6BAAO,MAAM,IAAI;AAAA,oBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,WAAW,IAAI,eAAe,EAAE;AAAA,kBACxE,iBAAe,SAAS,WAAW;AAAA,kBACnC,SAAS;AAAA,oBAAO,MACb,OACE,MAAM,EACN,MAAM,EACN,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,kBACT;AAAA,kBAEA;AAAA,iEAAC,6BAAO,MAAM,IAAI;AAAA,oBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,WAAW,IAAI,eAAe,EAAE;AAAA,kBACxE,iBAAe,SAAS,WAAW;AAAA,kBACnC,SAAS;AAAA,oBAAO,MACb,OACE,MAAM,EACN,MAAM,EACN,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,kBACT;AAAA,kBAEA;AAAA,iEAAC,6BAAO,MAAM,IAAI;AAAA,oBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,WAAW,IAAI,eAAe,EAAE;AAAA,kBACxE,iBAAe,SAAS,WAAW;AAAA,kBACnC,SAAS;AAAA,oBAAO,MACb,OACE,MAAM,EACN,MAAM,EACN,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,kBACT;AAAA,kBAEA;AAAA,iEAAC,6BAAO,MAAM,IAAI;AAAA,oBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,aAAa,IAAI,eAAe,EAAE;AAAA,kBAC1E,iBAAe,SAAS,aAAa;AAAA,kBACrC,SAAS;AAAA,oBAAO,MACb,OAAe,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,kBACzD;AAAA,kBAEA;AAAA,iEAAC,+BAAS,MAAM,IAAI;AAAA,oBACpB,6CAAC,UAAK,yBAAW;AAAA;AAAA;AAAA,cACnB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,cAAc,IAAI,eAAe,EAAE;AAAA,kBAC3E,iBAAe,SAAS,cAAc;AAAA,kBACtC,SAAS;AAAA,oBAAO,MACb,OAAe,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,kBAC1D;AAAA,kBAEA;AAAA,iEAAC,sCAAgB,MAAM,IAAI;AAAA,oBAC3B,6CAAC,UAAK,0BAAY;AAAA;AAAA;AAAA,cACpB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,OAAO,IAAI,eAAe,EAAE;AAAA,kBACpE,iBAAe,SAAS,OAAO;AAAA,kBAC/B,SAAS;AAAA,oBAAO,MACb,OAAe,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,kBACzD;AAAA,kBAEA;AAAA,iEAAC,qCAAe,MAAM,IAAI;AAAA,oBAC1B,6CAAC,UAAK,mBAAK;AAAA;AAAA;AAAA,cACb;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,MAAM,IAAI,eAAe,EAAE;AAAA,kBACnE,iBAAe,SAAS,MAAM;AAAA,kBAC9B,SAAS;AAAA,oBAAO,MACb,OAAe,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,kBACnD;AAAA,kBAEA;AAAA,iEAAC,+BAAS,MAAM,IAAI;AAAA,oBACpB,6CAAC,UAAK,kBAAI;AAAA;AAAA;AAAA,cACZ;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oBAAoB,SAAS,YAAY,IAAI,eAAe,EAAE;AAAA,kBACzE,iBAAe,SAAS,YAAY;AAAA,kBACpC,SAAS;AAAA,oBAAO,MACb,OAAe,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,kBACxD;AAAA,kBAEA;AAAA,iEAAC,qCAAe,MAAM,IAAI;AAAA,oBAC1B,6CAAC,UAAK,wBAAU;AAAA;AAAA;AAAA,cAClB;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF,IACE;AAAA,KACN;AAEJ;;;ACpQA,IAAAC,gBAA4D;AAC5D,IAAAC,sBAKO;AAwHC,IAAAC,sBAAA;AA9GD,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,KAAK,MAAM,QAAI,wBAAiB,EAAE;AACzC,QAAM,eAAW,sBAAgC,IAAI;AACrD,QAAM,cAAU,sBAA8B,IAAI;AAElD,QAAM,WACJ,CAAC,CAAC,QAAQ,WAAW,MAAM,KAAK,CAAC,CAAC,QAAQ,WAAW,WAAW;AAClE,QAAM,WAAW,CAAC,CAAC,QAAQ,WAAW,MAAM;AAC5C,QAAM,kBAAsB;AAAA,IAC1B,MACE,QAAQ,gBAAiB,OAAO,cAAc,MAAM,GAAG,QAAQ,KAAM;AAAA,IACvE,CAAC,QAAQ,QAAQ,OAAO,WAAW,MAAM,QAAQ,OAAO,WAAW,EAAE;AAAA,EACvE;AAEA,QAAM,aAAS,uBAAQ,MAAM;AAC3B,QAAI,CAAC,UAAU,SAAU,QAAO;AAChC,QAAI;AACF,aAAO,OACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,QAAQ,EAAE,MAAM,sBAAsB,CAAC,EACvC,IAAI;AAAA,IACT,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,+BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,MAAM;AACnB,YAAM,OAAO,OAAO,cAAc,MAAM,GAAG,QAAQ;AACnD,aAAO,IAAI;AACX,YAAM,aAAa,OAAO,SAAS,MAAM;AACzC,UAAI,wBAAwB,OAAO,aAAa,WAAY,SAAQ,IAAI;AACxE,UAAI,CAAC,WAAY,SAAQ,KAAK;AAAA,IAChC;AACA,WAAO;AACP,WAAO,GAAG,mBAAmB,MAAM;AACnC,WAAO,GAAG,eAAe,MAAM;AAC/B,WAAO,GAAG,UAAU,MAAM;AAC1B,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,MAAM;AACpC,aAAO,IAAI,eAAe,MAAM;AAChC,aAAO,IAAI,UAAU,MAAM;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,QAAQ,oBAAoB,CAAC;AAEjC,+BAAU,MAAM;AACd,QAAI,KAAM,UAAS,SAAS,MAAM;AAClC,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,uBAAuB,CAAC,UAAU,CAAC,SAAU,QAAO;AAExD,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,IAAK;AACT,IAAC,OACC,MAAM,EACN,MAAM,EACN,gBAAgB,MAAM,EACtB,QAAQ,EAAE,MAAM,IAAI,CAAC,EACrB,IAAI;AACP,gBAAY;AACZ,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,aAAa,MAAM;AACvB;AAAC,IAAC,OAAe,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI;AACjD,YAAQ,KAAK;AAAA,EACf;AAGA,+BAAU,MAAM;AACd,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,CAAC,KAAM;AACX,YAAM,KAAK,QAAQ;AACnB,UAAI,CAAC,GAAI;AACT,UAAI,CAAC,GAAG,SAAS,EAAE,MAAc,EAAG,SAAQ,KAAK;AAAA,IACnD;AACA,aAAS,iBAAiB,eAAe,OAAO;AAChD,WAAO,MAAM,SAAS,oBAAoB,eAAe,OAAO;AAAA,EAClE,GAAG,CAAC,IAAI,CAAC;AAET,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO,EAAE,UAAU,WAAW;AAAA,MAE9B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,WAAW,gDAAgD,WAAW,eAAe,EAAE;AAAA,YACvF,cAAY,WAAW,cAAc;AAAA,YACrC,gBAAc;AAAA,YACd,iBAAe;AAAA,YACf,UAAU;AAAA,YACV,iBAAe;AAAA,YACf,OAAO,WAAW,eAAe,cAAc;AAAA,YAE/C,uDAAC,gCAAS,MAAM,IAAI;AAAA;AAAA,QACtB;AAAA,QAEC,OACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,MAAM;AAAA,cACN,WAAW;AAAA,YACb;AAAA,YACA,MAAK;AAAA,YACL,cAAW;AAAA,YAEX,wDAAC,SAAI,WAAU,oBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,kBACtC,aAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,aAAa,CAAC,MAAM;AAClB,sBAAE,gBAAgB;AAAA,kBACpB;AAAA,kBACA,WAAW,CAAC,MAAM;AAChB,wBAAI,EAAE,QAAQ,SAAS;AACrB,wBAAE,eAAe;AACjB,gCAAU;AAAA,oBACZ,WAAW,EAAE,QAAQ,UAAU;AAC7B,wBAAE,eAAe;AACjB,8BAAQ,KAAK;AAAA,oBACf;AAAA,kBACF;AAAA;AAAA,cACF;AAAA,cACA,6CAAC,SAAI,WAAU,6BAA4B;AAAA,cAC3C;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAM;AAAA,kBACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,kBACrC,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBAEX,uDAAC,0CAAmB,MAAM,IAAI;AAAA;AAAA,cAChC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAM;AAAA,kBACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,kBACrC,SAAS,MAAM;AACb,0BAAM,SAAS,OAAO;AACtB,wBAAI,OAAQ,QAAO,KAAK,QAAQ,UAAU,qBAAqB;AAAA,kBACjE;AAAA,kBACA,UAAU,CAAC,OAAO,CAAC;AAAA,kBAEnB,uDAAC,wCAAiB,MAAM,IAAI;AAAA;AAAA,cAC9B;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAM;AAAA,kBACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,kBACrC,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBAEX,uDAAC,iCAAU,MAAM,IAAI;AAAA;AAAA,cACvB;AAAA,eACF;AAAA;AAAA,QACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AFzIM,IAAAC,sBAAA;AAnDC,SAAS,SAAS,EAAE,UAAU,GAAkB;AACrD,QAAM,EAAE,OAAO,QAAI,iCAAiB;AAEpC,QAAM,kBAAc,+BAAe;AAAA,IACjC;AAAA,IACA,UAAU,CAAC,QAAQ;AACjB,UAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,aAAO;AAAA,QACL,QAAQ,IAAI,OAAO,SAAS,MAAM;AAAA,QAClC,UAAU,IAAI,OAAO,SAAS,QAAQ;AAAA,QACtC,UAAU,IAAI,OAAO,SAAS,QAAQ;AAAA,QACtC,QAAQ,IAAI,OAAO,SAAS,MAAM;AAAA,QAClC,aAAa,IAAI,OAAO,SAAS,WAAW;AAAA,QAC5C,aAAa,IAAI,OAAO,SAAS,WAAW;AAAA,QAC5C,WAAW,IAAI,OAAO,SAAS,SAAS;AAAA,QACxC,QACE,IAAI,OAAO,SAAS,YAAY,KAChC,IAAI,OAAO,SAAS,aAAa;AAAA,QACnC,cAAc,IAAI,OAAO,SAAS,YAAY;AAAA,MAChD;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,CAAC,UAAU,CAAC,YAAa,QAAO;AAEpC,QAAM,yBAAyB,MAAM;AACnC,UAAM,YAAiB;AACvB,UAAM,QAAQ,UAAU;AACxB,UAAM,MAAW,MAAM;AACvB,QAAI,MAAM;AACV,UAAM,IAAI,aAAa,IAAI,MAAM,IAAI,IAAI,CAAC,SAAc;AACtD,UAAI,KAAK,UAAU,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACtD,cAAM;AACN,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,OAAO,IAAI,OAAO;AACrB,YAAM,QAAQ,MAAM,eAAe,IAAI,MAAM,MAAM;AACnD,UAAI,SAAS,MAAM,SAAS,EAAG,OAAM;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;AAC5B,eAAO,SAAS;AAAA,MAClB;AAAA,MAEA,wDAAC,SAAI,WAAW,YAAY,eAAe,SAAS,KAAK,eACvD;AAAA,qDAAC,YAAS,QAAgB;AAAA,QAC1B;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,YACvD,WAAW,gDAAgD,YAAY,SAAS,eAAe,EAAE;AAAA,YACjG,UAAU,YAAY,UAAU,YAAY;AAAA,YAC5C,iBAAe,YAAY,UAAU,YAAY;AAAA,YACjD,gBAAc,YAAY;AAAA,YAC1B,cAAW;AAAA,YAEX,uDAAC,gCAAS,MAAM,IAAI;AAAA;AAAA,QACtB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,YACzD,WAAW,gDAAgD,YAAY,WAAW,eAAe,EAAE;AAAA,YACnG,UAAU,YAAY,UAAU,YAAY;AAAA,YAC5C,iBAAe,YAAY,UAAU,YAAY;AAAA,YACjD,gBAAc,YAAY;AAAA,YAC1B,cAAW;AAAA,YAEX,uDAAC,kCAAW,MAAM,IAAI;AAAA;AAAA,QACxB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,YACzD,WAAW,gDAAgD,YAAY,WAAW,eAAe,EAAE;AAAA,YACnG,UAAU,YAAY,UAAU,YAAY;AAAA,YAC5C,iBAAe,YAAY,UAAU,YAAY;AAAA,YACjD,gBAAc,YAAY;AAAA,YAC1B,cAAW;AAAA,YAEX,uDAAC,yCAAkB,MAAM,IAAI;AAAA;AAAA,QAC/B;AAAA,QAEA,6CAAC,eAAY,QAAgB,qBAAqB,OAAO;AAAA,SAEvD,MAAM;AACN,gBAAM,iBAAiB,uBAAuB;AAE9C,gBAAM,mBACJ,YAAY,eACZ,CAAC,YAAY,aACb,CAAC,YAAY,UACb,CAAC,YAAY,gBACb,CAAC,YAAY,eACb,CAAC;AAEH,iBACE;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,cACrC,SAAS,MACP,OACG,MAAM,EACN,MAAM,EACN,WAAW,EACX,aAAa,EACb,cAAc,EACd,IAAI;AAAA,cAET,WAAU;AAAA,cACV,cAAW;AAAA,cACX,OAAM;AAAA,cACN,UAAU;AAAA,cACV,iBAAe;AAAA,cAEf,uDAAC,uCAAgB,MAAM,IAAI;AAAA;AAAA,UAC7B;AAAA,QAEJ,GAAG;AAAA,SACL;AAAA;AAAA,EACF;AAEJ;;;AGhJA,IAAAC,iBAAiC;AAMjC,IAAAC,sBAcO;AAkCG,IAAAC,sBAAA;AA5BH,SAAS,UAAU,EAAE,UAAU,GAAmB;AACvD,QAAM,EAAE,OAAO,QAAI,iCAAiB;AACpC,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,6CAAC,iBAAc,WAAW,aAAa,eACrC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,MAE1D;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAC;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,WAAW,EACX,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,gCAAS,MAAM,IAAI;AAAA,kBACpB,6CAAC,UAAK,kBAAI;AAAA;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,aAAa,EACb,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,kCAAW,MAAM,IAAI;AAAA,kBACtB,6CAAC,UAAK,oBAAM;AAAA;AAAA;AAAA,YACd;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,aAAa,EACb,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,yCAAkB,MAAM,IAAI;AAAA,kBAC7B,6CAAC,UAAK,oBAAM;AAAA;AAAA;AAAA,YACd;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,8BAAO,MAAM,IAAI;AAAA,kBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,8BAAO,MAAM,IAAI;AAAA,kBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,8BAAO,MAAM,IAAI;AAAA,kBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc,EAAE,OAAO,EAAE,CAAC,EAC1B,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,8BAAO,MAAM,IAAI;AAAA,kBAClB,6CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,iBAAiB,EACjB,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,gCAAS,MAAM,IAAI;AAAA,kBACpB,6CAAC,UAAK,yBAAW;AAAA;AAAA;AAAA,YACnB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,kBAAkB,EAClB,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,uCAAgB,MAAM,IAAI;AAAA,kBAC3B,6CAAC,UAAK,0BAAY;AAAA;AAAA;AAAA,YACpB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,iBAAiB,EACjB,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,sCAAe,MAAM,IAAI;AAAA,kBAC1B,6CAAC,UAAK,mBAAK;AAAA;AAAA;AAAA,YACb;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,WAAW,EACX,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,gCAAS,MAAM,IAAI;AAAA,kBACpB,6CAAC,UAAK,kBAAI;AAAA;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAIGA,QACE,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,gBAAgB,EAChB,IAAI;AAAA,YAGT;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,sCAAe,MAAM,IAAI;AAAA,kBAC1B,6CAAC,UAAK,wBAAU;AAAA;AAAA;AAAA,YAClB;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,WAAW,CAAC;AAAA,cACV,QAAAA;AAAA,cACA;AAAA,YACF,MAGM;AACJ;AAAC,cAACA,QAAe,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,IAAI;AACvD,cAACA,QAAe,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI;AAAA,YACrD;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,gBAE9D;AAAA,+DAAC,iCAAU,MAAM,IAAI;AAAA,kBACrB,6CAAC,UAAK,mBAAK;AAAA;AAAA;AAAA,YACb;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AC3WA,IAAAC,iBAAiC;AACjC,IAAAC,gBAA2B;AAC3B,IAAAC,sBAMO;AACP,IAAAF,iBAAoC;AA4E1B,IAAAG,sBAAA;AAtEH,SAAS,UAAU,EAAE,UAAU,GAAmB;AACvD,QAAM,EAAE,OAAO,QAAI,iCAAiB;AACpC,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAiB,GAAG;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAsC,MAAM;AAEtE,gCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,MAAM;AACnB,UAAI,CAAC,OAAO,SAAS,OAAO,EAAG;AAC/B,YAAM,QAAQ,OAAO,cAAc,OAAO,KAAK;AAAA,QAC7C,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AACA,YAAM,QAAQ,MAAM,SAAS;AAC7B,UAAI,MAAM,SAAS,GAAG,GAAG;AACvB,gBAAQ,SAAS,KAAK,KAAK,GAAG;AAAA,MAChC,OAAO;AACL,gBAAQ,GAAG;AAAA,MACb;AACA,eAAS,MAAM,SAAS,MAAM;AAAA,IAChC;AACA,WAAO;AACP,WAAO,GAAG,mBAAmB,MAAM;AACnC,WAAO,GAAG,eAAe,MAAM;AAC/B,WAAO,GAAG,UAAU,MAAM;AAC1B,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,MAAM;AACpC,aAAO,IAAI,eAAe,MAAM;AAChC,aAAO,IAAI,UAAU,MAAM;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,kBAAkB,CAAC,YAAoB;AAC3C,YAAQ,OAAO;AACf,WAAO,SAAS,iBAAiB,SAAS;AAAA,MACxC,OAAO,GAAG,OAAO;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,CAAC,aAA0C;AAClE,aAAS,QAAQ;AACjB,WAAO,SAAS,iBAAiB,SAAS,EAAE,OAAO,SAAS,CAAC;AAAA,EAC/D;AAEA,QAAM,cAAc,MAAM;AACxB,WAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,EAC/C;AAEA,QAAM,gBAAgB,MAAM;AAC1B;AAAC,IAAC,OAAe,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI;AAAA,EACrD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM;AAC7B,eAAO,EAAE,SAAS,OAAO;AAAA,MAC3B;AAAA,MAEA,wDAAC,SAAI,WAAW,YAAY,eAAe,SAAS,KAAK,eACvD;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,UAAU;AAAA,YACZ;AAAA,YAEA;AAAA,4DAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,SAAS,GACnD;AAAA;AAAA,gBAAK;AAAA,iBACR;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,KAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,gBAAgB,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,kBACzD,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,kBACtC,OAAO,EAAE,MAAM,EAAE;AAAA;AAAA,cACnB;AAAA;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,QAAQ;AAAA;AAAA,QAC3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,gDAAgD,UAAU,SAAS,eAAe,EAAE;AAAA,YAC/F,OAAM;AAAA,YACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,iBAAiB,MAAM;AAAA,YAEtC,uDAAC,qCAAc,MAAM,IAAI;AAAA;AAAA,QAC3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,gDAAgD,UAAU,WAAW,eAAe,EAAE;AAAA,YACjG,OAAM;AAAA,YACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,iBAAiB,QAAQ;AAAA,YAExC,uDAAC,uCAAgB,MAAM,IAAI;AAAA;AAAA,QAC7B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,gDAAgD,UAAU,UAAU,eAAe,EAAE;AAAA,YAChG,OAAM;AAAA,YACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,iBAAiB,OAAO;AAAA,YAEvC,uDAAC,sCAAe,MAAM,IAAI;AAAA;AAAA,QAC5B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,QAAQ;AAAA;AAAA,QAC3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAM;AAAA,YACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS;AAAA,YAET,uDAAC,kCAAW,MAAM,IAAI;AAAA;AAAA,QACxB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAM;AAAA,YACN,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS;AAAA,YAET,uDAAC,iCAAU,MAAM,IAAI;AAAA;AAAA,QACvB;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACpHQ,IAAAC,sBAAA;AAhBD,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,SACE,6CAAC,SAAI,WACH,uDAAC,cACC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,CAAC,GAAG,sBAAa,EAAE,YAAY,CAAC,GAAG,GAAI,cAAc,CAAC,CAAE;AAAA,MACpE,aAAa;AAAA,QACX,YAAY;AAAA,UACV,OAAO;AAAA,QACT;AAAA,QACA,eAAe,CAAC,MAAM,UAAU;AAC9B,iBAAO,CAAC,CAAC,0BAA0B,KAAY;AAAA,QACjD;AAAA,MACF;AAAA,MAEC;AAAA,uBAAe,6CAAC,YAAS,IAAK;AAAA,QAC9B,gBAAgB,6CAAC,aAAU,IAAK;AAAA,QAChC,gBAAgB,6CAAC,aAAU,IAAK;AAAA;AAAA;AAAA,EACnC,GACF,GACF;AAEJ;","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={({ editor: e, state, from, to, view }) => {\n // Don't show if an image is active anywhere\n if (e.isActive(\"image\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // Check if the selection contains an image node\n let hasImage = false\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === \"image\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n <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, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"image\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n <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"]}
@@ -163,6 +163,9 @@
163
163
  max-width: 100%;
164
164
  height: auto;
165
165
  display: block;
166
+ border: 1px solid var(--border, rgba(0, 0, 0, 0.12));
167
+ border-radius: 0.5rem;
168
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
166
169
  }
167
170
  .nph-editor img[data-align=left],
168
171
  .ProseMirror.nph-editor img[data-align=left] {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/styles.css"],"sourcesContent":["/* Neuphlo Editor default styles (TipTap-friendly) */\n/* Note: Highlight.js theme is now optional. Import\n 'neuphlo-editor/highlight.css' or your preferred theme separately. */\n\n:root {\n --nph-z: 9999;\n}\n\n.nph-editor,\n.ProseMirror.nph-editor {\n min-height: 240px;\n line-height: 1.65;\n color: inherit;\n caret-color: currentColor;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n word-break: break-word;\n}\n\n/* Trim outer spacing */\n.nph-editor > *:first-child,\n.ProseMirror.nph-editor > *:first-child {\n margin-top: 0;\n}\n.nph-editor > *:last-child,\n.ProseMirror.nph-editor > *:last-child {\n margin-bottom: 0;\n}\n\n/* Paragraphs */\n.nph-editor p,\n.ProseMirror.nph-editor p {\n margin: 0.75em 0;\n}\n\n/* Headings */\n.nph-editor h1,\n.nph-editor h2,\n.nph-editor h3,\n.nph-editor h4,\n.nph-editor h5,\n.nph-editor h6,\n.ProseMirror.nph-editor h1,\n.ProseMirror.nph-editor h2,\n.ProseMirror.nph-editor h3,\n.ProseMirror.nph-editor h4,\n.ProseMirror.nph-editor h5,\n.ProseMirror.nph-editor h6 {\n line-height: 1.2;\n font-weight: 700;\n margin-top: 2.5rem;\n margin-bottom: 0.75rem;\n text-wrap: pretty;\n}\n.nph-editor h1,\n.nph-editor h2,\n.ProseMirror.nph-editor h1,\n.ProseMirror.nph-editor h2 {\n margin-top: 3rem;\n margin-bottom: 1rem;\n}\n.nph-editor h1,\n.ProseMirror.nph-editor h1 {\n font-size: 1.5rem;\n}\n.nph-editor h2,\n.ProseMirror.nph-editor h2 {\n font-size: 1.25rem;\n}\n.nph-editor h3,\n.ProseMirror.nph-editor h3 {\n font-size: 1.125rem;\n}\n.nph-editor h4,\n.nph-editor h5,\n.nph-editor h6,\n.ProseMirror.nph-editor h4,\n.ProseMirror.nph-editor h5,\n.ProseMirror.nph-editor h6 {\n font-size: 1rem;\n}\n\n/* Lists */\n.nph-editor ul,\n.nph-editor ol,\n.ProseMirror.nph-editor ul,\n.ProseMirror.nph-editor ol {\n padding-left: 1.25rem;\n margin: 1.25rem 1rem 1.25rem 0.4rem;\n}\n.nph-editor ul,\n.ProseMirror.nph-editor ul {\n list-style: disc outside;\n}\n.nph-editor ul ul,\n.ProseMirror.nph-editor ul ul {\n list-style: circle outside;\n}\n.nph-editor ul ul ul,\n.ProseMirror.nph-editor ul ul ul {\n list-style: square outside;\n}\n.nph-editor ol,\n.ProseMirror.nph-editor ol {\n list-style: decimal outside;\n}\n.nph-editor li p,\n.ProseMirror.nph-editor li p {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n\n/* Blockquote */\n.nph-editor blockquote,\n.ProseMirror.nph-editor blockquote {\n border-left: 3px solid var(--border, rgba(0, 0, 0, 0.12));\n margin: 1.5rem 0;\n padding-left: 1rem;\n color: var(--muted-foreground, #6b7280);\n}\n\n/* Code (inline) */\n.nph-editor code,\n.ProseMirror.nph-editor code {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n border-radius: 0.375rem;\n color: inherit;\n font-size: 0.875em;\n padding: 0.15em 0.35em;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n\n/* Code blocks */\n.nph-editor pre,\n.ProseMirror.nph-editor pre {\n background: var(--muted, #f4f4f5);\n border-radius: 0.5rem;\n color: var(--foreground, #111827);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n margin: 1.5rem 0;\n padding: 0.75rem 1rem;\n overflow-x: auto;\n}\n.nph-editor pre code,\n.ProseMirror.nph-editor pre code {\n background: none;\n color: inherit;\n font-size: 0.85em;\n padding: 0;\n}\n/* Normalize highlight.js base element to integrate with our block styling */\n.nph-editor pre code.hljs,\n.ProseMirror.nph-editor pre code.hljs {\n display: block;\n background: none;\n padding: 0;\n}\n\n/* Horizontal rule */\n.nph-editor hr,\n.ProseMirror.nph-editor hr {\n border: none;\n border-top: 1px solid var(--border, rgba(0, 0, 0, 0.12));\n margin: 2rem 0;\n}\n\n/* Links */\n.nph-editor a,\n.ProseMirror.nph-editor a {\n color: var(--primary, #2563eb);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n/* Images */\n.nph-editor img,\n.ProseMirror.nph-editor img {\n max-width: 100%;\n height: auto;\n display: block;\n}\n\n/* Image alignment */\n.nph-editor img[data-align=\"left\"],\n.ProseMirror.nph-editor img[data-align=\"left\"] {\n float: left;\n margin-right: 1rem;\n margin-bottom: 0.5rem;\n clear: left;\n}\n\n.nph-editor img[data-align=\"center\"],\n.ProseMirror.nph-editor img[data-align=\"center\"] {\n display: block;\n margin-left: auto;\n margin-right: auto;\n clear: both;\n}\n\n.nph-editor img[data-align=\"right\"],\n.ProseMirror.nph-editor img[data-align=\"right\"] {\n float: right;\n margin-left: 1rem;\n margin-bottom: 0.5rem;\n clear: right;\n}\n\n/* Clear floats after headings to prevent layout issues */\n.nph-editor h1,\n.nph-editor h2,\n.nph-editor h3,\n.nph-editor h4,\n.nph-editor h5,\n.nph-editor h6,\n.ProseMirror.nph-editor h1,\n.ProseMirror.nph-editor h2,\n.ProseMirror.nph-editor h3,\n.ProseMirror.nph-editor h4,\n.ProseMirror.nph-editor h5,\n.ProseMirror.nph-editor h6 {\n clear: both;\n}\n\n/* Tables */\n.nph-editor table,\n.ProseMirror.nph-editor table {\n width: 100%;\n table-layout: auto;\n border-collapse: collapse;\n margin: 1.25rem 0;\n}\n.nph-editor th,\n.nph-editor td,\n.ProseMirror.nph-editor th,\n.ProseMirror.nph-editor td {\n border: 1px solid var(--border, rgba(0, 0, 0, 0.12));\n padding: 0.5rem 0.75rem;\n vertical-align: top;\n}\n.nph-editor th,\n.ProseMirror.nph-editor th {\n background: var(--muted, #f4f4f5);\n font-weight: 600;\n}\n\n/* Task list (if enabled) */\n.nph-editor ul[data-type=\"taskList\"],\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] {\n list-style: none;\n padding-left: 0;\n}\n.nph-editor ul[data-type=\"taskList\"] li,\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] li {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n.nph-editor ul[data-type=\"taskList\"] li > label,\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n user-select: none;\n}\n.nph-editor ul[data-type=\"taskList\"] li input[type=\"checkbox\"],\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] li input[type=\"checkbox\"] {\n margin: 0.25rem 0.5rem 0 0;\n}\n\n/* ProseMirror helpers */\n.nph-editor .ProseMirror-gapcursor,\n.ProseMirror.nph-editor .ProseMirror-gapcursor {\n display: none;\n}\n.nph-editor .ProseMirror-selectednode,\n.ProseMirror.nph-editor .ProseMirror-selectednode {\n outline: 2px solid var(--ring, rgba(59, 130, 246, 0.5));\n}\n\n/* Placeholder (requires Placeholder extension) */\n.nph-editor p.is-editor-empty:first-child::before,\n.ProseMirror.nph-editor p.is-editor-empty:first-child::before {\n color: var(--muted-foreground, #6b7280);\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n}\n\n/* ------------------\n Bubble menu & dropdown\n ------------------ */\n.bubble-menu {\n /* Themed surface */\n background-color: var(--background, #ffffff);\n color: var(--foreground, #111827);\n border: 1px solid var(--border, rgba(0, 0, 0, 0.08));\n border-radius: 0.7rem;\n box-shadow: var(--shadow, 0 4px 16px rgba(0, 0, 0, 0.08));\n\n /* Layout */\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem;\n font-size: 0.875rem; /* ~text-sm */\n\n /* Keep menu content visible for dropdowns */\n max-width: calc(100vw - 16px);\n overflow: visible; /* allow inner dropdown to escape the shell */\n\n /* On top of editor */\n position: relative;\n z-index: var(--nph-z) !important;\n}\n\n/* Ensure Tiptap/Tippy bubble root stacks high */\n[data-tippy-root],\n.tippy-box {\n z-index: var(--nph-z) !important;\n}\n\n/* Generic dropdown container and panel (used in TextMenu) */\n.nph-dropdown {\n position: relative;\n}\n.nph-dropdown__panel {\n position: absolute;\n top: 100%;\n left: 0;\n margin-top: 0.25rem;\n min-width: 11rem;\n z-index: calc(var(--nph-z) + 1) !important; /* above the bubble itself */\n}\n\n/* Command menu (slash menu & the block-type panel) */\n.nph-command {\n background-color: var(--background, #ffffff);\n color: var(--foreground, #111827);\n border: 1px solid var(--border, rgba(0, 0, 0, 0.08));\n border-radius: 0.5rem;\n box-shadow: var(--shadow, 0 4px 16px rgba(0, 0, 0, 0.08));\n padding: 0.25rem;\n}\n\n.nph-command__list {\n list-style: none;\n margin: 0;\n padding: 0.125rem;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n max-height: 320px;\n overflow: auto;\n /* Show only the thumb (pill), hide track */\n scrollbar-width: thin; /* Firefox */\n scrollbar-color: #e5e7eb transparent; /* thumb track */\n}\n\n/* WebKit: keep a small thumb, hide the track */\n.nph-command__list::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n background: transparent;\n}\n.nph-command__list::-webkit-scrollbar-track {\n background: transparent;\n}\n.nph-command__list::-webkit-scrollbar-thumb {\n background-color: #e5e7eb;\n border-radius: 9999px;\n}\n.nph-command__list:hover::-webkit-scrollbar-thumb {\n background-color: #d1d5db;\n}\n\n@media (prefers-color-scheme: dark) {\n .nph-command__list {\n scrollbar-color: #4b5563 transparent;\n }\n .nph-command__list::-webkit-scrollbar-thumb {\n background-color: #4b5563;\n }\n .nph-command__list:hover::-webkit-scrollbar-thumb {\n background-color: #6b7280;\n }\n}\n\n.nph-command__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n border-radius: 0.375rem;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n}\n\n.nph-command__item:hover {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n}\n\n.nph-command__item.is-active,\n.nph-command__item[aria-selected=\"true\"] {\n background-color: var(--accent, rgba(0, 0, 0, 0.08));\n}\n\n@media (prefers-color-scheme: dark) {\n .nph-command__item.is-active,\n .nph-command__item[aria-selected=\"true\"] {\n background-color: var(--accent, rgba(255, 255, 255, 0.14));\n }\n}\n\n/* Base buttons for headless UI */\n.nph-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n border-radius: 0.375rem; /* rounded-md */\n font-size: 0.875rem; /* text-sm */\n font-weight: 500; /* font-medium */\n transition:\n background-color 0.2s ease,\n color 0.2s ease,\n box-shadow 0.2s ease;\n outline: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n background: transparent;\n color: inherit;\n border: none;\n}\n\n.nph-btn:focus-visible {\n outline: 2px solid var(--ring, rgba(59, 130, 246, 0.5));\n outline-offset: 2px; /* ring-offset */\n}\n\n.nph-btn:disabled {\n pointer-events: none;\n opacity: 0.5;\n}\n\n/* Ghost variant */\n.nph-btn-ghost {\n background: transparent;\n}\n.nph-btn-ghost:hover {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n}\n\n/* Size: sm */\n.nph-btn-sm {\n height: 2.25rem;\n padding: 0 0.75rem;\n}\n\n/* Size: xs (more compact than sm) */\n.nph-btn-xs {\n height: 1.75rem;\n padding: 0 0.5rem;\n font-size: 0.8125rem;\n}\n\n/* Icon variant: square buttons with equal width/height */\n.nph-btn-icon {\n width: 1.75rem;\n min-width: 1.75rem;\n padding-left: 0;\n padding-right: 0;\n}\n\n/* Keep generic styling for bubble menu buttons if custom classes not applied */\n.bubble-menu button {\n background: transparent;\n color: inherit;\n border: none;\n border-radius: 0.5rem;\n padding: 0.25rem 0.4rem;\n cursor: pointer;\n}\n\n.bubble-menu button:hover {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n}\n\n.bubble-menu button.is-active,\n.bubble-menu button[aria-pressed=\"true\"],\n.nph-btn.is-active,\n.nph-btn[aria-pressed=\"true\"] {\n /* Subtle, neutral active state */\n background-color: var(--accent, rgba(0, 0, 0, 0.08));\n color: inherit;\n}\n\n.bubble-menu button.is-active:hover,\n.bubble-menu button[aria-pressed=\"true\"]:hover,\n.nph-btn.is-active:hover,\n.nph-btn[aria-pressed=\"true\"]:hover {\n background-color: var(--accent-hover, rgba(0, 0, 0, 0.12));\n}\n\n/* Basic input style for small inline editors */\n.nph-input {\n width: 100%;\n border: 1px solid var(--border, rgba(127, 127, 127, 0.3));\n background: var(--background, transparent);\n color: inherit;\n border-radius: 0.375rem;\n}\n\n/* Link popover pill */\n.nph-link-popover {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--background, #fff);\n color: inherit;\n border: 1px solid var(--border, rgba(127, 127, 127, 0.3));\n border-radius: 0.7rem; /* match bubble-menu corners */\n box-shadow: var(--shadow, 0 4px 16px rgba(0, 0, 0, 0.08));\n padding: 6px 8px;\n}\n.nph-link-popover__input {\n appearance: none;\n border: none;\n background: transparent;\n color: inherit;\n outline: none;\n min-width: 200px;\n font-size: 14px;\n}\n.nph-link-popover__divider {\n width: 1px;\n height: 18px;\n background: var(--border, rgba(127, 127, 127, 0.3));\n margin: 0 2px;\n}\n\n@media (prefers-color-scheme: dark) {\n .nph-link-popover {\n background: var(--background, #111);\n border-color: var(--border, rgba(255, 255, 255, 0.16));\n box-shadow: var(--shadow, 0 8px 24px rgba(0, 0, 0, 0.4));\n }\n .nph-link-popover__divider {\n background: var(--border, rgba(255, 255, 255, 0.16));\n }\n}\n\n@media (prefers-color-scheme: dark) {\n .bubble-menu button.is-active,\n .bubble-menu button[aria-pressed=\"true\"] {\n background-color: var(--accent, rgba(255, 255, 255, 0.14));\n }\n .bubble-menu button.is-active:hover,\n .bubble-menu button[aria-pressed=\"true\"]:hover {\n background-color: var(--accent-hover, rgba(255, 255, 255, 0.18));\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/styles.css"],"sourcesContent":["/* Neuphlo Editor default styles (TipTap-friendly) */\n/* Note: Highlight.js theme is now optional. Import\n 'neuphlo-editor/highlight.css' or your preferred theme separately. */\n\n:root {\n --nph-z: 9999;\n}\n\n.nph-editor,\n.ProseMirror.nph-editor {\n min-height: 240px;\n line-height: 1.65;\n color: inherit;\n caret-color: currentColor;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n word-break: break-word;\n}\n\n/* Trim outer spacing */\n.nph-editor > *:first-child,\n.ProseMirror.nph-editor > *:first-child {\n margin-top: 0;\n}\n.nph-editor > *:last-child,\n.ProseMirror.nph-editor > *:last-child {\n margin-bottom: 0;\n}\n\n/* Paragraphs */\n.nph-editor p,\n.ProseMirror.nph-editor p {\n margin: 0.75em 0;\n}\n\n/* Headings */\n.nph-editor h1,\n.nph-editor h2,\n.nph-editor h3,\n.nph-editor h4,\n.nph-editor h5,\n.nph-editor h6,\n.ProseMirror.nph-editor h1,\n.ProseMirror.nph-editor h2,\n.ProseMirror.nph-editor h3,\n.ProseMirror.nph-editor h4,\n.ProseMirror.nph-editor h5,\n.ProseMirror.nph-editor h6 {\n line-height: 1.2;\n font-weight: 700;\n margin-top: 2.5rem;\n margin-bottom: 0.75rem;\n text-wrap: pretty;\n}\n.nph-editor h1,\n.nph-editor h2,\n.ProseMirror.nph-editor h1,\n.ProseMirror.nph-editor h2 {\n margin-top: 3rem;\n margin-bottom: 1rem;\n}\n.nph-editor h1,\n.ProseMirror.nph-editor h1 {\n font-size: 1.5rem;\n}\n.nph-editor h2,\n.ProseMirror.nph-editor h2 {\n font-size: 1.25rem;\n}\n.nph-editor h3,\n.ProseMirror.nph-editor h3 {\n font-size: 1.125rem;\n}\n.nph-editor h4,\n.nph-editor h5,\n.nph-editor h6,\n.ProseMirror.nph-editor h4,\n.ProseMirror.nph-editor h5,\n.ProseMirror.nph-editor h6 {\n font-size: 1rem;\n}\n\n/* Lists */\n.nph-editor ul,\n.nph-editor ol,\n.ProseMirror.nph-editor ul,\n.ProseMirror.nph-editor ol {\n padding-left: 1.25rem;\n margin: 1.25rem 1rem 1.25rem 0.4rem;\n}\n.nph-editor ul,\n.ProseMirror.nph-editor ul {\n list-style: disc outside;\n}\n.nph-editor ul ul,\n.ProseMirror.nph-editor ul ul {\n list-style: circle outside;\n}\n.nph-editor ul ul ul,\n.ProseMirror.nph-editor ul ul ul {\n list-style: square outside;\n}\n.nph-editor ol,\n.ProseMirror.nph-editor ol {\n list-style: decimal outside;\n}\n.nph-editor li p,\n.ProseMirror.nph-editor li p {\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n\n/* Blockquote */\n.nph-editor blockquote,\n.ProseMirror.nph-editor blockquote {\n border-left: 3px solid var(--border, rgba(0, 0, 0, 0.12));\n margin: 1.5rem 0;\n padding-left: 1rem;\n color: var(--muted-foreground, #6b7280);\n}\n\n/* Code (inline) */\n.nph-editor code,\n.ProseMirror.nph-editor code {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n border-radius: 0.375rem;\n color: inherit;\n font-size: 0.875em;\n padding: 0.15em 0.35em;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n\n/* Code blocks */\n.nph-editor pre,\n.ProseMirror.nph-editor pre {\n background: var(--muted, #f4f4f5);\n border-radius: 0.5rem;\n color: var(--foreground, #111827);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n margin: 1.5rem 0;\n padding: 0.75rem 1rem;\n overflow-x: auto;\n}\n.nph-editor pre code,\n.ProseMirror.nph-editor pre code {\n background: none;\n color: inherit;\n font-size: 0.85em;\n padding: 0;\n}\n/* Normalize highlight.js base element to integrate with our block styling */\n.nph-editor pre code.hljs,\n.ProseMirror.nph-editor pre code.hljs {\n display: block;\n background: none;\n padding: 0;\n}\n\n/* Horizontal rule */\n.nph-editor hr,\n.ProseMirror.nph-editor hr {\n border: none;\n border-top: 1px solid var(--border, rgba(0, 0, 0, 0.12));\n margin: 2rem 0;\n}\n\n/* Links */\n.nph-editor a,\n.ProseMirror.nph-editor a {\n color: var(--primary, #2563eb);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n/* Images */\n.nph-editor img,\n.ProseMirror.nph-editor img {\n max-width: 100%;\n height: auto;\n display: block;\n border: 1px solid var(--border, rgba(0, 0, 0, 0.12));\n border-radius: 0.5rem;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);\n}\n\n/* Image alignment */\n.nph-editor img[data-align=\"left\"],\n.ProseMirror.nph-editor img[data-align=\"left\"] {\n float: left;\n margin-right: 1rem;\n margin-bottom: 0.5rem;\n clear: left;\n}\n\n.nph-editor img[data-align=\"center\"],\n.ProseMirror.nph-editor img[data-align=\"center\"] {\n display: block;\n margin-left: auto;\n margin-right: auto;\n clear: both;\n}\n\n.nph-editor img[data-align=\"right\"],\n.ProseMirror.nph-editor img[data-align=\"right\"] {\n float: right;\n margin-left: 1rem;\n margin-bottom: 0.5rem;\n clear: right;\n}\n\n/* Clear floats after headings to prevent layout issues */\n.nph-editor h1,\n.nph-editor h2,\n.nph-editor h3,\n.nph-editor h4,\n.nph-editor h5,\n.nph-editor h6,\n.ProseMirror.nph-editor h1,\n.ProseMirror.nph-editor h2,\n.ProseMirror.nph-editor h3,\n.ProseMirror.nph-editor h4,\n.ProseMirror.nph-editor h5,\n.ProseMirror.nph-editor h6 {\n clear: both;\n}\n\n/* Tables */\n.nph-editor table,\n.ProseMirror.nph-editor table {\n width: 100%;\n table-layout: auto;\n border-collapse: collapse;\n margin: 1.25rem 0;\n}\n.nph-editor th,\n.nph-editor td,\n.ProseMirror.nph-editor th,\n.ProseMirror.nph-editor td {\n border: 1px solid var(--border, rgba(0, 0, 0, 0.12));\n padding: 0.5rem 0.75rem;\n vertical-align: top;\n}\n.nph-editor th,\n.ProseMirror.nph-editor th {\n background: var(--muted, #f4f4f5);\n font-weight: 600;\n}\n\n/* Task list (if enabled) */\n.nph-editor ul[data-type=\"taskList\"],\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] {\n list-style: none;\n padding-left: 0;\n}\n.nph-editor ul[data-type=\"taskList\"] li,\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] li {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n.nph-editor ul[data-type=\"taskList\"] li > label,\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n user-select: none;\n}\n.nph-editor ul[data-type=\"taskList\"] li input[type=\"checkbox\"],\n.ProseMirror.nph-editor ul[data-type=\"taskList\"] li input[type=\"checkbox\"] {\n margin: 0.25rem 0.5rem 0 0;\n}\n\n/* ProseMirror helpers */\n.nph-editor .ProseMirror-gapcursor,\n.ProseMirror.nph-editor .ProseMirror-gapcursor {\n display: none;\n}\n.nph-editor .ProseMirror-selectednode,\n.ProseMirror.nph-editor .ProseMirror-selectednode {\n outline: 2px solid var(--ring, rgba(59, 130, 246, 0.5));\n}\n\n/* Placeholder (requires Placeholder extension) */\n.nph-editor p.is-editor-empty:first-child::before,\n.ProseMirror.nph-editor p.is-editor-empty:first-child::before {\n color: var(--muted-foreground, #6b7280);\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n}\n\n/* ------------------\n Bubble menu & dropdown\n ------------------ */\n.bubble-menu {\n /* Themed surface */\n background-color: var(--background, #ffffff);\n color: var(--foreground, #111827);\n border: 1px solid var(--border, rgba(0, 0, 0, 0.08));\n border-radius: 0.7rem;\n box-shadow: var(--shadow, 0 4px 16px rgba(0, 0, 0, 0.08));\n\n /* Layout */\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem;\n font-size: 0.875rem; /* ~text-sm */\n\n /* Keep menu content visible for dropdowns */\n max-width: calc(100vw - 16px);\n overflow: visible; /* allow inner dropdown to escape the shell */\n\n /* On top of editor */\n position: relative;\n z-index: var(--nph-z) !important;\n}\n\n/* Ensure Tiptap/Tippy bubble root stacks high */\n[data-tippy-root],\n.tippy-box {\n z-index: var(--nph-z) !important;\n}\n\n/* Generic dropdown container and panel (used in TextMenu) */\n.nph-dropdown {\n position: relative;\n}\n.nph-dropdown__panel {\n position: absolute;\n top: 100%;\n left: 0;\n margin-top: 0.25rem;\n min-width: 11rem;\n z-index: calc(var(--nph-z) + 1) !important; /* above the bubble itself */\n}\n\n/* Command menu (slash menu & the block-type panel) */\n.nph-command {\n background-color: var(--background, #ffffff);\n color: var(--foreground, #111827);\n border: 1px solid var(--border, rgba(0, 0, 0, 0.08));\n border-radius: 0.5rem;\n box-shadow: var(--shadow, 0 4px 16px rgba(0, 0, 0, 0.08));\n padding: 0.25rem;\n}\n\n.nph-command__list {\n list-style: none;\n margin: 0;\n padding: 0.125rem;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n max-height: 320px;\n overflow: auto;\n /* Show only the thumb (pill), hide track */\n scrollbar-width: thin; /* Firefox */\n scrollbar-color: #e5e7eb transparent; /* thumb track */\n}\n\n/* WebKit: keep a small thumb, hide the track */\n.nph-command__list::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n background: transparent;\n}\n.nph-command__list::-webkit-scrollbar-track {\n background: transparent;\n}\n.nph-command__list::-webkit-scrollbar-thumb {\n background-color: #e5e7eb;\n border-radius: 9999px;\n}\n.nph-command__list:hover::-webkit-scrollbar-thumb {\n background-color: #d1d5db;\n}\n\n@media (prefers-color-scheme: dark) {\n .nph-command__list {\n scrollbar-color: #4b5563 transparent;\n }\n .nph-command__list::-webkit-scrollbar-thumb {\n background-color: #4b5563;\n }\n .nph-command__list:hover::-webkit-scrollbar-thumb {\n background-color: #6b7280;\n }\n}\n\n.nph-command__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n border-radius: 0.375rem;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n}\n\n.nph-command__item:hover {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n}\n\n.nph-command__item.is-active,\n.nph-command__item[aria-selected=\"true\"] {\n background-color: var(--accent, rgba(0, 0, 0, 0.08));\n}\n\n@media (prefers-color-scheme: dark) {\n .nph-command__item.is-active,\n .nph-command__item[aria-selected=\"true\"] {\n background-color: var(--accent, rgba(255, 255, 255, 0.14));\n }\n}\n\n/* Base buttons for headless UI */\n.nph-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n border-radius: 0.375rem; /* rounded-md */\n font-size: 0.875rem; /* text-sm */\n font-weight: 500; /* font-medium */\n transition:\n background-color 0.2s ease,\n color 0.2s ease,\n box-shadow 0.2s ease;\n outline: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n background: transparent;\n color: inherit;\n border: none;\n}\n\n.nph-btn:focus-visible {\n outline: 2px solid var(--ring, rgba(59, 130, 246, 0.5));\n outline-offset: 2px; /* ring-offset */\n}\n\n.nph-btn:disabled {\n pointer-events: none;\n opacity: 0.5;\n}\n\n/* Ghost variant */\n.nph-btn-ghost {\n background: transparent;\n}\n.nph-btn-ghost:hover {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n}\n\n/* Size: sm */\n.nph-btn-sm {\n height: 2.25rem;\n padding: 0 0.75rem;\n}\n\n/* Size: xs (more compact than sm) */\n.nph-btn-xs {\n height: 1.75rem;\n padding: 0 0.5rem;\n font-size: 0.8125rem;\n}\n\n/* Icon variant: square buttons with equal width/height */\n.nph-btn-icon {\n width: 1.75rem;\n min-width: 1.75rem;\n padding-left: 0;\n padding-right: 0;\n}\n\n/* Keep generic styling for bubble menu buttons if custom classes not applied */\n.bubble-menu button {\n background: transparent;\n color: inherit;\n border: none;\n border-radius: 0.5rem;\n padding: 0.25rem 0.4rem;\n cursor: pointer;\n}\n\n.bubble-menu button:hover {\n background-color: var(--muted, rgba(127, 127, 127, 0.12));\n}\n\n.bubble-menu button.is-active,\n.bubble-menu button[aria-pressed=\"true\"],\n.nph-btn.is-active,\n.nph-btn[aria-pressed=\"true\"] {\n /* Subtle, neutral active state */\n background-color: var(--accent, rgba(0, 0, 0, 0.08));\n color: inherit;\n}\n\n.bubble-menu button.is-active:hover,\n.bubble-menu button[aria-pressed=\"true\"]:hover,\n.nph-btn.is-active:hover,\n.nph-btn[aria-pressed=\"true\"]:hover {\n background-color: var(--accent-hover, rgba(0, 0, 0, 0.12));\n}\n\n/* Basic input style for small inline editors */\n.nph-input {\n width: 100%;\n border: 1px solid var(--border, rgba(127, 127, 127, 0.3));\n background: var(--background, transparent);\n color: inherit;\n border-radius: 0.375rem;\n}\n\n/* Link popover pill */\n.nph-link-popover {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--background, #fff);\n color: inherit;\n border: 1px solid var(--border, rgba(127, 127, 127, 0.3));\n border-radius: 0.7rem; /* match bubble-menu corners */\n box-shadow: var(--shadow, 0 4px 16px rgba(0, 0, 0, 0.08));\n padding: 6px 8px;\n}\n.nph-link-popover__input {\n appearance: none;\n border: none;\n background: transparent;\n color: inherit;\n outline: none;\n min-width: 200px;\n font-size: 14px;\n}\n.nph-link-popover__divider {\n width: 1px;\n height: 18px;\n background: var(--border, rgba(127, 127, 127, 0.3));\n margin: 0 2px;\n}\n\n@media (prefers-color-scheme: dark) {\n .nph-link-popover {\n background: var(--background, #111);\n border-color: var(--border, rgba(255, 255, 255, 0.16));\n box-shadow: var(--shadow, 0 8px 24px rgba(0, 0, 0, 0.4));\n }\n .nph-link-popover__divider {\n background: var(--border, rgba(255, 255, 255, 0.16));\n }\n}\n\n@media (prefers-color-scheme: dark) {\n .bubble-menu button.is-active,\n .bubble-menu button[aria-pressed=\"true\"] {\n background-color: var(--accent, rgba(255, 255, 255, 0.14));\n }\n .bubble-menu button.is-active:hover,\n .bubble-menu button[aria-pressed=\"true\"]:hover {\n background-color: var(--accent-hover, rgba(255, 255, 255, 0.18));\n }\n}\n"],"mappings":"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","names":[]}
@@ -748,8 +748,20 @@ function TextMenu({ className }) {
748
748
  BubbleMenu,
749
749
  {
750
750
  editor,
751
- shouldShow: ({ from, to }) => {
752
- return from !== to;
751
+ shouldShow: ({ editor: e, state, from, to, view }) => {
752
+ if (e.isActive("image")) return false;
753
+ const { selection } = state;
754
+ if (selection.constructor.name === "NodeSelection") return false;
755
+ if (from === to) return false;
756
+ let hasImage = false;
757
+ state.doc.nodesBetween(from, to, (node) => {
758
+ if (node.type.name === "image") {
759
+ hasImage = true;
760
+ return false;
761
+ }
762
+ });
763
+ if (hasImage) return false;
764
+ return true;
753
765
  },
754
766
  children: /* @__PURE__ */ jsxs3("div", { className: className ? `bubble-menu ${className}` : "bubble-menu", children: [
755
767
  /* @__PURE__ */ jsx3(MenuList, { editor }),
@@ -1192,9 +1204,13 @@ function ImageMenu({ className }) {
1192
1204
  BubbleMenu2,
1193
1205
  {
1194
1206
  editor,
1195
- shouldShow: ({ editor: e }) => {
1196
- return e.isActive("image");
1207
+ shouldShow: ({ editor: e, state }) => {
1208
+ if (!e.isActive("image")) return false;
1209
+ const { selection } = state;
1210
+ const isNodeSelection = selection.constructor.name === "NodeSelection";
1211
+ return isNodeSelection;
1197
1212
  },
1213
+ updateDelay: 0,
1198
1214
  children: /* @__PURE__ */ jsxs5("div", { className: className ? `bubble-menu ${className}` : "bubble-menu", children: [
1199
1215
  /* @__PURE__ */ jsxs5(
1200
1216
  "div",
@@ -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: 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"]}
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={({ editor: e, state, from, to, view }) => {\n // Don't show if an image is active anywhere\n if (e.isActive(\"image\")) return false\n\n // Don't show for node selections\n const { selection } = state\n if (selection.constructor.name === \"NodeSelection\") return false\n\n // Don't show if selection is empty\n if (from === to) return false\n\n // Check if the selection contains an image node\n let hasImage = false\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === \"image\") {\n hasImage = true\n return false\n }\n })\n if (hasImage) return false\n\n // Show only for text selections\n return true\n }}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n <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, state }) => {\n // Only show when an image node is selected\n if (!e.isActive(\"image\")) return false\n\n // Check if we have a node selection (clicking on image)\n const { selection } = state\n const isNodeSelection = selection.constructor.name === \"NodeSelection\"\n\n // Only show for node selections (when clicking directly on the image)\n // This prevents showing when there's a text selection that includes an image\n return isNodeSelection\n }}\n updateDelay={0}\n >\n <div className={className ? `bubble-menu ${className}` : \"bubble-menu\"}>\n <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"]}
package/dist/styles.css CHANGED
@@ -178,6 +178,9 @@
178
178
  max-width: 100%;
179
179
  height: auto;
180
180
  display: block;
181
+ border: 1px solid var(--border, rgba(0, 0, 0, 0.12));
182
+ border-radius: 0.5rem;
183
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
181
184
  }
182
185
 
183
186
  /* Image alignment */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neuphlo-editor",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "private": false,
5
5
  "description": "A lightweight React wrapper around Tiptap with sensible defaults and image upload support.",
6
6
  "type": "module",