@firecms/editor 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/components/editor-bubble.tsx","../src/components/editor-bubble-item.tsx","../src/selectors/node-selector.tsx","../src/selectors/link-selector.tsx","../src/selectors/text-buttons.tsx","../src/utils/remove_classes.ts","../src/extensions/TextLoadingDecorationExtension.tsx","../src/extensions/index.ts","../src/editor_extensions.tsx","../src/extensions/Image.ts","../src/extensions/custom-keymap.ts","../src/extensions/clipboard.ts","../src/extensions/drag-and-drop.tsx","../src/extensions/HighlightDecorationExtension.ts","../src/extensions/slashCommand.tsx","../src/editor.tsx"],"sourcesContent":["import { useCurrentEditor } from \"@tiptap/react\";\nimport { forwardRef, type ReactNode, useMemo } from \"react\";\n// @ts-ignore\nimport { BubbleMenu, type BubbleMenuProps } from \"@tiptap/react/menus\";\nimport { NodeSelection } from \"@tiptap/pm/state\";\n\nexport interface EditorBubbleProps extends Omit<BubbleMenuProps, \"editor\"> {\n children: ReactNode;\n // Temporary backward-compat: map v2 tippyOptions.placement -> v3 options.placement\n tippyOptions?: { placement?: any };\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({ children, tippyOptions, options, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n\n const bubbleMenuProps: Omit<BubbleMenuProps, \"editor\" | \"children\"> = useMemo(() => {\n const shouldShow: BubbleMenuProps[\"shouldShow\"] = ({ editor, state }:any) => {\n const { selection } = state;\n const { empty } = selection as any;\n\n // don't show bubble menu if:\n // - the selected node is an image\n // - the selection is empty\n // - the selection is a node selection (for drag handles)\n if (editor.isActive(\"image\") || empty || selection instanceof NodeSelection) {\n return false;\n }\n return true;\n };\n\n const mergedOptions = {\n ...options,\n // map deprecated tippy placement if provided\n placement: tippyOptions?.placement ?? options?.placement,\n } as BubbleMenuProps[\"options\"];\n\n return {\n shouldShow,\n options: mergedOptions,\n ...rest,\n };\n }, [rest, options, tippyOptions?.placement]);\n\n if (!editor) return null;\n\n return (\n // We need to add this because of https://github.com/ueberdosis/tiptap/issues/2658\n <div ref={ref}>\n <BubbleMenu editor={editor} {...bubbleMenuProps}>\n {children}\n </BubbleMenu>\n </div>\n );\n }\n);\n\nexport default EditorBubble;\n","import { type ComponentPropsWithoutRef, type ReactNode, forwardRef } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { useCurrentEditor, type Editor } from \"@tiptap/react\";\n\ninterface EditorBubbleItemProps {\n children: ReactNode;\n asChild?: boolean;\n onSelect?: (editor: Editor) => void;\n}\n\nexport const EditorBubbleItem = forwardRef<\n HTMLDivElement,\n EditorBubbleItemProps & Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\">\n>(({ children, asChild, onSelect, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n const Comp = asChild ? Slot : \"div\";\n\n if (!editor) return null;\n\n return (\n <Comp ref={ref} {...rest} onClick={() => onSelect?.(editor)}>\n {children}\n </Comp>\n );\n});\n\nEditorBubbleItem.displayName = \"EditorBubbleItem\";\n\nexport default EditorBubbleItem;\n","import React from \"react\";\nimport { EditorBubbleItem, useEditor } from \"../components\";\n\nimport {\n Button,\n CheckBoxIcon,\n CheckIcon,\n CodeIcon,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n KeyboardArrowDownIcon,\n Looks3Icon,\n LooksOneIcon,\n LooksTwoIcon,\n Popover,\n TextFieldsIcon\n} from \"@firecms/ui\";\n\nexport type SelectorItem = {\n name: string;\n icon: React.ElementType;\n command: (editor: ReturnType<typeof useEditor>[\"editor\"]) => void;\n isActive: (editor: ReturnType<typeof useEditor>[\"editor\"]) => boolean;\n};\n\nconst items: SelectorItem[] = [\n {\n name: \"Text\",\n icon: TextFieldsIcon,\n command: (editor) =>\n editor?.chain().focus().toggleNode(\"paragraph\", \"paragraph\").run(),\n // I feel like there has to be a more efficient way to do this – feel free to PR if you know how!\n isActive: (editor) =>\n (editor?.isActive(\"paragraph\") &&\n !editor?.isActive(\"bulletList\") &&\n !editor?.isActive(\"orderedList\")) ?? false,\n },\n {\n name: \"Heading 1\",\n icon: LooksOneIcon,\n command: (editor) =>\n editor?.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: (editor) => editor?.isActive(\"heading\", { level: 1 }) ?? false,\n },\n {\n name: \"Heading 2\",\n icon: LooksTwoIcon,\n command: (editor) =>\n editor?.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (editor) => editor?.isActive(\"heading\", { level: 2 }) ?? false,\n },\n {\n name: \"Heading 3\",\n icon: Looks3Icon,\n command: (editor) =>\n editor?.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: (editor) => editor?.isActive(\"heading\", { level: 3 }) ?? false,\n },\n {\n name: \"To-do List\",\n icon: CheckBoxIcon,\n command: (editor) => editor?.chain().focus().toggleTaskList().run(),\n isActive: (editor) => editor?.isActive(\"taskItem\") ?? false,\n },\n {\n name: \"Bullet List\",\n icon: FormatListBulletedIcon,\n command: (editor) => editor?.chain().focus().toggleBulletList().run(),\n isActive: (editor) => editor?.isActive(\"bulletList\") ?? false,\n },\n {\n name: \"Numbered List\",\n icon: FormatListNumberedIcon,\n command: (editor) => editor?.chain().focus().toggleOrderedList().run(),\n isActive: (editor) => editor?.isActive(\"orderedList\") ?? false,\n },\n {\n name: \"Quote\",\n icon: FormatQuoteIcon,\n command: (editor) => editor?.chain()\n .focus()\n .toggleNode(\"paragraph\", \"paragraph\")\n .toggleBlockquote()\n .run(),\n isActive: (editor) => editor?.isActive(\"blockquote\") ?? false,\n },\n {\n name: \"Code\",\n icon: CodeIcon,\n command: (editor) => editor?.chain().focus().toggleCodeBlock().run(),\n isActive: (editor) => editor?.isActive(\"codeBlock\") ?? false,\n },\n];\n\ninterface NodeSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n portalContainer: HTMLElement | null;\n}\n\nexport const NodeSelector = ({\n open,\n onOpenChange,\n portalContainer\n }: NodeSelectorProps) => {\n const { editor } = useEditor();\n if (!editor) return null;\n const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? {\n name: \"Multiple\",\n };\n\n return (\n\n <Popover\n sideOffset={5}\n align=\"start\"\n portalContainer={portalContainer}\n className=\"w-48 p-1\"\n trigger={<Button variant=\"text\"\n className=\"gap-2 rounded-none\"\n color=\"text\">\n <span className=\"whitespace-nowrap text-sm\">{activeItem.name}</span>\n <KeyboardArrowDownIcon size={\"small\"}/>\n </Button>}\n modal={true}\n open={open}\n onOpenChange={onOpenChange}>\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={(editor) => {\n item.command(editor);\n onOpenChange(false);\n }}\n className=\"flex cursor-pointer items-center justify-between rounded px-2 py-1 text-sm hover:bg-blue-50 hover:dark:bg-surface-700 text-surface-900 dark:text-white\"\n >\n <div className=\"flex items-center space-x-2\">\n <item.icon size=\"smallest\"/>\n <span>{item.name}</span>\n </div>\n {activeItem.name === item.name && <CheckIcon size=\"smallest\"/>}\n </EditorBubbleItem>\n ))}\n\n </Popover>\n );\n};\n","import { useEditor } from \"../components\";\nimport { useEffect, useRef, } from \"react\";\nimport { Button, CheckIcon, cls, DeleteIcon, focusedDisabled, Popover } from \"@firecms/ui\";\n\nexport function isValidUrl(url: string) {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function getUrlFromString(str: string) {\n if (isValidUrl(str)) return str;\n try {\n if (str.includes(\".\") && !str.includes(\" \")) {\n return new URL(`https://${str}`).toString();\n }\n return null;\n } catch (e) {\n return null;\n }\n}\n\ninterface LinkSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const LinkSelector = ({\n open,\n onOpenChange\n }: LinkSelectorProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { editor } = useEditor();\n\n // Autofocus on input by default\n useEffect(() => {\n inputRef.current && inputRef.current?.focus();\n });\n\n if (!editor) return null;\n\n return (\n <Popover modal={true}\n open={open}\n onOpenChange={onOpenChange}\n trigger={<Button variant=\"text\"\n className=\"gap-2 rounded-none\"\n color={\"text\"}>\n <p className={cls(\"underline decoration-stone-400 underline-offset-4\", {\n \"text-blue-500\": editor.isActive(\"link\"),\n })}>\n Link\n </p>\n </Button>}>\n <form\n onSubmit={(e) => {\n const target = e.currentTarget as HTMLFormElement;\n e.preventDefault();\n const input = target[0] as HTMLInputElement;\n const url = getUrlFromString(input.value);\n url && editor.chain().focus().setLink({ href: url }).run();\n }}\n className=\"flex p-1\"\n >\n <input\n ref={inputRef}\n autoFocus={open}\n placeholder=\"Paste a link\"\n defaultValue={editor.getAttributes(\"link\").href || \"\"}\n className={cls(\"text-surface-900 dark:text-white flex-grow bg-transparent p-1 text-sm outline-none\", focusedDisabled)}/>\n\n {editor.getAttributes(\"link\").href ? (\n <Button\n size={\"small\"}\n variant=\"text\"\n type=\"button\"\n color={\"text\"}\n className=\"flex items-center\"\n onClick={() => {\n editor.chain().focus().unsetLink().run();\n }}\n >\n <DeleteIcon size=\"small\"/>\n </Button>\n ) : (\n <Button size={\"small\"}\n variant={\"text\"}>\n <CheckIcon size=\"small\"/>\n </Button>\n )}\n </form>\n </Popover>\n );\n};\n","import { EditorBubbleItem, useEditor } from \"../components\";\nimport type { SelectorItem } from \"./node-selector\";\nimport {\n Button,\n cls,\n CodeIcon,\n FormatBoldIcon,\n FormatItalicIcon,\n FormatStrikethroughIcon,\n FormatUnderlinedIcon\n} from \"@firecms/ui\";\n\nexport const TextButtons = () => {\n const { editor } = useEditor();\n if (!editor) return null;\n const items: SelectorItem[] = [\n {\n name: \"bold\",\n isActive: (editor) => editor?.isActive(\"bold\") ?? false,\n command: (editor) => editor?.chain().focus().toggleBold().run(),\n icon: FormatBoldIcon,\n },\n {\n name: \"italic\",\n isActive: (editor) => editor?.isActive(\"italic\") ?? false,\n command: (editor) => editor?.chain().focus().toggleItalic().run(),\n icon: FormatItalicIcon,\n },\n {\n name: \"underline\",\n isActive: (editor) => editor?.isActive(\"underline\") ?? false,\n command: (editor) => editor?.chain().focus().toggleUnderline().run(),\n icon: FormatUnderlinedIcon,\n },\n {\n name: \"strike\",\n isActive: (editor) => editor?.isActive(\"strike\") ?? false,\n command: (editor) => editor?.chain().focus().toggleStrike().run(),\n icon: FormatStrikethroughIcon,\n },\n {\n name: \"code\",\n isActive: (editor) => editor?.isActive(\"code\") ?? false,\n command: (editor) => editor?.chain().focus().toggleCode().run(),\n icon: CodeIcon,\n },\n ];\n return (\n <div className=\"flex\">\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={(editor) => {\n item.command(editor);\n }}\n >\n <Button size={\"small\"}\n color=\"text\"\n className=\"gap-2 rounded-none h-full\"\n variant=\"text\">\n <item.icon\n className={cls( {\n \"text-inherit\": !item.isActive(editor),\n \"text-blue-500\": item.isActive(editor),\n })}\n />\n </Button>\n </EditorBubbleItem>\n ))}\n </div>\n );\n};\n","export function removeClassesFromJson(jsonObj: any): any {\n // If it's an array, apply the function to each element\n if (Array.isArray(jsonObj)) {\n return jsonObj.map(item => removeClassesFromJson(item));\n } else if (typeof jsonObj === \"object\" && jsonObj !== null) { // If it's an object, recurse through its properties\n // If the object has an `attrs` property and `class` field, delete the `class` field\n if (jsonObj.attrs && typeof jsonObj.attrs === \"object\" && \"class\" in jsonObj.attrs) {\n delete jsonObj.attrs.class;\n }\n\n // Apply the function recursively to object properties\n Object.keys(jsonObj).forEach(key => {\n jsonObj[key] = removeClassesFromJson(jsonObj[key]);\n });\n }\n return jsonObj;\n}\n","import { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { Command, Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n textLoadingDecoration: {\n toggleLoadingDecoration: (loadingHtml?: string) => ReturnType;\n removeLoadingDecoration: () => ReturnType;\n };\n }\n}\n\n// Define and export the plugin key\nexport const loadingDecorationKey = new PluginKey<LoadingDecorationState>(\"loadingDecoration\");\n\ninterface LoadingDecorationState {\n decorationSet: DecorationSet;\n hasDecoration: boolean;\n}\n\n // this decoration is used to display streaming content from an LLM, called withing the slash command\nconst TextLoadingDecorationExtension = Extension.create({\n name: \"loadingDecoration\",\n\n addOptions() {\n return {\n pluginKey: loadingDecorationKey\n };\n },\n\n addProseMirrorPlugins() {\n const pluginKey = this.options.pluginKey;\n\n return [\n new Plugin<LoadingDecorationState>({\n key: pluginKey,\n\n state: {\n init() {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n },\n\n apply(tr, oldState) {\n const action = tr.getMeta(pluginKey);\n\n if (action?.type === \"loadingDecoration\") {\n const { pos, remove, loadingHtml } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n }\n\n const decoration = Decoration.widget(pos, () => {\n const container = document.createElement(\"span\");\n container.className = \"loading-decoration\";\n\n // Sanitize and append HTML\n if (loadingHtml) {\n container.innerHTML = loadingHtml;\n } else {\n const span = document.createElement(\"span\");\n span.innerText = \"loading...\";\n container.appendChild(span);\n }\n\n return container;\n });\n\n return {\n decorationSet: DecorationSet.empty.add(tr.doc, [decoration]),\n hasDecoration: true\n };\n }\n\n return {\n decorationSet: oldState.decorationSet.map(tr.mapping, tr.doc),\n hasDecoration: oldState.hasDecoration\n };\n }\n },\n\n props: {\n decorations(state) {\n return this.getState(state)?.decorationSet || DecorationSet.empty;\n }\n }\n })\n ];\n },\n\n addCommands() {\n return {\n toggleLoadingDecoration: (loadingHtml?: string): Command => ({ state, dispatch }) => {\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n\n const tr = state.tr.setMeta(pluginKey, {\n pos,\n type: \"loadingDecoration\",\n remove: false,\n loadingHtml\n });\n\n dispatch(tr);\n return true;\n },\n\n removeLoadingDecoration: (): Command => ({ state, dispatch }) => {\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n const tr = state.tr.setMeta(pluginKey, {\n pos: 0, // We can pass any position as it will remove the entire decoration set\n type: \"loadingDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n };\n }\n});\n\nexport default TextLoadingDecorationExtension;\n","import StarterKit from \"@tiptap/starter-kit\";\nimport HorizontalRule from \"@tiptap/extension-horizontal-rule\";\nimport TiptapLink from \"@tiptap/extension-link\";\nimport TiptapImage from \"@tiptap/extension-image\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\n\nimport { TaskItem } from \"@tiptap/extension-task-item\";\nimport { TaskList } from \"@tiptap/extension-task-list\";\nimport { Editor, InputRule } from \"@tiptap/core\";\nimport { loadingDecorationKey } from \"./TextLoadingDecorationExtension\";\n\nconst PlaceholderExtension = Placeholder.configure({\n placeholder: ({\n node,\n editor\n }) => {\n const {\n from,\n to\n } = editor.state.selection;\n\n function hasLoadingDecoration(editor: Editor): boolean {\n const pluginState = loadingDecorationKey.get(editor.state);\n return pluginState?.getState(editor.state)?.hasDecoration ?? false;\n }\n\n const hasDecoration = hasLoadingDecoration(editor);\n\n if (hasDecoration) {\n return \"\";\n }\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`;\n }\n if (node.type.name === \"paragraph\") {\n return \"Press '/' for commands\";\n }\n return \"\";\n },\n includeChildren: true\n});\n\nconst Horizontal = HorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({\n state,\n range\n }) => {\n const attributes = {};\n\n const { tr } = state;\n const start = range.from;\n const end = range.to;\n\n tr.insert(start - 1, this.type.create(attributes) as any).delete(\n tr.mapping.map(start),\n tr.mapping.map(end)\n );\n }\n })\n ];\n }\n});\n\nexport {\n PlaceholderExtension as Placeholder,\n StarterKit,\n Horizontal as HorizontalRule,\n TiptapLink,\n TiptapImage,\n TaskItem,\n TaskList,\n InputRule\n};\n\nexport { getPrevText } from \"../utils/utils\";\n","import StarterKit from \"@tiptap/starter-kit\";\n\nimport { HorizontalRule, Placeholder, TaskItem, TaskList, TiptapLink, } from \"./extensions\";\n\nimport { cls, defaultBorderMixin } from \"@firecms/ui\";\nimport OrderedList from \"@tiptap/extension-ordered-list\";\nimport BulletList from \"@tiptap/extension-bullet-list\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport CodeBlock from \"@tiptap/extension-code-block\";\nimport Blockquote from \"@tiptap/extension-blockquote\";\nimport Code from \"@tiptap/extension-code\";\n\nexport const placeholder = Placeholder;\n\nexport const tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n class: cls(\n \"text-surface-700 dark:text-surface-accent-200 underline underline-offset-[3px] hover:text-primary transition-colors cursor-pointer\",\n ),\n },\n});\n\nexport const taskList = TaskList.configure({\n HTMLAttributes: {\n class: cls(\"not-prose\"),\n },\n});\nexport const taskItem = TaskItem.configure({\n HTMLAttributes: {\n class: cls(\"flex items-start my-4\"),\n },\n nested: true,\n});\n\nexport const horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n class: cls(\"mt-4 mb-6 border-t\", defaultBorderMixin),\n },\n});\n\nexport const bulletList = BulletList.configure({\n HTMLAttributes: {\n class: cls(\"list-disc list-outside leading-3 -mt-2\"),\n },\n});\n\nexport const orderedList = OrderedList.configure({\n HTMLAttributes: {\n class: cls(\"list-decimal list-outside leading-3 -mt-2\"),\n },\n});\n\nexport const listItem = ListItem.configure({\n HTMLAttributes: {\n class: cls(\"leading-normal -mb-2\"),\n },\n});\n\nexport const blockquote = Blockquote.configure({\n HTMLAttributes: {\n class: cls(\"border-l-4 border-primary\"),\n },\n});\n\nexport const codeBlock = CodeBlock.configure({\n HTMLAttributes: {\n class: cls(\"rounded bg-blue-50 dark:bg-surface-700 border p-5 font-mono font-medium\", defaultBorderMixin),\n },\n});\n\n// code: {\n// HTMLAttributes: {\n// class: cls(\"rounded-md bg-surface-accent-50 dark:bg-surface-700 px-1.5 py-1 font-mono font-medium\"),\n// spellcheck: \"false\",\n// },\n// },\n\nexport const code = Code.configure({\n HTMLAttributes: {\n class: cls(\"rounded-md bg-surface-accent-50 dark:bg-surface-700 px-1.5 py-1 font-mono font-medium\"),\n spellcheck: \"false\",\n },\n});\n\nexport const starterKit = StarterKit.configure({\n document: false,\n horizontalRule: false,\n dropcursor: {\n color: \"#DBEAFE\",\n width: 4,\n },\n gapcursor: false,\n});\n","import { TiptapImage } from \"./index\";\nimport { cls, defaultBorderMixin } from \"@firecms/ui\";\nimport { Decoration, DecorationSet, EditorView } from \"@tiptap/pm/view\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nexport type UploadFn = (image: File) => Promise<string>;\n\nexport async function onFileRead(view: EditorView, readerEvent: ProgressEvent<FileReader>, pos: number, upload: UploadFn, image: File) {\n\n const { schema } = view.state;\n\n // @ts-ignore\n const plugin = view.state.plugins.find((p: Plugin) => p.key === ImagePluginKey.key);\n if (!plugin) {\n console.error(\"Image plugin not found\");\n return;\n }\n let decorationSet = plugin.getState(view.state);\n\n const placeholder = document.createElement(\"div\");\n const imageElement = document.createElement(\"img\");\n imageElement.setAttribute(\"class\", \"opacity-40 rounded-lg border \" + defaultBorderMixin);\n imageElement.src = readerEvent.target?.result as string;\n placeholder.appendChild(imageElement);\n\n const deco = Decoration.widget(pos, placeholder);\n decorationSet = decorationSet?.add(view.state.doc, [deco]);\n view.dispatch(view.state.tr.setMeta(plugin, { decorationSet }));\n\n // Image Upload Logic\n const src = await upload(image);\n console.debug(\"Uploaded image\", src);\n\n // Replace placeholder with actual image\n const imageNode = schema.nodes.image.create({ src });\n const tr = view.state.tr.replaceWith(pos, pos, imageNode);\n\n // Remove placeholder decoration\n decorationSet = decorationSet?.remove([deco]);\n tr.setMeta(plugin, { decorationSet });\n view.dispatch(tr);\n}\n\nexport const ImagePluginKey = new PluginKey(\"imagePlugin\");\n\nexport const createDropImagePlugin = (upload: UploadFn): Plugin => {\n const plugin: Plugin = new Plugin({\n key: ImagePluginKey,\n state: {\n // Initialize the plugin state with an empty DecorationSet\n init: () => DecorationSet.empty,\n // Apply transactions to update the state\n apply: (tr, old) => {\n // Handle custom transaction steps that update decorations\n const meta = tr.getMeta(plugin);\n if (meta && meta.decorationSet) {\n return meta.decorationSet;\n }\n // Map decorations to the new document structure\n return old.map(tr.mapping, tr.doc);\n }\n },\n props: {\n handleDOMEvents: {\n drop: (view, event) => {\n if (!event.dataTransfer?.files || event.dataTransfer?.files.length === 0) {\n return false;\n }\n event.preventDefault();\n\n const files = Array.from(event.dataTransfer.files);\n const images = files.filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n console.log(\"No images found in dropped files\");\n return false;\n }\n\n images.forEach(image => {\n\n const position = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view as any, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n return true;\n }\n },\n handlePaste(view, event, slice) {\n const items = Array.from(event.clipboardData?.items || []);\n const pos = view.state.selection.from;\n let anyImageFound = false;\n\n items.forEach((item) => {\n const image = item.getAsFile();\n if (image) {\n anyImageFound = true;\n\n const reader = new FileReader();\n\n reader.onload = async (readerEvent) => {\n await onFileRead(view as any, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n }\n });\n\n return anyImageFound;\n },\n decorations(state) {\n return plugin.getState(state);\n }\n },\n view(editorView) {\n // This is needed to immediately apply the decoration updates\n return {\n update(view, prevState) {\n const prevDecos = plugin.getState(prevState);\n const newDecos = plugin.getState(view.state);\n\n if (prevDecos !== newDecos) {\n view.updateState(view.state);\n }\n }\n };\n }\n });\n return plugin;\n};\n\n/**\n * Matches following attributes in Markdown-typed image: [, alt, src, title]\n *\n * Example:\n * ![Lorem](image.jpg) -> [, \"Lorem\", \"image.jpg\"]\n * ![](image.jpg \"Ipsum\") -> [, \"\", \"image.jpg\", \"Ipsum\"]\n * ![Lorem](image.jpg \"Ipsum\") -> [, \"Lorem\", \"image.jpg\", \"Ipsum\"]\n */\nconst IMAGE_INPUT_REGEX = /!\\[(.+|:?)\\]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/;\n\nexport const createImageExtension = (dropImagePlugin: Plugin) => {\n return TiptapImage.extend({\n addProseMirrorPlugins() {\n return [dropImagePlugin];\n }\n }).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cls(\"rounded-lg border\", defaultBorderMixin)\n }\n });\n};\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n // eslint-disable-next-line no-unused-vars\n interface Commands<ReturnType> {\n customkeymap: {\n /**\n * Select text between node boundaries\n */\n selectTextWithinNodeBoundaries: () => ReturnType;\n };\n }\n}\n\nexport const CustomKeymap = Extension.create({\n name: \"CustomKeymap\",\n\n addCommands() {\n return {\n selectTextWithinNodeBoundaries:\n () =>\n ({ editor, commands }) => {\n const { state } = editor;\n const { tr } = state;\n const startNodePos = tr.selection.$from.start();\n const endNodePos = tr.selection.$to.end();\n return commands.setTextSelection({\n from: startNodePos,\n to: endNodePos,\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-a\": ({ editor }) => {\n const { state } = editor;\n const { tr } = state;\n const startSelectionPos = tr.selection.from;\n const endSelectionPos = tr.selection.to;\n const startNodePos = tr.selection.$from.start();\n const endNodePos = tr.selection.$to.end();\n const isCurrentTextSelectionNotExtendedToNodeBoundaries =\n startSelectionPos > startNodePos || endSelectionPos < endNodePos;\n if (isCurrentTextSelectionNotExtendedToNodeBoundaries) {\n editor.chain().selectTextWithinNodeBoundaries().run();\n return true;\n }\n return false;\n },\n };\n },\n});\n\n","import { DOMSerializer, Slice } from \"@tiptap/pm/model\"\nimport { EditorView } from \"@tiptap/pm/view\";\n\nexport function serializeForClipboard(view: EditorView, slice: Slice) {\n view.someProp(\"transformCopied\", f => {\n slice = f(slice!, view)\n })\n\n const context = [];\n let {\n content,\n openStart,\n openEnd\n } = slice\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild!.childCount == 1) {\n openStart--\n openEnd--\n const node = content.firstChild!\n // @ts-ignore\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null)\n content = node.content\n }\n\n const serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema)\n const doc = detachedDoc(), wrap = doc.createElement(\"div\")\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }))\n\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n const wrapper = doc.createElement(needsWrap[i])\n while (wrap.firstChild) wrapper.appendChild(wrap.firstChild)\n wrap.appendChild(wrapper)\n wrappers++\n }\n firstChild = wrap.firstChild\n }\n\n if (firstChild && firstChild.nodeType == 1)\n (firstChild as HTMLElement).setAttribute(\n \"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`)\n\n const text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\")\n\n return {\n dom: wrap,\n text,\n slice\n }\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap: { [node: string]: string[] } = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n}\n\nlet _detachedDoc: Document | null = null\n\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n","import { Extension } from \"@tiptap/core\";\n\nimport { NodeSelection, Plugin } from \"@tiptap/pm/state\";\n\nimport { EditorView } from \"@tiptap/pm/view\";\nimport { serializeForClipboard } from \"./clipboard\";\n\nexport interface DragHandleOptions {\n /**\n * The width of the drag handle\n */\n dragHandleWidth: number;\n}\n\nfunction absoluteRect(element: Element) {\n const data = element.getBoundingClientRect();\n\n let ancestor = element.parentElement;\n while (ancestor && window.getComputedStyle(ancestor).position === \"static\") {\n ancestor = ancestor.parentElement;\n }\n const ancestorRect = ancestor?.getBoundingClientRect();\n\n return {\n top: data.top - (ancestorRect?.top ?? 0),\n left: data.left - (ancestorRect?.left ?? 0),\n width: data.width\n };\n}\n\nfunction nodeDOMAtCoords(coords: { x: number; y: number }) {\n return document\n .elementsFromPoint(coords.x, coords.y)\n .find(\n (elem: Element) =>\n elem.parentElement?.matches?.(\".ProseMirror\") ||\n elem.matches(\n [\"li\", \"p:not(:first-child)\", \"pre\", \"blockquote\", \"h1, h2, h3, h4, h5, h6\"].join(\", \")\n )\n );\n}\n\nfunction nodePosAtDOM(node: Element, view: EditorView, options: DragHandleOptions) {\n const boundingRect = node.getBoundingClientRect();\n\n return view.posAtCoords({\n left: boundingRect.left + 50 + options.dragHandleWidth,\n top: boundingRect.top + 1\n })?.inside;\n}\n\nfunction DragHandle(options: DragHandleOptions) {\n function handleDragStart(event: DragEvent, view: EditorView) {\n view.focus();\n\n if (!event.dataTransfer) return;\n\n const node = nodeDOMAtCoords({\n x: event.clientX + 50 + options.dragHandleWidth,\n y: event.clientY\n });\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (nodePos == null || nodePos < 0) return;\n\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos)));\n\n const slice = view.state.selection.content();\n const {\n dom,\n text\n } = serializeForClipboard(view, slice);\n\n event.dataTransfer.clearData();\n event.dataTransfer.setData(\"text/html\", dom.innerHTML);\n event.dataTransfer.setData(\"text/plain\", text);\n event.dataTransfer.effectAllowed = \"copyMove\";\n\n event.dataTransfer.setDragImage(node, 0, 0);\n\n view.dragging = {\n slice,\n move: event.ctrlKey\n };\n }\n\n function handleClick(event: MouseEvent, view: EditorView) {\n view.focus();\n\n view.dom.classList.remove(\"dragging\");\n\n const node = nodeDOMAtCoords({\n x: event.clientX + 50 + options.dragHandleWidth,\n y: event.clientY\n });\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (!nodePos) return;\n\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos)));\n }\n\n let dragHandleElement: HTMLElement | null = null;\n\n function hideDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.add(\"hide\");\n }\n }\n\n function showDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.remove(\"hide\");\n }\n }\n\n return new Plugin({\n view: (view) => {\n dragHandleElement = document.createElement(\"div\");\n dragHandleElement.draggable = true;\n dragHandleElement.dataset.dragHandle = \"\";\n dragHandleElement.classList.add(\"drag-handle\");\n dragHandleElement.addEventListener(\"dragstart\", (e) => {\n handleDragStart(e, view as any);\n });\n dragHandleElement.addEventListener(\"click\", (e) => {\n handleClick(e, view as any);\n });\n\n hideDragHandle();\n\n view?.dom?.parentElement?.appendChild(dragHandleElement);\n\n return {\n destroy: () => {\n // dragHandleElement?.remove?.();\n // dragHandleElement = null;\n }\n };\n },\n props: {\n handleDOMEvents: {\n mousemove: (view, event) => {\n if (!view.editable) {\n return;\n }\n\n const node = nodeDOMAtCoords({\n x: event.clientX + 50 + options.dragHandleWidth,\n y: event.clientY\n });\n\n if (!(node instanceof Element)) {\n hideDragHandle();\n return;\n }\n\n const compStyle = window.getComputedStyle(node);\n const lineHeight = parseInt(compStyle.lineHeight, 10);\n const paddingTop = parseInt(compStyle.paddingTop, 10);\n\n const rect = absoluteRect(node);\n\n rect.top += (lineHeight - 24) / 2;\n rect.top += paddingTop;\n // Li markers\n if (node.matches(\"ul:not([data-type=taskList]) li, ol li\")) {\n rect.left -= options.dragHandleWidth;\n }\n rect.width = options.dragHandleWidth;\n\n if (!dragHandleElement) return;\n\n dragHandleElement.style.left = `${rect.left - rect.width}px`;\n dragHandleElement.style.top = `${rect.top}px`;\n showDragHandle();\n },\n keydown: () => {\n hideDragHandle();\n },\n mousewheel: () => {\n hideDragHandle();\n },\n // dragging class is used for CSS\n dragstart: (view) => {\n view.dom.classList.add(\"dragging\");\n },\n drop: (view) => {\n view.dom.classList.remove(\"dragging\");\n },\n dragend: (view) => {\n view.dom.classList.remove(\"dragging\");\n }\n }\n }\n });\n}\n\nexport const DragAndDrop = Extension.create({\n name: \"dragAndDrop\",\n\n addProseMirrorPlugins() {\n return [\n DragHandle({\n dragHandleWidth: 24\n })\n ];\n }\n});\n","import { Command, Extension } from \"@tiptap/core\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\"\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n highlightDecoration: {\n toggleAutocompleteHighlight: (range?: { from: number, to: number }) => ReturnType;\n removeAutocompleteHighlight: () => ReturnType;\n };\n }\n}\n\nexport interface HighlightRange {\n from: number\n to: number\n}\n\ninterface AutocompleteHighlightState {\n highlight?: HighlightRange\n decorationSet?: DecorationSet\n}\n\nexport interface HighlightDecorationOptions {\n pluginKey: PluginKey<AutocompleteHighlightState>\n highlight?: { from: number, to: number }\n}\n\nfunction buildDecorationSet(highlight: any, doc: any) {\n const decorations: [any?] = [];\n\n if (highlight) {\n decorations.push(\n Decoration.inline(highlight.from, highlight.to, {\n class: \"dark:bg-surface-accent-700 bg-surface-accent-300\"\n })\n );\n }\n const decorationSet = DecorationSet.create(doc, decorations);\n return decorationSet;\n}\n\n/**\n * This plugin is used to highlight the current autocomplete suggestion.\n * It allows to set a range and remove it.\n */\nexport const HighlightDecorationExtension = (initialHighlight?: HighlightRange) => Extension.create<HighlightDecorationOptions>({\n name: \"highlightDecoration\",\n addOptions() {\n return {\n pluginKey: new PluginKey<AutocompleteHighlightState>(\"highlightDecoration\"),\n highlight: initialHighlight\n };\n },\n addProseMirrorPlugins() {\n\n const pluginKey = this.options.pluginKey;\n return [\n new Plugin<AutocompleteHighlightState>({\n key: pluginKey,\n state: {\n init: (_, { doc }) => {\n const highlight = this.options.highlight;\n const decorationSet = highlight && doc ? buildDecorationSet(highlight, doc) : DecorationSet.empty;\n return {\n decorationSet,\n highlight\n };\n },\n apply(transaction, oldState) {\n const action = transaction.getMeta(pluginKey);\n const highlight = action?.range;\n if (action?.type === \"highlightDecoration\") {\n\n const doc = transaction.doc;\n const { remove } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty\n };\n }\n const decorationSet = buildDecorationSet(highlight, doc);\n return {\n decorationSet: decorationSet,\n highlight\n }\n } else {\n return oldState\n }\n }\n },\n props: {\n decorations(state) {\n const autocompleteState = this.getState(state);\n if (autocompleteState?.decorationSet) {\n return autocompleteState.decorationSet\n } else {\n return DecorationSet.empty\n }\n }\n }\n })\n ]\n },\n\n addCommands() {\n return {\n toggleAutocompleteHighlight: (range?: { from: number, to: number }): Command => ({\n state,\n dispatch\n }) => {\n\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n\n const tr = state.tr.setMeta(pluginKey, {\n pos,\n type: \"highlightDecoration\",\n remove: false,\n range\n });\n\n dispatch(tr);\n return true;\n },\n\n removeAutocompleteHighlight: (): Command => ({\n state,\n dispatch\n }) => {\n\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n const tr = state.tr.setMeta(pluginKey, {\n pos: 0, // We can pass any position as it will remove the entire decoration set\n type: \"highlightDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n };\n }\n});\n","import React, { forwardRef, ReactNode, useEffect, useImperativeHandle, useRef, useState } from \"react\"\nimport { Editor, mergeAttributes, Node, Range } from \"@tiptap/core\";\nimport { ReactRenderer, useCurrentEditor } from \"@tiptap/react\";\nimport { DOMOutputSpec, Node as ProseMirrorNode } from \"@tiptap/pm/model\"\nimport { PluginKey } from \"@tiptap/pm/state\"\nimport Suggestion, { SuggestionOptions } from \"@tiptap/suggestion\";\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\n\nimport {\n AutoFixHighIcon,\n CheckBoxIcon,\n cls,\n CodeIcon,\n defaultBorderMixin,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n ImageIcon,\n Looks3Icon,\n LooksOneIcon,\n LooksTwoIcon,\n TextFieldsIcon\n} from \"@firecms/ui\"\nimport { onFileRead, UploadFn } from \"./Image\";\nimport { EditorAIController } from \"../types\";\n\n// See `addAttributes` below\nexport interface CommandNodeAttrs {\n /**\n * The identifier for the selected item that was mentioned, stored as a `data-id`\n * attribute.\n */\n id: string | null;\n /**\n * The label to be rendered by the editor as the displayed text for this mentioned\n * item, if provided. Stored as a `data-label` attribute. See `renderLabel`.\n */\n label?: string | null;\n}\n\nexport type CommandOptions<SuggestionItem = any, Attrs extends Record<string, any> = CommandNodeAttrs> = {\n /**\n * The HTML attributes for a command node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record<string, any>\n\n /**\n * A function to render the label of a command.\n * @deprecated use renderText and renderHTML instead\n * @param props The render props\n * @returns The label\n * @example ({ options, node }) => `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n */\n renderLabel?: (props: { options: CommandOptions<SuggestionItem, Attrs>; node: ProseMirrorNode }) => string\n\n /**\n * A function to render the text of a command.\n * @param props The render props\n * @returns The text\n * @example ({ options, node }) => `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n */\n renderText: (props: { options: CommandOptions<SuggestionItem, Attrs>; node: ProseMirrorNode }) => string\n\n /**\n * A function to render the HTML of a command.\n * @param props The render props\n * @returns The HTML as a ProseMirror DOM Output Spec\n * @example ({ options, node }) => ['span', { 'data-type': 'command' }, `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`]\n */\n renderHTML: (props: { options: CommandOptions<SuggestionItem, Attrs>; node: ProseMirrorNode }) => DOMOutputSpec\n\n /**\n * Whether to delete the trigger character with backspace.\n * @default false\n */\n deleteTriggerWithBackspace: boolean\n\n /**\n * The suggestion options.\n * @default {}\n * @example { char: '@', pluginKey: CommandPluginKey, command: ({ editor, range, props }) => { ... } }\n */\n suggestion: Omit<SuggestionOptions<SuggestionItem, Attrs>, \"editor\">\n}\n\n/**\n * The plugin key for the command plugin.\n * @default 'command'\n */\nexport const CommandPluginKey = new PluginKey(\"slash-command\")\n\nexport const SlashCommand = Node.create<CommandOptions>({\n name: \"command\",\n\n addOptions() {\n return {\n HTMLAttributes: {},\n renderText({\n options,\n node\n }) {\n return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n },\n deleteTriggerWithBackspace: false,\n renderHTML({\n options,\n node\n }) {\n return [\n \"span\",\n mergeAttributes(this.HTMLAttributes, options.HTMLAttributes),\n `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n ]\n },\n suggestion: {\n char: \"/\",\n pluginKey: CommandPluginKey,\n command: ({\n editor,\n range,\n props\n }) => {\n // increase range.to by one when the next node is of type \"text\"\n // and starts with a space character\n const nodeAfter = editor.view.state.selection.$to.nodeAfter\n const overrideSpace = nodeAfter?.text?.startsWith(\" \")\n\n if (overrideSpace) {\n range.to += 1\n }\n\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: this.name,\n attrs: props\n },\n {\n type: \"text\",\n text: \" \"\n }\n ])\n .run()\n\n window.getSelection()?.collapseToEnd()\n },\n allow: ({\n state,\n range\n }) => {\n const $from = state.doc.resolve(range.from)\n const type = state.schema.nodes[this.name]\n return !!$from.parent.type.contentMatch.matchType(type)\n }\n }\n }\n },\n\n group: \"inline\",\n\n inline: true,\n\n selectable: false,\n\n atom: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: element => element.getAttribute(\"data-id\"),\n renderHTML: attributes => {\n if (!attributes.id) {\n return {}\n }\n\n return {\n \"data-id\": attributes.id\n }\n }\n },\n\n label: {\n default: null,\n parseHTML: element => element.getAttribute(\"data-label\"),\n renderHTML: attributes => {\n if (!attributes.label) {\n return {}\n }\n\n return {\n \"data-label\": attributes.label\n }\n }\n }\n }\n },\n\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`\n }\n ]\n },\n\n renderHTML({\n node,\n HTMLAttributes\n }) {\n if (this.options.renderLabel !== undefined) {\n console.warn(\"renderLabel is deprecated use renderText and renderHTML instead\")\n return [\n \"span\",\n mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes),\n this.options.renderLabel({\n options: this.options,\n node\n })\n ]\n }\n const mergedOptions = { ...this.options }\n\n mergedOptions.HTMLAttributes = mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes)\n const html = this.options.renderHTML({\n options: mergedOptions,\n node\n })\n\n if (typeof html === \"string\") {\n return [\n \"span\",\n mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes),\n html\n ]\n }\n return html\n },\n\n renderText({ node }) {\n return this.options.renderText({\n options: this.options,\n node\n })\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => this.editor.commands.command(({\n tr,\n state\n }) => {\n let isCommand = false\n const { selection } = state\n const {\n empty,\n anchor\n } = selection\n\n if (!empty) {\n return false\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isCommand = true\n tr.insertText(\n this.options.deleteTriggerWithBackspace ? \"\" : this.options.suggestion.char || \"\",\n pos,\n pos + node.nodeSize\n )\n\n return false\n }\n return true\n })\n\n return isCommand\n })\n }\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion\n })\n ]\n }\n});\n\nexport interface SuggestionItem {\n title: string;\n description: string;\n icon: ReactNode;\n searchTerms?: string[];\n command?: (props: { editor: Editor; range: Range, upload: UploadFn, aiController?: EditorAIController }) => void;\n}\n\nexport const suggestion = (ref: React.MutableRefObject<any>, {\n upload,\n aiController\n}: {\n upload: UploadFn,\n aiController?: EditorAIController\n}): Omit<SuggestionOptions<SuggestionItem, any>, \"editor\"> =>\n({\n items: ({ query }) => {\n const availableSuggestionItems = [...suggestionItems];\n if (aiController) {\n availableSuggestionItems.push(autocompleteSuggestionItem)\n }\n\n return availableSuggestionItems\n .filter(item => {\n const inTitle = item.title.toLowerCase().startsWith(query.toLowerCase());\n if (inTitle) return inTitle;\n return item.searchTerms?.some(term => term.toLowerCase().startsWith(query.toLowerCase()));\n })\n },\n\n allow: ({ editor, range }) => {\n return editor.can().insertContentAt(range, { type: \"command\" });\n },\n\n render: () => {\n let component: any;\n let containerEl: HTMLDivElement | null = null;\n let cleanupAutoUpdate: (() => void) | null = null;\n let reference: { getBoundingClientRect: () => DOMRect } | null = null;\n let escapeListener: ((e: KeyboardEvent) => void) | null = null;\n\n function exit() {\n if (cleanupAutoUpdate) cleanupAutoUpdate();\n if (containerEl && containerEl.parentNode) {\n containerEl.parentNode.removeChild(containerEl);\n }\n if (escapeListener) {\n document.removeEventListener('keydown', escapeListener, true);\n escapeListener = null;\n }\n containerEl = null;\n reference = null;\n component?.destroy()\n }\n\n return {\n onStart: (props) => {\n // Add capture-phase escape listener\n escapeListener = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n exit();\n }\n };\n document.addEventListener('keydown', escapeListener, true);\n\n component = new ReactRenderer(CommandList, {\n props: {\n ...props,\n upload,\n aiController,\n onClose: exit\n },\n editor: props.editor,\n })\n\n if (!props.clientRect) {\n return\n }\n\n // Create floating container\n containerEl = document.createElement(\"div\");\n containerEl.setAttribute(\"data-suggestion-menu\", \"true\");\n containerEl.style.position = \"fixed\";\n containerEl.style.left = \"0px\";\n containerEl.style.top = \"0px\";\n containerEl.style.zIndex = \"9999\";\n (ref?.current || document.body).appendChild(containerEl);\n containerEl.appendChild(component.element);\n\n // Virtual reference element using provided clientRect\n reference = {\n getBoundingClientRect: props.clientRect as () => DOMRect\n }\n\n // Auto-update position\n cleanupAutoUpdate = autoUpdate(reference as any, containerEl, () => {\n if (!reference) return;\n computePosition(reference as any, containerEl!, {\n placement: \"bottom-start\",\n middleware: [offset(4), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n Object.assign(containerEl!.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\",\n });\n });\n });\n },\n\n onUpdate(props) {\n component.updateProps(props)\n\n if (!props.clientRect || !containerEl || !reference) {\n return\n }\n\n // Update reference rect and reposition\n reference.getBoundingClientRect = props.clientRect as () => DOMRect;\n\n computePosition(reference as any, containerEl!, {\n placement: \"bottom-start\",\n middleware: [offset(4), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n Object.assign(containerEl!.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\",\n });\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n props.event.preventDefault();\n props.event.stopPropagation();\n exit();\n return true;\n }\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n exit();\n }\n }\n }\n}\n);\n\nconst CommandList = forwardRef((props: {\n items: SuggestionItem[];\n query: string;\n range: Range;\n command: (props: { id: string }) => void;\n upload: UploadFn;\n aiController: EditorAIController;\n onClose: () => void;\n}, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const { editor } = useCurrentEditor();\n const selectItem = (item?: SuggestionItem, event?: React.MouseEvent) => {\n if (!editor) return;\n event?.preventDefault();\n event?.stopPropagation();\n item?.command?.({\n editor,\n range: props.range,\n upload: props.upload,\n aiController: props.aiController\n })\n };\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length);\n };\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length);\n };\n\n const enterHandler = () => {\n const item = props.items[selectedIndex]\n selectItem(item);\n };\n\n useEffect(() => setSelectedIndex(0), [props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler();\n return true;\n }\n if (event.key === \"ArrowDown\") {\n downHandler();\n return true;\n }\n if (event.key === \"Enter\") {\n enterHandler();\n return true;\n }\n return false;\n }\n }));\n\n const itemRefs = useRef<HTMLElement[]>([]);\n\n useEffect(() => {\n if (itemRefs.current[selectedIndex]) {\n itemRefs.current[selectedIndex].scrollIntoView({\n block: \"nearest\"\n });\n }\n }, [selectedIndex]);\n\n return (\n <div\n className={cls(\"text-surface-900 dark:text-white z-50 max-h-[280px] h-auto w-72 overflow-y-auto rounded-md border bg-white dark:bg-surface-900 px-1 py-2 shadow transition-all\", defaultBorderMixin)}>\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n value={item.title}\n ref={el => {\n if (!el) return;\n itemRefs.current[index] = el;\n }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => selectItem(item, e)}\n tabIndex={index === selectedIndex ? 0 : -1}\n aria-selected={index === selectedIndex}\n className={cls(\"flex w-full items-center space-x-2 rounded-md px-2 py-1 text-left text-sm hover:bg-blue-50 hover:dark:bg-surface-700 aria-selected:bg-blue-50 aria-selected:dark:bg-surface-700\",\n index === selectedIndex ? \"bg-blue-100 dark:bg-surface-accent-950\" : \"\")}\n key={item.title}\n >\n <div\n className={cls(\"flex h-10 w-10 items-center justify-center rounded-md border bg-white dark:bg-surface-900\", defaultBorderMixin)}>\n {item.icon}\n </div>\n <div>\n <p className=\"font-medium\">{item.title}</p>\n <p className=\"text-xs text-surface-700 dark:text-surface-accent-300\">\n {item.description}\n </p>\n </div>\n </button>\n ))\n ) : (\n <div className=\"item\">No result</div>\n )}\n </div>\n );\n});\nCommandList.displayName = \"CommandList\";\n\nconst autocompleteSuggestionItem: SuggestionItem = {\n title: \"Autocomplete\",\n description: \"Add text based on the context.\",\n searchTerms: [\"ai\"],\n icon: <AutoFixHighIcon size={18} />,\n command: async ({\n editor,\n range,\n aiController\n }) => {\n if (!aiController)\n throw Error(\"No AiController\");\n\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode(\"paragraph\", \"paragraph\")\n .run();\n\n const { state } = editor;\n const {\n from,\n to\n } = state.selection;\n\n // Get text before the cursor (from start to the cursor position)\n const textBeforeCursor = state.doc.textBetween(0, from, \"\\n\");\n\n // Get text after the cursor (from the cursor position to the end)\n const textAfterCursor = state.doc.textBetween(to, state.doc.content.size, \"\\n\");\n\n let buffer = \"\";\n const result = await aiController.autocomplete(textBeforeCursor, textAfterCursor, (delta) => {\n buffer += delta;\n if (delta.length !== 0) {\n editor.chain().focus().toggleLoadingDecoration(buffer).run()\n }\n });\n\n editor.chain().focus()\n .insertContent(result, {\n applyInputRules: false,\n applyPasteRules: false,\n parseOptions: {\n preserveWhitespace: false\n }\n }).run();\n\n }\n};\nconst suggestionItems: SuggestionItem[] = [\n {\n title: \"Text\",\n description: \"Just start typing with plain text.\",\n searchTerms: [\"p\", \"paragraph\"],\n icon: <TextFieldsIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode(\"paragraph\", \"paragraph\")\n .run();\n }\n },\n {\n title: \"To-do List\",\n description: \"Track tasks with a to-do list.\",\n searchTerms: [\"todo\", \"task\", \"list\", \"check\", \"checkbox\"],\n icon: <CheckBoxIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor.chain().focus().deleteRange(range).toggleTaskList().run();\n }\n },\n {\n title: \"Heading 1\",\n description: \"Big section heading.\",\n searchTerms: [\"title\", \"big\", \"large\"],\n icon: <LooksOneIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode(\"heading\", { level: 1 })\n .run();\n }\n },\n {\n title: \"Heading 2\",\n description: \"Medium section heading.\",\n searchTerms: [\"subtitle\", \"medium\"],\n icon: <LooksTwoIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode(\"heading\", { level: 2 })\n .run();\n }\n },\n {\n title: \"Heading 3\",\n description: \"Small section heading.\",\n searchTerms: [\"subtitle\", \"small\"],\n icon: <Looks3Icon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode(\"heading\", { level: 3 })\n .run();\n }\n },\n {\n title: \"Bullet List\",\n description: \"Create a simple bullet list.\",\n searchTerms: [\"unordered\", \"point\"],\n icon: <FormatListBulletedIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n }\n },\n {\n title: \"Numbered List\",\n description: \"Create a list with numbering.\",\n searchTerms: [\"ordered\"],\n icon: <FormatListNumberedIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n }\n },\n {\n title: \"Quote\",\n description: \"Capture a quote.\",\n searchTerms: [\"blockquote\"],\n icon: <FormatQuoteIcon size={18} />,\n command: ({\n editor,\n range\n }) =>\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode(\"paragraph\", \"paragraph\")\n .toggleBlockquote()\n .run()\n },\n {\n title: \"Code\",\n description: \"Capture a code snippet.\",\n searchTerms: [\"codeblock\"],\n icon: <CodeIcon size={18} />,\n command: ({\n editor,\n range\n }) =>\n editor.chain().focus().deleteRange(range).toggleCodeBlock().run()\n },\n {\n title: \"Image\",\n description: \"Upload an image from your computer.\",\n searchTerms: [\"photo\", \"picture\", \"media\", \"upload\", \"file\"],\n icon: <ImageIcon size={18} />,\n command: ({\n editor,\n range,\n upload\n }) => {\n\n editor.chain().focus().deleteRange(range).run();\n // upload image\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.onchange = async () => {\n if (input.files?.length) {\n const file = input.files[0];\n if (!file) return;\n const pos = editor.view.state.selection.from;\n\n const fileList = input.files;\n const files = Array.from(fileList);\n const images = files.filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n console.log(\"No images found in uploaded files\");\n return false;\n }\n\n const view = editor.view;\n\n images.forEach(image => {\n // const position = view.posAtCoords({\n // left: event.clientX,\n // top: event.clientY\n // });\n // if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, pos, upload, image);\n // await onFileRead(view, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n }\n return true;\n };\n input.click();\n }\n }\n];\n","\"use client\";\nimport React, { useDeferredValue, useEffect, useMemo, useState } from \"react\";\n\nimport { cls, defaultBorderMixin, Separator, useInjectStyles } from \"@firecms/ui\";\n\nimport { Editor, EditorProvider, Extensions } from \"@tiptap/react\";\nimport Document from \"@tiptap/extension-document\";\nimport { Markdown } from \"tiptap-markdown\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Heading from \"@tiptap/extension-heading\";\nimport { TextStyleKit } from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport Bold from \"@tiptap/extension-bold\";\nimport Italic from \"@tiptap/extension-italic\";\nimport Strike from \"@tiptap/extension-strike\";\n\nimport { EditorBubble, type JSONContent } from \"./components\";\n\nimport { NodeSelector } from \"./selectors/node-selector\";\nimport { LinkSelector } from \"./selectors/link-selector\";\nimport { TextButtons } from \"./selectors/text-buttons\";\n\nimport { removeClassesFromJson } from \"./utils/remove_classes\";\nimport {\n blockquote,\n bulletList,\n code,\n codeBlock,\n horizontalRule,\n listItem,\n orderedList,\n placeholder,\n starterKit,\n taskItem,\n taskList,\n tiptapLink\n} from \"./editor_extensions\";\nimport { createDropImagePlugin, createImageExtension } from \"./extensions/Image\";\nimport { CustomKeymap } from \"./extensions/custom-keymap\";\nimport { DragAndDrop } from \"./extensions/drag-and-drop\";\nimport { EditorAIController } from \"./types\";\nimport TextLoadingDecorationExtension from \"./extensions/TextLoadingDecorationExtension\";\nimport { HighlightDecorationExtension } from \"./extensions/HighlightDecorationExtension\";\n\nimport { SlashCommand, suggestion } from \"./extensions/slashCommand\";\n\nexport type FireCMSEditorTextSize = \"sm\" | \"base\" | \"lg\";\n\nexport type FireCMSEditorProps = {\n content?: JSONContent | string,\n onMarkdownContentChange?: (content: string) => void,\n onJsonContentChange?: (content: JSONContent | null) => void,\n onHtmlContentChange?: (content: string) => void,\n handleImageUpload: (file: File) => Promise<string>,\n version?: number,\n textSize?: FireCMSEditorTextSize,\n highlight?: { from: number, to: number },\n aiController?: EditorAIController,\n customComponents?: CustomEditorComponent[];\n disabled?: boolean;\n};\n\nexport type CustomEditorComponent = {\n name: string,\n component: React.FC\n};\n\nconst proseClasses = {\n \"sm\": \"prose-sm\",\n \"base\": \"prose-base\",\n \"lg\": \"prose-lg\"\n}\n\nconst canUseDOM = Boolean(\n typeof window !== \"undefined\" &&\n window.document && window.document.createElement\n);\n\nexport const FireCMSEditor = ({\n content,\n onJsonContentChange,\n onHtmlContentChange,\n onMarkdownContentChange,\n version,\n textSize = \"base\",\n highlight,\n handleImageUpload,\n aiController,\n disabled\n }: FireCMSEditorProps) => {\n\n const ref = React.useRef<HTMLDivElement | null>(null);\n const editorRef = React.useRef<Editor | null>(null);\n\n const imagePlugin = createDropImagePlugin(handleImageUpload);\n const imageExtension = useMemo(() => createImageExtension(imagePlugin), []);\n\n const [openNode, setOpenNode] = useState(false);\n const [openLink, setOpenLink] = useState(false);\n\n useInjectStyles(\"Editor\", cssStyles);\n\n const deferredHighlight = useDeferredValue(highlight);\n\n useEffect(() => {\n if (version === undefined) return;\n if (version > -1 && editorRef.current) {\n editorRef.current?.commands.setContent(content ?? \"\");\n }\n }, [version]);\n\n useEffect(() => {\n editorRef?.current?.setEditable(!disabled);\n }, [disabled]);\n\n useEffect(() => {\n if (version === undefined) return;\n if (editorRef.current && version > 0) {\n\n const chain = editorRef.current.chain();\n\n if (deferredHighlight) {\n chain.focus().toggleAutocompleteHighlight(deferredHighlight).run();\n } else {\n chain.focus().removeAutocompleteHighlight().run();\n }\n\n }\n }, [deferredHighlight?.from, deferredHighlight?.to]);\n\n const firstUpdateRef = React.useRef(true);\n const onEditorUpdate = (editor: Editor) => {\n editorRef.current = editor;\n if (firstUpdateRef.current) {\n firstUpdateRef.current = false;\n return; // Skip the first update to avoid unnecessary content change calls\n }\n if (onMarkdownContentChange) {\n // @ts-ignore\n const markdown = editorRef.current.storage.markdown.getMarkdown();\n onMarkdownContentChange?.(addLineBreakAfterImages(markdown));\n }\n if (onJsonContentChange) {\n const jsonContent = removeClassesFromJson(editor.getJSON());\n onJsonContentChange(jsonContent);\n }\n if (onHtmlContentChange) {\n onHtmlContentChange?.(editor.getHTML());\n }\n }\n\n const proseClass = proseClasses[textSize];\n\n const extensions: Extensions = useMemo(() => ([\n starterKit as any,\n Document.extend({}),\n HighlightDecorationExtension(highlight),\n TextLoadingDecorationExtension,\n Underline,\n Bold,\n TextStyleKit,\n Italic,\n Strike,\n Color,\n Highlight.configure({\n multicolor: true\n }),\n Heading,\n CustomKeymap,\n DragAndDrop,\n placeholder,\n tiptapLink,\n imageExtension,\n taskList,\n taskItem,\n Markdown.configure({\n html: true\n }),\n horizontalRule,\n bulletList,\n orderedList,\n listItem,\n blockquote,\n codeBlock,\n code,\n SlashCommand.configure({\n HTMLAttributes: {\n class: \"mention\"\n },\n suggestion: suggestion(ref, {\n upload: handleImageUpload,\n aiController,\n })\n })\n ]), []);\n\n return (\n <div\n ref={ref}\n className=\"relative min-h-[300px] w-full\">\n\n <EditorProvider\n content={content ?? \"\"}\n extensions={extensions}\n immediatelyRender={canUseDOM}\n editorProps={{\n editable: () => !disabled,\n attributes: {\n class: cls(proseClass, \"prose-headings:font-title font-default focus:outline-none max-w-full p-12\")\n }\n }}\n onCreate={({ editor }) => {\n // @ts-ignore\n editorRef.current = editor;\n editor.setEditable(!disabled);\n }}\n onUpdate={({ editor }) => {\n onEditorUpdate(editor as Editor);\n }}>\n\n <EditorBubble\n options={{\n placement: \"top\",\n offset: 6,\n }}\n className={cls(\"flex w-fit max-w-[90vw] h-10 overflow-hidden rounded border bg-white dark:bg-surface-900 shadow\", defaultBorderMixin)}\n >\n <NodeSelector portalContainer={ref.current} open={openNode} onOpenChange={setOpenNode}/>\n <Separator orientation=\"vertical\"/>\n <LinkSelector open={openLink} onOpenChange={setOpenLink}/>\n <Separator orientation=\"vertical\"/>\n <TextButtons/>\n </EditorBubble>\n\n </EditorProvider>\n </div>\n\n );\n};\n\nfunction addLineBreakAfterImages(markdown: string): string {\n // Regular expression to match markdown image syntax\n const imageRegex = /!\\[.*?\\]\\(.*?\\)/g;\n // Replace image with image followed by a line break\n return markdown.replace(imageRegex, (match) => `${match}\\n`);\n}\n\nconst cssStyles = `\n.ProseMirror {\n box-shadow: none !important;\n}\n.ProseMirror .is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n.ProseMirror .is-empty::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n\n[data-theme=\"dark\"] {\n .ProseMirror .is-empty::before {\n color: rgb(100 116 139); //500\n }\n}\n\n.is-empty {\n cursor: text;\n color: rgb(100 116 139); //500\n}\n\n\n/* Custom image styles */\n\n.ProseMirror img {\n transition: filter 0.1s ease-in-out;\n\n &:hover {\n cursor: pointer;\n filter: brightness(90%);\n }\n\n &.ProseMirror-selectednode {\n outline: 3px solid #5abbf7;\n filter: brightness(90%);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) !important;\n }\n}\n\n/* Custom TODO list checkboxes – shoutout to this awesome tutorial: https://moderncss.dev/pure-css-custom-checkbox-style/ */\n\nul[data-type=\"taskList\"] li > label {\n margin-right: 0.2rem;\n user-select: none;\n}\n\n@media screen and (max-width: 768px) {\n ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n }\n}\n\n\n[data-theme=\"dark\"] {\n ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n background-color: rgb(30 41 59); // 800\n border: 2px solid #666;\n \n &:hover {\n background-color: rgb(51 65 85); // 700\n }\n \n &:active {\n background-color: rgb(71 85 105);\n }\n }\n}\n \n\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n -webkit-appearance: none;\n appearance: none;\n background-color: white;\n margin: 0;\n cursor: pointer;\n width: 1.2em;\n height: 1.2em;\n position: relative;\n top: 5px;\n border: 2px solid #777;\n border-radius: 0.25em;\n margin-right: 0.3rem;\n display: grid;\n place-content: center;\n\n &:hover {\n background-color: rgb(241 245 249); //100\n }\n\n &:active {\n background-color: rgb(226 232 240); //200\n }\n\n &::before {\n content: \"\";\n width: 0.65em;\n height: 0.65em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em;\n transform-origin: center;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n }\n\n &:checked::before {\n transform: scale(1);\n }\n}\n\n[data-theme=\"dark\"] {\n ul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(226 232 240);\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n }\n}\n\nul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(51 65 85); // 700\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n}\n\n/* Overwrite tippy-box original max-width */\n\n.tippy-box {\n max-width: 400px !important;\n}\n\n.ProseMirror:not(.dragging) .ProseMirror-selectednode {\n // outline: none !important;\n background-color: rgb(219 234 254); // blue 100\n transition: background-color 0.2s;\n box-shadow: none;\n}\n\n[data-theme=\"dark\"] .ProseMirror:not(.dragging) .ProseMirror-selectednode {\n background-color: rgb(51 65 85); // 700\n}\n\n.prose-base table p {\n margin: 0;\n}\n\n.drag-handle {\n position: absolute;\n opacity: 1;\n transition: opacity ease-in 0.2s;\n border-radius: 0.25rem;\n\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(128, 128, 128, 0.9)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7,8.44771525 7,9 7,9 C7,9.55228475 7,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E\");\n background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);\n background-repeat: no-repeat;\n background-position: center;\n width: 1.2rem;\n height: 1.5rem;\n z-index: 100;\n cursor: grab;\n\n &:hover {\n background-color: rgb(241 245 249); //100\n transition: background-color 0.2s;\n }\n\n &:active {\n background-color: rgb(226 232 240); //200\n transition: background-color 0.2s;\n }\n\n &.hide {\n opacity: 0;\n pointer-events: none;\n }\n\n @media screen and (max-width: 600px) {\n display: none;\n pointer-events: none;\n }\n}\n\n[data-theme=\"dark\"] .drag-handle {\n &:hover {\n background-color: rgb(51 65 85); // 700\n }\n\n &:active {\n background-color: rgb(51 65 85); // 700\n }\n}\n`;\n"],"names":["EditorBubble","forwardRef","t0","ref","$","_c","children","options","rest","tippyOptions","editor","useCurrentEditor","placement","t1","shouldShow","_temp","t2","t3","mergedOptions","t4","bubbleMenuProps","t5","t6","editor_0","state","selection","empty","isActive","NodeSelection","EditorBubbleItem","asChild","onSelect","Comp","Slot","displayName","items","name","icon","TextFieldsIcon","command","chain","focus","toggleNode","run","LooksOneIcon","toggleHeading","level","LooksTwoIcon","Looks3Icon","CheckBoxIcon","toggleTaskList","FormatListBulletedIcon","toggleBulletList","FormatListNumberedIcon","toggleOrderedList","FormatQuoteIcon","toggleBlockquote","CodeIcon","toggleCodeBlock","NodeSelector","open","onOpenChange","portalContainer","useEditor","filter","item","pop","activeItem","Symbol","for","map","item_0","index","isValidUrl","url","URL","e","getUrlFromString","str","includes","toString","LinkSelector","inputRef","useRef","current","useEffect","cls","target","currentTarget","preventDefault","input","value","setLink","href","getAttributes","focusedDisabled","t7","t8","unsetLink","t9","t10","TextButtons","_temp2","FormatBoldIcon","_temp3","_temp4","FormatItalicIcon","_temp5","_temp6","FormatUnderlinedIcon","_temp7","_temp8","FormatStrikethroughIcon","_temp9","_temp0","editor_10","editor_1","toggleBold","editor_2","editor_3","toggleItalic","editor_4","editor_5","toggleUnderline","editor_6","editor_7","toggleStrike","editor_8","editor_9","toggleCode","removeClassesFromJson","jsonObj","Array","isArray","attrs","class","Object","keys","forEach","key","loadingDecorationKey","PluginKey","TextLoadingDecorationExtension","Extension","create","addOptions","pluginKey","addProseMirrorPlugins","Plugin","init","decorationSet","DecorationSet","hasDecoration","apply","tr","oldState","action","getMeta","type","pos","remove","loadingHtml","decoration","Decoration","widget","container","document","createElement","className","innerHTML","span","innerText","appendChild","add","doc","mapping","props","decorations","getState","addCommands","toggleLoadingDecoration","dispatch","from","setMeta","removeLoadingDecoration","PlaceholderExtension","Placeholder","configure","placeholder","node","to","hasLoadingDecoration","pluginState","get","includeChildren","Horizontal","HorizontalRule","extend","addInputRules","InputRule","find","handler","range","attributes","start","end","insert","delete","tiptapLink","TiptapLink","HTMLAttributes","taskList","TaskList","taskItem","TaskItem","nested","horizontalRule","defaultBorderMixin","bulletList","BulletList","orderedList","OrderedList","listItem","ListItem","blockquote","Blockquote","codeBlock","CodeBlock","code","Code","spellcheck","starterKit","StarterKit","dropcursor","color","width","gapcursor","onFileRead","view","readerEvent","upload","image","schema","plugin","plugins","p","ImagePluginKey","console","error","imageElement","setAttribute","src","result","deco","debug","imageNode","nodes","replaceWith","createDropImagePlugin","old","meta","handleDOMEvents","drop","event","dataTransfer","files","length","images","file","test","log","position","posAtCoords","left","clientX","top","clientY","reader","FileReader","onload","readAsDataURL","handlePaste","slice","clipboardData","anyImageFound","getAsFile","editorView","update","prevState","prevDecos","newDecos","updateState","createImageExtension","dropImagePlugin","TiptapImage","allowBase64","CustomKeymap","selectTextWithinNodeBoundaries","commands","startNodePos","$from","endNodePos","$to","setTextSelection","addKeyboardShortcuts","Mod-a","startSelectionPos","endSelectionPos","isCurrentTextSelectionNotExtendedToNodeBoundaries","serializeForClipboard","someProp","f","context","content","openStart","openEnd","childCount","firstChild","push","defaultAttrs","serializer","DOMSerializer","fromSchema","detachedDoc","wrap","serializeFragment","needsWrap","wrappers","nodeType","wrapMap","nodeName","toLowerCase","i","wrapper","JSON","stringify","text","textBetween","size","dom","thead","tbody","tfoot","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","absoluteRect","element","data","getBoundingClientRect","ancestor","parentElement","window","getComputedStyle","ancestorRect","nodeDOMAtCoords","coords","elementsFromPoint","x","y","elem","matches","join","nodePosAtDOM","boundingRect","dragHandleWidth","inside","DragHandle","handleDragStart","Element","nodePos","setSelection","clearData","setData","effectAllowed","setDragImage","dragging","move","ctrlKey","handleClick","classList","dragHandleElement","hideDragHandle","showDragHandle","draggable","dataset","dragHandle","addEventListener","destroy","mousemove","editable","compStyle","lineHeight","parseInt","paddingTop","rect","style","keydown","mousewheel","dragstart","dragend","DragAndDrop","buildDecorationSet","highlight","inline","HighlightDecorationExtension","initialHighlight","_","transaction","autocompleteState","toggleAutocompleteHighlight","removeAutocompleteHighlight","CommandPluginKey","SlashCommand","Node","renderText","suggestion","char","label","id","deleteTriggerWithBackspace","renderHTML","mergeAttributes","nodeAfter","overrideSpace","startsWith","insertContentAt","getSelection","collapseToEnd","allow","resolve","parent","contentMatch","matchType","group","selectable","atom","addAttributes","default","parseHTML","getAttribute","tag","renderLabel","undefined","warn","html","Backspace","isCommand","anchor","nodesBetween","insertText","nodeSize","Suggestion","aiController","query","availableSuggestionItems","suggestionItems","autocompleteSuggestionItem","inTitle","title","searchTerms","some","term","can","render","component","containerEl","cleanupAutoUpdate","reference","escapeListener","exit","parentNode","removeChild","removeEventListener","onStart","stopPropagation","stopImmediatePropagation","ReactRenderer","CommandList","onClose","clientRect","zIndex","body","autoUpdate","computePosition","middleware","offset","flip","shift","strategy","then","assign","visibility","onUpdate","updateProps","onKeyDown","onExit","selectedIndex","setSelectedIndex","useState","selectItem","upHandler","downHandler","enterHandler","event_0","useImperativeHandle","itemRefs","scrollIntoView","block","t11","item_1","el","e_0","description","t12","Error","deleteRange","textBeforeCursor","textAfterCursor","buffer","autocomplete","delta","insertContent","applyInputRules","applyPasteRules","parseOptions","preserveWhitespace","setNode","accept","onchange","fileList","click","proseClasses","canUseDOM","Boolean","FireCMSEditor","onJsonContentChange","onHtmlContentChange","onMarkdownContentChange","version","textSize","handleImageUpload","disabled","React","editorRef","imagePlugin","imageExtension","useMemo","openNode","setOpenNode","openLink","setOpenLink","useInjectStyles","cssStyles","deferredHighlight","useDeferredValue","setContent","setEditable","firstUpdateRef","onEditorUpdate","markdown","storage","getMarkdown","addLineBreakAfterImages","jsonContent","getJSON","getHTML","proseClass","extensions","Document","Underline","Bold","TextStyleKit","Italic","Strike","Color","Highlight","multicolor","Heading","Markdown","imageRegex","replace","match"],"mappings":"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AA,CAAI;AAC/D;AAEA,MAAM7B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/components/editor-bubble.tsx","../src/components/editor-bubble-item.tsx","../src/selectors/node-selector.tsx","../src/selectors/link-selector.tsx","../src/selectors/text-buttons.tsx","../src/utils/remove_classes.ts","../src/extensions/TextLoadingDecorationExtension.tsx","../src/extensions/index.ts","../src/editor_extensions.tsx","../src/extensions/Image.ts","../src/extensions/custom-keymap.ts","../src/extensions/clipboard.ts","../src/extensions/drag-and-drop.tsx","../src/extensions/HighlightDecorationExtension.ts","../src/extensions/slashCommand.tsx","../src/editor.tsx"],"sourcesContent":["import { useCurrentEditor } from \"@tiptap/react\";\nimport { forwardRef, type ReactNode, useMemo } from \"react\";\n// @ts-ignore\nimport { BubbleMenu, type BubbleMenuProps } from \"@tiptap/react/menus\";\nimport { NodeSelection } from \"@tiptap/pm/state\";\n\nexport interface EditorBubbleProps extends Omit<BubbleMenuProps, \"editor\"> {\n children: ReactNode;\n // Temporary backward-compat: map v2 tippyOptions.placement -> v3 options.placement\n tippyOptions?: { placement?: any };\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({ children, tippyOptions, options, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n\n const bubbleMenuProps: Omit<BubbleMenuProps, \"editor\" | \"children\"> = useMemo(() => {\n const shouldShow: BubbleMenuProps[\"shouldShow\"] = ({ editor, state }:any) => {\n const { selection } = state;\n const { empty } = selection as any;\n\n // don't show bubble menu if:\n // - the selected node is an image\n // - the selection is empty\n // - the selection is a node selection (for drag handles)\n if (editor.isActive(\"image\") || empty || selection instanceof NodeSelection) {\n return false;\n }\n return true;\n };\n\n const mergedOptions = {\n ...options,\n // map deprecated tippy placement if provided\n placement: tippyOptions?.placement ?? options?.placement,\n } as BubbleMenuProps[\"options\"];\n\n return {\n shouldShow,\n options: mergedOptions,\n ...rest,\n };\n }, [rest, options, tippyOptions?.placement]);\n\n if (!editor) return null;\n\n return (\n // We need to add this because of https://github.com/ueberdosis/tiptap/issues/2658\n <div ref={ref}>\n <BubbleMenu editor={editor} {...bubbleMenuProps}>\n {children}\n </BubbleMenu>\n </div>\n );\n }\n);\n\nexport default EditorBubble;\n","import { type ComponentPropsWithoutRef, type ReactNode, forwardRef } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { useCurrentEditor, type Editor } from \"@tiptap/react\";\n\ninterface EditorBubbleItemProps {\n children: ReactNode;\n asChild?: boolean;\n onSelect?: (editor: Editor) => void;\n}\n\nexport const EditorBubbleItem = forwardRef<\n HTMLDivElement,\n EditorBubbleItemProps & Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\">\n>(({ children, asChild, onSelect, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n const Comp = asChild ? Slot : \"div\";\n\n if (!editor) return null;\n\n return (\n <Comp ref={ref} {...rest} onClick={() => onSelect?.(editor)}>\n {children}\n </Comp>\n );\n});\n\nEditorBubbleItem.displayName = \"EditorBubbleItem\";\n\nexport default EditorBubbleItem;\n","import React from \"react\";\nimport { EditorBubbleItem, useEditor } from \"../components\";\n\nimport {\n Button,\n CheckBoxIcon,\n CheckIcon,\n CodeIcon,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n KeyboardArrowDownIcon,\n Looks3Icon,\n LooksOneIcon,\n LooksTwoIcon,\n Popover,\n TextFieldsIcon\n} from \"@firecms/ui\";\n\nexport type SelectorItem = {\n name: string;\n icon: React.ElementType;\n command: (editor: ReturnType<typeof useEditor>[\"editor\"]) => void;\n isActive: (editor: ReturnType<typeof useEditor>[\"editor\"]) => boolean;\n};\n\nconst items: SelectorItem[] = [\n {\n name: \"Text\",\n icon: TextFieldsIcon,\n command: (editor) =>\n editor?.chain().focus().toggleNode(\"paragraph\", \"paragraph\").run(),\n // I feel like there has to be a more efficient way to do this – feel free to PR if you know how!\n isActive: (editor) =>\n (editor?.isActive(\"paragraph\") &&\n !editor?.isActive(\"bulletList\") &&\n !editor?.isActive(\"orderedList\")) ?? false,\n },\n {\n name: \"Heading 1\",\n icon: LooksOneIcon,\n command: (editor) =>\n editor?.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: (editor) => editor?.isActive(\"heading\", { level: 1 }) ?? false,\n },\n {\n name: \"Heading 2\",\n icon: LooksTwoIcon,\n command: (editor) =>\n editor?.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (editor) => editor?.isActive(\"heading\", { level: 2 }) ?? false,\n },\n {\n name: \"Heading 3\",\n icon: Looks3Icon,\n command: (editor) =>\n editor?.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: (editor) => editor?.isActive(\"heading\", { level: 3 }) ?? false,\n },\n {\n name: \"To-do List\",\n icon: CheckBoxIcon,\n command: (editor) => editor?.chain().focus().toggleTaskList().run(),\n isActive: (editor) => editor?.isActive(\"taskItem\") ?? false,\n },\n {\n name: \"Bullet List\",\n icon: FormatListBulletedIcon,\n command: (editor) => editor?.chain().focus().toggleBulletList().run(),\n isActive: (editor) => editor?.isActive(\"bulletList\") ?? false,\n },\n {\n name: \"Numbered List\",\n icon: FormatListNumberedIcon,\n command: (editor) => editor?.chain().focus().toggleOrderedList().run(),\n isActive: (editor) => editor?.isActive(\"orderedList\") ?? false,\n },\n {\n name: \"Quote\",\n icon: FormatQuoteIcon,\n command: (editor) => editor?.chain()\n .focus()\n .toggleNode(\"paragraph\", \"paragraph\")\n .toggleBlockquote()\n .run(),\n isActive: (editor) => editor?.isActive(\"blockquote\") ?? false,\n },\n {\n name: \"Code\",\n icon: CodeIcon,\n command: (editor) => editor?.chain().focus().toggleCodeBlock().run(),\n isActive: (editor) => editor?.isActive(\"codeBlock\") ?? false,\n },\n];\n\ninterface NodeSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n portalContainer: HTMLElement | null;\n}\n\nexport const NodeSelector = ({\n open,\n onOpenChange,\n portalContainer\n }: NodeSelectorProps) => {\n const { editor } = useEditor();\n if (!editor) return null;\n const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? {\n name: \"Multiple\",\n };\n\n return (\n\n <Popover\n sideOffset={5}\n align=\"start\"\n portalContainer={portalContainer}\n className=\"w-48 p-1\"\n trigger={<Button variant=\"text\"\n className=\"gap-2 rounded-none\"\n color=\"text\">\n <span className=\"whitespace-nowrap text-sm\">{activeItem.name}</span>\n <KeyboardArrowDownIcon size={\"small\"}/>\n </Button>}\n modal={true}\n open={open}\n onOpenChange={onOpenChange}>\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={(editor) => {\n item.command(editor);\n onOpenChange(false);\n }}\n className=\"flex cursor-pointer items-center justify-between rounded px-2 py-1 text-sm hover:bg-blue-50 hover:dark:bg-surface-700 text-surface-900 dark:text-white\"\n >\n <div className=\"flex items-center space-x-2\">\n <item.icon size=\"smallest\"/>\n <span>{item.name}</span>\n </div>\n {activeItem.name === item.name && <CheckIcon size=\"smallest\"/>}\n </EditorBubbleItem>\n ))}\n\n </Popover>\n );\n};\n","import { useEditor } from \"../components\";\nimport { useEffect, useRef, } from \"react\";\nimport { Button, CheckIcon, cls, DeleteIcon, focusedDisabled, Popover } from \"@firecms/ui\";\n\nexport function isValidUrl(url: string) {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function getUrlFromString(str: string) {\n if (isValidUrl(str)) return str;\n try {\n if (str.includes(\".\") && !str.includes(\" \")) {\n return new URL(`https://${str}`).toString();\n }\n return null;\n } catch (e) {\n return null;\n }\n}\n\ninterface LinkSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const LinkSelector = ({\n open,\n onOpenChange\n }: LinkSelectorProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { editor } = useEditor();\n\n // Autofocus on input by default\n useEffect(() => {\n inputRef.current && inputRef.current?.focus();\n });\n\n if (!editor) return null;\n\n return (\n <Popover modal={true}\n open={open}\n onOpenChange={onOpenChange}\n trigger={<Button variant=\"text\"\n className=\"gap-2 rounded-none\"\n color={\"text\"}>\n <p className={cls(\"underline decoration-stone-400 underline-offset-4\", {\n \"text-blue-500\": editor.isActive(\"link\"),\n })}>\n Link\n </p>\n </Button>}>\n <form\n onSubmit={(e) => {\n const target = e.currentTarget as HTMLFormElement;\n e.preventDefault();\n const input = target[0] as HTMLInputElement;\n const url = getUrlFromString(input.value);\n url && editor.chain().focus().setLink({ href: url }).run();\n }}\n className=\"flex p-1\"\n >\n <input\n ref={inputRef}\n autoFocus={open}\n placeholder=\"Paste a link\"\n defaultValue={editor.getAttributes(\"link\").href || \"\"}\n className={cls(\"text-surface-900 dark:text-white flex-grow bg-transparent p-1 text-sm outline-none\", focusedDisabled)}/>\n\n {editor.getAttributes(\"link\").href ? (\n <Button\n size={\"small\"}\n variant=\"text\"\n type=\"button\"\n color={\"text\"}\n className=\"flex items-center\"\n onClick={() => {\n editor.chain().focus().unsetLink().run();\n }}\n >\n <DeleteIcon size=\"small\"/>\n </Button>\n ) : (\n <Button size={\"small\"}\n variant={\"text\"}>\n <CheckIcon size=\"small\"/>\n </Button>\n )}\n </form>\n </Popover>\n );\n};\n","import { EditorBubbleItem, useEditor } from \"../components\";\nimport type { SelectorItem } from \"./node-selector\";\nimport {\n Button,\n cls,\n CodeIcon,\n FormatBoldIcon,\n FormatItalicIcon,\n FormatStrikethroughIcon,\n FormatUnderlinedIcon\n} from \"@firecms/ui\";\n\nexport const TextButtons = () => {\n const { editor } = useEditor();\n if (!editor) return null;\n const items: SelectorItem[] = [\n {\n name: \"bold\",\n isActive: (editor) => editor?.isActive(\"bold\") ?? false,\n command: (editor) => editor?.chain().focus().toggleBold().run(),\n icon: FormatBoldIcon,\n },\n {\n name: \"italic\",\n isActive: (editor) => editor?.isActive(\"italic\") ?? false,\n command: (editor) => editor?.chain().focus().toggleItalic().run(),\n icon: FormatItalicIcon,\n },\n {\n name: \"underline\",\n isActive: (editor) => editor?.isActive(\"underline\") ?? false,\n command: (editor) => editor?.chain().focus().toggleUnderline().run(),\n icon: FormatUnderlinedIcon,\n },\n {\n name: \"strike\",\n isActive: (editor) => editor?.isActive(\"strike\") ?? false,\n command: (editor) => editor?.chain().focus().toggleStrike().run(),\n icon: FormatStrikethroughIcon,\n },\n {\n name: \"code\",\n isActive: (editor) => editor?.isActive(\"code\") ?? false,\n command: (editor) => editor?.chain().focus().toggleCode().run(),\n icon: CodeIcon,\n },\n ];\n return (\n <div className=\"flex\">\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={(editor) => {\n item.command(editor);\n }}\n >\n <Button size={\"small\"}\n color=\"text\"\n className=\"gap-2 rounded-none h-full\"\n variant=\"text\">\n <item.icon\n className={cls( {\n \"text-inherit\": !item.isActive(editor),\n \"text-blue-500\": item.isActive(editor),\n })}\n />\n </Button>\n </EditorBubbleItem>\n ))}\n </div>\n );\n};\n","export function removeClassesFromJson(jsonObj: any): any {\n // If it's an array, apply the function to each element\n if (Array.isArray(jsonObj)) {\n return jsonObj.map(item => removeClassesFromJson(item));\n } else if (typeof jsonObj === \"object\" && jsonObj !== null) { // If it's an object, recurse through its properties\n // If the object has an `attrs` property and `class` field, delete the `class` field\n if (jsonObj.attrs && typeof jsonObj.attrs === \"object\" && \"class\" in jsonObj.attrs) {\n delete jsonObj.attrs.class;\n }\n\n // Apply the function recursively to object properties\n Object.keys(jsonObj).forEach(key => {\n jsonObj[key] = removeClassesFromJson(jsonObj[key]);\n });\n }\n return jsonObj;\n}\n","import { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { Command, Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n textLoadingDecoration: {\n toggleLoadingDecoration: (loadingHtml?: string) => ReturnType;\n removeLoadingDecoration: () => ReturnType;\n };\n }\n}\n\n// Define and export the plugin key\nexport const loadingDecorationKey = new PluginKey<LoadingDecorationState>(\"loadingDecoration\");\n\ninterface LoadingDecorationState {\n decorationSet: DecorationSet;\n hasDecoration: boolean;\n}\n\n // this decoration is used to display streaming content from an LLM, called withing the slash command\nconst TextLoadingDecorationExtension = Extension.create({\n name: \"loadingDecoration\",\n\n addOptions() {\n return {\n pluginKey: loadingDecorationKey\n };\n },\n\n addProseMirrorPlugins() {\n const pluginKey = this.options.pluginKey;\n\n return [\n new Plugin<LoadingDecorationState>({\n key: pluginKey,\n\n state: {\n init() {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n },\n\n apply(tr, oldState) {\n const action = tr.getMeta(pluginKey);\n\n if (action?.type === \"loadingDecoration\") {\n const { pos, remove, loadingHtml } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n }\n\n const decoration = Decoration.widget(pos, () => {\n const container = document.createElement(\"span\");\n container.className = \"loading-decoration\";\n\n // Sanitize and append HTML\n if (loadingHtml) {\n container.innerHTML = loadingHtml;\n } else {\n const span = document.createElement(\"span\");\n span.innerText = \"loading...\";\n container.appendChild(span);\n }\n\n return container;\n });\n\n return {\n decorationSet: DecorationSet.empty.add(tr.doc, [decoration]),\n hasDecoration: true\n };\n }\n\n return {\n decorationSet: oldState.decorationSet.map(tr.mapping, tr.doc),\n hasDecoration: oldState.hasDecoration\n };\n }\n },\n\n props: {\n decorations(state) {\n return this.getState(state)?.decorationSet || DecorationSet.empty;\n }\n }\n })\n ];\n },\n\n addCommands() {\n return {\n toggleLoadingDecoration: (loadingHtml?: string): Command => ({ state, dispatch }) => {\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n\n const tr = state.tr.setMeta(pluginKey, {\n pos,\n type: \"loadingDecoration\",\n remove: false,\n loadingHtml\n });\n\n dispatch(tr);\n return true;\n },\n\n removeLoadingDecoration: (): Command => ({ state, dispatch }) => {\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n const tr = state.tr.setMeta(pluginKey, {\n pos: 0, // We can pass any position as it will remove the entire decoration set\n type: \"loadingDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n };\n }\n});\n\nexport default TextLoadingDecorationExtension;\n","import StarterKit from \"@tiptap/starter-kit\";\nimport HorizontalRule from \"@tiptap/extension-horizontal-rule\";\nimport TiptapLink from \"@tiptap/extension-link\";\nimport TiptapImage from \"@tiptap/extension-image\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\n\nimport { TaskItem } from \"@tiptap/extension-task-item\";\nimport { TaskList } from \"@tiptap/extension-task-list\";\nimport { Editor, InputRule } from \"@tiptap/core\";\nimport { loadingDecorationKey } from \"./TextLoadingDecorationExtension\";\n\nconst PlaceholderExtension = Placeholder.configure({\n placeholder: ({\n node,\n editor\n }) => {\n const {\n from,\n to\n } = editor.state.selection;\n\n function hasLoadingDecoration(editor: Editor): boolean {\n const pluginState = loadingDecorationKey.get(editor.state);\n return pluginState?.getState(editor.state)?.hasDecoration ?? false;\n }\n\n const hasDecoration = hasLoadingDecoration(editor);\n\n if (hasDecoration) {\n return \"\";\n }\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`;\n }\n if (node.type.name === \"paragraph\") {\n return \"Press '/' for commands\";\n }\n return \"\";\n },\n includeChildren: true\n});\n\nconst Horizontal = HorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({\n state,\n range\n }) => {\n const attributes = {};\n\n const { tr } = state;\n const start = range.from;\n const end = range.to;\n\n tr.insert(start - 1, this.type.create(attributes) as any).delete(\n tr.mapping.map(start),\n tr.mapping.map(end)\n );\n }\n })\n ];\n }\n});\n\nexport {\n PlaceholderExtension as Placeholder,\n StarterKit,\n Horizontal as HorizontalRule,\n TiptapLink,\n TiptapImage,\n TaskItem,\n TaskList,\n InputRule\n};\n\nexport { getPrevText } from \"../utils/utils\";\n","import StarterKit from \"@tiptap/starter-kit\";\n\nimport { HorizontalRule, Placeholder, TaskItem, TaskList, TiptapLink, } from \"./extensions\";\n\nimport { cls, defaultBorderMixin } from \"@firecms/ui\";\nimport OrderedList from \"@tiptap/extension-ordered-list\";\nimport BulletList from \"@tiptap/extension-bullet-list\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport CodeBlock from \"@tiptap/extension-code-block\";\nimport Blockquote from \"@tiptap/extension-blockquote\";\nimport Code from \"@tiptap/extension-code\";\n\nexport const placeholder = Placeholder;\n\nexport const tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n class: cls(\n \"text-surface-700 dark:text-surface-accent-200 underline underline-offset-[3px] hover:text-primary transition-colors cursor-pointer\",\n ),\n },\n});\n\nexport const taskList = TaskList.configure({\n HTMLAttributes: {\n class: cls(\"not-prose\"),\n },\n});\nexport const taskItem = TaskItem.configure({\n HTMLAttributes: {\n class: cls(\"flex items-start my-4\"),\n },\n nested: true,\n});\n\nexport const horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n class: cls(\"mt-4 mb-6 border-t\", defaultBorderMixin),\n },\n});\n\nexport const bulletList = BulletList.configure({\n HTMLAttributes: {\n class: cls(\"list-disc list-outside leading-3 -mt-2\"),\n },\n});\n\nexport const orderedList = OrderedList.configure({\n HTMLAttributes: {\n class: cls(\"list-decimal list-outside leading-3 -mt-2\"),\n },\n});\n\nexport const listItem = ListItem.configure({\n HTMLAttributes: {\n class: cls(\"leading-normal -mb-2\"),\n },\n});\n\nexport const blockquote = Blockquote.configure({\n HTMLAttributes: {\n class: cls(\"border-l-4 border-primary\"),\n },\n});\n\nexport const codeBlock = CodeBlock.configure({\n HTMLAttributes: {\n class: cls(\"rounded bg-blue-50 dark:bg-surface-700 border p-5 font-mono font-medium\", defaultBorderMixin),\n },\n});\n\n// code: {\n// HTMLAttributes: {\n// class: cls(\"rounded-md bg-surface-accent-50 dark:bg-surface-700 px-1.5 py-1 font-mono font-medium\"),\n// spellcheck: \"false\",\n// },\n// },\n\nexport const code = Code.configure({\n HTMLAttributes: {\n class: cls(\"rounded-md bg-surface-accent-50 dark:bg-surface-700 px-1.5 py-1 font-mono font-medium\"),\n spellcheck: \"false\",\n },\n});\n\nexport const starterKit = StarterKit.configure({\n document: false,\n horizontalRule: false,\n dropcursor: {\n color: \"#DBEAFE\",\n width: 4,\n },\n gapcursor: false,\n});\n","import { TiptapImage } from \"./index\";\nimport { cls, defaultBorderMixin } from \"@firecms/ui\";\nimport { Decoration, DecorationSet, EditorView } from \"@tiptap/pm/view\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nexport type UploadFn = (image: File) => Promise<string>;\n\nexport async function onFileRead(view: EditorView, readerEvent: ProgressEvent<FileReader>, pos: number, upload: UploadFn, image: File) {\n\n const { schema } = view.state;\n\n // @ts-ignore\n const plugin = view.state.plugins.find((p: Plugin) => p.key === ImagePluginKey.key);\n if (!plugin) {\n console.error(\"Image plugin not found\");\n return;\n }\n let decorationSet = plugin.getState(view.state);\n\n const placeholder = document.createElement(\"div\");\n const imageElement = document.createElement(\"img\");\n imageElement.setAttribute(\"class\", \"opacity-40 rounded-lg border \" + defaultBorderMixin);\n imageElement.src = readerEvent.target?.result as string;\n placeholder.appendChild(imageElement);\n\n const deco = Decoration.widget(pos, placeholder);\n decorationSet = decorationSet?.add(view.state.doc, [deco]);\n view.dispatch(view.state.tr.setMeta(plugin, { decorationSet }));\n\n // Image Upload Logic\n const src = await upload(image);\n console.debug(\"Uploaded image\", src);\n\n // Replace placeholder with actual image\n const imageNode = schema.nodes.image.create({ src });\n const tr = view.state.tr.replaceWith(pos, pos, imageNode);\n\n // Remove placeholder decoration\n decorationSet = decorationSet?.remove([deco]);\n tr.setMeta(plugin, { decorationSet });\n view.dispatch(tr);\n}\n\nexport const ImagePluginKey = new PluginKey(\"imagePlugin\");\n\nexport const createDropImagePlugin = (upload: UploadFn): Plugin => {\n const plugin: Plugin = new Plugin({\n key: ImagePluginKey,\n state: {\n // Initialize the plugin state with an empty DecorationSet\n init: () => DecorationSet.empty,\n // Apply transactions to update the state\n apply: (tr, old) => {\n // Handle custom transaction steps that update decorations\n const meta = tr.getMeta(plugin);\n if (meta && meta.decorationSet) {\n return meta.decorationSet;\n }\n // Map decorations to the new document structure\n return old.map(tr.mapping, tr.doc);\n }\n },\n props: {\n handleDOMEvents: {\n drop: (view, event) => {\n if (!event.dataTransfer?.files || event.dataTransfer?.files.length === 0) {\n return false;\n }\n event.preventDefault();\n\n const files = Array.from(event.dataTransfer.files);\n const images = files.filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n console.log(\"No images found in dropped files\");\n return false;\n }\n\n images.forEach(image => {\n\n const position = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view as any, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n return true;\n }\n },\n handlePaste(view, event, slice) {\n const items = Array.from(event.clipboardData?.items || []);\n const pos = view.state.selection.from;\n let anyImageFound = false;\n\n items.forEach((item) => {\n const image = item.getAsFile();\n if (image) {\n anyImageFound = true;\n\n const reader = new FileReader();\n\n reader.onload = async (readerEvent) => {\n await onFileRead(view as any, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n }\n });\n\n return anyImageFound;\n },\n decorations(state) {\n return plugin.getState(state);\n }\n },\n view(editorView) {\n // This is needed to immediately apply the decoration updates\n return {\n update(view, prevState) {\n const prevDecos = plugin.getState(prevState);\n const newDecos = plugin.getState(view.state);\n\n if (prevDecos !== newDecos) {\n view.updateState(view.state);\n }\n }\n };\n }\n });\n return plugin;\n};\n\n/**\n * Matches following attributes in Markdown-typed image: [, alt, src, title]\n *\n * Example:\n * ![Lorem](image.jpg) -> [, \"Lorem\", \"image.jpg\"]\n * ![](image.jpg \"Ipsum\") -> [, \"\", \"image.jpg\", \"Ipsum\"]\n * ![Lorem](image.jpg \"Ipsum\") -> [, \"Lorem\", \"image.jpg\", \"Ipsum\"]\n */\nconst IMAGE_INPUT_REGEX = /!\\[(.+|:?)\\]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/;\n\nexport const createImageExtension = (dropImagePlugin: Plugin) => {\n return TiptapImage.extend({\n addProseMirrorPlugins() {\n return [dropImagePlugin];\n }\n }).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cls(\"rounded-lg border\", defaultBorderMixin)\n }\n });\n};\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n // eslint-disable-next-line no-unused-vars\n interface Commands<ReturnType> {\n customkeymap: {\n /**\n * Select text between node boundaries\n */\n selectTextWithinNodeBoundaries: () => ReturnType;\n };\n }\n}\n\nexport const CustomKeymap = Extension.create({\n name: \"CustomKeymap\",\n\n addCommands() {\n return {\n selectTextWithinNodeBoundaries:\n () =>\n ({ editor, commands }) => {\n const { state } = editor;\n const { tr } = state;\n const startNodePos = tr.selection.$from.start();\n const endNodePos = tr.selection.$to.end();\n return commands.setTextSelection({\n from: startNodePos,\n to: endNodePos,\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-a\": ({ editor }) => {\n const { state } = editor;\n const { tr } = state;\n const startSelectionPos = tr.selection.from;\n const endSelectionPos = tr.selection.to;\n const startNodePos = tr.selection.$from.start();\n const endNodePos = tr.selection.$to.end();\n const isCurrentTextSelectionNotExtendedToNodeBoundaries =\n startSelectionPos > startNodePos || endSelectionPos < endNodePos;\n if (isCurrentTextSelectionNotExtendedToNodeBoundaries) {\n editor.chain().selectTextWithinNodeBoundaries().run();\n return true;\n }\n return false;\n },\n };\n },\n});\n\n","import { DOMSerializer, Slice } from \"@tiptap/pm/model\"\nimport { EditorView } from \"@tiptap/pm/view\";\n\nexport function serializeForClipboard(view: EditorView, slice: Slice) {\n view.someProp(\"transformCopied\", f => {\n slice = f(slice!, view)\n })\n\n const context = [];\n let {\n content,\n openStart,\n openEnd\n } = slice\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild!.childCount == 1) {\n openStart--\n openEnd--\n const node = content.firstChild!\n // @ts-ignore\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null)\n content = node.content\n }\n\n const serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema)\n const doc = detachedDoc(), wrap = doc.createElement(\"div\")\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }))\n\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n const wrapper = doc.createElement(needsWrap[i])\n while (wrap.firstChild) wrapper.appendChild(wrap.firstChild)\n wrap.appendChild(wrapper)\n wrappers++\n }\n firstChild = wrap.firstChild\n }\n\n if (firstChild && firstChild.nodeType == 1)\n (firstChild as HTMLElement).setAttribute(\n \"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`)\n\n const text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\")\n\n return {\n dom: wrap,\n text,\n slice\n }\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap: { [node: string]: string[] } = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n}\n\nlet _detachedDoc: Document | null = null\n\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n","import { Extension } from \"@tiptap/core\";\n\nimport { NodeSelection, Plugin } from \"@tiptap/pm/state\";\n\nimport { EditorView } from \"@tiptap/pm/view\";\nimport { serializeForClipboard } from \"./clipboard\";\n\nexport interface DragHandleOptions {\n /**\n * The width of the drag handle\n */\n dragHandleWidth: number;\n}\n\nfunction absoluteRect(element: Element) {\n const data = element.getBoundingClientRect();\n\n let ancestor = element.parentElement;\n while (ancestor && window.getComputedStyle(ancestor).position === \"static\") {\n ancestor = ancestor.parentElement;\n }\n const ancestorRect = ancestor?.getBoundingClientRect();\n\n return {\n top: data.top - (ancestorRect?.top ?? 0),\n left: data.left - (ancestorRect?.left ?? 0),\n width: data.width\n };\n}\n\nfunction nodeDOMAtCoords(coords: { x: number; y: number }) {\n return document\n .elementsFromPoint(coords.x, coords.y)\n .find(\n (elem: Element) =>\n elem.parentElement?.matches?.(\".ProseMirror\") ||\n elem.matches(\n [\"li\", \"p:not(:first-child)\", \"pre\", \"blockquote\", \"h1, h2, h3, h4, h5, h6\"].join(\", \")\n )\n );\n}\n\nfunction nodePosAtDOM(node: Element, view: EditorView, options: DragHandleOptions) {\n const boundingRect = node.getBoundingClientRect();\n\n return view.posAtCoords({\n left: boundingRect.left + 50 + options.dragHandleWidth,\n top: boundingRect.top + 1\n })?.inside;\n}\n\nfunction DragHandle(options: DragHandleOptions) {\n function handleDragStart(event: DragEvent, view: EditorView) {\n view.focus();\n\n if (!event.dataTransfer) return;\n\n const node = nodeDOMAtCoords({\n x: event.clientX + 50 + options.dragHandleWidth,\n y: event.clientY\n });\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (nodePos == null || nodePos < 0) return;\n\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos)));\n\n const slice = view.state.selection.content();\n const {\n dom,\n text\n } = serializeForClipboard(view, slice);\n\n event.dataTransfer.clearData();\n event.dataTransfer.setData(\"text/html\", dom.innerHTML);\n event.dataTransfer.setData(\"text/plain\", text);\n event.dataTransfer.effectAllowed = \"copyMove\";\n\n event.dataTransfer.setDragImage(node, 0, 0);\n\n view.dragging = {\n slice,\n move: event.ctrlKey\n };\n }\n\n function handleClick(event: MouseEvent, view: EditorView) {\n view.focus();\n\n view.dom.classList.remove(\"dragging\");\n\n const node = nodeDOMAtCoords({\n x: event.clientX + 50 + options.dragHandleWidth,\n y: event.clientY\n });\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (!nodePos) return;\n\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos)));\n }\n\n let dragHandleElement: HTMLElement | null = null;\n\n function hideDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.add(\"hide\");\n }\n }\n\n function showDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.remove(\"hide\");\n }\n }\n\n return new Plugin({\n view: (view) => {\n dragHandleElement = document.createElement(\"div\");\n dragHandleElement.draggable = true;\n dragHandleElement.dataset.dragHandle = \"\";\n dragHandleElement.classList.add(\"drag-handle\");\n dragHandleElement.addEventListener(\"dragstart\", (e) => {\n handleDragStart(e, view as any);\n });\n dragHandleElement.addEventListener(\"click\", (e) => {\n handleClick(e, view as any);\n });\n\n hideDragHandle();\n\n view?.dom?.parentElement?.appendChild(dragHandleElement);\n\n return {\n destroy: () => {\n // dragHandleElement?.remove?.();\n // dragHandleElement = null;\n }\n };\n },\n props: {\n handleDOMEvents: {\n mousemove: (view, event) => {\n if (!view.editable) {\n return;\n }\n\n const node = nodeDOMAtCoords({\n x: event.clientX + 50 + options.dragHandleWidth,\n y: event.clientY\n });\n\n if (!(node instanceof Element)) {\n hideDragHandle();\n return;\n }\n\n const compStyle = window.getComputedStyle(node);\n const lineHeight = parseInt(compStyle.lineHeight, 10);\n const paddingTop = parseInt(compStyle.paddingTop, 10);\n\n const rect = absoluteRect(node);\n\n rect.top += (lineHeight - 24) / 2;\n rect.top += paddingTop;\n // Li markers\n if (node.matches(\"ul:not([data-type=taskList]) li, ol li\")) {\n rect.left -= options.dragHandleWidth;\n }\n rect.width = options.dragHandleWidth;\n\n if (!dragHandleElement) return;\n\n dragHandleElement.style.left = `${rect.left - rect.width}px`;\n dragHandleElement.style.top = `${rect.top}px`;\n showDragHandle();\n },\n keydown: () => {\n hideDragHandle();\n },\n mousewheel: () => {\n hideDragHandle();\n },\n // dragging class is used for CSS\n dragstart: (view) => {\n view.dom.classList.add(\"dragging\");\n },\n drop: (view) => {\n view.dom.classList.remove(\"dragging\");\n },\n dragend: (view) => {\n view.dom.classList.remove(\"dragging\");\n }\n }\n }\n });\n}\n\nexport const DragAndDrop = Extension.create({\n name: \"dragAndDrop\",\n\n addProseMirrorPlugins() {\n return [\n DragHandle({\n dragHandleWidth: 24\n })\n ];\n }\n});\n","import { Command, Extension } from \"@tiptap/core\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\"\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n highlightDecoration: {\n toggleAutocompleteHighlight: (range?: { from: number, to: number }) => ReturnType;\n removeAutocompleteHighlight: () => ReturnType;\n };\n }\n}\n\nexport interface HighlightRange {\n from: number\n to: number\n}\n\ninterface AutocompleteHighlightState {\n highlight?: HighlightRange\n decorationSet?: DecorationSet\n}\n\nexport interface HighlightDecorationOptions {\n pluginKey: PluginKey<AutocompleteHighlightState>\n highlight?: { from: number, to: number }\n}\n\nfunction buildDecorationSet(highlight: any, doc: any) {\n const decorations: [any?] = [];\n\n if (highlight) {\n decorations.push(\n Decoration.inline(highlight.from, highlight.to, {\n class: \"dark:bg-surface-accent-700 bg-surface-accent-300\"\n })\n );\n }\n const decorationSet = DecorationSet.create(doc, decorations);\n return decorationSet;\n}\n\n/**\n * This plugin is used to highlight the current autocomplete suggestion.\n * It allows to set a range and remove it.\n */\nexport const HighlightDecorationExtension = (initialHighlight?: HighlightRange) => Extension.create<HighlightDecorationOptions>({\n name: \"highlightDecoration\",\n addOptions() {\n return {\n pluginKey: new PluginKey<AutocompleteHighlightState>(\"highlightDecoration\"),\n highlight: initialHighlight\n };\n },\n addProseMirrorPlugins() {\n\n const pluginKey = this.options.pluginKey;\n return [\n new Plugin<AutocompleteHighlightState>({\n key: pluginKey,\n state: {\n init: (_, { doc }) => {\n const highlight = this.options.highlight;\n const decorationSet = highlight && doc ? buildDecorationSet(highlight, doc) : DecorationSet.empty;\n return {\n decorationSet,\n highlight\n };\n },\n apply(transaction, oldState) {\n const action = transaction.getMeta(pluginKey);\n const highlight = action?.range;\n if (action?.type === \"highlightDecoration\") {\n\n const doc = transaction.doc;\n const { remove } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty\n };\n }\n const decorationSet = buildDecorationSet(highlight, doc);\n return {\n decorationSet: decorationSet,\n highlight\n }\n } else {\n return oldState\n }\n }\n },\n props: {\n decorations(state) {\n const autocompleteState = this.getState(state);\n if (autocompleteState?.decorationSet) {\n return autocompleteState.decorationSet\n } else {\n return DecorationSet.empty\n }\n }\n }\n })\n ]\n },\n\n addCommands() {\n return {\n toggleAutocompleteHighlight: (range?: { from: number, to: number }): Command => ({\n state,\n dispatch\n }) => {\n\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n\n const tr = state.tr.setMeta(pluginKey, {\n pos,\n type: \"highlightDecoration\",\n remove: false,\n range\n });\n\n dispatch(tr);\n return true;\n },\n\n removeAutocompleteHighlight: (): Command => ({\n state,\n dispatch\n }) => {\n\n if (!dispatch) return false;\n\n const pluginKey = this.options.pluginKey;\n const tr = state.tr.setMeta(pluginKey, {\n pos: 0, // We can pass any position as it will remove the entire decoration set\n type: \"highlightDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n };\n }\n});\n","import React, { forwardRef, ReactNode, useEffect, useImperativeHandle, useRef, useState } from \"react\"\nimport { Editor, mergeAttributes, Node, Range } from \"@tiptap/core\";\nimport { ReactRenderer, useCurrentEditor } from \"@tiptap/react\";\nimport { DOMOutputSpec, Node as ProseMirrorNode } from \"@tiptap/pm/model\"\nimport { PluginKey } from \"@tiptap/pm/state\"\nimport Suggestion, { SuggestionOptions } from \"@tiptap/suggestion\";\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\n\nimport {\n AutoFixHighIcon,\n CheckBoxIcon,\n cls,\n CodeIcon,\n defaultBorderMixin,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n ImageIcon,\n Looks3Icon,\n LooksOneIcon,\n LooksTwoIcon,\n TextFieldsIcon\n} from \"@firecms/ui\"\nimport { onFileRead, UploadFn } from \"./Image\";\nimport { EditorAIController } from \"../types\";\n\n// See `addAttributes` below\nexport interface CommandNodeAttrs {\n /**\n * The identifier for the selected item that was mentioned, stored as a `data-id`\n * attribute.\n */\n id: string | null;\n /**\n * The label to be rendered by the editor as the displayed text for this mentioned\n * item, if provided. Stored as a `data-label` attribute. See `renderLabel`.\n */\n label?: string | null;\n}\n\nexport type CommandOptions<SuggestionItem = any, Attrs extends Record<string, any> = CommandNodeAttrs> = {\n /**\n * The HTML attributes for a command node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record<string, any>\n\n /**\n * A function to render the label of a command.\n * @deprecated use renderText and renderHTML instead\n * @param props The render props\n * @returns The label\n * @example ({ options, node }) => `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n */\n renderLabel?: (props: { options: CommandOptions<SuggestionItem, Attrs>; node: ProseMirrorNode }) => string\n\n /**\n * A function to render the text of a command.\n * @param props The render props\n * @returns The text\n * @example ({ options, node }) => `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n */\n renderText: (props: { options: CommandOptions<SuggestionItem, Attrs>; node: ProseMirrorNode }) => string\n\n /**\n * A function to render the HTML of a command.\n * @param props The render props\n * @returns The HTML as a ProseMirror DOM Output Spec\n * @example ({ options, node }) => ['span', { 'data-type': 'command' }, `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`]\n */\n renderHTML: (props: { options: CommandOptions<SuggestionItem, Attrs>; node: ProseMirrorNode }) => DOMOutputSpec\n\n /**\n * Whether to delete the trigger character with backspace.\n * @default false\n */\n deleteTriggerWithBackspace: boolean\n\n /**\n * The suggestion options.\n * @default {}\n * @example { char: '@', pluginKey: CommandPluginKey, command: ({ editor, range, props }) => { ... } }\n */\n suggestion: Omit<SuggestionOptions<SuggestionItem, Attrs>, \"editor\">\n}\n\n/**\n * The plugin key for the command plugin.\n * @default 'command'\n */\nexport const CommandPluginKey = new PluginKey(\"slash-command\")\n\nexport const SlashCommand = Node.create<CommandOptions>({\n name: \"command\",\n\n addOptions() {\n return {\n HTMLAttributes: {},\n renderText({\n options,\n node\n }) {\n return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n },\n deleteTriggerWithBackspace: false,\n renderHTML({\n options,\n node\n }) {\n return [\n \"span\",\n mergeAttributes(this.HTMLAttributes, options.HTMLAttributes),\n `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`\n ]\n },\n suggestion: {\n char: \"/\",\n pluginKey: CommandPluginKey,\n command: ({\n editor,\n range,\n props\n }) => {\n // increase range.to by one when the next node is of type \"text\"\n // and starts with a space character\n const nodeAfter = editor.view.state.selection.$to.nodeAfter\n const overrideSpace = nodeAfter?.text?.startsWith(\" \")\n\n if (overrideSpace) {\n range.to += 1\n }\n\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: this.name,\n attrs: props\n },\n {\n type: \"text\",\n text: \" \"\n }\n ])\n .run()\n\n window.getSelection()?.collapseToEnd()\n },\n allow: ({\n state,\n range\n }) => {\n const $from = state.doc.resolve(range.from)\n const type = state.schema.nodes[this.name]\n return !!$from.parent.type.contentMatch.matchType(type)\n }\n }\n }\n },\n\n group: \"inline\",\n\n inline: true,\n\n selectable: false,\n\n atom: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: element => element.getAttribute(\"data-id\"),\n renderHTML: attributes => {\n if (!attributes.id) {\n return {}\n }\n\n return {\n \"data-id\": attributes.id\n }\n }\n },\n\n label: {\n default: null,\n parseHTML: element => element.getAttribute(\"data-label\"),\n renderHTML: attributes => {\n if (!attributes.label) {\n return {}\n }\n\n return {\n \"data-label\": attributes.label\n }\n }\n }\n }\n },\n\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`\n }\n ]\n },\n\n renderHTML({\n node,\n HTMLAttributes\n }) {\n if (this.options.renderLabel !== undefined) {\n console.warn(\"renderLabel is deprecated use renderText and renderHTML instead\")\n return [\n \"span\",\n mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes),\n this.options.renderLabel({\n options: this.options,\n node\n })\n ]\n }\n const mergedOptions = { ...this.options }\n\n mergedOptions.HTMLAttributes = mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes)\n const html = this.options.renderHTML({\n options: mergedOptions,\n node\n })\n\n if (typeof html === \"string\") {\n return [\n \"span\",\n mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes),\n html\n ]\n }\n return html\n },\n\n renderText({ node }) {\n return this.options.renderText({\n options: this.options,\n node\n })\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => this.editor.commands.command(({\n tr,\n state\n }) => {\n let isCommand = false\n const { selection } = state\n const {\n empty,\n anchor\n } = selection\n\n if (!empty) {\n return false\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isCommand = true\n tr.insertText(\n this.options.deleteTriggerWithBackspace ? \"\" : this.options.suggestion.char || \"\",\n pos,\n pos + node.nodeSize\n )\n\n return false\n }\n return true\n })\n\n return isCommand\n })\n }\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion\n })\n ]\n }\n});\n\nexport interface SuggestionItem {\n title: string;\n description: string;\n icon: ReactNode;\n searchTerms?: string[];\n command?: (props: { editor: Editor; range: Range, upload: UploadFn, aiController?: EditorAIController }) => void;\n}\n\nexport const suggestion = (ref: React.MutableRefObject<any>, {\n upload,\n aiController\n}: {\n upload: UploadFn,\n aiController?: EditorAIController\n}): Omit<SuggestionOptions<SuggestionItem, any>, \"editor\"> =>\n({\n items: ({ query }) => {\n const availableSuggestionItems = [...suggestionItems];\n if (aiController) {\n availableSuggestionItems.push(autocompleteSuggestionItem)\n }\n\n return availableSuggestionItems\n .filter(item => {\n const inTitle = item.title.toLowerCase().startsWith(query.toLowerCase());\n if (inTitle) return inTitle;\n return item.searchTerms?.some(term => term.toLowerCase().startsWith(query.toLowerCase()));\n })\n },\n\n allow: ({ editor, range }) => {\n return editor.can().insertContentAt(range, { type: \"command\" });\n },\n\n render: () => {\n let component: any;\n let containerEl: HTMLDivElement | null = null;\n let cleanupAutoUpdate: (() => void) | null = null;\n let reference: { getBoundingClientRect: () => DOMRect } | null = null;\n let escapeListener: ((e: KeyboardEvent) => void) | null = null;\n\n function exit() {\n if (cleanupAutoUpdate) cleanupAutoUpdate();\n if (containerEl && containerEl.parentNode) {\n containerEl.parentNode.removeChild(containerEl);\n }\n if (escapeListener) {\n document.removeEventListener('keydown', escapeListener, true);\n escapeListener = null;\n }\n containerEl = null;\n reference = null;\n component?.destroy()\n }\n\n return {\n onStart: (props) => {\n // Add capture-phase escape listener\n escapeListener = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n exit();\n }\n };\n document.addEventListener('keydown', escapeListener, true);\n\n component = new ReactRenderer(CommandList, {\n props: {\n ...props,\n upload,\n aiController,\n onClose: exit\n },\n editor: props.editor,\n })\n\n if (!props.clientRect) {\n return\n }\n\n // Create floating container\n containerEl = document.createElement(\"div\");\n containerEl.setAttribute(\"data-suggestion-menu\", \"true\");\n containerEl.style.position = \"fixed\";\n containerEl.style.left = \"0px\";\n containerEl.style.top = \"0px\";\n containerEl.style.zIndex = \"9999\";\n (ref?.current || document.body).appendChild(containerEl);\n containerEl.appendChild(component.element);\n\n // Virtual reference element using provided clientRect\n reference = {\n getBoundingClientRect: props.clientRect as () => DOMRect\n }\n\n // Auto-update position\n cleanupAutoUpdate = autoUpdate(reference as any, containerEl, () => {\n if (!reference) return;\n computePosition(reference as any, containerEl!, {\n placement: \"bottom-start\",\n middleware: [offset(4), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n Object.assign(containerEl!.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\",\n });\n });\n });\n },\n\n onUpdate(props) {\n component.updateProps(props)\n\n if (!props.clientRect || !containerEl || !reference) {\n return\n }\n\n // Update reference rect and reposition\n reference.getBoundingClientRect = props.clientRect as () => DOMRect;\n\n computePosition(reference as any, containerEl!, {\n placement: \"bottom-start\",\n middleware: [offset(4), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n Object.assign(containerEl!.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\",\n });\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n props.event.preventDefault();\n props.event.stopPropagation();\n exit();\n return true;\n }\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n exit();\n }\n }\n }\n}\n);\n\nconst CommandList = forwardRef((props: {\n items: SuggestionItem[];\n query: string;\n range: Range;\n command: (props: { id: string }) => void;\n upload: UploadFn;\n aiController: EditorAIController;\n onClose: () => void;\n}, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const { editor } = useCurrentEditor();\n const selectItem = (item?: SuggestionItem, event?: React.MouseEvent) => {\n if (!editor) return;\n event?.preventDefault();\n event?.stopPropagation();\n item?.command?.({\n editor,\n range: props.range,\n upload: props.upload,\n aiController: props.aiController\n })\n };\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length);\n };\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length);\n };\n\n const enterHandler = () => {\n const item = props.items[selectedIndex]\n selectItem(item);\n };\n\n useEffect(() => setSelectedIndex(0), [props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler();\n return true;\n }\n if (event.key === \"ArrowDown\") {\n downHandler();\n return true;\n }\n if (event.key === \"Enter\") {\n enterHandler();\n return true;\n }\n return false;\n }\n }));\n\n const itemRefs = useRef<HTMLElement[]>([]);\n\n useEffect(() => {\n if (itemRefs.current[selectedIndex]) {\n itemRefs.current[selectedIndex].scrollIntoView({\n block: \"nearest\"\n });\n }\n }, [selectedIndex]);\n\n return (\n <div\n className={cls(\"text-surface-900 dark:text-white z-50 max-h-[280px] h-auto w-72 overflow-y-auto rounded-md border bg-white dark:bg-surface-900 px-1 py-2 shadow transition-all\", defaultBorderMixin)}>\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n value={item.title}\n ref={el => {\n if (!el) return;\n itemRefs.current[index] = el;\n }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => selectItem(item, e)}\n tabIndex={index === selectedIndex ? 0 : -1}\n aria-selected={index === selectedIndex}\n className={cls(\"flex w-full items-center space-x-2 rounded-md px-2 py-1 text-left text-sm hover:bg-blue-50 hover:dark:bg-surface-700 aria-selected:bg-blue-50 aria-selected:dark:bg-surface-700\",\n index === selectedIndex ? \"bg-blue-100 dark:bg-surface-accent-950\" : \"\")}\n key={item.title}\n >\n <div\n className={cls(\"flex h-10 w-10 items-center justify-center rounded-md border bg-white dark:bg-surface-900\", defaultBorderMixin)}>\n {item.icon}\n </div>\n <div>\n <p className=\"font-medium\">{item.title}</p>\n <p className=\"text-xs text-surface-700 dark:text-surface-accent-300\">\n {item.description}\n </p>\n </div>\n </button>\n ))\n ) : (\n <div className=\"item\">No result</div>\n )}\n </div>\n );\n});\nCommandList.displayName = \"CommandList\";\n\nconst autocompleteSuggestionItem: SuggestionItem = {\n title: \"Autocomplete\",\n description: \"Add text based on the context.\",\n searchTerms: [\"ai\"],\n icon: <AutoFixHighIcon size={18} />,\n command: async ({\n editor,\n range,\n aiController\n }) => {\n if (!aiController)\n throw Error(\"No AiController\");\n\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode(\"paragraph\", \"paragraph\")\n .run();\n\n const { state } = editor;\n const {\n from,\n to\n } = state.selection;\n\n // Get text before the cursor (from start to the cursor position)\n const textBeforeCursor = state.doc.textBetween(0, from, \"\\n\");\n\n // Get text after the cursor (from the cursor position to the end)\n const textAfterCursor = state.doc.textBetween(to, state.doc.content.size, \"\\n\");\n\n let buffer = \"\";\n const result = await aiController.autocomplete(textBeforeCursor, textAfterCursor, (delta) => {\n buffer += delta;\n if (delta.length !== 0) {\n editor.chain().focus().toggleLoadingDecoration(buffer).run()\n }\n });\n\n editor.chain().focus()\n .insertContent(result, {\n applyInputRules: false,\n applyPasteRules: false,\n parseOptions: {\n preserveWhitespace: false\n }\n }).run();\n\n }\n};\nconst suggestionItems: SuggestionItem[] = [\n {\n title: \"Text\",\n description: \"Just start typing with plain text.\",\n searchTerms: [\"p\", \"paragraph\"],\n icon: <TextFieldsIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode(\"paragraph\", \"paragraph\")\n .run();\n }\n },\n {\n title: \"To-do List\",\n description: \"Track tasks with a to-do list.\",\n searchTerms: [\"todo\", \"task\", \"list\", \"check\", \"checkbox\"],\n icon: <CheckBoxIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor.chain().focus().deleteRange(range).toggleTaskList().run();\n }\n },\n {\n title: \"Heading 1\",\n description: \"Big section heading.\",\n searchTerms: [\"title\", \"big\", \"large\"],\n icon: <LooksOneIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode(\"heading\", { level: 1 })\n .run();\n }\n },\n {\n title: \"Heading 2\",\n description: \"Medium section heading.\",\n searchTerms: [\"subtitle\", \"medium\"],\n icon: <LooksTwoIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode(\"heading\", { level: 2 })\n .run();\n }\n },\n {\n title: \"Heading 3\",\n description: \"Small section heading.\",\n searchTerms: [\"subtitle\", \"small\"],\n icon: <Looks3Icon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode(\"heading\", { level: 3 })\n .run();\n }\n },\n {\n title: \"Bullet List\",\n description: \"Create a simple bullet list.\",\n searchTerms: [\"unordered\", \"point\"],\n icon: <FormatListBulletedIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n }\n },\n {\n title: \"Numbered List\",\n description: \"Create a list with numbering.\",\n searchTerms: [\"ordered\"],\n icon: <FormatListNumberedIcon size={18} />,\n command: ({\n editor,\n range\n }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n }\n },\n {\n title: \"Quote\",\n description: \"Capture a quote.\",\n searchTerms: [\"blockquote\"],\n icon: <FormatQuoteIcon size={18} />,\n command: ({\n editor,\n range\n }) =>\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode(\"paragraph\", \"paragraph\")\n .toggleBlockquote()\n .run()\n },\n {\n title: \"Code\",\n description: \"Capture a code snippet.\",\n searchTerms: [\"codeblock\"],\n icon: <CodeIcon size={18} />,\n command: ({\n editor,\n range\n }) =>\n editor.chain().focus().deleteRange(range).toggleCodeBlock().run()\n },\n {\n title: \"Image\",\n description: \"Upload an image from your computer.\",\n searchTerms: [\"photo\", \"picture\", \"media\", \"upload\", \"file\"],\n icon: <ImageIcon size={18} />,\n command: ({\n editor,\n range,\n upload\n }) => {\n\n editor.chain().focus().deleteRange(range).run();\n // upload image\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.onchange = async () => {\n if (input.files?.length) {\n const file = input.files[0];\n if (!file) return;\n const pos = editor.view.state.selection.from;\n\n const fileList = input.files;\n const files = Array.from(fileList);\n const images = files.filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n console.log(\"No images found in uploaded files\");\n return false;\n }\n\n const view = editor.view;\n\n images.forEach(image => {\n // const position = view.posAtCoords({\n // left: event.clientX,\n // top: event.clientY\n // });\n // if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, pos, upload, image);\n // await onFileRead(view, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n }\n return true;\n };\n input.click();\n }\n }\n];\n","\"use client\";\nimport React, { useDeferredValue, useEffect, useMemo, useState } from \"react\";\n\nimport { cls, defaultBorderMixin, Separator, useInjectStyles } from \"@firecms/ui\";\n\nimport { Editor, EditorProvider, Extensions } from \"@tiptap/react\";\nimport Document from \"@tiptap/extension-document\";\nimport { Markdown } from \"tiptap-markdown\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Heading from \"@tiptap/extension-heading\";\nimport { TextStyleKit } from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport Bold from \"@tiptap/extension-bold\";\nimport Italic from \"@tiptap/extension-italic\";\nimport Strike from \"@tiptap/extension-strike\";\n\nimport { EditorBubble, type JSONContent } from \"./components\";\n\nimport { NodeSelector } from \"./selectors/node-selector\";\nimport { LinkSelector } from \"./selectors/link-selector\";\nimport { TextButtons } from \"./selectors/text-buttons\";\n\nimport { removeClassesFromJson } from \"./utils/remove_classes\";\nimport {\n blockquote,\n bulletList,\n code,\n codeBlock,\n horizontalRule,\n listItem,\n orderedList,\n placeholder,\n starterKit,\n taskItem,\n taskList,\n tiptapLink\n} from \"./editor_extensions\";\nimport { createDropImagePlugin, createImageExtension } from \"./extensions/Image\";\nimport { CustomKeymap } from \"./extensions/custom-keymap\";\nimport { DragAndDrop } from \"./extensions/drag-and-drop\";\nimport { EditorAIController } from \"./types\";\nimport TextLoadingDecorationExtension from \"./extensions/TextLoadingDecorationExtension\";\nimport { HighlightDecorationExtension } from \"./extensions/HighlightDecorationExtension\";\n\nimport { SlashCommand, suggestion } from \"./extensions/slashCommand\";\n\nexport type FireCMSEditorTextSize = \"sm\" | \"base\" | \"lg\";\n\nexport type FireCMSEditorProps = {\n content?: JSONContent | string,\n onMarkdownContentChange?: (content: string) => void,\n onJsonContentChange?: (content: JSONContent | null) => void,\n onHtmlContentChange?: (content: string) => void,\n handleImageUpload: (file: File) => Promise<string>,\n version?: number,\n textSize?: FireCMSEditorTextSize,\n highlight?: { from: number, to: number },\n aiController?: EditorAIController,\n customComponents?: CustomEditorComponent[];\n disabled?: boolean;\n};\n\nexport type CustomEditorComponent = {\n name: string,\n component: React.FC\n};\n\nconst proseClasses = {\n \"sm\": \"prose-sm\",\n \"base\": \"prose-base\",\n \"lg\": \"prose-lg\"\n}\n\nconst canUseDOM = Boolean(\n typeof window !== \"undefined\" &&\n window.document && window.document.createElement\n);\n\nexport const FireCMSEditor = ({\n content,\n onJsonContentChange,\n onHtmlContentChange,\n onMarkdownContentChange,\n version,\n textSize = \"base\",\n highlight,\n handleImageUpload,\n aiController,\n disabled\n }: FireCMSEditorProps) => {\n\n const ref = React.useRef<HTMLDivElement | null>(null);\n const editorRef = React.useRef<Editor | null>(null);\n\n const imagePlugin = createDropImagePlugin(handleImageUpload);\n const imageExtension = useMemo(() => createImageExtension(imagePlugin), []);\n\n const [openNode, setOpenNode] = useState(false);\n const [openLink, setOpenLink] = useState(false);\n\n useInjectStyles(\"Editor\", cssStyles);\n\n const deferredHighlight = useDeferredValue(highlight);\n\n useEffect(() => {\n if (version === undefined) return;\n if (version > -1 && editorRef.current) {\n editorRef.current?.commands.setContent(content ?? \"\");\n }\n }, [version]);\n\n useEffect(() => {\n editorRef?.current?.setEditable(!disabled);\n }, [disabled]);\n\n useEffect(() => {\n if (version === undefined) return;\n if (editorRef.current && version > 0) {\n\n const chain = editorRef.current.chain();\n\n if (deferredHighlight) {\n chain.focus().toggleAutocompleteHighlight(deferredHighlight).run();\n } else {\n chain.focus().removeAutocompleteHighlight().run();\n }\n\n }\n }, [deferredHighlight?.from, deferredHighlight?.to]);\n\n const firstUpdateRef = React.useRef(true);\n const onEditorUpdate = (editor: Editor) => {\n editorRef.current = editor;\n if (firstUpdateRef.current) {\n firstUpdateRef.current = false;\n return; // Skip the first update to avoid unnecessary content change calls\n }\n if (onMarkdownContentChange) {\n // @ts-ignore\n const markdown = editorRef.current.storage.markdown.getMarkdown();\n onMarkdownContentChange?.(addLineBreakAfterImages(markdown));\n }\n if (onJsonContentChange) {\n const jsonContent = removeClassesFromJson(editor.getJSON());\n onJsonContentChange(jsonContent);\n }\n if (onHtmlContentChange) {\n onHtmlContentChange?.(editor.getHTML());\n }\n }\n\n const proseClass = proseClasses[textSize];\n\n const extensions: Extensions = useMemo(() => ([\n starterKit as any,\n Document.extend({}),\n HighlightDecorationExtension(highlight),\n TextLoadingDecorationExtension,\n Underline,\n Bold,\n TextStyleKit,\n Italic,\n Strike,\n Color,\n Highlight.configure({\n multicolor: true\n }),\n Heading,\n CustomKeymap,\n DragAndDrop,\n placeholder,\n tiptapLink,\n imageExtension,\n taskList,\n taskItem,\n Markdown.configure({\n html: true\n }),\n horizontalRule,\n bulletList,\n orderedList,\n listItem,\n blockquote,\n codeBlock,\n code,\n SlashCommand.configure({\n HTMLAttributes: {\n class: \"mention\"\n },\n suggestion: suggestion(ref, {\n upload: handleImageUpload,\n aiController,\n })\n })\n ]), []);\n\n return (\n <div\n ref={ref}\n className=\"relative min-h-[300px] w-full\">\n\n <EditorProvider\n content={content ?? \"\"}\n extensions={extensions}\n immediatelyRender={canUseDOM}\n editorProps={{\n editable: () => !disabled,\n attributes: {\n class: cls(proseClass, \"prose-headings:font-title font-default focus:outline-none max-w-full p-12\")\n }\n }}\n onCreate={({ editor }) => {\n // @ts-ignore\n editorRef.current = editor;\n editor.setEditable(!disabled);\n }}\n onUpdate={({ editor }) => {\n onEditorUpdate(editor as Editor);\n }}>\n\n <EditorBubble\n options={{\n placement: \"top\",\n offset: 6,\n }}\n className={cls(\"flex w-fit max-w-[90vw] h-10 overflow-hidden rounded border bg-white dark:bg-surface-900 shadow\", defaultBorderMixin)}\n >\n <NodeSelector portalContainer={ref.current} open={openNode} onOpenChange={setOpenNode}/>\n <Separator orientation=\"vertical\"/>\n <LinkSelector open={openLink} onOpenChange={setOpenLink}/>\n <Separator orientation=\"vertical\"/>\n <TextButtons/>\n </EditorBubble>\n\n </EditorProvider>\n </div>\n\n );\n};\n\nfunction addLineBreakAfterImages(markdown: string): string {\n // Regular expression to match markdown image syntax\n const imageRegex = /!\\[.*?\\]\\(.*?\\)/g;\n // Replace image with image followed by a line break\n return markdown.replace(imageRegex, (match) => `${match}\\n`);\n}\n\nconst cssStyles = `\n.ProseMirror {\n box-shadow: none !important;\n}\n.ProseMirror .is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n.ProseMirror .is-empty::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n\n[data-theme=\"dark\"] {\n .ProseMirror .is-empty::before {\n color: rgb(100 116 139); //500\n }\n}\n\n.is-empty {\n cursor: text;\n color: rgb(100 116 139); //500\n}\n\n\n/* Custom image styles */\n\n.ProseMirror img {\n transition: filter 0.1s ease-in-out;\n\n &:hover {\n cursor: pointer;\n filter: brightness(90%);\n }\n\n &.ProseMirror-selectednode {\n outline: 3px solid #5abbf7;\n filter: brightness(90%);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) !important;\n }\n}\n\n/* Custom TODO list checkboxes – shoutout to this awesome tutorial: https://moderncss.dev/pure-css-custom-checkbox-style/ */\n\nul[data-type=\"taskList\"] li > label {\n margin-right: 0.2rem;\n user-select: none;\n}\n\n@media screen and (max-width: 768px) {\n ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n }\n}\n\n\n[data-theme=\"dark\"] {\n ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n background-color: rgb(30 41 59); // 800\n border: 2px solid #666;\n \n &:hover {\n background-color: rgb(51 65 85); // 700\n }\n \n &:active {\n background-color: rgb(71 85 105);\n }\n }\n}\n \n\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n -webkit-appearance: none;\n appearance: none;\n background-color: white;\n margin: 0;\n cursor: pointer;\n width: 1.2em;\n height: 1.2em;\n position: relative;\n top: 5px;\n border: 2px solid #777;\n border-radius: 0.25em;\n margin-right: 0.3rem;\n display: grid;\n place-content: center;\n\n &:hover {\n background-color: rgb(241 245 249); //100\n }\n\n &:active {\n background-color: rgb(226 232 240); //200\n }\n\n &::before {\n content: \"\";\n width: 0.65em;\n height: 0.65em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em;\n transform-origin: center;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n }\n\n &:checked::before {\n transform: scale(1);\n }\n}\n\n[data-theme=\"dark\"] {\n ul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(226 232 240);\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n }\n}\n\nul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(51 65 85); // 700\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n}\n\n/* Overwrite tippy-box original max-width */\n\n.tippy-box {\n max-width: 400px !important;\n}\n\n.ProseMirror:not(.dragging) .ProseMirror-selectednode {\n // outline: none !important;\n background-color: rgb(219 234 254); // blue 100\n transition: background-color 0.2s;\n box-shadow: none;\n}\n\n[data-theme=\"dark\"] .ProseMirror:not(.dragging) .ProseMirror-selectednode {\n background-color: rgb(51 65 85); // 700\n}\n\n.prose-base table p {\n margin: 0;\n}\n\n.drag-handle {\n position: absolute;\n opacity: 1;\n transition: opacity ease-in 0.2s;\n border-radius: 0.25rem;\n\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(128, 128, 128, 0.9)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7,8.44771525 7,9 7,9 C7,9.55228475 7,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E\");\n background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);\n background-repeat: no-repeat;\n background-position: center;\n width: 1.2rem;\n height: 1.5rem;\n z-index: 100;\n cursor: grab;\n\n &:hover {\n background-color: rgb(241 245 249); //100\n transition: background-color 0.2s;\n }\n\n &:active {\n background-color: rgb(226 232 240); //200\n transition: background-color 0.2s;\n }\n\n &.hide {\n opacity: 0;\n pointer-events: none;\n }\n\n @media screen and (max-width: 600px) {\n display: none;\n pointer-events: none;\n }\n}\n\n[data-theme=\"dark\"] .drag-handle {\n &:hover {\n background-color: rgb(51 65 85); // 700\n }\n\n &:active {\n background-color: rgb(51 65 85); // 700\n }\n}\n`;\n"],"names":["EditorBubble","forwardRef","t0","ref","$","_c","children","options","rest","tippyOptions","editor","useCurrentEditor","placement","t1","shouldShow","_temp","t2","t3","mergedOptions","t4","bubbleMenuProps","t5","t6","editor_0","state","selection","empty","isActive","NodeSelection","EditorBubbleItem","asChild","onSelect","Comp","Slot","displayName","items","name","icon","TextFieldsIcon","command","chain","focus","toggleNode","run","LooksOneIcon","toggleHeading","level","LooksTwoIcon","Looks3Icon","CheckBoxIcon","toggleTaskList","FormatListBulletedIcon","toggleBulletList","FormatListNumberedIcon","toggleOrderedList","FormatQuoteIcon","toggleBlockquote","CodeIcon","toggleCodeBlock","NodeSelector","open","onOpenChange","portalContainer","useEditor","filter","item","pop","activeItem","Symbol","for","map","item_0","index","isValidUrl","url","URL","e","getUrlFromString","str","includes","toString","LinkSelector","inputRef","useRef","current","useEffect","cls","target","currentTarget","preventDefault","input","value","setLink","href","getAttributes","focusedDisabled","t7","t8","unsetLink","t9","t10","TextButtons","_temp2","FormatBoldIcon","_temp3","_temp4","FormatItalicIcon","_temp5","_temp6","FormatUnderlinedIcon","_temp7","_temp8","FormatStrikethroughIcon","_temp9","_temp0","editor_10","editor_1","toggleBold","editor_2","editor_3","toggleItalic","editor_4","editor_5","toggleUnderline","editor_6","editor_7","toggleStrike","editor_8","editor_9","toggleCode","removeClassesFromJson","jsonObj","Array","isArray","attrs","class","Object","keys","forEach","key","loadingDecorationKey","PluginKey","TextLoadingDecorationExtension","Extension","create","addOptions","pluginKey","addProseMirrorPlugins","Plugin","init","decorationSet","DecorationSet","hasDecoration","apply","tr","oldState","action","getMeta","type","pos","remove","loadingHtml","decoration","Decoration","widget","container","document","createElement","className","innerHTML","span","innerText","appendChild","add","doc","mapping","props","decorations","getState","addCommands","toggleLoadingDecoration","dispatch","from","setMeta","removeLoadingDecoration","PlaceholderExtension","Placeholder","configure","placeholder","node","to","hasLoadingDecoration","pluginState","get","includeChildren","Horizontal","HorizontalRule","extend","addInputRules","InputRule","find","handler","range","attributes","start","end","insert","delete","tiptapLink","TiptapLink","HTMLAttributes","taskList","TaskList","taskItem","TaskItem","nested","horizontalRule","defaultBorderMixin","bulletList","BulletList","orderedList","OrderedList","listItem","ListItem","blockquote","Blockquote","codeBlock","CodeBlock","code","Code","spellcheck","starterKit","StarterKit","dropcursor","color","width","gapcursor","onFileRead","view","readerEvent","upload","image","schema","plugin","plugins","p","ImagePluginKey","console","error","imageElement","setAttribute","src","result","deco","debug","imageNode","nodes","replaceWith","createDropImagePlugin","old","meta","handleDOMEvents","drop","event","dataTransfer","files","length","images","file","test","log","position","posAtCoords","left","clientX","top","clientY","reader","FileReader","onload","readAsDataURL","handlePaste","slice","clipboardData","anyImageFound","getAsFile","editorView","update","prevState","prevDecos","newDecos","updateState","createImageExtension","dropImagePlugin","TiptapImage","allowBase64","CustomKeymap","selectTextWithinNodeBoundaries","commands","startNodePos","$from","endNodePos","$to","setTextSelection","addKeyboardShortcuts","Mod-a","startSelectionPos","endSelectionPos","isCurrentTextSelectionNotExtendedToNodeBoundaries","serializeForClipboard","someProp","f","context","content","openStart","openEnd","childCount","firstChild","push","defaultAttrs","serializer","DOMSerializer","fromSchema","detachedDoc","wrap","serializeFragment","needsWrap","wrappers","nodeType","wrapMap","nodeName","toLowerCase","i","wrapper","JSON","stringify","text","textBetween","size","dom","thead","tbody","tfoot","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","absoluteRect","element","data","getBoundingClientRect","ancestor","parentElement","window","getComputedStyle","ancestorRect","nodeDOMAtCoords","coords","elementsFromPoint","x","y","elem","matches","join","nodePosAtDOM","boundingRect","dragHandleWidth","inside","DragHandle","handleDragStart","Element","nodePos","setSelection","clearData","setData","effectAllowed","setDragImage","dragging","move","ctrlKey","handleClick","classList","dragHandleElement","hideDragHandle","showDragHandle","draggable","dataset","dragHandle","addEventListener","destroy","mousemove","editable","compStyle","lineHeight","parseInt","paddingTop","rect","style","keydown","mousewheel","dragstart","dragend","DragAndDrop","buildDecorationSet","highlight","inline","HighlightDecorationExtension","initialHighlight","_","transaction","autocompleteState","toggleAutocompleteHighlight","removeAutocompleteHighlight","CommandPluginKey","SlashCommand","Node","renderText","suggestion","char","label","id","deleteTriggerWithBackspace","renderHTML","mergeAttributes","nodeAfter","overrideSpace","startsWith","insertContentAt","getSelection","collapseToEnd","allow","resolve","parent","contentMatch","matchType","group","selectable","atom","addAttributes","default","parseHTML","getAttribute","tag","renderLabel","undefined","warn","html","Backspace","isCommand","anchor","nodesBetween","insertText","nodeSize","Suggestion","aiController","query","availableSuggestionItems","suggestionItems","autocompleteSuggestionItem","inTitle","title","searchTerms","some","term","can","render","component","containerEl","cleanupAutoUpdate","reference","escapeListener","exit","parentNode","removeChild","removeEventListener","onStart","stopPropagation","stopImmediatePropagation","ReactRenderer","CommandList","onClose","clientRect","zIndex","body","autoUpdate","computePosition","middleware","offset","flip","shift","strategy","then","assign","visibility","onUpdate","updateProps","onKeyDown","onExit","selectedIndex","setSelectedIndex","useState","selectItem","upHandler","downHandler","enterHandler","event_0","useImperativeHandle","itemRefs","scrollIntoView","block","t11","item_1","el","e_0","description","t12","Error","deleteRange","textBeforeCursor","textAfterCursor","buffer","autocomplete","delta","insertContent","applyInputRules","applyPasteRules","parseOptions","preserveWhitespace","setNode","accept","onchange","fileList","click","proseClasses","canUseDOM","Boolean","FireCMSEditor","onJsonContentChange","onHtmlContentChange","onMarkdownContentChange","version","textSize","handleImageUpload","disabled","React","editorRef","imagePlugin","imageExtension","useMemo","openNode","setOpenNode","openLink","setOpenLink","useInjectStyles","cssStyles","deferredHighlight","useDeferredValue","setContent","setEditable","firstUpdateRef","onEditorUpdate","markdown","storage","getMarkdown","addLineBreakAfterImages","jsonContent","getJSON","getHTML","proseClass","extensions","Document","Underline","Bold","TextStyleKit","Italic","Strike","Color","Highlight","multicolor","Heading","Markdown","imageRegex","replace","match"],"mappings":"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AAK;AAAA,CAAI;AAC/D;AAEA,MAAM7B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}