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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/components/editor-bubble.tsx","../src/components/editor-bubble-item.tsx","../src/selectors/node-selector.tsx","../src/selectors/link-selector.tsx","../src/selectors/text-buttons.tsx","../src/utils/remove_classes.ts","../src/extensions/TextLoadingDecorationExtension.tsx","../src/extensions/index.ts","../src/editor_extensions.tsx","../src/extensions/Image.ts","../src/extensions/custom-keymap.ts","../src/extensions/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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQO,MAAMA,eAAeC,WAC1B,CAAAC,IAAAC,QAAA;AAAAC,QAAAA,IAAAC,EAAA,EAAA;AAAAC,MAAAA;AAAAC,MAAAA;AAAAC,MAAAA;AAAAJ,MAAAA,SAAAF,IAAA;AAAC,KAAA;AAAA,MAAAI;AAAAA,MAAAE;AAAAA,MAAA,GAAAD;AAAAA,IAAAA,IAAAL;AAAmCE,WAAAF;AAAAE,WAAAE;AAAAF,WAAAG;AAAAH,WAAAI;AAAAA,EAAAA,OAAA;AAAAF,eAAAF,EAAA,CAAA;AAAAG,WAAAH,EAAA,CAAA;AAAAI,mBAAAJ,EAAA,CAAA;AAAA,EAAA;AAClC,QAAA;AAAA,IAAAK;AAAAA,MAAmBC,iBAAiB;AACpCC,QAAAA,cAAoBC,OAAA,IAAmC;AAAEC,MAAAA;AAAAT,MAAAA,SAAAI,cAAA;AAE/CK,SAAAA,MAAA;AAAA,UACJ,CAACF,YAAWG,WAAaN,CAAAA,cAAYO,WAAW;AAAA;AAAA,MAAA;AAEpDJ,kBAAWG,QAAAE,SAAA;AAAA,QAAAD,WAA+BP,aAAYO;AAAAA,MAAAA,CAAY;AACvDD,kBAAAA,QAAAG,gBAAAC,OAAA;AAAA,IAAA;AACZd,WAAAI;AAAAJ,WAAAS;AAAAA,EAAAA,OAAA;AAAAA,SAAAT,EAAA,CAAA;AAAA,EAAA;AAAG,QAAAe,KAAAX,cAAYO;AAAWK,MAAAA;AAAAhB,MAAAA,SAAAe,IAAA;AAAxBC,UAACD,EAAuB;AAACf,WAAAe;AAAAf,WAAAgB;AAAAA,EAAAA,OAAA;AAAAA,SAAAhB,EAAA,CAAA;AAAA,EAAA;AAL5BiB,YAAUR,IAKPO,EAAyB;AAACE,MAAAA;AAG3B,QAAAC,aAAAC;AAYEC,MAAAA;AAAA,MAAArB,EAAA,CAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;AAKYF,SAAAG,CAAA,QAAA;AACRjB,kBAAWG,UAAWc;AAAAA,IAAG;AAC1BxB,WAAAqB;AAAAA,EAAAA,OAAA;AAAAA,SAAArB,EAAA,CAAA;AAAA,EAAA;AAAAyB,MAAAA;AAAAzB,MAAAA,SAAAI,cAAA;AAHW,SAAA;AAAA,MAAAsB,UACFL;AAAAA,MAETM,gBACe;AAAA,MAA0B,GACvCvB;AAAAA,IAAY;AAChBJ,WAAAI;AAAAJ,YAAAyB;AAAAA,EAAAA,OAAA;AAAAA,SAAAzB,EAAA,EAAA;AAAA,EAAA;AAAA4B,MAAAA;AAAA,MAAA5B,EAAAG,EAAAA,MAAAA,QAAAH,UAAAyB,IAAA;AARI,SAAA;AAAA,MAAAN;AAAAA,MAAAf,cAESqB;AAAAA,MAMb,GACEtB;AAAAA,IAAI;AACRH,YAAAG;AAAAH,YAAAyB;AAAAzB,YAAA4B;AAAAA,EAAAA,OAAA;AAAAA,SAAA5B,EAAA,EAAA;AAAA,EAAA;AAVM4B,OAAAA;AAfT,QAAAC,kBAAsEX;AA0B7C,MAAA,CAEpBb,QAAM;AAAA,WAAA;AAAA,EAAA;AAAAyB,MAAAA;AAAA9B,MAAAA,EAAA6B,EAAAA,MAAAA,mBAAA7B,UAAAE,YAAAF,EAAA,EAAA,MAAAK,QAAA;AAKPyB,SAAC,oBAAA,YAAA,EAAmBzB,QAAYwB,GAAAA,iBAC7B3B,UACH;AAAaF,YAAA6B;AAAA7B,YAAAE;AAAAF,YAAAK;AAAAL,YAAA8B;AAAAA,EAAAA,OAAA;AAAAA,SAAA9B,EAAA,EAAA;AAAA,EAAA;AAAA+B,MAAAA;AAAA,MAAA/B,EAAAD,EAAAA,MAAAA,OAAAC,UAAA8B,IAAA;AAHf,SAAA,oBAAA,OAAU/B,EAAAA,KACR+B,UAGF,IAAA;AAAM9B,YAAAD;AAAAC,YAAA8B;AAAA9B,YAAA+B;AAAAA,EAAAA,OAAA;AAAAA,SAAA/B,EAAA,EAAA;AAAA,EAAA;AAJN+B,SAAAA;AAIM,CAGZ;AAlDE,SAAAX,QAAAtB,IAAA;AAYuD,QAAA;AAAA,IAAAO,QAAA2B;AAAAA,IAAAC;AAAAA,EAAAA,IAAAnC;AACjD,QAAA;AAAA,IAAAoC;AAAAA,EAAAA,IAAsBD;AACtB,QAAA;AAAA,IAAAE;AAAAA,EAAAA,IAAkBD;AAAU,MAMxB7B,SAAM+B,SAAU,OAAO,KAAKD,SAASE,gBAAgBH,SAAS,GAAC;AAAA,WAAA;AAAA,EAAA;AAAA,SAAA;AAAA;ACnBpE,MAAMI,mBAAmBzC,WAG9B,CAAAC,IAAAC,QAAA;AAAAC,QAAAA,IAAAC,EAAA,EAAA;AAAAsC,MAAAA;AAAArC,MAAAA;AAAAsC,MAAAA;AAAArC,MAAAA;AAAAH,MAAAA,SAAAF,IAAA;AAAC,KAAA;AAAA,MAAAI;AAAAA,MAAAqC;AAAAA,MAAAC;AAAAA,MAAA,GAAArC;AAAAA,IAAAA,IAAAL;AAAwCE,WAAAF;AAAAE,WAAAuC;AAAAvC,WAAAE;AAAAF,WAAAwC;AAAAxC,WAAAG;AAAAA,EAAAA,OAAA;AAAAoC,cAAAvC,EAAA,CAAA;AAAAE,eAAAF,EAAA,CAAA;AAAAwC,eAAAxC,EAAA,CAAA;AAAAG,WAAAH,EAAA,CAAA;AAAA,EAAA;AACzC,QAAA;AAAA,IAAAK;AAAAA,MAAmBC,iBAAiB;AACpCmC,QAAAA,OAAaF,UAAOG,OAAU;AAAM,MAAA,CAE/BrC,QAAM;AAAA,WAAA;AAAA,EAAA;AAAAI,MAAAA;AAAA,MAAAT,EAAAK,CAAAA,MAAAA,UAAAL,SAAAwC,UAAA;AAG0B/B,SAAAA,MAAM+B,WAAWnC,MAAM;AAACL,WAAAK;AAAAL,WAAAwC;AAAAxC,WAAAS;AAAAA,EAAAA,OAAA;AAAAA,SAAAT,EAAA,CAAA;AAAA,EAAA;AAAAe,MAAAA;AAAA,MAAAf,EAAAyC,CAAAA,MAAAA,QAAAzC,EAAA,CAAA,MAAAE,YAAAF,EAAAD,EAAAA,MAAAA,OAAAC,EAAA,EAAA,MAAAG,QAAAH,UAAAS,IAAA;AAA3DM,6BAAC,MAAUhB,EAAAA,QAASI,MAAe,SAAAM,cAEnC;AAAOT,WAAAyC;AAAAzC,WAAAE;AAAAF,YAAAD;AAAAC,YAAAG;AAAAH,YAAAS;AAAAT,YAAAe;AAAAA,EAAAA,OAAA;AAAAA,SAAAf,EAAA,EAAA;AAAA,EAAA;AAFPe,SAAAA;AAEO,CAEV;AAEDuB,iBAAiBK,cAAc;ACA/B,MAAMC,QAAwB,CAC1B;AAAA,EACIC,MAAM;AAAA,EACNC,MAAMC;AAAAA,EACNC,SAAU3C,CACNA,WAAAA,QAAQ4C,MAAM,EAAEC,MAAM,EAAEC,WAAW,aAAa,WAAW,EAAEC,IAAI;AAAA;AAAA,EAErEhB,UAAW/B,CAAAA,YACNA,QAAQ+B,SAAS,WAAW,KACzB,CAAC/B,QAAQ+B,SAAS,YAAY,KAC9B,CAAC/B,QAAQ+B,SAAS,aAAa,MAAM;AACjD,GACA;AAAA,EACIS,MAAM;AAAA,EACNC,MAAMO;AAAAA,EACNL,SAAU3C,CACNA,WAAAA,QAAQ4C,QAAQC,QAAQI,cAAc;AAAA,IAAEC,OAAO;AAAA,EAAG,CAAA,EAAEH,IAAI;AAAA,EAC5DhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,WAAW;AAAA,IAAEmB,OAAO;AAAA,EAAA,CAAG,KAAK;AACvE,GACA;AAAA,EACIV,MAAM;AAAA,EACNC,MAAMU;AAAAA,EACNR,SAAU3C,CACNA,WAAAA,QAAQ4C,QAAQC,QAAQI,cAAc;AAAA,IAAEC,OAAO;AAAA,EAAG,CAAA,EAAEH,IAAI;AAAA,EAC5DhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,WAAW;AAAA,IAAEmB,OAAO;AAAA,EAAA,CAAG,KAAK;AACvE,GACA;AAAA,EACIV,MAAM;AAAA,EACNC,MAAMW;AAAAA,EACNT,SAAU3C,CACNA,WAAAA,QAAQ4C,QAAQC,QAAQI,cAAc;AAAA,IAAEC,OAAO;AAAA,EAAG,CAAA,EAAEH,IAAI;AAAA,EAC5DhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,WAAW;AAAA,IAAEmB,OAAO;AAAA,EAAA,CAAG,KAAK;AACvE,GACA;AAAA,EACIV,MAAM;AAAA,EACNC,MAAMY;AAAAA,EACNV,SAAU3C,YAAWA,QAAQ4C,QAAQC,MAAM,EAAES,eAAe,EAAEP,IAAI;AAAA,EAClEhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,UAAU,KAAK;AAC1D,GACA;AAAA,EACIS,MAAM;AAAA,EACNC,MAAMc;AAAAA,EACNZ,SAAU3C,YAAWA,QAAQ4C,QAAQC,MAAM,EAAEW,iBAAiB,EAAET,IAAI;AAAA,EACpEhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,YAAY,KAAK;AAC5D,GACA;AAAA,EACIS,MAAM;AAAA,EACNC,MAAMgB;AAAAA,EACNd,SAAU3C,YAAWA,QAAQ4C,QAAQC,MAAM,EAAEa,kBAAkB,EAAEX,IAAI;AAAA,EACrEhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,aAAa,KAAK;AAC7D,GACA;AAAA,EACIS,MAAM;AAAA,EACNC,MAAMkB;AAAAA,EACNhB,SAAU3C,CAAAA,WAAWA,QAAQ4C,MACxBC,EAAAA,MAAAA,EACAC,WAAW,aAAa,WAAW,EACnCc,iBAAAA,EACAb,IAAI;AAAA,EACThB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,YAAY,KAAK;AAC5D,GACA;AAAA,EACIS,MAAM;AAAA,EACNC,MAAMoB;AAAAA,EACNlB,SAAU3C,YAAWA,QAAQ4C,QAAQC,MAAM,EAAEiB,gBAAgB,EAAEf,IAAI;AAAA,EACnEhB,UAAW/B,CAAAA,WAAWA,QAAQ+B,SAAS,WAAW,KAAK;AAC3D,CAAC;AASE,MAAMgC,eAAetE,CAAA,OAAA;AAAAE,QAAAA,IAAAC,EAAA,EAAA;AAAC,QAAA;AAAA,IAAAoE;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAAzE;AAKzB,QAAA;AAAA,IAAAO;AAAAA,MAAmBmE,iBAAU;AAAE,MAAA,CAC1BnE,QAAM;AAAA,WAAA;AAAA,EAAA;AAAAI,MAAAA;AAAAT,MAAAA,SAAAK,QAAA;AACQuC,SAAAA,MAAA6B,OAAAC,CAAuBA,SAAAA,KAAItC,SAAU/B,MAAM,CAAC,EAACsE,SAAM;AAAA,MAAA9B,MAC5D;AAAA,IAAU;AACnB7C,WAAAK;AAAAL,WAAAS;AAAAA,EAAAA,OAAA;AAAAA,SAAAT,EAAA,CAAA;AAAA,EAAA;AAFD,QAAA4E,aAAmBnE;AAEjBM,MAAAA;AAAA,MAAAf,EAAA,CAAA,MAAA4E,WAAA/B,MAAA;AAYU9B,SAAoE,oBAAA,QAAA,EAApD,WAAA,6BAA6B6D,qBAAU/B,MAAM;AAAO,MAAA,CAAA,IAAA+B,WAAA/B;AAAA7C,WAAAe;AAAAA,EAAAA,OAAA;AAAAA,SAAAf,EAAA,CAAA;AAAA,EAAA;AAAAgB,MAAAA;AAAA,MAAAhB,EAAA,CAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;6BACnE,uBAA4B,EAAA,MAAA,QAAU,CAAA;AAAAvB,WAAAgB;AAAAA,EAAAA,OAAA;AAAAA,SAAAhB,EAAA,CAAA;AAAA,EAAA;AAAAkB,MAAAA;AAAAlB,MAAAA,SAAAe,IAAA;AAJlCG,8BAAC,QAAe,EAAA,SAAA,QACE,WAAA,sBACJ,OAAA,QACnBH,UAAAA;AAAAA,MAAAA;AAAAA,MACAC;AAAAA,IAAAA,GACJ;AAAShB,WAAAe;AAAAf,WAAAkB;AAAAA,EAAAA,OAAA;AAAAA,SAAAlB,EAAA,CAAA;AAAA,EAAA;AAAAqB,MAAAA;AAAArB,MAAAA,SAAA4E,WAAA/B,QAAA7C,SAAAsE,cAAA;AAIR1B,SAAAA,MAAAiC,KAAAC,QAAAC,UACI,qBAAA,kBAAA,EAEa,UAAA/C,CAAA,aAAA;AACN0C,aAAI1B,QAAS3C,QAAM;AACnBiE,wBAAkB;AAAA,IAAA,GAEZ,WAAA,0JAEV,UAAA;AAAA,MAAA,qBAAA,OAAA,EAAe,WAAA,+BACX,UAAA;AAAA,QAAA,oBAAgB,OAAA,MAAA,EAAA,MAAA,WAChB,CAAA;AAAA,QAAA,oBAAA,QAAOI,EAAAA,UAAAA,OAAI7B,KAAM,CAAA;AAAA,MAAA,GACrB;AAAA,MACC+B,WAAU/B,SAAU6B,OAAI7B,QAAU,oBAAA,WAAA,EAAe,MAAA;SAXzC,KAYb,CACH;AAAC,MAAA,CAAA,IAAA+B,WAAA/B;AAAA7C,WAAAsE;AAAAtE,WAAAqB;AAAAA,EAAAA,OAAA;AAAAA,SAAArB,EAAA,CAAA;AAAA,EAAA;AAAAyB,MAAAA;AAAA,MAAAzB,EAAAsE,EAAAA,MAAAA,gBAAAtE,EAAA,EAAA,MAAAqE,QAAArE,EAAAuE,EAAAA,MAAAA,mBAAAvE,EAAA,EAAA,MAAAkB,MAAAlB,UAAAqB,IAAA;AA7BNI,SAAC,oBAAA,SAAA,EACe,YAAC,GACP,OAAA,SACW8C,iBACP,WAAA,YACD,SAAArD,IAMF,OAAA,MACDmD,MACQC,cACbjD,UAiBL,IAAA;AAAUrB,YAAAsE;AAAAtE,YAAAqE;AAAArE,YAAAuE;AAAAvE,YAAAkB;AAAAlB,YAAAqB;AAAArB,YAAAyB;AAAAA,EAAAA,OAAA;AAAAA,SAAAzB,EAAA,EAAA;AAAA,EAAA;AA/BVyB,SAAAA;AA+BU;AC7IX,SAASuD,WAAWC,KAAa;AAChC,MAAA;AAEA,QAAIC,IAAID,GAAG;AACJ,WAAA;AAAA,WACFE,GAAG;AACD,WAAA;AAAA,EAAA;AAEf;AAEO,SAASC,iBAAiBC,KAAa;AACtCL,MAAAA,WAAWK,GAAG,EAAUA,QAAAA;AACxB,MAAA;AACIA,QAAAA,IAAIC,SAAS,GAAG,KAAK,CAACD,IAAIC,SAAS,GAAG,GAAG;AACzC,aAAO,IAAIJ,IAAI,WAAWG,GAAG,EAAE,EAAEE,SAAS;AAAA,IAAA;AAEvC,WAAA;AAAA,WACFJ,GAAG;AACD,WAAA;AAAA,EAAA;AAEf;AAOO,MAAMK,eAAe1F,CAAA,OAAA;AAAAE,QAAAA,IAAAC,EAAA,EAAA;AAAC,QAAA;AAAA,IAAAoE;AAAAA,IAAAC;AAAAA,EAAAA,IAAAxE;AAIzB2F,QAAAA,WAAiBjF,OAAA,IAA6B;AAC9C,QAAA;AAAA,IAAAH;AAAAA,MAAmBmE,iBAAU;AAAE/D,MAAAA;AAAA,MAAAT,EAAA,CAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;AAGrBd,SAAAA,MAAA;AACEC,eAAAA,WAAY+E,SAAQ/E,SAAAwC,MAAiB;AAAA,IAAA;AAChDlD,WAAAS;AAAAA,EAAAA,OAAA;AAAAA,SAAAT,EAAA,CAAA;AAAA,EAAA;AAFDiB,YAAUR,EAET;AAAC,MAAA,CAEGJ,QAAM;AAAA,WAAA;AAAA,EAAA;AAAAU,MAAAA;AAAAf,MAAAA,SAAAK,QAAA;AASoBU,SAAA2E,IAAI,qDAAmD;AAAA,MAAA,iBAChDrF,OAAM+B,SAAU,MAAM;AAAA,IAAA,CAC1C;AAACpC,WAAAK;AAAAL,WAAAe;AAAAA,EAAAA,OAAA;AAAAA,SAAAf,EAAA,CAAA;AAAA,EAAA;AAAAgB,MAAAA;AAAAhB,MAAAA,SAAAe,IAAA;AALGC,SAAC,oBAAA,QAAA,EAAe,SAAA,QACE,WAAA,sBACH,OAAA,QACpB,UAAA,oBAAA,KAAA,EAAc,WAAAD,IAEV,iBAEJ,CAAA,GACJ;AAASf,WAAAe;AAAAf,WAAAgB;AAAAA,EAAAA,OAAA;AAAAA,SAAAhB,EAAA,CAAA;AAAA,EAAA;AAAAkB,MAAAA;AAAAlB,MAAAA,SAAAK,QAAA;AAEAa,SAAAiE,CAAA,MAAA;AACN,YAAAQ,SAAeR,EAACS;AAChBT,QAACU,eAAgB;AACjBC,YAAAA,QAAcH,OAAM,CAAA;AACpBV,YAAAA,MAAYG,iBAAiBU,MAAKC,KAAM;AACxCd,aAAO5E,OAAM4C,MAAQC,EAAAA,MAAAA,EAAQ8C,QAAA;AAAA,QAAAC,MAAiBhB;AAAAA,MAAK,CAAA,EAAC7B,IAAK;AAAA,IAAC;AAC7DpD,WAAAK;AAAAL,WAAAkB;AAAAA,EAAAA,OAAA;AAAAA,SAAAlB,EAAA,CAAA;AAAA,EAAA;AAAAqB,MAAAA;AAAArB,MAAAA,SAAAK,QAAA;AAOiBgB,SAAAhB,OAAM6F,cAAe,MAAM,EAACD,QAAS;AAAEjG,WAAAK;AAAAL,WAAAqB;AAAAA,EAAAA,OAAA;AAAAA,SAAArB,EAAA,CAAA;AAAA,EAAA;AAAAyB,MAAAA;AAAA,MAAAzB,EAAA,CAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;AAC1CmE,SAAAA,IAAI,sFAAoFS,eAAiB;AAACnG,WAAAyB;AAAAA,EAAAA,OAAA;AAAAA,SAAAzB,EAAA,CAAA;AAAA,EAAA;AAAA4B,MAAAA;AAAA,MAAA5B,EAAAqE,EAAAA,MAAAA,QAAArE,UAAAqB,IAAA;AALzH,SAAA,oBAAA,SACSoE,EAAAA,KAAAA,UACMpB,WAAG,MACF,aAAA,gBACE,cAAAhD,IACH,WAAAI,GAA6G,CAAA;AAAAzB,YAAAqE;AAAArE,YAAAqB;AAAArB,YAAA4B;AAAAA,EAAAA,OAAA;AAAAA,SAAA5B,EAAA,EAAA;AAAA,EAAA;AAAA8B,MAAAA;AAAA9B,MAAAA,UAAAK,QAAA;AAE3HyB,SAAAzB,OAAM6F,cAAe,MAAM,EAACD,OACzB,oBAAC,UACS,MAAA,SACE,SAAA,QACH,MAAA,UACE,OAAA,QACG,WAAA,qBACD,SAAA,MAAA;AACL5F,aAAM4C,QAAQC,MAAQkD,EAAAA,UAAAA,EAAYhD,IAAK;AAAA,IAAA,GAG3C,UAAC,oBAAA,YAAA,EAAgB,MAAA,QAAA,CAAO,EAC5B,CAAA,IAEA,oBAAC,QAAa,EAAA,MAAA,SACG,SAAA,QACb,8BAAC,WAAe,EAAA,MAAA,QACpB,CAAA,GAAA;AACHpD,YAAAK;AAAAL,YAAA8B;AAAAA,EAAAA,OAAA;AAAAA,SAAA9B,EAAA,EAAA;AAAA,EAAA;AAAA+B,MAAAA;AAAA/B,MAAAA,EAAAkB,EAAAA,MAAAA,MAAAlB,UAAA4B,MAAA5B,EAAA,EAAA,MAAA8B,IAAA;AAnCLC,wCACc,UAAAb,IAOA,WAAA,YAEVU,UAAAA;AAAAA,MAAAA;AAAAA,MAOCE;AAAAA,IAAAA,GAmBL;AAAO9B,YAAAkB;AAAAlB,YAAA4B;AAAA5B,YAAA8B;AAAA9B,YAAA+B;AAAAA,EAAAA,OAAA;AAAAA,SAAA/B,EAAA,EAAA;AAAA,EAAA;AAAAqG,MAAAA;AAAA,MAAArG,EAAA,EAAA,MAAAsE,gBAAAtE,EAAAqE,EAAAA,MAAAA,QAAArE,EAAAgB,EAAAA,MAAAA,MAAAhB,UAAA+B,IAAA;AAhDV,UAAA,oBAAA,WAAe,OAAA,MACDsC,MACQC,cACL,SAAAtD,IASde,UAqCJ,GAAA,CAAA;AAAU/B,YAAAsE;AAAAtE,YAAAqE;AAAArE,YAAAgB;AAAAhB,YAAA+B;AAAA/B,YAAAqG;AAAAA,EAAAA,OAAA;AAAAA,UAAArG,EAAA,EAAA;AAAA,EAAA;AAjDVqG,SAAAA;AAiDU;ACnFX,MAAMC,cAAcA,MAAA;AAAAtG,QAAAA,IAAAC,EAAA,CAAA;AACvB,QAAA;AAAA,IAAAI;AAAAA,MAAmBmE,iBAAU;AAAE,MAAA,CAC1BnE,QAAM;AAAA,WAAA;AAAA,EAAA;AAAAP,MAAAA;AAAAE,MAAAA,SAAAK,QAAA;AACX,UAAAuC,SAAA,CAAA;AAAA,MAAAC,MAEc;AAAA,MAAMT,UAAAhB;AAAAA,MAAA4B,SAAAuD;AAAAA,MAAAzD,MAAA0D;AAAAA,IAAAA,GAAA;AAAA,MAAA3D,MAMN;AAAA,MAAQT,UAAAqE;AAAAA,MAAAzD,SAAA0D;AAAAA,MAAA5D,MAAA6D;AAAAA,IAAAA,GAAA;AAAA,MAAA9D,MAMR;AAAA,MAAWT,UAAAwE;AAAAA,MAAA5D,SAAA6D;AAAAA,MAAA/D,MAAAgE;AAAAA,IAAAA,GAAA;AAAA,MAAAjE,MAMX;AAAA,MAAQT,UAAA2E;AAAAA,MAAA/D,SAAAgE;AAAAA,MAAAlE,MAAAmE;AAAAA,IAAAA,GAAA;AAAA,MAAApE,MAMR;AAAA,MAAMT,UAAA8E;AAAAA,MAAAlE,SAAAmE;AAAAA,MAAArE,MAAAoB;AAAAA,IAAAA,CAAA;AAOhBpE,SAAA,oBAAA,OAAA,EAAe,WAAA,QACV8C,UAAKiC,OAAAA,IAAA,CAAAH,MAAAK,UACF,oBAAC,kBAEa,EAAA,UAAAqC,CAAA,cAAA;AACN1C,WAAI1B,QAAS3C,SAAM;AAAA,IAAA,GAGvB,UAAC,oBAAA,QAAA,EAAa,MAAA,SACA,OAAA,QACI,WAAA,6BACF,SAAA,QACZ,UACe,oBAAA,KAAA,MAAA,EAAA,WAAAqF,IAAA;AAAA,MAAA,gBAAA,CACUhB,KAAItC,SAAU/B,MAAM;AAAA,MAAC,iBACrBqE,KAAItC,SAAU/B,MAAM;AAAA,IACxC,CAAA,EAET,CAAA,EAAA,CAAA,EAfS,GAAA,KAgBb,CACH,EACL,CAAA;AAAML,WAAAK;AAAAL,WAAAF;AAAAA,EAAAA,OAAA;AAAAA,SAAAE,EAAA,CAAA;AAAA,EAAA;AArBNF,SAAAA;AAqBM;AAzDa,SAAAsB,MAAAY,UAAA;AAMO3B,SAAAA,UAAM+B,SAAW,MAAM,KAAU;AAAA;AANxC,SAAAmE,OAAAc,UAAA;AAAA,SAOMhH,UAAM4C,MAAA,EAAAC,QAAAoE,aAAAlE,IAAA;AAAA;AAPZ,SAAAqD,OAAAc,UAAA;AAYOlH,SAAAA,UAAM+B,SAAW,QAAQ,KAAU;AAAA;AAZ1C,SAAAsE,OAAAc,UAAA;AAAA,SAaMnH,UAAM4C,MAAA,EAAAC,QAAAuE,eAAArE,IAAA;AAAA;AAbZ,SAAAwD,OAAAc,UAAA;AAkBOrH,SAAAA,UAAM+B,SAAW,WAAW,KAAU;AAAA;AAlB7C,SAAAyE,OAAAc,UAAA;AAAA,SAmBMtH,UAAM4C,MAAA,EAAAC,QAAA0E,kBAAAxE,IAAA;AAAA;AAnBZ,SAAA2D,OAAAc,UAAA;AAwBOxH,SAAAA,UAAM+B,SAAW,QAAQ,KAAU;AAAA;AAxB1C,SAAA4E,OAAAc,UAAA;AAAA,SAyBMzH,UAAM4C,MAAA,EAAAC,QAAA6E,eAAA3E,IAAA;AAAA;AAzBZ,SAAA8D,OAAAc,UAAA;AA8BO3H,SAAAA,UAAM+B,SAAW,MAAM,KAAU;AAAA;AA9BxC,SAAA+E,QAAAc,UAAA;AAAA,SA+BM5H,UAAM4C,MAAA,EAAAC,QAAAgF,aAAA9E,IAAA;AAAA;AC3ChC,SAAS+E,sBAAsBC,SAAmB;AAEjDC,MAAAA,MAAMC,QAAQF,OAAO,GAAG;AACxB,WAAOA,QAAQvD,IAAIH,CAAQyD,SAAAA,sBAAsBzD,IAAI,CAAC;AAAA,EAC/C,WAAA,OAAO0D,YAAY,YAAYA,YAAY,MAAM;AAEpDA,QAAAA,QAAQG,SAAS,OAAOH,QAAQG,UAAU,YAAY,WAAWH,QAAQG,OAAO;AAChF,aAAOH,QAAQG,MAAMC;AAAAA,IAAAA;AAIzBC,WAAOC,KAAKN,OAAO,EAAEO,QAAQC,CAAO,QAAA;AAChCR,cAAQQ,GAAG,IAAIT,sBAAsBC,QAAQQ,GAAG,CAAC;AAAA,IAAA,CACpD;AAAA,EAAA;AAEER,SAAAA;AACX;ACFaS,MAAAA,uBAAuB,IAAIC,UAAkC,mBAAmB;AAQ7F,MAAMC,iCAAiCC,UAAUC,OAAO;AAAA,EACpDpG,MAAM;AAAA,EAENqG,aAAa;AACF,WAAA;AAAA,MACHC,WAAWN;AAAAA,IACf;AAAA,EACJ;AAAA,EAEAO,wBAAwB;AACdD,UAAAA,YAAY,KAAKE,QAAQF;AAExB,WAAA,CACH,IAAIG,OAA+B;AAAA,MAC/BV,KAAKO;AAAAA,MAELlH,OAAO;AAAA,QACHsH,OAAO;AACI,iBAAA;AAAA,YACHC,eAAeC,cAActH;AAAAA,YAC7BuH,eAAe;AAAA,UACnB;AAAA,QACJ;AAAA,QAEAC,MAAMC,IAAIC,UAAU;AACVC,gBAAAA,SAASF,GAAGG,QAAQZ,SAAS;AAE/BW,cAAAA,QAAQE,SAAS,qBAAqB;AAChC,kBAAA;AAAA,cAAEC;AAAAA,cAAKC;AAAAA,cAAQC;AAAAA,YAAAA,IAAgBL;AAErC,gBAAII,QAAQ;AACD,qBAAA;AAAA,gBACHV,eAAeC,cAActH;AAAAA,gBAC7BuH,eAAe;AAAA,cACnB;AAAA,YAAA;AAGJ,kBAAMU,aAAaC,WAAWC,OAAOL,KAAK,MAAM;AACtCM,oBAAAA,YAAYC,SAASC,cAAc,MAAM;AAC/CF,wBAAUG,YAAY;AAGtB,kBAAIP,aAAa;AACbI,0BAAUI,YAAYR;AAAAA,cAAAA,OACnB;AACGS,sBAAAA,OAAOJ,SAASC,cAAc,MAAM;AAC1CG,qBAAKC,YAAY;AACjBN,0BAAUO,YAAYF,IAAI;AAAA,cAAA;AAGvBL,qBAAAA;AAAAA,YAAAA,CACV;AAEM,mBAAA;AAAA,cACHf,eAAeC,cAActH,MAAM4I,IAAInB,GAAGoB,KAAK,CAACZ,UAAU,CAAC;AAAA,cAC3DV,eAAe;AAAA,YACnB;AAAA,UAAA;AAGG,iBAAA;AAAA,YACHF,eAAeK,SAASL,cAAc3E,IAAI+E,GAAGqB,SAASrB,GAAGoB,GAAG;AAAA,YAC5DtB,eAAeG,SAASH;AAAAA,UAC5B;AAAA,QAAA;AAAA,MAER;AAAA,MAEAwB,OAAO;AAAA,QACHC,YAAYlJ,OAAO;AACf,iBAAO,KAAKmJ,SAASnJ,KAAK,GAAGuH,iBAAiBC,cAActH;AAAAA,QAAAA;AAAAA,MAChE;AAAA,IACJ,CACH,CAAC;AAAA,EAEV;AAAA,EAEAkJ,cAAc;AACH,WAAA;AAAA,MACHC,yBAAyBA,CAACnB,gBAAkC,CAAC;AAAA,QAAElI;AAAAA,QAAOsJ;AAAAA,MAAAA,MAAe;AAC3E,cAAA;AAAA,UAAErJ;AAAAA,QAAAA,IAAcD;AACtB,cAAMgI,MAAM/H,UAAUsJ;AAElB,YAAA,CAACD,SAAiB,QAAA;AAEhBpC,cAAAA,YAAY,KAAKE,QAAQF;AAE/B,cAAMS,KAAK3H,MAAM2H,GAAG6B,QAAQtC,WAAW;AAAA,UACnCc;AAAAA,UACAD,MAAM;AAAA,UACNE,QAAQ;AAAA,UACRC;AAAAA,QAAAA,CACH;AAEDoB,iBAAS3B,EAAE;AACJ,eAAA;AAAA,MACX;AAAA,MAEA8B,yBAAyBA,MAAe,CAAC;AAAA,QAAEzJ;AAAAA,QAAOsJ;AAAAA,MAAAA,MAAe;AACzD,YAAA,CAACA,SAAiB,QAAA;AAEhBpC,cAAAA,YAAY,KAAKE,QAAQF;AAC/B,cAAMS,KAAK3H,MAAM2H,GAAG6B,QAAQtC,WAAW;AAAA,UACnCc,KAAK;AAAA;AAAA,UACLD,MAAM;AAAA,UACNE,QAAQ;AAAA,QAAA,CACX;AAEDqB,iBAAS3B,EAAE;AACJ,eAAA;AAAA,MAAA;AAAA,IAEf;AAAA,EAAA;AAER,CAAC;AC1HD,MAAM+B,uBAAuBC,YAAYC,UAAU;AAAA,EAC/CC,aAAaA,CAAC;AAAA,IACIC;AAAAA,IACA1L;AAAAA,EAAAA,MACE;AAIZA,WAAO4B,MAAMC;AAEjB,aAAS8J,qBAAqB3L,SAAyB;AACnD,YAAM4L,cAAcpD,qBAAqBqD,IAAI7L,QAAO4B,KAAK;AACzD,aAAOgK,aAAab,SAAS/K,QAAO4B,KAAK,GAAGyH,iBAAiB;AAAA,IAAA;AAG3DA,UAAAA,gBAAgBsC,qBAAqB3L,MAAM;AAEjD,QAAIqJ,eAAe;AACR,aAAA;AAAA,IAAA;AAEPqC,QAAAA,KAAK/B,KAAKnH,SAAS,WAAW;AACvB,aAAA,WAAWkJ,KAAKxD,MAAMhF,KAAK;AAAA,IAAA;AAElCwI,QAAAA,KAAK/B,KAAKnH,SAAS,aAAa;AACzB,aAAA;AAAA,IAAA;AAEJ,WAAA;AAAA,EACX;AAAA,EACAsJ,iBAAiB;AACrB,CAAC;AAED,MAAMC,aAAaC,eAAeC,OAAO;AAAA,EACrCC,gBAAgB;AACL,WAAA,CACH,IAAIC,UAAU;AAAA,MACVC,MAAM;AAAA,MACNC,SAASA,CAAC;AAAA,QACIzK;AAAAA,QACA0K;AAAAA,MAAAA,MACE;AACZ,cAAMC,aAAa,CAAC;AAEd,cAAA;AAAA,UAAEhD;AAAAA,QAAAA,IAAO3H;AACf,cAAM4K,QAAQF,MAAMnB;AACpB,cAAMsB,MAAMH,MAAMI;AAElBnD,WAAGoD,OAAOH,QAAQ,GAAG,KAAK7C,KAAKf,OAAO2D,UAAU,CAAQ,EAAEK,OACtDrD,GAAGqB,QAAQpG,IAAIgI,KAAK,GACpBjD,GAAGqB,QAAQpG,IAAIiI,GAAG,CACtB;AAAA,MAAA;AAAA,IACJ,CACH,CAAC;AAAA,EAAA;AAGd,CAAC;ACrDM,MAAMhB,cAAcF;AAEdsB,MAAAA,aAAaC,WAAWtB,UAAU;AAAA,EAC3CuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IACH,oIACJ;AAAA,EAAA;AAER,CAAC;AAEY2H,MAAAA,WAAWC,SAASzB,UAAU;AAAA,EACvCuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,WAAW;AAAA,EAAA;AAE9B,CAAC;AACY6H,MAAAA,WAAWC,SAAS3B,UAAU;AAAA,EACvCuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,uBAAuB;AAAA,EACtC;AAAA,EACA+H,QAAQ;AACZ,CAAC;AAEYC,MAAAA,iBAAiBrB,WAAeR,UAAU;AAAA,EACnDuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,sBAAsBiI,kBAAkB;AAAA,EAAA;AAE3D,CAAC;AAEYC,MAAAA,aAAaC,WAAWhC,UAAU;AAAA,EAC3CuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,wCAAwC;AAAA,EAAA;AAE3D,CAAC;AAEYoI,MAAAA,cAAcC,YAAYlC,UAAU;AAAA,EAC7CuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,2CAA2C;AAAA,EAAA;AAE9D,CAAC;AAEYsI,MAAAA,WAAWC,SAASpC,UAAU;AAAA,EACvCuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,sBAAsB;AAAA,EAAA;AAEzC,CAAC;AAEYwI,MAAAA,aAAaC,WAAWtC,UAAU;AAAA,EAC3CuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,2BAA2B;AAAA,EAAA;AAE9C,CAAC;AAEY0I,MAAAA,YAAYC,UAAUxC,UAAU;AAAA,EACzCuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,2EAA2EiI,kBAAkB;AAAA,EAAA;AAEhH,CAAC;AASYW,MAAAA,OAAOC,KAAK1C,UAAU;AAAA,EAC/BuB,gBAAgB;AAAA,IACZ5E,OAAO9C,IAAI,uFAAuF;AAAA,IAClG8I,YAAY;AAAA,EAAA;AAEpB,CAAC;AAEYC,MAAAA,aAAaC,WAAW7C,UAAU;AAAA,EAC3CrB,UAAU;AAAA,EACVkD,gBAAgB;AAAA,EAChBiB,YAAY;AAAA,IACRC,OAAO;AAAA,IACPC,OAAO;AAAA,EACX;AAAA,EACAC,WAAW;AACf,CAAC;ACrFD,eAAsBC,WAAWC,MAAkBC,aAAwChF,KAAaiF,QAAkBC,OAAa;AAE7H,QAAA;AAAA,IAAEC;AAAAA,MAAWJ,KAAK/M;AAGlBoN,QAAAA,SAASL,KAAK/M,MAAMqN,QAAQ7C,KAAK,CAAC8C,MAAcA,EAAE3G,QAAQ4G,eAAe5G,GAAG;AAClF,MAAI,CAACyG,QAAQ;AACTI,YAAQC,MAAM,wBAAwB;AACtC;AAAA,EAAA;AAEJ,MAAIlG,gBAAgB6F,OAAOjE,SAAS4D,KAAK/M,KAAK;AAExC6J,QAAAA,eAActB,SAASC,cAAc,KAAK;AAC1CkF,QAAAA,eAAenF,SAASC,cAAc,KAAK;AACpCmF,eAAAA,aAAa,SAAS,kCAAkCjC,kBAAkB;AAC1EkC,eAAAA,MAAMZ,YAAYtJ,QAAQmK;AACvChE,EAAAA,aAAYhB,YAAY6E,YAAY;AAEpC,QAAMI,OAAO1F,aAAWC,OAAOL,KAAK6B,YAAW;AAC/CtC,kBAAgBA,eAAeuB,IAAIiE,KAAK/M,MAAM+I,KAAK,CAAC+E,IAAI,CAAC;AACzDf,OAAKzD,SAASyD,KAAK/M,MAAM2H,GAAG6B,QAAQ4D,QAAQ;AAAA,IAAE7F;AAAAA,EAAAA,CAAe,CAAC;AAGxDqG,QAAAA,MAAM,MAAMX,OAAOC,KAAK;AACtBa,UAAAA,MAAM,kBAAkBH,GAAG;AAGnC,QAAMI,YAAYb,OAAOc,MAAMf,MAAMlG,OAAO;AAAA,IAAE4G;AAAAA,EAAAA,CAAK;AACnD,QAAMjG,KAAKoF,KAAK/M,MAAM2H,GAAGuG,YAAYlG,KAAKA,KAAKgG,SAAS;AAGxDzG,kBAAgBA,eAAeU,OAAO,CAAC6F,IAAI,CAAC;AAC5CnG,KAAG6B,QAAQ4D,QAAQ;AAAA,IAAE7F;AAAAA,EAAAA,CAAe;AACpCwF,OAAKzD,SAAS3B,EAAE;AACpB;AAEa4F,MAAAA,iBAAiB,IAAI1G,YAAU,aAAa;AAE5CsH,MAAAA,wBAAwBA,CAAClB,WAA6B;AACzDG,QAAAA,SAAiB,IAAI/F,SAAO;AAAA,IAC9BV,KAAK4G;AAAAA,IACLvN,OAAO;AAAA;AAAA,MAEHsH,MAAMA,MAAME,gBAActH;AAAAA;AAAAA,MAE1BwH,OAAOA,CAACC,IAAIyG,QAAQ;AAEVC,cAAAA,OAAO1G,GAAGG,QAAQsF,MAAM;AAC1BiB,YAAAA,QAAQA,KAAK9G,eAAe;AAC5B,iBAAO8G,KAAK9G;AAAAA,QAAAA;AAGhB,eAAO6G,IAAIxL,IAAI+E,GAAGqB,SAASrB,GAAGoB,GAAG;AAAA,MAAA;AAAA,IAEzC;AAAA,IACAE,OAAO;AAAA,MACHqF,iBAAiB;AAAA,QACbC,MAAMA,CAACxB,MAAMyB,UAAU;AACf,cAAA,CAACA,MAAMC,cAAcC,SAASF,MAAMC,cAAcC,MAAMC,WAAW,GAAG;AAC/D,mBAAA;AAAA,UAAA;AAEXH,gBAAM5K,eAAe;AAErB,gBAAM8K,QAAQtI,MAAMmD,KAAKiF,MAAMC,aAAaC,KAAK;AAC3CE,gBAAAA,SAASF,MAAMlM,OAAOqM,CAAAA,SAAQ,SAASC,KAAKD,KAAK9G,IAAI,CAAC;AAExD6G,cAAAA,OAAOD,WAAW,GAAG;AACrBnB,oBAAQuB,IAAI,kCAAkC;AACvC,mBAAA;AAAA,UAAA;AAGXH,iBAAOlI,QAAQwG,CAAS,UAAA;AAEd8B,kBAAAA,WAAWjC,KAAKkC,YAAY;AAAA,cAC9BC,MAAMV,MAAMW;AAAAA,cACZC,KAAKZ,MAAMa;AAAAA,YAAAA,CACd;AACD,gBAAI,CAACL,SAAU;AAETM,kBAAAA,SAAS,IAAIC,WAAW;AACvBC,mBAAAA,SAAS,OAAOxC,gBAAgB;AACnC,oBAAMF,WAAWC,MAAaC,aAAagC,SAAShH,KAAKiF,QAAQC,KAAK;AAAA,YAC1E;AACAoC,mBAAOG,cAAcvC,KAAK;AAAA,UAAA,CAC7B;AAEM,iBAAA;AAAA,QAAA;AAAA,MAEf;AAAA,MACAwC,YAAY3C,MAAMyB,OAAOmB,OAAO;AAC5B,cAAMhP,SAAQyF,MAAMmD,KAAKiF,MAAMoB,eAAejP,SAAS,EAAE;AACnDqH,cAAAA,MAAM+E,KAAK/M,MAAMC,UAAUsJ;AACjC,YAAIsG,gBAAgB;AAEpBlP,QAAAA,OAAM+F,QAASjE,CAAS,SAAA;AACdyK,gBAAAA,QAAQzK,KAAKqN,UAAU;AAC7B,cAAI5C,OAAO;AACS,4BAAA;AAcVoC,kBAAAA,SAAS,IAAIC,WAAW;AAEvBC,mBAAAA,SAAS,OAAOxC,gBAAgB;AACnC,oBAAMF,WAAWC,MAAaC,aAAahF,KAAKiF,QAAQC,KAAK;AAAA,YACjE;AACAoC,mBAAOG,cAAcvC,KAAK;AAAA,UAAA;AAAA,QAC9B,CACH;AAEM2C,eAAAA;AAAAA,MACX;AAAA,MACA3G,YAAYlJ,OAAO;AACRoN,eAAAA,OAAOjE,SAASnJ,KAAK;AAAA,MAAA;AAAA,IAEpC;AAAA,IACA+M,KAAKgD,YAAY;AAEN,aAAA;AAAA,QACHlR,OAAOkO,MAAMiD,WAAW;AACdC,gBAAAA,YAAY7C,OAAOjE,SAAS6G,SAAS;AAC3C,gBAAME,WAAW9C,OAAOjE,SAAS4D,KAAK/M,KAAK;AAE3C,cAAIiQ,cAAcC,UAAU;AACnBC,iBAAAA,YAAYpD,KAAK/M,KAAK;AAAA,UAAA;AAAA,QAC/B;AAAA,MAER;AAAA,IAAA;AAAA,EACJ,CACH;AACMoN,SAAAA;AACX;AAYagD,MAAAA,uBAAuBA,CAACC,oBAA4B;AAC7D,SAAOC,YAAYjG,OAAO;AAAA,IACtBlD,wBAAwB;AACpB,aAAO,CAACkJ,eAAe;AAAA,IAAA;AAAA,EAE9B,CAAA,EAAEzG,UAAU;AAAA,IACT2G,aAAa;AAAA,IACbpF,gBAAgB;AAAA,MACZ5E,OAAO9C,IAAI,qBAAqBiI,kBAAkB;AAAA,IAAA;AAAA,EACtD,CACH;AACL;AC7Ja8E,MAAAA,eAAezJ,UAAUC,OAAO;AAAA,EAC3CpG,MAAM;AAAA,EAENwI,cAAc;AACL,WAAA;AAAA,MACLqH,gCACEA,MACA,CAAC;AAAA,QAAErS;AAAAA,QAAQsS;AAAAA,MAAAA,MAAe;AAClB,cAAA;AAAA,UAAE1Q;AAAAA,QAAAA,IAAU5B;AACZ,cAAA;AAAA,UAAEuJ;AAAAA,QAAAA,IAAO3H;AACf,cAAM2Q,eAAehJ,GAAG1H,UAAU2Q,MAAMhG,MAAM;AAC9C,cAAMiG,aAAalJ,GAAG1H,UAAU6Q,IAAIjG,IAAI;AACxC,eAAO6F,SAASK,iBAAiB;AAAA,UAC/BxH,MAAMoH;AAAAA,UACN7F,IAAI+F;AAAAA,QAAAA,CACL;AAAA,MAAA;AAAA,IAEP;AAAA,EACF;AAAA,EAEAG,uBAAuB;AACd,WAAA;AAAA,MACL,SAASC,CAAC;AAAA,QAAE7S;AAAAA,MAAAA,MAAa;AACjB,cAAA;AAAA,UAAE4B;AAAAA,QAAAA,IAAU5B;AACZ,cAAA;AAAA,UAAEuJ;AAAAA,QAAAA,IAAO3H;AACTkR,cAAAA,oBAAoBvJ,GAAG1H,UAAUsJ;AACjC4H,cAAAA,kBAAkBxJ,GAAG1H,UAAU6K;AACrC,cAAM6F,eAAehJ,GAAG1H,UAAU2Q,MAAMhG,MAAM;AAC9C,cAAMiG,aAAalJ,GAAG1H,UAAU6Q,IAAIjG,IAAI;AAClCuG,cAAAA,oDACJF,oBAAoBP,gBAAgBQ,kBAAkBN;AACxD,YAAIO,mDAAmD;AACrDhT,iBAAO4C,MAAM,EAAEyP,+BAA+B,EAAEtP,IAAI;AAC7C,iBAAA;AAAA,QAAA;AAEF,eAAA;AAAA,MAAA;AAAA,IAEX;AAAA,EAAA;AAEJ,CAAC;ACxCD,SAASkQ,aAAaC,SAAkB;AAC9BC,QAAAA,OAAOD,QAAQE,sBAAsB;AAE3C,MAAIC,WAAWH,QAAQI;AACvB,SAAOD,YAAYE,OAAOC,iBAAiBH,QAAQ,EAAEzC,aAAa,UAAU;AACxEyC,eAAWA,SAASC;AAAAA,EAAAA;AAElBG,QAAAA,eAAeJ,UAAUD,sBAAsB;AAE9C,SAAA;AAAA,IACHpC,KAAKmC,KAAKnC,OAAOyC,cAAczC,OAAO;AAAA,IACtCF,MAAMqC,KAAKrC,QAAQ2C,cAAc3C,QAAQ;AAAA,IACzCtC,OAAO2E,KAAK3E;AAAAA,EAChB;AACJ;AAEA,SAASkF,gBAAgBC,QAAkC;AAChDxJ,SAAAA,SACFyJ,kBAAkBD,OAAOE,GAAGF,OAAOG,CAAC,EACpC1H,KACG,CAAC2H,SACGA,KAAKT,eAAeU,UAAU,cAAc,KAC5CD,KAAKC,QACD,CAAC,MAAM,uBAAuB,OAAO,cAAc,wBAAwB,EAAEC,KAAK,IAAI,CAC1F,CACR;AACR;AAEA,SAASC,aAAaxI,MAAeiD,MAAkB3F,SAA4B;AACzEmL,QAAAA,eAAezI,KAAK0H,sBAAsB;AAEhD,SAAOzE,KAAKkC,YAAY;AAAA,IACpBC,MAAMqD,aAAarD,OAAO,KAAK9H,QAAQoL;AAAAA,IACvCpD,KAAKmD,aAAanD,MAAM;AAAA,EAC3B,CAAA,GAAGqD;AACR;AAEA,SAASC,WAAWtL,SAA4B;AACnCuL,WAAAA,gBAAgBnE,OAAkBzB,MAAkB;AACzDA,SAAK9L,MAAM;AAEP,QAAA,CAACuN,MAAMC,aAAc;AAEzB,UAAM3E,OAAOgI,gBAAgB;AAAA,MACzBG,GAAGzD,MAAMW,UAAU,KAAK/H,QAAQoL;AAAAA,MAChCN,GAAG1D,MAAMa;AAAAA,IAAAA,CACZ;AAEG,QAAA,EAAEvF,gBAAgB8I,SAAU;AAEhC,UAAMC,UAAUP,aAAaxI,MAAMiD,MAAM3F,OAAO;AAC5CyL,QAAAA,WAAW,QAAQA,UAAU,EAAG;AAEpC9F,SAAKzD,SAASyD,KAAK/M,MAAM2H,GAAGmL,aAAaC,cAAc/L,OAAO+F,KAAK/M,MAAM+I,KAAK8J,OAAO,CAAC,CAAC;AAEvF,UAAMlD,QAAQ5C,KAAK/M,MAAMC,UAAU+S,QAAQ;AACrC,UAAA;AAAA,MACFC;AAAAA,MACAC;AAAAA,IAAAA,IACAC,wBAAwBpG,MAAM4C,KAAK;AAEvCnB,UAAMC,aAAa2E,UAAU;AAC7B5E,UAAMC,aAAa4E,QAAQ,aAAaJ,IAAIvK,SAAS;AAC/C+F,UAAAA,aAAa4E,QAAQ,cAAcH,IAAI;AAC7C1E,UAAMC,aAAa6E,gBAAgB;AAEnC9E,UAAMC,aAAa8E,aAAazJ,MAAM,GAAG,CAAC;AAE1CiD,SAAKyG,WAAW;AAAA,MACZ7D;AAAAA,MACA8D,MAAMjF,MAAMkF;AAAAA,IAChB;AAAA,EAAA;AAGKC,WAAAA,YAAYnF,OAAmBzB,MAAkB;AACtDA,SAAK9L,MAAM;AAENgS,SAAAA,IAAIW,UAAU3L,OAAO,UAAU;AAEpC,UAAM6B,OAAOgI,gBAAgB;AAAA,MACzBG,GAAGzD,MAAMW,UAAU,KAAK/H,QAAQoL;AAAAA,MAChCN,GAAG1D,MAAMa;AAAAA,IAAAA,CACZ;AAEG,QAAA,EAAEvF,gBAAgB8I,SAAU;AAEhC,UAAMC,UAAUP,aAAaxI,MAAMiD,MAAM3F,OAAO;AAChD,QAAI,CAACyL,QAAS;AAEd9F,SAAKzD,SAASyD,KAAK/M,MAAM2H,GAAGmL,aAAaC,cAAc/L,OAAO+F,KAAK/M,MAAM+I,KAAK8J,OAAO,CAAC,CAAC;AAAA,EAAA;AAG3F,MAAIgB,oBAAwC;AAE5C,WAASC,iBAAiB;AACtB,QAAID,mBAAmB;AACDD,wBAAAA,UAAU9K,IAAI,MAAM;AAAA,IAAA;AAAA,EAC1C;AAGJ,WAASiL,iBAAiB;AACtB,QAAIF,mBAAmB;AACDD,wBAAAA,UAAU3L,OAAO,MAAM;AAAA,IAAA;AAAA,EAC7C;AAGJ,SAAO,IAAIZ,SAAO;AAAA,IACd0F,MAAOA,CAAS,SAAA;AACQxE,0BAAAA,SAASC,cAAc,KAAK;AAChDqL,wBAAkBG,YAAY;AAC9BH,wBAAkBI,QAAQC,aAAa;AACrBN,wBAAAA,UAAU9K,IAAI,aAAa;AAC3BqL,wBAAAA,iBAAiB,aAAcjR,CAAM,MAAA;AACnDyP,wBAAgBzP,GAAG6J,IAAW;AAAA,MAAA,CACjC;AACiBoH,wBAAAA,iBAAiB,SAAUjR,CAAM,MAAA;AAC/CyQ,oBAAYzQ,GAAG6J,IAAW;AAAA,MAAA,CAC7B;AAEc,qBAAA;AAETkG,YAAAA,KAAKvB,eAAe7I,YAAYgL,iBAAiB;AAEhD,aAAA;AAAA,QACHO,SAASA,MAAM;AAAA,QAAA;AAAA,MAInB;AAAA,IACJ;AAAA,IACAnL,OAAO;AAAA,MACHqF,iBAAiB;AAAA,QACb+F,WAAWA,CAACtH,MAAMyB,UAAU;AACpB,cAAA,CAACzB,KAAKuH,UAAU;AAChB;AAAA,UAAA;AAGJ,gBAAMxK,OAAOgI,gBAAgB;AAAA,YACzBG,GAAGzD,MAAMW,UAAU,KAAK/H,QAAQoL;AAAAA,YAChCN,GAAG1D,MAAMa;AAAAA,UAAAA,CACZ;AAEG,cAAA,EAAEvF,gBAAgB8I,UAAU;AACb,2BAAA;AACf;AAAA,UAAA;AAGE2B,gBAAAA,YAAY5C,OAAOC,iBAAiB9H,IAAI;AAC9C,gBAAM0K,aAAaC,SAASF,UAAUC,YAAY,EAAE;AACpD,gBAAME,aAAaD,SAASF,UAAUG,YAAY,EAAE;AAE9CC,gBAAAA,OAAOtD,aAAavH,IAAI;AAEzBsF,eAAAA,QAAQoF,aAAa,MAAM;AAChCG,eAAKvF,OAAOsF;AAER5K,cAAAA,KAAKsI,QAAQ,wCAAwC,GAAG;AACxDuC,iBAAKzF,QAAQ9H,QAAQoL;AAAAA,UAAAA;AAEzBmC,eAAK/H,QAAQxF,QAAQoL;AAErB,cAAI,CAACqB,kBAAmB;AAExBA,4BAAkBe,MAAM1F,OAAO,GAAGyF,KAAKzF,OAAOyF,KAAK/H,KAAK;AACxDiH,4BAAkBe,MAAMxF,MAAM,GAAGuF,KAAKvF,GAAG;AAC1B,yBAAA;AAAA,QACnB;AAAA,QACAyF,SAASA,MAAM;AACI,yBAAA;AAAA,QACnB;AAAA,QACAC,YAAYA,MAAM;AACC,yBAAA;AAAA,QACnB;AAAA;AAAA,QAEAC,WAAYhI,CAAS,SAAA;AACZkG,eAAAA,IAAIW,UAAU9K,IAAI,UAAU;AAAA,QACrC;AAAA,QACAyF,MAAOxB,CAAS,SAAA;AACPkG,eAAAA,IAAIW,UAAU3L,OAAO,UAAU;AAAA,QACxC;AAAA,QACA+M,SAAUjI,CAAS,SAAA;AACVkG,eAAAA,IAAIW,UAAU3L,OAAO,UAAU;AAAA,QAAA;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ,CACH;AACL;AAEagN,MAAAA,cAAclO,UAAUC,OAAO;AAAA,EACxCpG,MAAM;AAAA,EAENuG,wBAAwB;AACpB,WAAO,CACHuL,WAAW;AAAA,MACPF,iBAAiB;AAAA,IAAA,CACpB,CAAC;AAAA,EAAA;AAGd,CAAC;ACvLD,SAAS0C,mBAAmBC,WAAgBpM,KAAU;AAClD,QAAMG,cAAsB,CAAE;AAE9B,MAAIiM,WAAW;AACXjM,gBAAYkM,KACRhN,aAAWiN,OAAOF,UAAU5L,MAAM4L,UAAUrK,IAAI;AAAA,MAC5CvE,OAAO;AAAA,IAAA,CACV,CACL;AAAA,EAAA;AAEJ,QAAMgB,gBAAgBC,gBAAcR,OAAO+B,KAAKG,WAAW;AACpD3B,SAAAA;AACX;AAMO,MAAM+N,+BAA+BA,CAACC,qBAAsCxO,UAAUC,OAAmC;AAAA,EAC5HpG,MAAM;AAAA,EACNqG,aAAa;AACF,WAAA;AAAA,MACHC,WAAW,IAAIL,YAAsC,qBAAqB;AAAA,MAC1EsO,WAAWI;AAAAA,IACf;AAAA,EACJ;AAAA,EACApO,wBAAwB;AAEdD,UAAAA,YAAY,KAAKE,QAAQF;AACxB,WAAA,CACH,IAAIG,SAAmC;AAAA,MACnCV,KAAKO;AAAAA,MACLlH,OAAO;AAAA,QACHsH,MAAMA,CAACkO,GAAG;AAAA,UAAEzM;AAAAA,QAAAA,MAAU;AACZoM,gBAAAA,YAAY,KAAK/N,QAAQ+N;AAC/B,gBAAM5N,gBAAgB4N,aAAapM,MAAMmM,mBAAmBC,WAAWpM,GAAG,IAAIvB,gBAActH;AACrF,iBAAA;AAAA,YACHqH;AAAAA,YACA4N;AAAAA,UACJ;AAAA,QACJ;AAAA,QACAzN,MAAM+N,aAAa7N,UAAU;AACnBC,gBAAAA,SAAS4N,YAAY3N,QAAQZ,SAAS;AAC5C,gBAAMiO,YAAYtN,QAAQ6C;AACtB7C,cAAAA,QAAQE,SAAS,uBAAuB;AAExC,kBAAMgB,MAAM0M,YAAY1M;AAClB,kBAAA;AAAA,cAAEd;AAAAA,YAAAA,IAAWJ;AAEnB,gBAAII,QAAQ;AACD,qBAAA;AAAA,gBACHV,eAAeC,gBAActH;AAAAA,cACjC;AAAA,YAAA;AAEEqH,kBAAAA,gBAAgB2N,mBAAmBC,WAAWpM,GAAG;AAChD,mBAAA;AAAA,cACHxB;AAAAA,cACA4N;AAAAA,YACJ;AAAA,UAAA,OACG;AACIvN,mBAAAA;AAAAA,UAAAA;AAAAA,QACX;AAAA,MAER;AAAA,MACAqB,OAAO;AAAA,QACHC,YAAYlJ,OAAO;AACT0V,gBAAAA,oBAAoB,KAAKvM,SAASnJ,KAAK;AAC7C,cAAI0V,mBAAmBnO,eAAe;AAClC,mBAAOmO,kBAAkBnO;AAAAA,UAAAA,OACtB;AACH,mBAAOC,gBAActH;AAAAA,UAAAA;AAAAA,QACzB;AAAA,MACJ;AAAA,IACJ,CACH,CAAC;AAAA,EAEV;AAAA,EAEAkJ,cAAc;AACH,WAAA;AAAA,MACHuM,6BAA6BA,CAACjL,UAAkD,CAAC;AAAA,QACI1K;AAAAA,QACAsJ;AAAAA,MAAAA,MACE;AAE7E,cAAA;AAAA,UAAErJ;AAAAA,QAAAA,IAAcD;AACtB,cAAMgI,MAAM/H,UAAUsJ;AAElB,YAAA,CAACD,SAAiB,QAAA;AAEhBpC,cAAAA,YAAY,KAAKE,QAAQF;AAE/B,cAAMS,KAAK3H,MAAM2H,GAAG6B,QAAQtC,WAAW;AAAA,UACnCc;AAAAA,UACAD,MAAM;AAAA,UACNE,QAAQ;AAAA,UACRyC;AAAAA,QAAAA,CACH;AAEDpB,iBAAS3B,EAAE;AACJ,eAAA;AAAA,MACX;AAAA,MAEAiO,6BAA6BA,MAAe,CAAC;AAAA,QACI5V;AAAAA,QACAsJ;AAAAA,MAAAA,MACE;AAE3C,YAAA,CAACA,SAAiB,QAAA;AAEhBpC,cAAAA,YAAY,KAAKE,QAAQF;AAC/B,cAAMS,KAAK3H,MAAM2H,GAAG6B,QAAQtC,WAAW;AAAA,UACnCc,KAAK;AAAA;AAAA,UACLD,MAAM;AAAA,UACNE,QAAQ;AAAA,QAAA,CACX;AAEDqB,iBAAS3B,EAAE;AACJ,eAAA;AAAA,MAAA;AAAA,IAEf;AAAA,EAAA;AAER,CAAC;AC5DYkO,MAAAA,mBAAmB,IAAIhP,YAAU,eAAe;AAEhDiP,MAAAA,eAAeC,KAAK/O,OAAuB;AAAA,EACpDpG,MAAM;AAAA,EAENqG,aAAa;AACF,WAAA;AAAA,MACHkE,gBAAgB,CAAC;AAAA,MACjB6K,WAAW;AAAA,QACI5O;AAAAA,QACA0C;AAAAA,MAAAA,GACD;AACH,eAAA,GAAG1C,QAAQ6O,WAAWC,IAAI,GAAGpM,KAAKxD,MAAM6P,SAASrM,KAAKxD,MAAM8P,EAAE;AAAA,MACzE;AAAA,MACAC,4BAA4B;AAAA,MAC5BC,WAAW;AAAA,QACIlP;AAAAA,QACA0C;AAAAA,MAAAA,GACD;AACV,eAAO,CACH,QACAyM,gBAAgB,KAAKpL,gBAAgB/D,QAAQ+D,cAAc,GAC3D,GAAG/D,QAAQ6O,WAAWC,IAAI,GAAGpM,KAAKxD,MAAM6P,SAASrM,KAAKxD,MAAM8P,EAAE,EAAE;AAAA,MAExE;AAAA,MACAH,YAAY;AAAA,QACRC,MAAM;AAAA,QACNhP,WAAW2O;AAAAA,QACX9U,SAASA,CAAC;AAAA,UACI3C;AAAAA,UACAsM;AAAAA,UACAzB;AAAAA,QAAAA,MACE;AAGZ,gBAAMuN,YAAYpY,OAAO2O,KAAK/M,MAAMC,UAAU6Q,IAAI0F;AAClD,gBAAMC,gBAAgBD,WAAWtD,MAAMwD,WAAW,GAAG;AAErD,cAAID,eAAe;AACf/L,kBAAMI,MAAM;AAAA,UAAA;AAGhB1M,iBACK4C,QACAC,MACA0V,EAAAA,gBAAgBjM,OAAO,CACpB;AAAA,YACI3C,MAAM,KAAKnH;AAAAA,YACX0F,OAAO2C;AAAAA,UAAAA,GAEX;AAAA,YACIlB,MAAM;AAAA,YACNmL,MAAM;AAAA,UAAA,CACT,CACJ,EACA/R,IAAI;AAEFyV,iBAAAA,gBAAgBC,cAAc;AAAA,QACzC;AAAA,QACAC,OAAOA,CAAC;AAAA,UACI9W;AAAAA,UACA0K;AAAAA,QAAAA,MACE;AACV,gBAAMkG,QAAQ5Q,MAAM+I,IAAIgO,QAAQrM,MAAMnB,IAAI;AAC1C,gBAAMxB,OAAO/H,MAAMmN,OAAOc,MAAM,KAAKrN,IAAI;AACnCkW,gBAAAA,QAAQ,CAAC,CAAClG,MAAMoG,OAAOjP,KAAKkP,aAAaC,UAAUnP,IAAI;AAEtD+O,iBAAAA;AAAAA,QAAAA;AAAAA,MACX;AAAA,IAER;AAAA,EACJ;AAAA,EAEAK,OAAO;AAAA,EAEP9B,QAAQ;AAAA,EAER+B,YAAY;AAAA,EAEZC,MAAM;AAAA,EAENC,gBAAgB;AACL,WAAA;AAAA,MACHlB,IAAI;AAAA,QACAmB,SAAS;AAAA,QACTC,WAAWlG,CAAAA,YAAWA,QAAQmG,aAAa,SAAS;AAAA,QACpDnB,YAAY3L,CAAc,eAAA;AAClB,cAAA,CAACA,WAAWyL,IAAI;AAChB,mBAAO,CAAC;AAAA,UAAA;AAGL,iBAAA;AAAA,YACH,WAAWzL,WAAWyL;AAAAA,UAC1B;AAAA,QAAA;AAAA,MAER;AAAA,MAEAD,OAAO;AAAA,QACHoB,SAAS;AAAA,QACTC,WAAWlG,CAAAA,YAAWA,QAAQmG,aAAa,YAAY;AAAA,QACvDnB,YAAY3L,CAAc,eAAA;AAClB,cAAA,CAACA,WAAWwL,OAAO;AACnB,mBAAO,CAAC;AAAA,UAAA;AAGL,iBAAA;AAAA,YACH,cAAcxL,WAAWwL;AAAAA,UAC7B;AAAA,QAAA;AAAA,MACJ;AAAA,IAER;AAAA,EACJ;AAAA,EAEAqB,YAAY;AACR,WAAO,CACH;AAAA,MACIE,KAAK,mBAAmB,KAAK9W,IAAI;AAAA,IAAA,CACpC;AAAA,EAET;AAAA,EAEA0V,WAAW;AAAA,IACIxM;AAAAA,IACAqB;AAAAA,EAAAA,GACD;AACN,QAAA,KAAK/D,QAAQuQ,gBAAgBC,QAAW;AACxCpK,cAAQqK,KAAK,iEAAiE;AACvE,aAAA,CACH,QACAtB,gBAAgB;AAAA,QAAE,aAAa,KAAK3V;AAAAA,MAAAA,GAAQ,KAAKwG,QAAQ+D,gBAAgBA,cAAc,GACvF,KAAK/D,QAAQuQ,YAAY;AAAA,QACrBvQ,SAAS,KAAKA;AAAAA,QACd0C;AAAAA,MAAAA,CACH,CAAC;AAAA,IAAA;AAGV,UAAMgO,gBAAgB;AAAA,MAAE,GAAG,KAAK1Q;AAAAA,IAAQ;AAExC0Q,kBAAc3M,iBAAiBoL,gBAAgB;AAAA,MAAE,aAAa,KAAK3V;AAAAA,IAAQ,GAAA,KAAKwG,QAAQ+D,gBAAgBA,cAAc;AAChH4M,UAAAA,OAAO,KAAK3Q,QAAQkP,WAAW;AAAA,MACjClP,SAAS0Q;AAAAA,MACThO;AAAAA,IAAAA,CACH;AAEG,QAAA,OAAOiO,SAAS,UAAU;AACnB,aAAA,CACH,QACAxB,gBAAgB;AAAA,QAAE,aAAa,KAAK3V;AAAAA,SAAQ,KAAKwG,QAAQ+D,gBAAgBA,cAAc,GACvF4M,IAAI;AAAA,IAAA;AAGLA,WAAAA;AAAAA,EACX;AAAA,EAEA/B,WAAW;AAAA,IAAElM;AAAAA,EAAAA,GAAQ;AACV,WAAA,KAAK1C,QAAQ4O,WAAW;AAAA,MAC3B5O,SAAS,KAAKA;AAAAA,MACd0C;AAAAA,IAAAA,CACH;AAAA,EACL;AAAA,EAEAkH,uBAAuB;AACZ,WAAA;AAAA,MACHgH,WAAWA,MAAM,KAAK5Z,OAAOsS,SAAS3P,QAAQ,CAAC;AAAA,QACI4G;AAAAA,QACA3H;AAAAA,MAAAA,MACE;AACjD,YAAIiY,YAAY;AACV,cAAA;AAAA,UAAEhY;AAAAA,QAAAA,IAAcD;AAChB,cAAA;AAAA,UACFE;AAAAA,UACAgY;AAAAA,QAAAA,IACAjY;AAEJ,YAAI,CAACC,OAAO;AACD,iBAAA;AAAA,QAAA;AAGXF,cAAM+I,IAAIoP,aAAaD,SAAS,GAAGA,QAAQ,CAACpO,MAAM9B,QAAQ;AACtD,cAAI8B,KAAK/B,KAAKnH,SAAS,KAAKA,MAAM;AAClB,wBAAA;AACZ+G,eAAGyQ,WACC,KAAKhR,QAAQiP,6BAA6B,KAAK,KAAKjP,QAAQ6O,WAAWC,QAAQ,IAC/ElO,KACAA,MAAM8B,KAAKuO,QACf;AAEO,mBAAA;AAAA,UAAA;AAEJ,iBAAA;AAAA,QAAA,CACV;AAEMJ,eAAAA;AAAAA,MACV,CAAA;AAAA,IACL;AAAA,EACJ;AAAA,EAEA9Q,wBAAwB;AACpB,WAAO,CACHmR,WAAW;AAAA,MACPla,QAAQ,KAAKA;AAAAA,MACb,GAAG,KAAKgJ,QAAQ6O;AAAAA,IAAAA,CACnB,CAAC;AAAA,EAAA;AAGd,CAAC;AAUYA,MAAAA,aAAaA,CAACnY,KAAkC;AAAA,EACzDmP;AAAAA,EACAsL;AAIJ,OACK;AAAA,EACO5X,OAAOA,CAAC;AAAA,IAAE6X;AAAAA,EAAAA,MAAY;AACZC,UAAAA,2BAA2B,CAAC,GAAGC,eAAe;AACpD,QAAKH,cAAc;AACfE,+BAAyBrD,KAAKuD,0BAA0B;AAAA,IAAA;AAGrDF,WAAAA,yBACFjW,OAAOC,CAAQ,SAAA;AACNmW,YAAAA,UAAUnW,KAAKoW,MAAMC,cAAcpC,WAAW8B,MAAMM,aAAa;AACvE,UAAIF,QAAgBA,QAAAA;AACpB,YAAMG,gBAAgBtW,KAAKuW,aAAaC,KAAKC,CAAQA,SAAAA,KAAKJ,YAAY,EAAEpC,WAAW8B,MAAMM,YAAa,CAAA,CAAC;AAChGC,aAAAA;AAAAA,IAAAA,CACV;AAAA,EACT;AAAA,EAEAI,QAAQA,MAAM;AACNC,QAAAA;AACAC,QAAAA;AAEG,WAAA;AAAA,MACHC,SAAUrQ,CAAU,UAAA;AAEJ,oBAAA,IAAIsQ,cAAcC,aAAa;AAAA,UACvCvQ,OAAO;AAAA,YACH,GAAGA;AAAAA,YACHgE;AAAAA,YACAsL;AAAAA,UACJ;AAAA,UACAna,QAAQ6K,MAAM7K;AAAAA,QAAAA,CACjB;AAEG,YAAA,CAAC6K,MAAMwQ,YAAY;AACnB;AAAA,QAAA;AAGJJ,gBAAQK,MAAM,QAAQ;AAAA,UAClBC,wBAAwB1Q,MAAMwQ;AAAAA,UAC9BG,UAAU9b,KAAKW;AAAAA,UACfuU,SAASoG,UAAU9H;AAAAA,UACnBuI,cAAc;AAAA,UACdC,aAAa;AAAA,UACbC,SAAS;AAAA,UACTrb,WAAW;AAAA,QAAA,CACd;AAAA,MACL;AAAA,MAEAsb,SAAS/Q,OAAO;AACZmQ,kBAAUa,YAAYhR,KAAK;AAEvB,YAAA,CAACA,MAAMwQ,YAAY;AACnB;AAAA,QAAA;AAGE,cAAA,CAAC,EAAE9a,SAAS;AAAA,UACdgb,wBAAwB1Q,MAAMwQ;AAAAA,QAAAA,CACjC;AAAA,MACL;AAAA,MAEAS,UAAUjR,OAAO;AACTA,YAAAA,MAAMuF,MAAM7H,QAAQ,UAAU;AACxB,gBAAA,CAAC,EAAEwT,KAAK;AACdlR,gBAAMuF,MAAM5K,eAAe;AACpB,iBAAA;AAAA,QAAA;AAGJwV,eAAAA,UAAUtb,KAAKoc,UAAUjR,KAAK;AAAA,MACzC;AAAA,MAEAmR,SAAS;AACL,YAAIf,SAASA,MAAM,CAAC,EACV,OAAA,CAAC,EAAEjF,QAAQ;AACrBgF,mBAAWhF,QAAQ;AAAA,MAAA;AAAA,IAE3B;AAAA,EAAA;AAER;AAGR,MAAMoF,cAAc5b,WAAW,CAAAqL,OAAAnL,QAAA;AAAAC,QAAAA,IAAAC,EAAA,EAAA;AAQ3B,QAAA,CAAAqc,eAAAC,gBAAA,IAA0CC,UAAU;AAEpD,QAAA;AAAA,IAAAnc;AAAAA,MAAmBC,iBAAiB;AAAER,MAAAA;AAAA,MAAAE,SAAAK,UAAAL,EAAAkL,CAAAA,MAAAA,MAAAsP,gBAAAxa,EAAAkL,CAAAA,MAAAA,MAAAyB,SAAA3M,EAAAkL,CAAAA,MAAAA,MAAAgE,QAAA;AACnBpP,SAAA4E,CAAA,SAAA;AAAA,UAAA,CACVrE,QAAM;AAAA;AAAA,MAAA;AACXqE,YAAI1B,UAAA;AAAA,QAAA3C;AAAAA,QAAAsM,OAEOzB,MAAKyB;AAAAA,QAAAuC,QACJhE,MAAKgE;AAAAA,QAAAsL,cACCtP,MAAKsP;AAAAA,MAAAA,CAAA;AAAA,IAAA;AAE1Bxa,WAAAK;AAAA,MAAA,CAAA,IAAA6K,MAAAsP;AAAA,MAAA,CAAA,IAAAtP,MAAAyB;AAAA,MAAA,CAAA,IAAAzB,MAAAgE;AAAAlP,WAAAF;AAAAA,EAAAA,OAAA;AAAAA,SAAAE,EAAA,CAAA;AAAA,EAAA;AARD,QAAAyc,aAAmB3c;AAQjBW,MAAAA;AAAAT,MAAAA,EAAAkL,CAAAA,MAAAA,MAAAtI,MAAAgO,UAAA5Q,EAAA,CAAA,MAAAsc,eAAA;AAEgB7b,SAAAA,MAAA;AACd8b,wBAAkBD,gBAAgBpR,MAAKtI,MAAAgO,SAAa,KAAQ1F,MAAKtI,MAAAgO,MAAa;AAAA,IAAC;AAClF1F,MAAAA,CAAAA,IAAAA,MAAAtI,MAAAgO;AAAA5Q,WAAAsc;AAAAtc,WAAAS;AAAAA,EAAAA,OAAA;AAAAA,SAAAT,EAAA,CAAA;AAAA,EAAA;AAFD,QAAA0c,YAAkBjc;AAEhBM,MAAAA;AAAAf,MAAAA,EAAAkL,CAAAA,MAAAA,MAAAtI,MAAAgO,UAAA5Q,EAAA,CAAA,MAAAsc,eAAA;AAEkBvb,SAAAA,MAAA;AAChBwb,wBAAkBD,gBAAiB,KAAIpR,MAAKtI,MAAAgO,MAAa;AAAA,IAAC;AAC7D1F,MAAAA,CAAAA,IAAAA,MAAAtI,MAAAgO;AAAA5Q,WAAAsc;AAAAtc,YAAAe;AAAAA,EAAAA,OAAA;AAAAA,SAAAf,EAAA,EAAA;AAAA,EAAA;AAFD,QAAA2c,cAAoB5b;AAElBC,MAAAA;AAAA,MAAAhB,EAAA,EAAA,MAAAkL,MAAAtI,SAAA5C,EAAA,EAAA,MAAAyc,cAAAzc,EAAA,EAAA,MAAAsc,eAAA;AAEmBtb,SAAAA,MAAA;AACjB8D,YAAAA,SAAaoG,MAAKtI,MAAO0Z,aAAa;AACtCG,iBAAW/X,MAAI;AAAA,IAAC;AACnB,MAAA,EAAA,IAAAwG,MAAAtI;AAAA5C,YAAAyc;AAAAzc,YAAAsc;AAAAtc,YAAAgB;AAAAA,EAAAA,OAAA;AAAAA,SAAAhB,EAAA,EAAA;AAAA,EAAA;AAHD,QAAA4c,eAAqB5b;AAGnBE,MAAAA;AAAA,MAAAlB,EAAA,EAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;AAEQL,SAAAA,MAAMqb,kBAAkB;AAACvc,YAAAkB;AAAAA,EAAAA,OAAA;AAAAA,SAAAlB,EAAA,EAAA;AAAA,EAAA;AAAAqB,MAAAA;AAAA,MAAArB,EAAA,EAAA,MAAAkL,MAAAtI,OAAA;AAAE,SAAA,CAACsI,MAAKtI,KAAA;AAAO,MAAA,EAAA,IAAAsI,MAAAtI;AAAA5C,YAAAqB;AAAAA,EAAAA,OAAA;AAAAA,SAAArB,EAAA,EAAA;AAAA,EAAA;AAAlDiB,YAAUC,IAA2BG,EAAa;AAACI,MAAAA;AAAAzB,MAAAA,EAAA2c,EAAAA,MAAAA,eAAA3c,UAAA4c,gBAAA5c,EAAA,EAAA,MAAA0c,WAAA;AAE1Bjb,SAAAA,OAAA;AAAA,MAAA0a,WAAAva,CAAAA,QAAA;AACT,cAAA;AAAA,UAAA6O;AAAAA,QAAAA,IAAA7O;AACJ6O,YAAAA,MAAK7H,QAAS,WAAS;AACb,oBAAA;AAAC,iBAAA;AAAA,QAAA;AAGX6H,YAAAA,MAAK7H,QAAS,aAAW;AACb,sBAAA;AAAC,iBAAA;AAAA,QAAA;AAGb6H,YAAAA,MAAK7H,QAAS,SAAO;AACR,uBAAA;AAAC,iBAAA;AAAA,QAAA;AAAA,eAAA;AAAA,MAAA;AAAA,IAAA;AAKxB5I,YAAA2c;AAAA3c,YAAA4c;AAAA5c,YAAA0c;AAAA1c,YAAAyB;AAAAA,EAAAA,OAAA;AAAAA,SAAAzB,EAAA,EAAA;AAAA,EAAA;AAhBF6c,sBAAoB9c,KAAK0B,EAgBvB;AAACG,MAAAA;AAAA,MAAA5B,EAAA,EAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;AAEoCK,SAAA,CAAA;AAAE5B,YAAA4B;AAAAA,EAAAA,OAAA;AAAAA,SAAA5B,EAAA,EAAA;AAAA,EAAA;AAAzC8c,QAAAA,WAAiBtc,OAAsBoB,EAAE;AAAEE,MAAAA;AAAAC,MAAAA;AAAA/B,MAAAA,UAAAsc,eAAA;AAEjCxa,SAAAA,MAAA;AACFgb,UAAAA,SAAQpc,QAAS4b,aAAa,GAAA;AACtB5b,iBAAAA,QAAS4b,aAAa,EAAAS,eAAA;AAAA,UAAAC,OACnB;AAAA,QAAA,CACV;AAAA,MAAA;AAAA,IAAC;AAEPjb,UAACua,aAAa;AAACtc,YAAAsc;AAAAtc,YAAA8B;AAAA9B,YAAA+B;AAAAA,EAAAA,OAAA;AAAAD,SAAA9B,EAAA,EAAA;AAAA+B,SAAA/B,EAAA,EAAA;AAAA,EAAA;AANlBiB,YAAUa,IAMPC,EAAe;AAACsE,MAAAA;AAAA,MAAArG,EAAA,EAAA,MAAAsB,OAAAC,IAAA,2BAAA,GAAA;AAIAmE,UAAAA,IAAI,kKAAgKiI,kBAAoB;AAAC3N,YAAAqG;AAAAA,EAAAA,OAAA;AAAAA,UAAArG,EAAA,EAAA;AAAA,EAAA;AAAAid,MAAAA;AAAA,MAAAjd,EAAA,EAAA,MAAAkL,MAAAtI,SAAA5C,EAAA,EAAA,MAAAyc,cAAAzc,EAAA,EAAA,MAAAsc,eAAA;AACnMW,UAAA/R,MAAKtI,MAAAgO,SACF1F,MAAKtI,MAAAiC,KAAAqY,QAAAnY,+BAwBQ,UAtBE,EAAA,OAAAL,OAAIoW,OACN,KAAAqC,CAAA,OAAA;AAAA,UAAA,CACIA,IAAE;AAAA;AAAA,MAAA;AACCzc,eAAAA,QAASqE,KAAK,IAAIoY;AAAAA,IAAAA,GAErB,SAAA,MAAMV,WAAW/X,MAAI,GACpB,UAAAK,UAAUuX,gBAAqB,IAAA,IAC1B,iBAAAvX,UAAUuX,eACd,WAAA5W,IAAI,mLACXX,UAAUuX,gBAAgB,2CAA2C,EAAE,GAG3E,UAAA;AAAA,MAAA,oBAGM,SAFS,WAAA5W,IAAI,6FAA2FiI,kBAAoB,GAC7HjJ,iBAAI5B,MACT;AAAA,2BACA,OACI,EAAA,UAAA;AAAA,QAAA,oBAAA,KAAa,EAAA,WAAA,eAAe4B,UAAAA,OAAIoW,OAAO;AAAA,QAGnC,oBAAA,KAAA,EAFS,WAAA,yDACRpW,iBAAI0Y,YACT,CAAA;AAAA,MAAA,EACJ,CAAA;AAAA,IAXK1Y,EAAAA,GAAAA,OAAIoW,KAYb,CACH,wBAED,OAAe,EAAA,WAAA,QAAO,UAAS,YAAA,CAAA;AAClC,MAAA,EAAA,IAAA5P,MAAAtI;AAAA5C,YAAAyc;AAAAzc,YAAAsc;AAAAtc,YAAAid;AAAAA,EAAAA,OAAA;AAAAA,UAAAjd,EAAA,EAAA;AAAA,EAAA;AAAAqd,MAAAA;AAAArd,MAAAA,UAAAid,KAAA;AA/BLI,UAgCM,oBAAA,OAAA,EA/BS,WAAAhX,KACV4W,UA8BL,KAAA;AAAMjd,YAAAid;AAAAjd,YAAAqd;AAAAA,EAAAA,OAAA;AAAAA,UAAArd,EAAA,EAAA;AAAA,EAAA;AAhCNqd,SAAAA;AAgCM,CAEb;AACD5B,YAAY9Y,cAAc;AAG1B,MAAMiY,6BAA6C;AAAA,EAC/CE,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,IAAI;AAAA,EAClBnY,MAAM,oBAAC,iBAAgB,EAAA,MAAM,GAAK,CAAA;AAAA,EAClCE,SAAS,OAAO;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,IACA6N;AAAAA,EAAAA,MACE;AAClB,QAAI,CAACA,aACK8C,OAAAA,MAAM,iBAAiB;AAG5Bra,WAAAA,MAAAA,EACAC,MAAAA,EACAqa,YAAY5Q,KAAK,EACjBxJ,WAAW,aAAa,WAAW,EACnCC,IAAI;AAEH,UAAA;AAAA,MAAEnB;AAAAA,IAAAA,IAAU5B;AACZ,UAAA;AAAA,MACFmL;AAAAA,MACAuB;AAAAA,QACA9K,MAAMC;AAGV,UAAMsb,mBAAmBvb,MAAM+I,IAAIyS,YAAY,GAAGjS,MAAM,IAAI;AAGtDkS,UAAAA,kBAAkBzb,MAAM+I,IAAIyS,YAAY1Q,IAAI9K,MAAM+I,IAAIiK,QAAQ0I,MAAM,IAAI;AAE9E,QAAIC,SAAS;AACb,UAAM9N,SAAS,MAAM0K,aAAaqD,aAAaL,kBAAkBE,iBAAkBI,CAAU,UAAA;AAC/EA,gBAAAA;AACNA,UAAAA,MAAMlN,WAAW,GAAG;AACpBvQ,eAAO4C,QAAQC,MAAAA,EAAQoI,wBAAwBsS,MAAM,EAAExa,IAAI;AAAA,MAAA;AAAA,IAC/D,CACH;AAED/C,WAAO4C,MAAM,EAAEC,MAAM,EAChB6a,cAAcjO,QAAQ;AAAA,MACnBkO,iBAAiB;AAAA,MACjBC,iBAAiB;AAAA,MACjBC,cAAc;AAAA,QACVC,oBAAoB;AAAA,MAAA;AAAA,IAE3B,CAAA,EAAE/a,IAAI;AAAA,EAAA;AAGnB;AACA,MAAMuX,kBAAoC,CACtC;AAAA,EACIG,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,KAAK,WAAW;AAAA,EAC9BnY,MAAM,oBAAC,gBAAe,EAAA,MAAM,GAAK,CAAA;AAAA,EACjCE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AAEP1J,WAAAA,MAAAA,EACAC,MAAAA,EACAqa,YAAY5Q,KAAK,EACjBxJ,WAAW,aAAa,WAAW,EACnCC,IAAI;AAAA,EAAA;AAEjB,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,QAAQ,QAAQ,QAAQ,SAAS,UAAU;AAAA,EACzDnY,MAAM,oBAAC,cAAa,EAAA,MAAM,GAAK,CAAA;AAAA,EAC/BE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AACL1J,WAAAA,QAAQC,MAAM,EAAEqa,YAAY5Q,KAAK,EAAEhJ,eAAe,EAAEP,IAAI;AAAA,EAAA;AAEvE,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,SAAS,OAAO,OAAO;AAAA,EACrCnY,MAAM,oBAAC,cAAa,EAAA,MAAM,GAAK,CAAA;AAAA,EAC/BE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AAEP1J,WAAAA,QACAC,MAAM,EACNqa,YAAY5Q,KAAK,EACjByR,QAAQ,WAAW;AAAA,MAAE7a,OAAO;AAAA,IAAG,CAAA,EAC/BH,IAAI;AAAA,EAAA;AAEjB,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,YAAY,QAAQ;AAAA,EAClCnY,MAAM,oBAAC,cAAa,EAAA,MAAM,GAAK,CAAA;AAAA,EAC/BE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AAEP1J,WAAAA,QACAC,MAAM,EACNqa,YAAY5Q,KAAK,EACjByR,QAAQ,WAAW;AAAA,MAAE7a,OAAO;AAAA,IAAG,CAAA,EAC/BH,IAAI;AAAA,EAAA;AAEjB,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,YAAY,OAAO;AAAA,EACjCnY,MAAM,oBAAC,YAAW,EAAA,MAAM,GAAK,CAAA;AAAA,EAC7BE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AAEP1J,WAAAA,QACAC,MAAM,EACNqa,YAAY5Q,KAAK,EACjByR,QAAQ,WAAW;AAAA,MAAE7a,OAAO;AAAA,IAAG,CAAA,EAC/BH,IAAI;AAAA,EAAA;AAEjB,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,aAAa,OAAO;AAAA,EAClCnY,MAAM,oBAAC,wBAAuB,EAAA,MAAM,GAAK,CAAA;AAAA,EACzCE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AACL1J,WAAAA,QAAQC,MAAM,EAAEqa,YAAY5Q,KAAK,EAAE9I,iBAAiB,EAAET,IAAI;AAAA,EAAA;AAEzE,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,SAAS;AAAA,EACvBnY,MAAM,oBAAC,wBAAuB,EAAA,MAAM,GAAK,CAAA;AAAA,EACzCE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MACE;AACL1J,WAAAA,QAAQC,MAAM,EAAEqa,YAAY5Q,KAAK,EAAE5I,kBAAkB,EAAEX,IAAI;AAAA,EAAA;AAE1E,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,YAAY;AAAA,EAC1BnY,MAAM,oBAAC,iBAAgB,EAAA,MAAM,GAAK,CAAA;AAAA,EAClCE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAEVtM,MAAAA,OACK4C,MAAM,EACNC,QACAqa,YAAY5Q,KAAK,EACjBxJ,WAAW,aAAa,WAAW,EACnCc,mBACAb,IAAI;AACjB,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,WAAW;AAAA,EACzBnY,MAAM,oBAAC,UAAS,EAAA,MAAM,GAAK,CAAA;AAAA,EAC3BE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,EAAAA,MAEVtM,OAAO4C,MAAAA,EAAQC,MAAAA,EAAQqa,YAAY5Q,KAAK,EAAExI,gBAAgB,EAAEf,IAAI;AACxE,GACA;AAAA,EACI0X,OAAO;AAAA,EACPsC,aAAa;AAAA,EACbnC,aAAa,CAAC,SAAS,WAAW,SAAS,UAAU,MAAM;AAAA,EAC3DnY,MAAM,oBAAC,WAAU,EAAA,MAAM,GAAK,CAAA;AAAA,EAC5BE,SAASA,CAAC;AAAA,IACI3C;AAAAA,IACAsM;AAAAA,IACAuC;AAAAA,EAAAA,MACE;AAEZ7O,WAAO4C,QAAQC,MAAAA,EAAQqa,YAAY5Q,KAAK,EAAEvJ,IAAI;AAExC0C,UAAAA,QAAQ0E,SAASC,cAAc,OAAO;AAC5C3E,UAAMkE,OAAO;AACblE,UAAMuY,SAAS;AACfvY,UAAMwY,WAAW,YAAY;AACrBxY,UAAAA,MAAM6K,OAAOC,QAAQ;AACfE,cAAAA,OAAOhL,MAAM6K,MAAM,CAAC;AAC1B,YAAI,CAACG,KAAM;AACX,cAAM7G,MAAM5J,OAAO2O,KAAK/M,MAAMC,UAAUsJ;AAExC,cAAM+S,WAAWzY,MAAM6K;AACjBA,cAAAA,QAAQtI,MAAMmD,KAAK+S,QAAQ;AAC3B1N,cAAAA,SAASF,MAAMlM,OAAOqM,CAAAA,UAAQ,SAASC,KAAKD,MAAK9G,IAAI,CAAC;AAExD6G,YAAAA,OAAOD,WAAW,GAAG;AACrBnB,kBAAQuB,IAAI,mCAAmC;AACxC,iBAAA;AAAA,QAAA;AAGX,cAAMhC,OAAO3O,OAAO2O;AAEpB6B,eAAOlI,QAAQwG,CAAS,UAAA;AAOdoC,gBAAAA,SAAS,IAAIC,WAAW;AACvBC,iBAAAA,SAAS,OAAOxC,gBAAgB;AACnC,kBAAMF,WAAWC,MAAMC,aAAahF,KAAKiF,QAAQC,KAAK;AAAA,UAE1D;AACAoC,iBAAOG,cAAcvC,KAAK;AAAA,QAAA,CAC7B;AAAA,MAAA;AAGE,aAAA;AAAA,IACX;AACArJ,UAAM0Y,MAAM;AAAA,EAAA;AAEpB,CAAC;AClpBL,MAAMC,iBAAiBC,SAASpS,OAAO;AAAA;AACnC,CACH;AAED,MAAMqS,eAAe;AAAA,EACjB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACV;AAEO,MAAMC,gBAAgBA,CAAC;AAAA,EACI3J;AAAAA,EACA4J;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC,WAAW;AAAA,EACX7H;AAAAA,EACA8H;AAAAA,EACA1E;AAAAA,EACA2E;AACgB,MAAM;AAE9Cpf,QAAAA,MAAMqf,MAAM5e,OAA8B,IAAI;AAC9C6e,QAAAA,YAAYD,MAAM5e,OAAsB,IAAI;AAE5C8e,QAAAA,cAAclP,sBAAsB8O,iBAAiB;AAC3D,QAAMK,iBAAiBC,QAAQ,MAAMnN,qBAAqBiN,WAAW,GAAG,CAAA,CAAE;AAE1E,QAAM,CAACG,UAAUC,WAAW,IAAIlD,SAAS,KAAK;AAC9C,QAAM,CAACmD,UAAUC,WAAW,IAAIpD,SAAS,KAAK;AAE9CqD,kBAAgB,UAAUC,SAAS;AAE7BC,QAAAA,oBAAoBC,iBAAiB5I,SAAS;AAEpDnW,YAAU,MAAM;AACZ,QAAI+d,YAAYnF,OAAW;AACvBmF,QAAAA,UAAU,MAAMK,UAAU3e,SAAS;AACnC2e,gBAAU3e,SAASiS,SAASsN,WAAWhL,WAAW,EAAE;AAAA,IAAA;AAAA,EACxD,GACD,CAAC+J,OAAO,CAAC;AAEZ/d,YAAU,MAAM;AACDP,eAAAA,SAASwf,YAAY,CAACf,QAAQ;AAAA,EAAA,GAC1C,CAACA,QAAQ,CAAC;AAEble,YAAU,MAAM;AACZ,QAAI+d,YAAYnF,OAAW;AACvBwF,QAAAA,UAAU3e,WAAWse,UAAU,GAAG;AAE5B/b,YAAAA,QAAQoc,UAAU3e,QAAQuC,MAAM;AAEtC,UAAI8c,mBAAmB;AACnB9c,cAAMC,MAAM,EAAE0U,4BAA4BmI,iBAAiB,EAAE3c,IAAI;AAAA,MAAA,OAC9D;AACHH,cAAMC,MAAM,EAAE2U,4BAA4B,EAAEzU,IAAI;AAAA,MAAA;AAAA,IACpD;AAAA,KAGL,CAAC2c,mBAAmBvU,MAAMuU,mBAAmBhT,EAAE,CAAC;AAE7CoT,QAAAA,iBAAiBA,CAAC9f,WAAmB;AACvCgf,cAAU3e,UAAUL;AACpB,QAAI0e,yBAAyB;AACzB,YAAMqB,WAAWf,UAAU3e,QAAQ2f,QAAQD,SAASE,YAAY;AACtCC,gCAAAA,wBAAwBH,QAAQ,CAAC;AAAA,IAAA;AAE/D,QAAIvB,qBAAqB;AACrB,YAAM2B,cAAcrY,sBAAsB9H,OAAOogB,QAAAA,CAAS;AAC1D5B,0BAAoB2B,WAAW;AAAA,IAAA;AAEnC,QAAI1B,qBAAqB;AACCze,4BAAAA,OAAOqgB,SAAS;AAAA,IAAA;AAAA,EAE9C;AAEMC,QAAAA,aAAahC,aAAaM,QAAQ;AAElC2B,QAAAA,aAAyBpB,QAAQ,MAAO;AAAA,IAC1C/Q;AAAAA,IACAgQ;AAAAA,IACAlH,6BAA6BH,SAAS;AAAA,IACtCrO;AAAAA,IACA8X;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC,UAAUtV,UAAU;AAAA,MAChBuV,YAAY;AAAA,IAAA,CACf;AAAA;AAAA;AAAA;AAAA;AAAA,IAKDC;AAAAA,IACA5O;AAAAA,IACAyE;AAAAA,IACApL;AAAAA,IACAoB;AAAAA,IACAqS;AAAAA,IACAlS;AAAAA,IACAE;AAAAA,IACA+T,SAASzV,UAAU;AAAA,MACfmO,MAAM;AAAA,IAAA,CACT;AAAA,IACDtM;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAyJ,aAAalM,UAAU;AAAA,MACnBuB,gBAAgB;AAAA,QACZ5E,OAAO;AAAA,MACX;AAAA,MACA0P,YAAYA,WAAWnY,KAAK;AAAA,QACxBmP,QAAQgQ;AAAAA,QACR1E;AAAAA,MACH,CAAA;AAAA,IACJ,CAAA;AAAA,EAAC,GACF,EAAE;AAGF,SAAA,oBAAC,OACG,EAAA,KACA,WAAU,iCAEV,UAAC,oBAAA,gBAAA,EACG,SAASvF,WAAW,IACpB,YACA,aAAa;AAAA,IACTsB,UAAUA,MAAM,CAAC4I;AAAAA,IACjBvS,YAAY;AAAA,MACRpE,OAAO9C,IAAIib,YAAY,2EAA2E;AAAA,IAAA;AAAA,EAE1G,GACA,UAAU,CAAC;AAAA,IAAEtgB,QAAAA;AAAAA,EAAAA,MAAa;AAEtBgf,cAAU3e,UAAUL;AACb6f,aAAAA,YAAY,CAACf,QAAQ;AAAA,EAChC,GACA,UAAU,CAAC;AAAA,IAAE9e,QAAAA;AAAAA,EAAAA,MAAa;AACtB8f,mBAAe9f,QAAgB;AAAA,EACnC,GAEA,UAAC,qBAAA,cAAA,EACG,cAAc;AAAA,IACVM,WAAW;AAAA,EAEf,GAAA,WAAW+E,IAAI,mGAAmGiI,kBAAkB,GAEpI,UAAA;AAAA,IAAA,oBAAC,gBAAa,iBAAiB5N,IAAIW,SAAS,MAAM+e,UAAU,cAAcC,aAAY;AAAA,IACtF,oBAAC,WAAU,EAAA,aAAY,WAAU,CAAA;AAAA,IAChC,oBAAA,cAAA,EAAa,MAAMC,UAAU,cAAcC,aAAY;AAAA,IACxD,oBAAC,WAAU,EAAA,aAAY,WAAU,CAAA;AAAA,wBAChC,aAAW,CAAA,CAAA;AAAA,EAAA,EAChB,CAAA,EAEJ,CAAA,GACJ;AAGR;AAEA,SAASW,wBAAwBH,UAA0B;AAEvD,QAAMmB,aAAa;AAEnB,SAAOnB,SAASoB,QAAQD,YAAaE,CAAAA,UAAU,GAAGA,KAAK;AAAA,CAAI;AAC/D;AAEA,MAAM3B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/components/editor-bubble.tsx","../src/components/editor-bubble-item.tsx","../src/selectors/node-selector.tsx","../src/selectors/link-selector.tsx","../src/selectors/text-buttons.tsx","../src/utils/remove_classes.ts","../src/extensions/TextLoadingDecorationExtension.tsx","../src/extensions/index.ts","../src/editor_extensions.tsx","../src/extensions/Image.ts","../src/extensions/custom-keymap.ts","../src/extensions/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\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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"}