@firecms/editor 3.0.0-canary.23 → 3.0.0-canary.231

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/components/editor.tsx","../src/components/editor-bubble.tsx","../src/components/editor-bubble-item.tsx","../src/components/editor-command.tsx","../src/components/editor-command-item.tsx","../src/extensions/slash-command.tsx","../src/extensions/index.ts","../src/selectors/node-selector.tsx","../src/selectors/link-selector.tsx","../src/selectors/text-buttons.tsx","../src/utils/useDebouncedCallback.ts","../src/utils/remove_classes.ts","../src/editor_extensions.tsx","../src/extensions/Image.ts","../src/extensions/custom-keymap.ts","../src/extensions/drag-and-drop.tsx","../src/editor.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { createStore, Provider } from \"jotai\";\n\nexport const editorStore = createStore();\n\nexport const EditorRoot = ({ children }: { children: ReactNode }): JSX.Element => {\n return <Provider store={editorStore}>{children}</Provider>;\n};\n","import { BubbleMenu, type BubbleMenuProps, isNodeSelection, useCurrentEditor } from \"@tiptap/react\";\nimport { type ReactNode, useMemo, useRef, useEffect, forwardRef } from \"react\";\nimport type { Instance, Props } from \"tippy.js\";\n\nexport interface EditorBubbleProps extends Omit<BubbleMenuProps, \"editor\"> {\n children: ReactNode;\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({ children, tippyOptions, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n const instanceRef = useRef<Instance<Props> | null>(null);\n\n useEffect(() => {\n if (!instanceRef.current || !tippyOptions?.placement) return;\n\n instanceRef.current.setProps({ placement: tippyOptions.placement });\n instanceRef.current.popperInstance?.update();\n }, [tippyOptions?.placement]);\n\n const bubbleMenuProps: Omit<BubbleMenuProps, \"children\"> = useMemo(() => {\n const shouldShow: BubbleMenuProps[\"shouldShow\"] = ({ editor, state }) => {\n const { selection } = state;\n const { empty } = selection;\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 || isNodeSelection(selection)) {\n return false;\n }\n return true;\n };\n\n return {\n shouldShow,\n tippyOptions: {\n onCreate: (val) => {\n instanceRef.current = val;\n },\n moveTransition: \"transform 0.15s ease-out\",\n ...tippyOptions,\n },\n ...rest,\n };\n }, [rest, tippyOptions]);\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 { atom, useAtom, useSetAtom } from \"jotai\";\nimport { useEffect, useRef, type ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport tunnel from \"tunnel-rat\";\nimport { editorStore } from \"./editor\";\nimport { Command } from \"cmdk\";\nimport type { Range } from \"@tiptap/core\";\n\nconst t = tunnel();\n\nexport const queryAtom = atom(\"\");\nexport const rangeAtom = atom<Range | null>(null);\n\nexport const EditorCommandOut = ({\n query,\n range,\n}: {\n query: string;\n range: Range;\n}): JSX.Element => {\n const setQuery = useSetAtom(queryAtom, { store: editorStore });\n const setRange = useSetAtom(rangeAtom, { store: editorStore });\n\n useEffect(() => {\n setQuery(query);\n }, [query, setQuery]);\n\n useEffect(() => {\n setRange(range);\n }, [range, setRange]);\n\n useEffect(() => {\n const navigationKeys = [\"ArrowUp\", \"ArrowDown\", \"Enter\"];\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault();\n const commandRef = document.querySelector(\"#slash-command\");\n\n if (commandRef)\n commandRef.dispatchEvent(\n new KeyboardEvent(\"keydown\", { key: e.key, cancelable: true, bubbles: true })\n );\n\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, []);\n\n return <t.Out />;\n};\n\nexport const EditorCommand = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<typeof Command>>(\n ({ children, className, ...rest }, ref) => {\n const commandListRef = useRef<HTMLDivElement>(null);\n const [query, setQuery] = useAtom(queryAtom);\n\n return (\n <t.In>\n <Command\n ref={ref}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n id='slash-command'\n className={className}\n {...rest}>\n <Command.Input value={query} onValueChange={setQuery} style={{ display: \"none\" }} />\n <Command.List ref={commandListRef}>{children}</Command.List>\n </Command>\n </t.In>\n );\n }\n);\n","import { type ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { CommandEmpty, CommandItem } from \"cmdk\";\nimport { Editor, type Range } from \"@tiptap/core\";\nimport { useCurrentEditor } from \"@tiptap/react\";\nimport { useAtomValue } from \"jotai\";\nimport { rangeAtom } from \"./editor-command\";\n\ninterface EditorCommandItemProps {\n onCommand: ({ editor, range }: { editor: Editor; range: Range }) => void;\n}\n\nexport const EditorCommandItem = forwardRef<\n HTMLDivElement,\n EditorCommandItemProps & ComponentPropsWithoutRef<typeof CommandItem>\n>(({ children, onCommand, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n const range = useAtomValue(rangeAtom);\n\n if (!editor || !range) return null;\n\n return (\n <CommandItem ref={ref} {...rest} onSelect={() => onCommand({ editor, range })}>\n {children}\n </CommandItem>\n );\n});\n\nEditorCommandItem.displayName = \"EditorCommandItem\";\n\nexport const EditorCommandEmpty = CommandEmpty;\n\nexport default EditorCommandItem;\n","import { type Editor, type Range, Extension } from \"@tiptap/core\";\nimport Suggestion from \"@tiptap/suggestion\";\nimport { ReactRenderer } from \"@tiptap/react\";\nimport tippy from \"tippy.js\";\n\nimport { EditorCommandOut } from \"../components/editor-command\";\nimport type { ReactNode } from \"react\";\n\nconst Command = Extension.create({\n name: \"slash-command\",\n addOptions() {\n return {\n suggestion: {\n char: \"/\",\n command: ({ editor, range, props }: { editor: Editor; range: Range; props: any }) => {\n props.command({ editor, range });\n },\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n});\n\nconst renderItems = () => {\n let component: ReactRenderer | null = null;\n let popup: any | null = null;\n\n return {\n onStart: (props: { editor: Editor; clientRect: DOMRect }) => {\n component = new ReactRenderer(EditorCommandOut, {\n props,\n editor: props.editor,\n });\n\n // @ts-ignore\n popup = tippy(\"body\", {\n getReferenceClientRect: props.clientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\",\n });\n },\n onUpdate: (props: { editor: Editor; clientRect: DOMRect }) => {\n component?.updateProps(props);\n\n popup &&\n popup[0].setProps({\n getReferenceClientRect: props.clientRect,\n });\n },\n\n onKeyDown: (props: { event: KeyboardEvent }) => {\n if (props.event.key === \"Escape\") {\n popup?.[0].hide();\n\n return true;\n }\n\n // @ts-ignore\n return component?.ref?.onKeyDown(props);\n },\n onExit: () => {\n popup?.[0].destroy();\n component?.destroy();\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 }) => void;\n}\n\nexport const createSuggestionItems = (items: SuggestionItem[]) => items;\n\nexport { Command, renderItems };\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 { InputRule } from \"@tiptap/core\";\n\nconst PlaceholderExtension = Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === \"heading\") {\n return `Heading ${node.attrs.level}`;\n }\n return \"Press '/' for commands\";\n },\n includeChildren: true,\n});\n\nconst Horizontal = HorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({ state, range }) => {\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)).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};\nexport * from \"./slash-command\";\n\nexport { getPrevText } from \"../utils/utils\";\n","import React from \"react\";\nimport { EditorBubbleItem, useEditor } from \"../components\";\n\nimport {\n Button,\n CheckBoxIcon,\n CheckIcon,\n CodeIcon,\n ExpandMoreIcon,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\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}\n\nexport const NodeSelector = ({\n open,\n onOpenChange\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 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 <ExpandMoreIcon 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-gray-700 text-gray-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, cn, DeleteIcon, 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={cn(\"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={\"text-gray-900 dark:text-white flex-grow bg-transparent p-1 text-sm outline-none\"}/>\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 cn,\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={cn( {\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","import React from \"react\";\n\nexport function useDebouncedCallback<T>(value: T, callback: () => void, immediate: boolean, timeoutMs = 300) {\n\n const pendingUpdate = React.useRef(false);\n const performUpdate = () => {\n callback();\n pendingUpdate.current = false;\n };\n\n const handlerRef = React.useRef<number | undefined>(undefined);\n\n React.useEffect(\n () => {\n pendingUpdate.current = true;\n clearTimeout(handlerRef.current);\n handlerRef.current = setTimeout(performUpdate, timeoutMs) as any;\n return () => {\n if (immediate)\n performUpdate();\n };\n },\n [immediate, value]\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 { HorizontalRule, Placeholder, StarterKit, TaskItem, TaskList, TiptapImage, TiptapLink, } from \"./extensions\";\n\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\n\n//You can overwrite the placeholder with your own configuration\nexport const placeholder = Placeholder;\nexport const tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n class: cn(\n \"text-gray-600 dark:text-slate-300 underline underline-offset-[3px] hover:text-primary transition-colors cursor-pointer\",\n ),\n },\n});\n\n// export const tiptapImage = TiptapImage.extend({\n// addProseMirrorPlugins() {\n// return [UploadImagesPlugin()];\n// },\n// }).configure({\n// allowBase64: true,\n// HTMLAttributes: {\n// class: cn(\"rounded-lg border\", defaultBorderMixin),\n// },\n// });\n\n// const updatedImage = UpdatedImage.configure({\n// HTMLAttributes: {\n// class: cn(\"rounded-lg border\", defaultBorderMixin),\n// },\n// });\n\nexport const taskList = TaskList.configure({\n HTMLAttributes: {\n class: cn(\"not-prose\"),\n },\n});\nexport const taskItem = TaskItem.configure({\n HTMLAttributes: {\n class: cn(\"flex items-start my-4\"),\n },\n nested: true,\n});\n\nexport const horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n class: cn(\"mt-4 mb-6 border-t\", defaultBorderMixin),\n },\n});\n\nexport const starterKit = StarterKit.configure({\n bulletList: {\n HTMLAttributes: {\n class: cn(\"list-disc list-outside leading-3 -mt-2\"),\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: cn(\"list-decimal list-outside leading-3 -mt-2\"),\n },\n },\n listItem: {\n HTMLAttributes: {\n class: cn(\"leading-normal -mb-2\"),\n },\n },\n blockquote: {\n HTMLAttributes: {\n class: cn(\"border-l-4 border-primary\"),\n },\n },\n codeBlock: {\n HTMLAttributes: {\n class: cn(\"rounded bg-blue-50 dark:bg-gray-700 border p-5 font-mono font-medium\", defaultBorderMixin),\n },\n },\n code: {\n HTMLAttributes: {\n class: cn(\"rounded-md bg-slate-50 dark:bg-gray-700 px-1.5 py-1 font-mono font-medium\"),\n spellcheck: \"false\",\n },\n },\n horizontalRule: false,\n dropcursor: {\n color: \"#DBEAFE\",\n width: 4,\n },\n gapcursor: false,\n});\n","import { Plugin, } from \"prosemirror-state\";\nimport { TiptapImage } from \"./index\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\nimport { Decoration, DecorationSet, EditorView } from \"@tiptap/pm/view\";\n\nexport type UploadFn = (image: File) => Promise<string>;\n\nasync function onFileRead(plugin: Plugin, view: EditorView, readerEvent: ProgressEvent<FileReader>, pos: number, upload: UploadFn, image: File) {\n\n const { schema } = view.state;\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 border-stone-200\");\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.log(\"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 dropImagePlugin = (upload: UploadFn) => {\n const plugin: Plugin = new Plugin({\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 console.log(\"drop event\", 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) return false;\n\n images.forEach(image => {\n\n const position = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(plugin, view, 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 console.log(\"pos\", pos)\n let anyImageFound = false;\n\n items.forEach((item) => {\n const image = item.getAsFile();\n console.log(\"image\", image);\n if (image) {\n anyImageFound = true;\n // if (item.type.indexOf(\"image\") === 0) {\n // event.preventDefault();\n //\n // if (upload && image) {\n // upload(image).then((src) => {\n // const node = schema.nodes.image.create({\n // src\n // });\n // const transaction = view.state.tr.replaceSelectionWith(node);\n // view.dispatch(transaction);\n // });\n // }\n // } else {\n const reader = new FileReader();\n\n reader.onload = async (readerEvent) => {\n await onFileRead(plugin, view, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n }\n });\n\n return anyImageFound;\n },\n decorations(state) {\n return plugin.getState(state);\n }\n },\n view(editorView) {\n // This is needed to immediately apply the decoration updates\n return {\n update(view, prevState) {\n const prevDecos = plugin.getState(prevState);\n const newDecos = plugin.getState(view.state);\n\n if (prevDecos !== newDecos) {\n view.updateState(view.state);\n }\n }\n };\n }\n });\n return plugin;\n};\n\n/**\n * Matches following attributes in Markdown-typed image: [, alt, src, title]\n *\n * Example:\n * ![Lorem](image.jpg) -> [, \"Lorem\", \"image.jpg\"]\n * ![](image.jpg \"Ipsum\") -> [, \"\", \"image.jpg\", \"Ipsum\"]\n * ![Lorem](image.jpg \"Ipsum\") -> [, \"Lorem\", \"image.jpg\", \"Ipsum\"]\n */\nconst IMAGE_INPUT_REGEX = /!\\[(.+|:?)\\]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/;\n\nexport const createImageExtension = (uploadFn: UploadFn) => {\n return TiptapImage.extend({\n addProseMirrorPlugins() {\n return [dropImagePlugin(uploadFn)];\n }\n }).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cn(\"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 { Extension } from \"@tiptap/core\";\n\nimport { NodeSelection, Plugin } from \"@tiptap/pm/state\";\n// @ts-ignore\nimport { __serializeForClipboard, EditorView } from \"@tiptap/pm/view\";\n\nexport interface DragHandleOptions {\n /**\n * The width of the drag handle\n */\n dragHandleWidth: number;\n}\nfunction absoluteRect(node: Element) {\n const data = node.getBoundingClientRect();\n\n return {\n top: data.top,\n left: data.left,\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 { dom, text } = __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 = { slice, move: event.ctrlKey };\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);\n });\n dragHandleElement.addEventListener(\"click\", (e) => {\n handleClick(e, view);\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\n","\"use client\";\nimport React, { useMemo, useState } from \"react\";\n\nimport TiptapUnderline from \"@tiptap/extension-underline\";\nimport TextStyle from \"@tiptap/extension-text-style\";\nimport { Color } from \"@tiptap/extension-color\";\n\nimport { Markdown } from \"tiptap-markdown\";\nimport Highlight from \"@tiptap/extension-highlight\";\n\nimport {\n EditorBubble,\n EditorCommand,\n EditorCommandEmpty,\n EditorCommandItem,\n EditorRoot,\n type JSONContent\n} from \"./components\";\nimport { Command, createSuggestionItems, renderItems } from \"./extensions\";\n\nimport { NodeSelector } from \"./selectors/node-selector\";\nimport { LinkSelector } from \"./selectors/link-selector\";\nimport { TextButtons } from \"./selectors/text-buttons\";\n\nimport {\n CheckBoxIcon,\n cn,\n CodeIcon,\n defaultBorderMixin,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n ImageIcon,\n Looks3Icon,\n LooksOneIcon,\n LooksTwoIcon,\n Separator,\n TextFieldsIcon,\n useInjectStyles\n} from \"@firecms/ui\";\n// import { startImageUpload } from \"./plugins\";\nimport { Editor, EditorProvider, EditorProviderProps } from \"@tiptap/react\";\nimport { useDebouncedCallback } from \"./utils/useDebouncedCallback\";\nimport { removeClassesFromJson } from \"./utils/remove_classes\";\nimport { horizontalRule, placeholder, starterKit, taskItem, taskList, tiptapLink } from \"./editor_extensions\";\nimport { createImageExtension } from \"./extensions/Image\";\nimport { CustomKeymap } from \"./extensions/custom-keymap\";\nimport { DragAndDrop } from \"./extensions/drag-and-drop\";\n\nexport type FireCMSEditorProps = {\n initialContent?: 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};\n\nexport const FireCMSEditor = ({\n handleImageUpload,\n initialContent,\n onJsonContentChange,\n onHtmlContentChange,\n onMarkdownContentChange\n }: FireCMSEditorProps) => {\n\n const defaultEditorProps: EditorProviderProps[\"editorProps\"] = {\n handleDOMEvents: {\n keydown: (_view, event) => {\n // prevent default event listeners from firing when slash command is active\n if ([\"ArrowUp\", \"ArrowDown\", \"Enter\"].includes(event.key)) {\n const slashCommand = document.querySelector(\"#slash-command\");\n if (slashCommand) {\n return true;\n }\n }\n return false;\n }\n },\n // handlePaste: (view, event) => {\n // if (event.clipboardData && event.clipboardData.files && event.clipboardData.files[0]) {\n // event.preventDefault();\n // const file = event.clipboardData.files[0];\n // const pos = view.state.selection.from;\n //\n // // startImageUpload({ file, view, pos, handleImageUpload });\n // return true;\n // }\n // return false;\n // },\n // handleDrop: (view, event, _slice, moved) => {\n // console.log(\"handleDrop\", { event, moved });\n // if (!moved && event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n // console.log(\"handleDrop!!!\", { event, moved });\n // event.preventDefault();\n // const file = event.dataTransfer.files[0];\n // const coordinates = view.posAtCoords({\n // left: event.clientX,\n // top: event.clientY\n // });\n // // here we deduct 1 from the pos or else the image will create an extra node\n // startImageUpload({\n // file,\n // view,\n // pos: coordinates?.pos || 0 - 1,\n // handleImageUpload,\n // });\n // return true;\n // }\n // return false;\n // }\n };\n\n const suggestionItems = createSuggestionItems([\n {\n title: \"Text\",\n description: \"Just start typing with plain text.\",\n searchTerms: [\"p\", \"paragraph\"],\n icon: <TextFieldsIcon size={18}/>,\n command: ({ editor, range }) => {\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: ({ editor, range }) => {\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: ({ editor, range }) => {\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: ({ editor, range }) => {\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: ({ editor, range }) => {\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: ({ editor, range }) => {\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: ({ editor, range }) => {\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: ({ editor, range }) =>\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: ({ editor, range }) =>\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\"],\n icon: <ImageIcon size={18}/>,\n command: ({ editor, range }) => {\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 // startImageUpload({\n // file,\n // view: editor.view,\n // pos,\n // handleImageUpload\n // });\n }\n };\n input.click();\n }\n }\n ]);\n\n const slashCommand = Command.configure({\n suggestion: {\n items: () => suggestionItems,\n render: renderItems\n }\n });\n\n const imageExtension = useMemo(() => createImageExtension(handleImageUpload), []);\n\n const extensions = [\n TiptapUnderline,\n TextStyle,\n Color,\n Highlight.configure({\n multicolor: true,\n }),\n Markdown.configure({\n html: false,\n transformCopiedText: true,\n }),\n CustomKeymap,\n DragAndDrop,\n starterKit,\n placeholder,\n tiptapLink,\n // tiptapImage,\n imageExtension,\n // updatedImage,\n taskList,\n taskItem,\n horizontalRule,\n slashCommand];\n const [openNode, setOpenNode] = useState(false);\n const [openLink, setOpenLink] = useState(false);\n\n useInjectStyles(\"Editor\", cssStyles);\n\n const editorRef = React.useRef<Editor | null>(null);\n const [markdownContent, setMarkdownContent] = useState<string | null>(null);\n const [jsonContent, setJsonContent] = useState<JSONContent | null>(null);\n const [htmlContent, setHtmlContent] = useState<string | null>(null);\n\n const onEditorUpdate = (editor: Editor) => {\n editorRef.current = editor;\n if (onMarkdownContentChange) {\n setMarkdownContent(editor.storage.markdown.getMarkdown());\n }\n if (onJsonContentChange) {\n setJsonContent(removeClassesFromJson(editor.getJSON()));\n }\n if (onHtmlContentChange) {\n setHtmlContent(editor.getHTML());\n }\n }\n\n useDebouncedCallback(markdownContent, () => {\n\n if (editorRef.current) {\n const markdown = editorRef.current.storage.markdown.getMarkdown();\n onMarkdownContentChange?.(addLineBreakAfterImages(markdown));\n }\n }, false, 500);\n\n useDebouncedCallback(jsonContent, () => {\n if (jsonContent)\n onJsonContentChange?.(jsonContent);\n }, false, 500);\n\n useDebouncedCallback(htmlContent, () => {\n if (htmlContent)\n onHtmlContentChange?.(htmlContent);\n }, false, 500);\n\n if (!initialContent) return null;\n\n return (\n <div className=\"relative w-full p-8\">\n <EditorRoot>\n <div\n className=\"relative min-h-[500px] w-full bg-white dark:bg-gray-950 rounded-lg\">\n <EditorProvider\n content={initialContent}\n extensions={extensions}\n editorProps={{\n ...defaultEditorProps,\n attributes: {\n class: \"prose-lg prose-headings:font-title font-default focus:outline-none max-w-full p-12\"\n }\n }}\n onUpdate={({ editor }) => {\n console.log(\"editor updated\");\n onEditorUpdate(editor as Editor);\n }}>\n\n <EditorCommand\n className={cn(\"text-gray-900 dark:text-white z-50 h-auto max-h-[330px] w-72 overflow-y-auto rounded-md border bg-white dark:bg-gray-900 px-1 py-2 shadow transition-all\", defaultBorderMixin)}>\n <EditorCommandEmpty className=\"px-2 text-gray-700 dark:text-slate-300\">\n No results\n </EditorCommandEmpty>\n {suggestionItems.map((item) => (\n <EditorCommandItem\n value={item.title}\n onCommand={(val) => item?.command?.(val)}\n className={\"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-gray-700 aria-selected:bg-blue-50 aria-selected:dark:bg-gray-700\"}\n key={item.title}\n >\n <div\n className={cn(\"flex h-10 w-10 items-center justify-center rounded-md border bg-white dark:bg-gray-900\", defaultBorderMixin)}>\n {item.icon}\n </div>\n <div>\n <p className=\"font-medium\">{item.title}</p>\n <p className=\"text-xs text-gray-700 dark:text-slate-300\">\n {item.description}\n </p>\n </div>\n </EditorCommandItem>\n ))}\n </EditorCommand>\n\n <EditorBubble\n tippyOptions={{\n placement: \"top\"\n }}\n className={cn(\"flex w-fit max-w-[90vw] h-10 overflow-hidden rounded border bg-white dark:bg-gray-900 shadow\", defaultBorderMixin)}\n >\n {/*<Separator orientation=\"vertical\"/>*/}\n <NodeSelector open={openNode} onOpenChange={setOpenNode}/>\n <Separator orientation=\"vertical\"/>\n\n <LinkSelector open={openLink} onOpenChange={setOpenLink}/>\n <Separator orientation=\"vertical\"/>\n <TextButtons/>\n {/*<Separator orientation=\"vertical\"/>*/}\n {/*<ColorSelector open={openColor} onOpenChange={setOpenColor}/>*/}\n </EditorBubble>\n\n </EditorProvider>\n </div>\n\n </EditorRoot>\n </div>\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\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 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 }\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.drag-handle {\n position: fixed;\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.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,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: 50;\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":["editorStore","createStore","EditorRoot","children","jsx","Provider","EditorBubble","forwardRef","tippyOptions","rest","ref","editor","useCurrentEditor","instanceRef","useRef","useEffect","bubbleMenuProps","useMemo","state","selection","empty","isNodeSelection","val","BubbleMenu","EditorBubbleItem","asChild","onSelect","Comp","Slot","t","tunnel","queryAtom","atom","rangeAtom","EditorCommandOut","query","range","setQuery","useSetAtom","setRange","navigationKeys","onKeyDown","e","commandRef","EditorCommand","className","commandListRef","useAtom","jsxs","Command","EditorCommandItem","onCommand","useAtomValue","CommandItem","EditorCommandEmpty","CommandEmpty","Extension","props","Suggestion","renderItems","component","popup","ReactRenderer","tippy","createSuggestionItems","items","PlaceholderExtension","Placeholder","node","Horizontal","HorizontalRule","InputRule","attributes","tr","start","end","TextFieldsIcon","LooksOneIcon","LooksTwoIcon","Looks3Icon","CheckBoxIcon","FormatListBulletedIcon","FormatListNumberedIcon","FormatQuoteIcon","CodeIcon","NodeSelector","open","onOpenChange","useEditor","activeItem","item","Popover","Button","ExpandMoreIcon","index","CheckIcon","isValidUrl","url","getUrlFromString","str","LinkSelector","inputRef","cn","target","input","DeleteIcon","TextButtons","FormatBoldIcon","FormatItalicIcon","FormatUnderlinedIcon","FormatStrikethroughIcon","useDebouncedCallback","value","callback","immediate","timeoutMs","pendingUpdate","React","performUpdate","handlerRef","removeClassesFromJson","jsonObj","key","placeholder","tiptapLink","TiptapLink","taskList","TaskList","taskItem","TaskItem","horizontalRule","defaultBorderMixin","starterKit","StarterKit","onFileRead","plugin","view","readerEvent","pos","upload","image","schema","decorationSet","imageElement","deco","Decoration","src","imageNode","dropImagePlugin","Plugin","DecorationSet","old","meta","event","images","file","position","reader","slice","anyImageFound","editorView","prevState","prevDecos","newDecos","createImageExtension","uploadFn","TiptapImage","CustomKeymap","commands","startNodePos","endNodePos","startSelectionPos","endSelectionPos","absoluteRect","data","nodeDOMAtCoords","coords","elem","nodePosAtDOM","options","boundingRect","DragHandle","handleDragStart","nodePos","NodeSelection","dom","text","__serializeForClipboard","handleClick","dragHandleElement","hideDragHandle","showDragHandle","compStyle","lineHeight","paddingTop","rect","DragAndDrop","FireCMSEditor","handleImageUpload","initialContent","onJsonContentChange","onHtmlContentChange","onMarkdownContentChange","defaultEditorProps","_view","suggestionItems","ImageIcon","slashCommand","imageExtension","extensions","TiptapUnderline","TextStyle","Color","Highlight","Markdown","openNode","setOpenNode","useState","openLink","setOpenLink","useInjectStyles","cssStyles","editorRef","markdownContent","setMarkdownContent","jsonContent","setJsonContent","htmlContent","setHtmlContent","onEditorUpdate","markdown","addLineBreakAfterImages","EditorProvider","Separator","imageRegex","match"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/components/editor-bubble.tsx","../src/components/editor-bubble-item.tsx","../src/selectors/node-selector.tsx","../src/selectors/link-selector.tsx","../src/selectors/text-buttons.tsx","../src/utils/remove_classes.ts","../src/extensions/TextLoadingDecorationExtension.tsx","../src/extensions/index.ts","../src/editor_extensions.tsx","../src/extensions/Image.ts","../src/extensions/custom-keymap.ts","../src/extensions/drag-and-drop.tsx","../src/extensions/HighlightDecorationExtension.ts","../src/extensions/slashCommand.tsx","../src/editor.tsx"],"sourcesContent":["import { BubbleMenu, type BubbleMenuProps, isNodeSelection, useCurrentEditor } from \"@tiptap/react\";\nimport { type ReactNode, useMemo, useRef, useEffect, forwardRef } from \"react\";\nimport type { Instance, Props } from \"tippy.js\";\n\nexport interface EditorBubbleProps extends Omit<BubbleMenuProps, \"editor\"> {\n children: ReactNode;\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({ children, tippyOptions, ...rest }, ref) => {\n const { editor } = useCurrentEditor();\n const instanceRef = useRef<Instance<Props> | null>(null);\n\n useEffect(() => {\n if (!instanceRef.current || !tippyOptions?.placement) return;\n\n instanceRef.current.setProps({ placement: tippyOptions.placement });\n instanceRef.current.popperInstance?.update();\n }, [tippyOptions?.placement]);\n\n const bubbleMenuProps: Omit<BubbleMenuProps, \"editor\" | \"children\"> = useMemo(() => {\n const shouldShow: BubbleMenuProps[\"shouldShow\"] = ({ editor, state }) => {\n const { selection } = state;\n const { empty } = selection;\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 || isNodeSelection(selection)) {\n return false;\n }\n return true;\n };\n\n return {\n shouldShow,\n tippyOptions: {\n onCreate: (val) => {\n instanceRef.current = val;\n },\n moveTransition: \"transform 0.15s ease-out\",\n ...tippyOptions,\n },\n ...rest,\n };\n }, [rest, tippyOptions]);\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 \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-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 // if (item.type.indexOf(\"image\") === 0) {\n // event.preventDefault();\n //\n // if (upload && image) {\n // upload(image).then((src) => {\n // const node = schema.nodes.image.create({\n // src\n // });\n // const transaction = view.state.tr.replaceSelectionWith(node);\n // view.dispatch(transaction);\n // });\n // }\n // } else {\n const reader = new FileReader();\n\n reader.onload = async (readerEvent) => {\n await onFileRead(view as any, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n }\n });\n\n return anyImageFound;\n },\n decorations(state) {\n return plugin.getState(state);\n }\n },\n view(editorView) {\n // This is needed to immediately apply the decoration updates\n return {\n update(view, prevState) {\n const prevDecos = plugin.getState(prevState);\n const newDecos = plugin.getState(view.state);\n\n if (prevDecos !== newDecos) {\n view.updateState(view.state);\n }\n }\n };\n }\n });\n return plugin;\n};\n\n/**\n * Matches following attributes in Markdown-typed image: [, alt, src, title]\n *\n * Example:\n * ![Lorem](image.jpg) -> [, \"Lorem\", \"image.jpg\"]\n * ![](image.jpg \"Ipsum\") -> [, \"\", \"image.jpg\", \"Ipsum\"]\n * ![Lorem](image.jpg \"Ipsum\") -> [, \"Lorem\", \"image.jpg\", \"Ipsum\"]\n */\nconst IMAGE_INPUT_REGEX = /!\\[(.+|:?)\\]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/;\n\nexport const createImageExtension = (dropImagePlugin: Plugin) => {\n return TiptapImage.extend({\n addProseMirrorPlugins() {\n return [dropImagePlugin];\n }\n }).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cls(\"rounded-lg border\", defaultBorderMixin)\n }\n });\n};\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n // eslint-disable-next-line no-unused-vars\n interface Commands<ReturnType> {\n customkeymap: {\n /**\n * Select text between node boundaries\n */\n selectTextWithinNodeBoundaries: () => ReturnType;\n };\n }\n}\n\nexport const CustomKeymap = Extension.create({\n name: \"CustomKeymap\",\n\n addCommands() {\n return {\n selectTextWithinNodeBoundaries:\n () =>\n ({ editor, commands }) => {\n const { state } = editor;\n const { tr } = state;\n const startNodePos = tr.selection.$from.start();\n const endNodePos = tr.selection.$to.end();\n return commands.setTextSelection({\n from: startNodePos,\n to: endNodePos,\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-a\": ({ editor }) => {\n const { state } = editor;\n const { tr } = state;\n const startSelectionPos = tr.selection.from;\n const endSelectionPos = tr.selection.to;\n const startNodePos = tr.selection.$from.start();\n const endNodePos = tr.selection.$to.end();\n const isCurrentTextSelectionNotExtendedToNodeBoundaries =\n startSelectionPos > startNodePos || endSelectionPos < endNodePos;\n if (isCurrentTextSelectionNotExtendedToNodeBoundaries) {\n editor.chain().selectTextWithinNodeBoundaries().run();\n return true;\n }\n return false;\n },\n };\n },\n});\n\n","import { Extension } from \"@tiptap/core\";\n\nimport { NodeSelection, Plugin } from \"@tiptap/pm/state\";\n// @ts-ignore\nimport { __serializeForClipboard, EditorView } from \"@tiptap/pm/view\";\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, 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\";\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 tippy from \"tippy.js\"\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 const allow = !!$from.parent.type.contentMatch.matchType(type)\n\n return allow\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 const inSearchTerms = item.searchTerms?.some(term => term.toLowerCase().startsWith(query.toLowerCase()));\n return inSearchTerms;\n })\n },\n\n render: () => {\n let component: any;\n let popup: any;\n\n return {\n onStart: (props) => {\n\n component = new ReactRenderer(CommandList, {\n props: {\n ...props,\n upload,\n aiController\n },\n editor: props.editor,\n })\n\n if (!props.clientRect) {\n return\n }\n // @ts-ignore\n popup = tippy(\"body\", {\n getReferenceClientRect: props.clientRect,\n appendTo: ref?.current,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\"\n });\n },\n\n onUpdate(props) {\n component.updateProps(props)\n\n if (!props.clientRect) {\n return\n }\n\n popup[0].setProps({\n getReferenceClientRect: props.clientRect\n })\n },\n\n onKeyDown(props) {\n if (props.event.key === \"Escape\") {\n popup[0].hide()\n props.event.preventDefault();\n return true\n }\n\n return component.ref?.onKeyDown(props)\n },\n\n onExit() {\n if (popup && popup[0])\n popup[0].destroy()\n component?.destroy()\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}, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const { editor } = useCurrentEditor();\n const selectItem = (item?: SuggestionItem) => {\n if (!editor) return;\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 onClick={() => selectItem(item)}\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\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\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 TextStyle 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\n// custom components need to be able to display and update the editor content\n// export type CustomEditorComponentProps = {\n//\n// };\n\nconst CustomDocument = Document.extend({\n // content: 'heading block*',\n});\n\nconst proseClasses = {\n \"sm\": \"prose-sm\",\n \"base\": \"prose-base\",\n \"lg\": \"prose-lg\"\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 onEditorUpdate = (editor: Editor) => {\n editorRef.current = editor;\n if (onMarkdownContentChange) {\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 CustomDocument,\n HighlightDecorationExtension(highlight),\n TextLoadingDecorationExtension,\n Underline,\n Bold,\n TextStyle,\n Italic,\n Strike,\n Color,\n Highlight.configure({\n multicolor: true\n }),\n // CustomBlock.configure({\n // component: CustomComponent,\n // delimiter: \"```custom\"\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 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 tippyOptions={{\n placement: \"top\"\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.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,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","rest","tippyOptions","editor","useCurrentEditor","instanceRef","useRef","t1","current","placement","setProps","popperInstance","update","t2","t3","useEffect","t4","shouldShow","_temp","t5","Symbol","for","val","t6","onCreate","moveTransition","t7","bubbleMenuProps","t8","t9","editor_0","state","selection","empty","isActive","isNodeSelection","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","map","item_0","index","isValidUrl","url","URL","e","getUrlFromString","str","includes","toString","LinkSelector","inputRef","cls","target","currentTarget","preventDefault","input","value","setLink","href","getAttributes","focusedDisabled","unsetLink","t10","TextButtons","_temp2","FormatBoldIcon","_temp3","_temp4","FormatItalicIcon","_temp5","_temp6","FormatUnderlinedIcon","_temp7","_temp8","FormatStrikethroughIcon","_temp9","_temp10","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","options","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","hasLoadingDecoration","pluginState","get","includeChildren","Horizontal","HorizontalRule","extend","addInputRules","InputRule","find","handler","range","attributes","start","end","to","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","prevState","prevDecos","newDecos","updateState","createImageExtension","dropImagePlugin","TiptapImage","allowBase64","CustomKeymap","selectTextWithinNodeBoundaries","commands","startNodePos","$from","endNodePos","$to","setTextSelection","addKeyboardShortcuts","Mod-a","startSelectionPos","endSelectionPos","isCurrentTextSelectionNotExtendedToNodeBoundaries","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","NodeSelection","content","dom","text","__serializeForClipboard","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","push","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","mergedOptions","html","Backspace","isCommand","anchor","nodesBetween","insertText","nodeSize","Suggestion","aiController","query","availableSuggestionItems","suggestionItems","autocompleteSuggestionItem","inTitle","title","toLowerCase","inSearchTerms","searchTerms","some","term","render","component","popup","onStart","ReactRenderer","CommandList","clientRect","tippy","getReferenceClientRect","appendTo","showOnCreate","interactive","trigger","onUpdate","updateProps","onKeyDown","hide","onExit","selectedIndex","setSelectedIndex","useState","selectItem","upHandler","downHandler","enterHandler","useImperativeHandle","itemRefs","scrollIntoView","block","t11","item_1","el","description","t12","Error","deleteRange","textBeforeCursor","textBetween","textAfterCursor","size","buffer","autocomplete","delta","insertContent","applyInputRules","applyPasteRules","parseOptions","preserveWhitespace","setNode","accept","onchange","fileList","click","CustomDocument","Document","proseClasses","FireCMSEditor","onJsonContentChange","onHtmlContentChange","onMarkdownContentChange","version","textSize","handleImageUpload","disabled","React","editorRef","imagePlugin","imageExtension","useMemo","openNode","setOpenNode","openLink","setOpenLink","useInjectStyles","cssStyles","deferredHighlight","useDeferredValue","setContent","setEditable","onEditorUpdate","markdown","storage","getMarkdown","addLineBreakAfterImages","jsonContent","getJSON","getHTML","proseClass","extensions","Underline","Bold","TextStyle","Italic","Strike","Color","Highlight","multicolor","Heading","Markdown","imageRegex","replace","match"],"mappings":"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"}