@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.
- package/dist/index.es.js +6 -6
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +6 -6
- package/dist/index.umd.js.map +1 -1
- package/package.json +29 -29
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.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\"]\n *  -> [, \"\", \"image.jpg\", \"Ipsum\"]\n *  -> [, \"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","jsx","BubbleMenu","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","KeyboardArrowDownIcon","Button","map","item_0","index","jsxs","CheckIcon","Popover","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","DeleteIcon","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","AutoFixHighIcon","Error","deleteRange","textBeforeCursor","textAfterCursor","buffer","autocomplete","delta","insertContent","applyInputRules","applyPasteRules","parseOptions","preserveWhitespace","setNode","ImageIcon","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","EditorProvider","Separator","imageRegex","replace","match"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.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\"]\n *  -> [, \"\", \"image.jpg\", \"Ipsum\"]\n *  -> [, \"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","jsx","BubbleMenu","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","KeyboardArrowDownIcon","Button","map","item_0","index","jsxs","CheckIcon","Popover","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","DeleteIcon","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","AutoFixHighIcon","Error","deleteRange","textBeforeCursor","textAfterCursor","buffer","autocomplete","delta","insertContent","applyInputRules","applyPasteRules","parseOptions","preserveWhitespace","setNode","ImageIcon","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","EditorProvider","Separator","imageRegex","replace","match"],"mappings":"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"}
|