@daisychainapp/maily-to-core 0.2.11 → 0.3.5

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,"sources":["../../src/extensions.ts","../../src/editor/extensions/color.ts","../../src/editor/extensions/horizontal-rule.tsx","../../src/editor/plugins/image-upload/image-upload-plugin.ts","../../src/editor/extensions/image-upload/image-upload.ts","../../src/editor/extensions/maily-kit.tsx","../../src/editor/nodes/footer.ts","../../src/editor/nodes/spacer.ts","../../src/editor/utils/update-attribute.ts","../../src/editor/nodes/section/section.ts","../../src/editor/extensions/link-card.ts","../../src/editor/nodes/link-card.tsx","../../src/editor/components/input.tsx","../../src/editor/utils/classname.ts","../../src/editor/utils/constants.ts","../../src/editor/components/popover.tsx","../../src/editor/components/textarea.tsx","../../src/editor/utils/columns.ts","../../src/editor/nodes/columns/column.ts","../../src/editor/nodes/columns/columns.ts","../../src/editor/nodes/button/button.tsx","../../src/editor/components/alignment-switch.tsx","../../src/editor/components/base-button.tsx","../../src/editor/components/ui/tooltip.tsx","../../src/editor/components/bubble-menu-button.tsx","../../src/editor/nodes/logo/logo.ts","../../src/editor/nodes/logo/logo-view.tsx","../../src/editor/nodes/image/image-view.tsx","../../src/editor/utils/use-event.ts","../../src/editor/utils/aspect-ratio.ts","../../src/editor/components/show-popover.tsx","../../src/editor/utils/node-options.ts","../../src/editor/utils/variable.ts","../../src/editor/utils/use-outside-click.ts","../../src/editor/components/ui/input-autocomplete.tsx","../../src/editor/components/ui/color-picker.tsx","../../src/editor/components/ui/divider.tsx","../../src/editor/components/ui/link-input-popover.tsx","../../src/editor/provider.tsx","../../src/editor/extensions/slash-command/default-slash-commands.tsx","../../src/blocks/button.tsx","../../src/blocks/code.tsx","../../src/blocks/image.tsx","../../src/blocks/layout.tsx","../../src/blocks/list.tsx","../../src/blocks/typography.tsx","../../src/editor/components/icons/logo-with-cover-image.tsx","../../src/editor/components/icons/logo-with-text-horizon.tsx","../../src/editor/components/icons/logo-with-text-vertical.tsx","../../src/blocks/headers.tsx","../../src/blocks/footers.tsx","../../src/editor/nodes/variable/variable.ts","../../src/editor/nodes/variable/variable-suggestions-popover.tsx","../../src/editor/nodes/variable/variable-view.tsx","../../src/editor/components/ui/select.tsx","../../src/editor/nodes/button/button-view.tsx","../../src/editor/nodes/button/button-label-input.tsx","../../src/editor/nodes/image/image.ts","../../src/editor/nodes/link.ts","../../src/editor/nodes/heading/heading.ts","../../src/editor/nodes/paragraph/paragraph.ts","../../src/editor/nodes/repeat/repeat.ts","../../src/editor/nodes/repeat/repeat-view.tsx","../../src/editor/extensions/placeholder.ts","../../src/editor/extensions/slash-command/slash-command.ts","../../src/editor/extensions/slash-command/slash-command-view.tsx","../../src/editor/extensions/slash-command/slash-command-item.tsx","../../src/editor/extensions/slash-command/slash-command-search.tsx","../../src/editor/nodes/variable/variable-suggestions.tsx","../../src/editor/nodes/html/html.tsx","../../src/editor/nodes/html/html-view.tsx"],"sourcesContent":["export * from './editor/extensions/color';\nexport * from './editor/extensions/horizontal-rule';\nexport * from './editor/extensions/image-upload/image-upload';\nexport * from './editor/plugins/image-upload/image-upload-plugin';\nexport * from './editor/extensions/maily-kit';\nexport * from './editor/extensions/placeholder';\nexport * from './editor/extensions/slash-command/slash-command';\nexport * from './editor/extensions/slash-command/slash-command-view';\nexport * from './editor/nodes/button/button';\nexport * from './editor/nodes/columns/column';\nexport * from './editor/nodes/columns/columns';\nexport * from './editor/nodes/footer';\nexport * from './editor/nodes/image/image';\nexport * from './editor/nodes/link';\nexport * from './editor/nodes/logo/logo';\nexport * from './editor/nodes/repeat/repeat';\nexport * from './editor/nodes/section/section';\nexport * from './editor/nodes/spacer';\nexport * from './editor/nodes/variable/variable';\nexport * from './editor/nodes/variable/variable-suggestions';\nexport * from './editor/nodes/html/html';\n","import TiptapColor, { ColorOptions } from '@tiptap/extension-color';\n\ntype ColorStorage = {\n /**\n * Last 5 used colors\n */\n colors: Set<string>;\n};\n\nexport const Color = TiptapColor.extend<ColorOptions, ColorStorage>({\n addStorage() {\n return {\n colors: new Set(),\n };\n },\n});\n","import { InputRule } from '@tiptap/core';\nimport { HorizontalRule as TipTapHorizontalRule } from '@tiptap/extension-horizontal-rule';\n\nexport const HorizontalRule = TipTapHorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({ state, range }) => {\n const attributes = {};\n\n const { tr } = state;\n const start = range.from;\n const end = range.to;\n\n tr.insert(start - 1, this.type.create(attributes)).delete(\n tr.mapping.map(start),\n tr.mapping.map(end)\n );\n },\n }),\n ];\n },\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n };\n },\n});\n","import { Editor } from '@tiptap/core';\nimport { Node } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\n\nexport type ImageUploadPluginOptions = {\n editor: Editor;\n /**\n * Allows you to define a list of allowed mime types for dropped or pasted images.\n * @default ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml']\n */\n allowedMimeTypes?: string[];\n\n /**\n * The onImageUpload callback that is called when an image is dropped or pasted.\n * @param file the image file\n * @returns Returns the image URL as a string.\n */\n onImageUpload?: (file: Blob) => Promise<string>;\n};\n\nexport function ImageUploadPlugin(options: ImageUploadPluginOptions) {\n const { editor, onImageUpload, allowedMimeTypes } = options;\n\n function handleImageUpload(view: EditorView, file: File, pos?: number) {\n const placeholderSrc = URL.createObjectURL(file);\n\n const { tr, schema } = view.state;\n const imageNode = schema.nodes.image.create({\n src: placeholderSrc,\n isSrcVariable: false,\n alt: file.name,\n externalLink: '',\n isExternalLinkVariable: false,\n });\n editor?.extensionStorage?.imageUpload?.placeholderImages?.add(\n placeholderSrc\n );\n\n const resolvedPos =\n pos !== undefined\n ? view.state.doc.resolve(pos)\n : view.state.selection.$head;\n\n const transaction = tr.insert(resolvedPos.pos, imageNode);\n view.dispatch(transaction);\n\n onImageUpload?.(file)\n .then((uploadedSrc) => {\n const updateTr = view.state.tr;\n\n // Find the placeholder image node\n const predicate = (node: Node) =>\n node.type.name === 'image' && node.attrs.src === placeholderSrc;\n\n view.state.doc.descendants((node, pos) => {\n if (predicate(node)) {\n updateTr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n src: uploadedSrc,\n });\n return false;\n }\n });\n\n view.dispatch(updateTr);\n })\n .catch((error) => {\n console.error('Image upload failed', error);\n })\n .finally(() => {\n editor.extensionStorage.imageUpload.placeholderImages.delete(\n placeholderSrc\n );\n URL.revokeObjectURL(placeholderSrc);\n });\n }\n\n return new Plugin({\n key: new PluginKey('imageUpload'),\n props: {\n handleDrop: (view, event) => {\n if (\n !onImageUpload ||\n // we'll handle drops in the ImageView component\n // this is just for dropping images in empty areas\n !event.dataTransfer?.files?.length\n ) {\n return false;\n }\n\n const images = Array.from(event.dataTransfer.files).filter((file) =>\n allowedMimeTypes?.includes(file.type)\n );\n if (images.length === 0) {\n return false;\n }\n\n const pos = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n if (!pos) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n images.forEach((file) => handleImageUpload(view, file, pos.pos));\n return true;\n },\n handlePaste: (view, event) => {\n if (!onImageUpload || !event.clipboardData?.files?.length) {\n return false;\n }\n\n const images = Array.from(event.clipboardData.files).filter((file) =>\n allowedMimeTypes?.includes(file.type)\n );\n if (images.length === 0) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n images.forEach((file) => handleImageUpload(view, file));\n return true;\n },\n },\n });\n}\n","import {\n ImageUploadPlugin,\n ImageUploadPluginOptions,\n} from '@/editor/plugins/image-upload/image-upload-plugin';\nimport { Editor, Extension } from '@tiptap/core';\nimport { useMemo } from 'react';\n\nexport type ImageUploadOptions = Omit<ImageUploadPluginOptions, 'editor'> & {};\nexport type ImageUploadStorage = {\n placeholderImages: Set<string>;\n};\n\nexport const ImageUploadExtension = Extension.create<ImageUploadOptions>({\n name: 'imageUpload',\n\n addOptions() {\n return {\n allowedMimeTypes: [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n ],\n onImageUpload: undefined,\n };\n },\n\n addStorage() {\n return {\n placeholderImages: new Set(),\n };\n },\n\n addProseMirrorPlugins() {\n const { onImageUpload } = this.options;\n\n if (!onImageUpload) {\n return [];\n }\n\n return [\n ImageUploadPlugin({\n editor: this.editor,\n allowedMimeTypes: this.options.allowedMimeTypes,\n onImageUpload: this.options.onImageUpload,\n }),\n ];\n },\n});\n\nexport function useImageUploadOptions(editor: Editor): ImageUploadOptions {\n return useMemo(() => {\n const node = editor.extensionManager.extensions.find(\n (extension) => extension.name === 'imageUpload'\n );\n\n return node?.options || {};\n }, [editor]);\n}\n","import { AnyExtension, Extension } from '@tiptap/core';\n\nimport StarterKit from '@tiptap/starter-kit';\nimport ListItem from '@tiptap/extension-list-item';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Heading from '@tiptap/extension-heading';\nimport Underline from '@tiptap/extension-underline';\nimport Document from '@tiptap/extension-document';\nimport Focus from '@tiptap/extension-focus';\nimport Dropcursor from '@tiptap/extension-dropcursor';\n\nimport { Color } from './color';\nimport { HorizontalRule } from './horizontal-rule';\nimport { Footer } from '../nodes/footer';\nimport { Spacer } from '../nodes/spacer';\nimport { LinkCardExtension, LinkCardOptions } from './link-card';\nimport { ColumnsExtension } from '../nodes/columns/columns';\nimport { ColumnExtension } from '../nodes/columns/column';\nimport { SectionExtension } from '../nodes/section/section';\nimport { ButtonExtension } from '../nodes/button/button';\nimport { LogoExtension } from '../nodes/logo/logo';\nimport { ImageExtension } from '../nodes/image/image';\nimport { LinkExtension } from '../nodes/link';\nimport { LinkOptions } from '@tiptap/extension-link';\nimport { HeadingExtension } from '../nodes/heading/heading';\nimport { ParagraphExtension } from '../nodes/paragraph/paragraph';\nimport { RepeatExtension } from '../nodes/repeat/repeat';\n\nexport type MailyKitOptions = {\n linkCard?: Partial<LinkCardOptions> | false;\n repeat?: Partial<{}> | false;\n section?: Partial<{}> | false;\n columns?: Partial<{}> | false;\n column?: Partial<{}> | false;\n button?: Partial<{}> | false;\n spacer?: Partial<{}> | false;\n logo?: Partial<{}> | false;\n image?: Partial<{}> | false;\n link?: Partial<LinkOptions> | false;\n};\n\nexport const MailyKit = Extension.create<MailyKitOptions>({\n name: 'maily-kit',\n\n addOptions() {\n return {\n link: {\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly-no-underline',\n },\n openOnClick: false,\n },\n };\n },\n\n addExtensions() {\n const extensions: AnyExtension[] = [\n Document.extend({\n content: '(block|columns)+',\n }),\n StarterKit.configure({\n code: {\n HTMLAttributes: {\n class:\n 'mly-px-1 mly-relative mly-py-0.5 mly-bg-[#efefef] mly-text-sm mly-rounded-md mly-tracking-normal mly-font-normal',\n },\n },\n blockquote: {\n HTMLAttributes: {\n class:\n 'mly-not-prose mly-border-l-4 mly-border-gray-300 mly-pl-4 mly-mt-4 mly-mb-4 mly-relative',\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n heading: false,\n paragraph: false,\n horizontalRule: false,\n dropcursor: false,\n document: false,\n }) as AnyExtension,\n Underline,\n Color.configure({ types: [TextStyle.name, ListItem.name] }),\n TextStyle.configure(),\n TextAlign.configure({\n types: [Paragraph.name, Heading.name, Footer.name],\n }),\n HorizontalRule,\n Footer,\n Focus,\n Dropcursor.configure({\n color: '#555',\n width: 3,\n class: 'ProseMirror-dropcursor',\n }),\n HeadingExtension.configure({\n levels: [1, 2, 3],\n HTMLAttributes: {\n class: 'mly-relative',\n },\n }),\n ParagraphExtension.configure({\n HTMLAttributes: {\n class: 'mly-relative',\n },\n }),\n ];\n\n if (this.options.linkCard !== false) {\n extensions.push(LinkCardExtension.configure(this.options.linkCard));\n }\n\n if (this.options.repeat !== false) {\n extensions.push(RepeatExtension);\n }\n\n if (this.options.section !== false) {\n extensions.push(SectionExtension);\n }\n\n if (this.options.columns !== false) {\n extensions.push(ColumnsExtension);\n }\n\n if (this.options.column !== false) {\n extensions.push(ColumnExtension);\n }\n\n if (this.options.button !== false) {\n extensions.push(ButtonExtension);\n }\n\n if (this.options.spacer !== false) {\n extensions.push(Spacer);\n }\n\n if (this.options.logo !== false) {\n extensions.push(LogoExtension);\n }\n\n if (this.options.image !== false) {\n extensions.push(ImageExtension);\n }\n\n if (this.options.link !== false) {\n extensions.push(LinkExtension.configure(this.options.link));\n }\n\n return extensions;\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\n\nexport interface FooterOptions {\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n footer: {\n setFooter: () => ReturnType;\n };\n }\n}\n\nexport const Footer = Node.create<FooterOptions>({\n name: 'footer',\n group: 'block',\n content: 'inline*',\n\n addAttributes() {\n return {\n 'maily-component': {\n default: 'footer',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element) => element?.getAttribute('data-maily-component'),\n },\n };\n },\n\n addCommands() {\n return {\n setFooter:\n () =>\n ({ commands }) => {\n return commands.setNode(this.name);\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'small[data-maily-component=\"footer\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'small',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class:\n 'footer mly-block mly-text-[13px] mly-text-slate-500 mly-relative',\n }),\n 0,\n ];\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from './section/section';\n\nexport interface SpacerOptions {\n height: number;\n showIfKey: string;\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n spacer: {\n setSpacer: (options: { height: number }) => ReturnType;\n setSpacerSize: (height: number) => ReturnType;\n setSpacerShowIfKey: (showIfKey: string) => ReturnType;\n unsetSpacer: () => ReturnType;\n };\n }\n}\n\nexport const DEFAULT_SPACER_HEIGHT = 8;\n\nexport const Spacer = Node.create<SpacerOptions>({\n name: 'spacer',\n priority: 1000,\n\n group: 'block',\n draggable: true,\n addAttributes() {\n return {\n height: {\n default: DEFAULT_SPACER_HEIGHT,\n parseHTML: (element) => Number(element.getAttribute('data-height')),\n renderHTML: (attributes) => {\n return {\n 'data-height': attributes.height,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSpacer:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n height: options.height,\n },\n });\n },\n\n setSpacerSize:\n (height) =>\n ({ commands }) => {\n return commands.updateAttributes('spacer', { height });\n },\n\n setSpacerShowIfKey:\n (showIfKey) =>\n ({ commands }) => {\n return commands.updateAttributes('spacer', { showIfKey });\n },\n\n unsetSpacer:\n () =>\n ({ commands }) => {\n return commands.deleteNode('spacer');\n },\n };\n },\n renderHTML({ HTMLAttributes, node }) {\n const { height } = node.attrs as SpacerOptions;\n\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n this.options.HTMLAttributes,\n HTMLAttributes,\n {\n class: 'spacer mly-relative mly-full mly-z-50',\n contenteditable: false,\n style: `height: ${height}px;--spacer-height: ${height}px;`,\n }\n ),\n ];\n },\n parseHTML() {\n return [{ tag: `div[data-maily-component=\"${this.name}\"]` }];\n },\n});\n","import { Command } from '@tiptap/core';\n\nexport function updateAttribute(\n type: string,\n attr: string,\n value: any\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n tr.setNodeAttribute(lastPos, attr, value);\n }\n }\n\n return true;\n });\n}\n\nexport function updateAttributes(\n type: string,\n attrs: Record<string, any>\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n const node = state.doc.nodeAt(lastPos);\n if (node) {\n tr.setNodeMarkup(lastPos, null, {\n ...node.attrs,\n ...attrs,\n });\n } else {\n for (const [key, value] of Object.entries(attrs)) {\n tr.setNodeAttribute(lastPos, key, value);\n }\n }\n }\n\n if (type === 'button') {\n tr.setSelection(tr.selection);\n }\n }\n\n return true;\n });\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes, Node } from '@tiptap/core';\n\nexport const DEFAULT_SECTION_BACKGROUND_COLOR = '#f7f7f7';\nexport const DEFAULT_SECTION_ALIGN = 'left';\nexport const DEFAULT_SECTION_BORDER_WIDTH = 2;\nexport const DEFAULT_SECTION_BORDER_COLOR = '#e2e2e2';\nexport const DEFAULT_SECTION_BORDER_RADIUS = 0;\n\nexport const DEFAULT_SECTION_MARGIN_TOP = 0;\nexport const DEFAULT_SECTION_MARGIN_RIGHT = 0;\nexport const DEFAULT_SECTION_MARGIN_BOTTOM = 0;\nexport const DEFAULT_SECTION_MARGIN_LEFT = 0;\n\nexport const DEFAULT_SECTION_PADDING_TOP = 0;\nexport const DEFAULT_SECTION_PADDING_RIGHT = 0;\nexport const DEFAULT_SECTION_PADDING_BOTTOM = 0;\nexport const DEFAULT_SECTION_PADDING_LEFT = 0;\n\nexport const DEFAULT_SECTION_SHOW_IF_KEY = null;\n\ntype SectionAttributes = {\n borderRadius: number;\n backgroundColor: string;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n marginTop: number;\n marginRight: number;\n marginBottom: number;\n marginLeft: number;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string | null;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n section: {\n setSection: () => ReturnType;\n updateSection: (attrs: Partial<SectionAttributes>) => ReturnType;\n };\n }\n}\n\nexport const SectionExtension = Node.create({\n name: 'section',\n group: 'block',\n content: '(block|columns)+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n borderRadius: {\n default: 0,\n parseHTML: (element) => {\n return Number(element?.style?.borderRadius?.replace(/['\"]+/g, ''));\n },\n renderHTML: (attributes) => {\n if (!attributes.borderRadius) {\n return {};\n }\n\n return {\n style: `border-radius: ${attributes.borderRadius}px`,\n };\n },\n },\n backgroundColor: {\n default: DEFAULT_SECTION_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return element.style.backgroundColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n\n return {\n style: `background-color: ${attributes.backgroundColor};--bg-color: ${attributes.backgroundColor}`,\n };\n },\n },\n align: {\n default: DEFAULT_SECTION_ALIGN,\n parseHTML: (element) => {\n return element.getAttribute('align') || DEFAULT_SECTION_ALIGN;\n },\n renderHTML(attributes) {\n if (!attributes.align) {\n return {};\n }\n\n return {\n align: attributes.align,\n };\n },\n },\n borderWidth: {\n default: DEFAULT_SECTION_BORDER_WIDTH,\n parseHTML: (element) => {\n return (\n Number(element?.style?.borderWidth?.replace(/['\"]+/g, '')) || 0\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.borderWidth) {\n return {};\n }\n\n return {\n style: `border-width: ${attributes.borderWidth}px`,\n };\n },\n },\n borderColor: {\n default: DEFAULT_SECTION_BORDER_COLOR,\n parseHTML: (element) => {\n return element.style.borderColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.borderColor) {\n return {};\n }\n\n return {\n style: `border-color: ${attributes.borderColor}`,\n };\n },\n },\n paddingTop: {\n default: DEFAULT_SECTION_PADDING_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.paddingTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.paddingTop) {\n return {};\n }\n\n return {\n style: `padding-top: ${attributes.paddingTop}px`,\n };\n },\n },\n paddingRight: {\n default: DEFAULT_SECTION_PADDING_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.paddingRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingRight) {\n return {};\n }\n\n return {\n style: `padding-right: ${attributes.paddingRight}px`,\n };\n },\n },\n paddingBottom: {\n default: DEFAULT_SECTION_PADDING_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.paddingBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingBottom) {\n return {};\n }\n\n return {\n style: `padding-bottom: ${attributes.paddingBottom}px`,\n };\n },\n },\n paddingLeft: {\n default: DEFAULT_SECTION_PADDING_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.paddingLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingLeft) {\n return {};\n }\n\n return {\n style: `padding-left: ${attributes.paddingLeft}px`,\n };\n },\n },\n marginTop: {\n default: DEFAULT_SECTION_MARGIN_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.marginTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.marginTop) {\n return {};\n }\n\n return {\n marginTop: attributes.marginTop,\n };\n },\n },\n marginRight: {\n default: DEFAULT_SECTION_MARGIN_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.marginRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginRight) {\n return {};\n }\n\n return {\n marginRight: attributes.marginRight,\n };\n },\n },\n marginBottom: {\n default: DEFAULT_SECTION_MARGIN_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.marginBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginBottom) {\n return {};\n }\n\n return {\n marginBottom: attributes.marginBottom,\n };\n },\n },\n marginLeft: {\n default: DEFAULT_SECTION_MARGIN_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.marginLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginLeft) {\n return {};\n }\n\n return {\n marginLeft: attributes.marginLeft,\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSection:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n type: this.name,\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateSection: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const {\n marginTop = 0,\n marginRight = 0,\n marginBottom = 0,\n marginLeft = 0,\n } = HTMLAttributes;\n\n return [\n 'table',\n {\n 'data-type': this.name,\n border: 0,\n cellpadding: 0,\n cellspacing: 0,\n class: 'mly-w-full mly-border-separate mly-relative mly-table-fixed',\n style: `margin-top: ${marginTop}px; margin-right: ${marginRight}px; margin-bottom: ${marginBottom}px; margin-left: ${marginLeft}px;`,\n },\n [\n 'tbody',\n {\n class: 'mly-w-full',\n },\n [\n 'tr',\n {\n class: 'mly-w-full',\n },\n [\n 'td',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'section-cell',\n style: 'border-style: solid',\n class: 'mly-w-full [text-align:revert-layer]',\n }),\n 0,\n ],\n ],\n ],\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'table[data-type=\"section\"]',\n },\n ];\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { LinkCardComponent } from '../nodes/link-card';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n linkCard: {\n setLinkCard: () => ReturnType;\n };\n }\n}\n\nexport type LinkCardOptions = {};\n\nexport const LinkCardExtension = Node.create({\n name: 'linkCard',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n mailyComponent: {\n default: 'linkCard',\n },\n title: {\n default: '',\n },\n description: {\n default: '',\n },\n link: {\n default: '',\n },\n linkTitle: {\n default: '',\n },\n image: {\n default: '',\n },\n subTitle: {\n default: '',\n },\n badgeText: {\n default: '',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `a[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n HTMLAttributes\n ),\n ];\n },\n\n addCommands() {\n return {\n setLinkCard:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n mailyComponent: this.name,\n },\n });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(LinkCardComponent, {\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Input } from '../components/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../components/popover';\nimport { Textarea } from '../components/textarea';\nimport { cn } from '../utils/classname';\n\nexport function LinkCardComponent(props: NodeViewProps) {\n const { title, description, link, linkTitle, image, badgeText, subTitle } =\n props.node.attrs;\n const { getPos, editor } = props;\n\n return (\n <NodeViewWrapper\n className={`react-component ${\n props.selected && 'ProseMirror-selectednode'\n }`}\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n >\n <Popover open={props.selected}>\n <PopoverTrigger asChild>\n <div\n tabIndex={-1}\n onClick={(e) => {\n e.preventDefault();\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n <div className=\"mly-no-prose mly-flex mly-flex-col mly-rounded-lg mly-border mly-border-gray-300\">\n {image && (\n <div className=\"mly-relative mly-mb-1.5 mly-w-full mly-shrink-0\">\n <img\n src={image}\n alt=\"link-card\"\n className=\"mly-no-prose !mly-mb-0 mly-h-full mly-w-full mly-rounded-t-lg\"\n draggable={editor.isEditable}\n />\n </div>\n )}\n <div className=\"mly-flex mly-items-stretch mly-p-3\">\n <div className={cn('mly-flex mly-flex-col')}>\n <div className=\"!mly-mb-1.5 mly-flex mly-items-center mly-gap-1.5\">\n <h2 className=\"!mly-mb-0 !mly-text-lg mly-font-semibold\">\n {title}\n </h2>\n {badgeText && (\n <span className=\"!mly-font-base text-xs mly-rounded-md mly-bg-yellow-200 mly-px-2 mly-py-1 mly-font-semibold mly-leading-none\">\n {badgeText}\n </span>\n )}{' '}\n {subTitle && !badgeText && (\n <span className=\"!mly-font-base text-xs mly-font-regular mly-rounded-md mly-leading-none mly-text-gray-400\">\n {subTitle}\n </span>\n )}\n </div>\n <p className=\"!mly-my-0 !mly-text-base mly-text-gray-500\">\n {description}{' '}\n {linkTitle ? (\n <a href={link} className=\"mly-font-semibold\">\n {linkTitle}\n </a>\n ) : null}\n </p>\n </div>\n </div>\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"mly-flex mly-w-96 mly-flex-col mly-gap-2\"\n sideOffset={10}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Image\n </span>\n <Input\n placeholder=\"Add Image\"\n type=\"url\"\n value={image}\n onChange={(e) => {\n props.updateAttributes({\n image: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Title\n </span>\n <Input\n placeholder=\"Add title\"\n value={title}\n onChange={(e) => {\n props.updateAttributes({\n title: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Description\n </span>\n <Textarea\n placeholder=\"Add description here\"\n value={description}\n onChange={(e) => {\n props.updateAttributes({\n description: e.target.value,\n });\n }}\n />\n </label>\n\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-2\">\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Link Title\n </span>\n <Input\n placeholder=\"Add link title here\"\n value={linkTitle}\n onChange={(e) => {\n props.updateAttributes({\n linkTitle: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Link\n </span>\n <Input\n placeholder=\"Add link here\"\n value={link}\n onChange={(e) => {\n props.updateAttributes({\n link: e.target.value,\n });\n }}\n />\n </label>\n </div>\n\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-2\">\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Badge Text\n </span>\n <Input\n placeholder=\"Add badge text here\"\n value={badgeText}\n onChange={(e) => {\n props.updateAttributes({\n badgeText: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Sub Title\n </span>\n <Input\n placeholder=\"Add sub title here\"\n value={subTitle}\n onChange={(e) => {\n props.updateAttributes({\n subTitle: e.target.value,\n });\n }}\n />\n </label>\n </div>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '../utils/constants';\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n type={type}\n className={cn(\n 'mly-flex mly-h-10 mly-w-full mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-3 mly-py-2 mly-text-sm mly-ring-offset-white file:mly-border-0 file:mly-bg-transparent file:mly-text-sm file:mly-font-medium placeholder:mly-text-gray-500 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-cursor-not-allowed disabled:mly-opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n prefix: 'mly-',\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","export const AUTOCOMPLETE_PASSWORD_MANAGERS_OFF = Object.freeze({\n autoComplete: 'off',\n 'data-1p-ignore': true,\n 'data-form-type': 'other',\n});\n","'use client';\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\n\nimport { cn } from '../utils/classname';\n\nconst Popover: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>\n> = PopoverPrimitive.Root;\n\nconst PopoverTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger>\n> = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'mly-z-[9999] mly-w-72 mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-p-4 mly-text-gray-950 mly-shadow-md mly-outline-none',\n 'mly-editor',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof PopoverPrimitive.Content>>\n>;\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\n\nexport interface TextAreaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextAreaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'mly-flex mly-min-h-24 mly-w-full mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-3 mly-py-2 mly-text-sm mly-ring-offset-white file:mly-border-0 file:mly-bg-transparent file:mly-text-sm file:mly-font-medium placeholder:mly-text-gray-500 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-cursor-not-allowed disabled:mly-opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","import { Editor } from '@tiptap/react';\nimport { Fragment, Node } from '@tiptap/pm/model';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { v4 as uuidv4 } from 'uuid';\nimport { findParentNode } from '@tiptap/core';\nimport { DEFAULT_COLUMN_WIDTH } from '../nodes/columns/column';\n\nexport function getColumnCount(editor: Editor) {\n return getClosestNodeByName(editor, 'columns')?.node?.childCount || 0;\n}\n\nexport function getClosestNodeByName(editor: Editor, name: string) {\n const { state } = editor.view;\n return findParentNode((node) => node.type.name === name)(state.selection);\n}\n\nexport function addColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const calculatedWidth = +Number(100 / (columnsNode.childCount + 1)).toFixed(\n 2\n );\n const newColumn = state.schema.nodes.column.create(\n {\n width: calculatedWidth,\n columnId: uuidv4(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n columnsNode.content.forEach((child, _, index) => {\n if (\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId\n ) {\n activeColumnIndex = index;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n updatedContent.splice(activeColumnIndex + 1, 0, newColumn);\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, activeColumnIndex + 1)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function removeColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n // If there is only one column, remove the entire columns node\n if (columnsNode.childCount === 1) {\n const transaction = tr.delete(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize\n );\n dispatch(transaction);\n editor.view.focus();\n return;\n }\n\n const calculatedWidth = +Number(100 / (columnsNode.childCount - 1)).toFixed(\n 2\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n let isRemoved = false;\n columnsNode.content.forEach((child, _, index) => {\n const isActiveColumn =\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId;\n if (isActiveColumn && !isRemoved) {\n activeColumnIndex = index;\n isRemoved = true;\n return;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n const isLastColumn = activeColumnIndex === columnsNode.childCount - 1;\n\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, isLastColumn ? activeColumnIndex - 1 : activeColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function goToColumn(editor: Editor, type: 'next' | 'previous') {\n const columnsNode = getClosestNodeByName(editor, 'columns');\n const columnNode = getClosestNodeByName(editor, 'column');\n if (!columnsNode || !columnNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const cols = columnsNode.node;\n let currColumnIndex = 0;\n cols.content.forEach((child, _, index) => {\n if (\n child.eq(columnNode.node) &&\n child?.attrs?.columnId === columnNode.node?.attrs?.columnId\n ) {\n currColumnIndex = index;\n }\n });\n\n const nextColumnIndex =\n type === 'next' ? currColumnIndex + 1 : currColumnIndex - 1;\n // if the next column index is out of bounds, return\n if (nextColumnIndex < 0 || nextColumnIndex >= cols.childCount) {\n return false;\n }\n\n let nextColumnPos = columnsNode.pos;\n cols.content.forEach((child, _, index) => {\n if (index < nextColumnIndex) {\n nextColumnPos += child.nodeSize;\n }\n });\n\n const tr = state.tr.setTime(Date.now());\n const textSelection = TextSelection.near(tr.doc.resolve(nextColumnPos));\n tr.setSelection(textSelection);\n\n dispatch(tr);\n return true;\n}\n\nexport function updateColumnWidth(\n editor: Editor,\n index: number,\n width: string = 'auto'\n) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n const { selection } = state;\n\n const beforeNodeEnd = columnsNodePos + columnsNode.nodeSize;\n const selectionRelative = {\n from: selection.from - columnsNodePos,\n to: selection.to - columnsNodePos,\n };\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: i === index ? width : child?.attrs?.width,\n },\n child.content\n )\n );\n });\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n beforeNodeEnd,\n updatedColumnsNode\n );\n\n const newSelection = TextSelection.create(\n transaction.doc,\n columnsNodePos + selectionRelative.from,\n columnsNodePos + selectionRelative.to\n );\n\n dispatch(transaction.setSelection(newSelection));\n return true;\n}\n\nexport function addColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n // If the index is out of bounds, append the column to the end\n // of the columns node\n const columnIndex = index < 0 ? columnsNode.childCount : index;\n // Keep the original width of the columns\n // and set the new column width to auto\n const { state } = editor.view;\n const newColumn = state.schema.nodes.column.create(\n {\n width: DEFAULT_COLUMN_WIDTH,\n columnId: uuidv4(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n // append the new column to the columns node\n // at the specified index\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(child);\n if (i === columnIndex) {\n updatedContent.push(newColumn);\n }\n });\n\n if (index === -1) {\n updatedContent.push(newColumn);\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = state.tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the new column\n // if the index is out of bounds, set the selection\n // to the last column\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, columnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n editor.view.dispatch(transaction);\n return true;\n}\n\nexport function removeColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n if (i !== index) {\n updatedContent.push(child);\n }\n });\n\n if (index === -1) {\n updatedContent.pop();\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the next column\n // if the index is out of bounds, set the selection\n // to the last column\n const nextColumnIndex =\n index === columnsNode.childCount - 1 ? index - 1 : index;\n const nextColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, nextColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(nextColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n return true;\n}\n\nexport function getColumnWidths(editor: Editor): {\n id: string;\n width: string;\n}[] {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return [];\n }\n\n const columnsWidth: { id: string; width: string }[] = [];\n columnsNode.content.forEach((child) => {\n const { columnId, width } = child.attrs;\n columnsWidth.push({ id: columnId, width });\n });\n\n return columnsWidth;\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { Node, mergeAttributes } from '@tiptap/core';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const DEFAULT_COLUMN_WIDTH = 'auto';\n\nexport type AllowedColumnVerticalAlign = 'top' | 'middle' | 'bottom';\nexport const DEFAULT_COLUMN_VERTICAL_ALIGN: AllowedColumnVerticalAlign = 'top';\n\ninterface ColumnAttributes {\n verticalAlign: AllowedColumnVerticalAlign;\n backgroundColor: string;\n borderRadius: number;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n column: {\n updateColumn: (attrs: Partial<ColumnAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnExtension = Node.create({\n name: 'column',\n content: 'block+',\n isolating: true,\n\n addAttributes() {\n return {\n columnId: {\n default: null,\n parseHTML: (element) =>\n element.getAttribute('data-column-id') || uuidv4(),\n renderHTML: (attributes) => {\n if (!attributes.columnId) {\n return {\n 'data-column-id': uuidv4(),\n };\n }\n\n return {\n 'data-column-id': attributes.columnId,\n };\n },\n },\n width: {\n default: DEFAULT_COLUMN_WIDTH,\n parseHTML: (element) =>\n element.style.width.replace(/['\"]+/g, '') || DEFAULT_COLUMN_WIDTH,\n renderHTML: (attributes) => {\n if (!attributes.width || attributes.width === DEFAULT_COLUMN_WIDTH) {\n return {};\n }\n\n return {\n style: `width: ${attributes.width}%;max-width:${attributes.width}%`,\n };\n },\n },\n verticalAlign: {\n default: DEFAULT_COLUMN_VERTICAL_ALIGN,\n parseHTML: (element) => element?.style?.verticalAlign || 'top',\n renderHTML: (attributes) => {\n const { verticalAlign } = attributes;\n if (\n !verticalAlign ||\n verticalAlign === DEFAULT_COLUMN_VERTICAL_ALIGN\n ) {\n return {};\n }\n\n if (verticalAlign === 'middle') {\n return {\n style: `display: flex;flex-direction: column;justify-content: center;`,\n };\n } else if (verticalAlign === 'bottom') {\n return {\n style: `display: flex;flex-direction: column;justify-content: flex-end;`,\n };\n }\n },\n },\n };\n },\n\n addCommands() {\n return {\n updateColumn: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'column',\n class: 'hide-scrollbars',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"column\"]',\n },\n ];\n },\n});\n","import { goToColumn } from '@/editor/utils/columns';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes } from '@tiptap/core';\nimport { Node } from '@tiptap/core';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const DEFAULT_COLUMNS_GAP = 8;\n\ninterface ColumnsAttributes {\n showIfKey: string;\n gap: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n setColumns: () => ReturnType;\n updateColumns: (attrs: Partial<ColumnsAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnsExtension = Node.create({\n name: 'columns',\n group: 'columns',\n content: 'column+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n gap: {\n default: DEFAULT_COLUMNS_GAP,\n parseHTML: (element) => {\n return Number(element.style.gap) || DEFAULT_COLUMNS_GAP;\n },\n renderHTML(attributes) {\n if (!attributes.gap) {\n return {};\n }\n\n return {\n style: `gap: ${attributes.gap}px`,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setColumns:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'column',\n attrs: {\n columnId: uuidv4(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: uuidv4(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n ],\n });\n },\n updateColumns: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'columns',\n class: 'mly-relative',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"columns\"]',\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => {\n return goToColumn(this.editor, 'next');\n },\n 'Shift-Tab': () => {\n return goToColumn(this.editor, 'previous');\n },\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { ButtonView } from './button-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { AllowedLogoAlignment } from '../logo/logo';\n\nexport const DEFAULT_BUTTON_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_BUTTON_VARIANT: AllowedButtonVariant = 'filled';\nexport const DEFAULT_BUTTON_BORDER_RADIUS: AllowedButtonBorderRadius = 'smooth';\nexport const DEFAULT_BUTTON_BACKGROUND_COLOR = '#000000';\nexport const DEFAULT_BUTTON_TEXT_COLOR = '#ffffff';\n\nexport const DEFAULT_BUTTON_PADDING_TOP = 10;\nexport const DEFAULT_BUTTON_PADDING_RIGHT = 32;\nexport const DEFAULT_BUTTON_PADDING_BOTTOM = 10;\nexport const DEFAULT_BUTTON_PADDING_LEFT = 32;\n\nexport const allowedButtonVariant = ['filled', 'outline'] as const;\nexport type AllowedButtonVariant = (typeof allowedButtonVariant)[number];\n\nexport const allowedButtonBorderRadius = ['sharp', 'smooth', 'round'] as const;\nexport type AllowedButtonBorderRadius =\n (typeof allowedButtonBorderRadius)[number];\n\nexport type ButtonAttributes = {\n text: string;\n isTextVariable: boolean;\n\n url: string;\n isUrlVariable: boolean;\n\n alignment: AllowedLogoAlignment;\n variant: AllowedButtonVariant;\n borderRadius: AllowedButtonBorderRadius;\n buttonColor: string;\n textColor: string;\n\n showIfKey: string;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n button: {\n setButton: () => ReturnType;\n updateButton: (attrs: Partial<ButtonAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ButtonExtension = Node.create({\n name: 'button',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n text: {\n default: 'Button',\n parseHTML: (element) => {\n return element.getAttribute('data-text') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-text': attributes.text,\n };\n },\n },\n isTextVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-text-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isTextVariable) {\n return {};\n }\n\n return {\n 'data-is-text-variable': 'true',\n };\n },\n },\n\n url: {\n default: '',\n parseHTML: (element) => {\n return element.getAttribute('data-url') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-url': attributes.url,\n };\n },\n },\n // Later we will remove this attribute\n // and use the `url` attribute instead when implement\n // the URL variable feature\n isUrlVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-url-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isUrlVariable) {\n return {};\n }\n\n return {\n 'data-is-url-variable': 'true',\n };\n },\n },\n\n alignment: {\n default: DEFAULT_BUTTON_ALIGNMENT,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-alignment') || DEFAULT_BUTTON_ALIGNMENT\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n variant: {\n default: DEFAULT_BUTTON_VARIANT,\n parseHTML: (element) => {\n return element.getAttribute('data-variant') || DEFAULT_BUTTON_VARIANT;\n },\n renderHTML: (attributes) => {\n return {\n 'data-variant': attributes.variant,\n };\n },\n },\n borderRadius: {\n default: DEFAULT_BUTTON_BORDER_RADIUS,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-border-radius') ||\n DEFAULT_BUTTON_BORDER_RADIUS\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-border-radius': attributes.borderRadius,\n };\n },\n },\n buttonColor: {\n default: DEFAULT_BUTTON_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-button-color') ||\n DEFAULT_BUTTON_BACKGROUND_COLOR\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-button-color': attributes.buttonColor,\n };\n },\n },\n textColor: {\n default: DEFAULT_BUTTON_TEXT_COLOR,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-text-color') || DEFAULT_BUTTON_TEXT_COLOR\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-text-color': attributes.textColor,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n\n paddingTop: {\n default: DEFAULT_BUTTON_PADDING_TOP,\n parseHTML: (element) => {\n return parseInt(\n element.getAttribute('data-padding-top') ||\n DEFAULT_BUTTON_PADDING_TOP.toString(),\n 10\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-padding-top': attributes.paddingTop,\n };\n },\n },\n paddingRight: {\n default: DEFAULT_BUTTON_PADDING_RIGHT,\n parseHTML: (element) => {\n return parseInt(\n element.getAttribute('data-padding-right') ||\n DEFAULT_BUTTON_PADDING_RIGHT.toString(),\n 10\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-padding-right': attributes.paddingRight,\n };\n },\n },\n paddingBottom: {\n default: DEFAULT_BUTTON_PADDING_BOTTOM,\n parseHTML: (element) => {\n return parseInt(\n element.getAttribute('data-padding-bottom') ||\n DEFAULT_BUTTON_PADDING_BOTTOM.toString(),\n 10\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-padding-bottom': attributes.paddingBottom,\n };\n },\n },\n paddingLeft: {\n default: DEFAULT_BUTTON_PADDING_LEFT,\n parseHTML: (element) => {\n return parseInt(\n element.getAttribute('data-padding-left') ||\n DEFAULT_BUTTON_PADDING_LEFT.toString(),\n 10\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-padding-left': attributes.paddingLeft,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n ];\n },\n\n addCommands() {\n return {\n setButton:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [],\n });\n },\n updateButton: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ButtonView, {\n contentDOMElementTag: 'div',\n className: 'mly-relative',\n });\n },\n});\n","import { AlignCenter, AlignLeft, AlignRight } from 'lucide-react';\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { AllowedLogoAlignment, allowedLogoAlignment } from '../nodes/logo/logo';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { cn } from '../utils/classname';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\ntype AlignmentSwitchProps = {\n alignment: AllowedLogoAlignment;\n onAlignmentChange: (alignment: AllowedLogoAlignment) => void;\n};\n\nexport function AlignmentSwitch(props: AlignmentSwitchProps) {\n const { alignment: rawAlignment, onAlignmentChange } = props;\n const alignment = allowedLogoAlignment.includes(\n rawAlignment as AllowedLogoAlignment\n )\n ? rawAlignment\n : 'left';\n\n const alignments = {\n left: {\n icon: AlignLeft,\n tooltip: 'Align Left',\n onClick: () => {\n onAlignmentChange('left');\n },\n },\n center: {\n icon: AlignCenter,\n tooltip: 'Align Center',\n onClick: () => {\n onAlignmentChange('center');\n },\n },\n right: {\n icon: AlignRight,\n tooltip: 'Align Right',\n onClick: () => {\n onAlignmentChange('right');\n },\n },\n };\n\n const activeAlignment = alignments[alignment];\n\n return (\n <Popover>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly-flex mly-size-7 mly-items-center mly-justify-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2'\n )}\n >\n <activeAlignment.icon className=\"mly-h-3 mly-w-3 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Alignment</TooltipContent>\n </Tooltip>\n <PopoverContent\n className=\"mly-flex mly-w-max mly-gap-0.5 mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"center\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n {Object.entries(alignments).map(([key, value]) => {\n return (\n <BubbleMenuButton\n key={key}\n icon={value.icon}\n tooltip={value.tooltip}\n command={value.onClick}\n isActive={() => key === alignment}\n />\n );\n })}\n </PopoverContent>\n </Popover>\n );\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../utils/classname';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?:\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'\n | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst BaseButton = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : 'button';\n const baseClass =\n 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 focus-visible:mly-relative focus-visible:mly-z-10 disabled:mly-opacity-50 ';\n const variantClasses = {\n default: 'mly-bg-gray-900 mly-text-gray-50 hover:mly-bg-soft-gray',\n destructive: 'mly-bg-red-500 mly-text-gray-50 hover:mly-bg-red-500/90',\n outline:\n 'mly-border mly-border-gray-200 mly-bg-white hover:mly-bg-gray-100 hover:mly-text-gray-900',\n secondary: 'mly-bg-gray-100 mly-text-gray-900 hover:mly-bg-gray-100/80',\n ghost:\n 'hover:mly-bg-soft-gray bg-transparent hover:mly-text-gray-900 data-[state=true]:mly-bg-soft-gray data-[state=true]:mly-text-gray-900',\n link: 'mly-text-gray-900 mly-underline-offset-4 hover:mly-underline',\n };\n const sizeClasses = {\n default: 'mly-h-10 mly-px-4 mly-py-2',\n sm: 'mly-h-9 mly-rounded-md mly-px-3',\n lg: 'mly-h-11 mly-rounded-md mly-px-8',\n icon: 'mly-h-10 mly-w-10',\n };\n\n const classes = cn(\n 'mly-editor',\n baseClass,\n variantClasses[variant],\n sizeClasses[size],\n className\n );\n\n return <Comp className={classes} ref={ref} {...props} />;\n }\n);\n\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '@/editor/utils/classname';\n\n// Explicit type annotations to avoid TS2742 errors\nconst TooltipProvider: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>\n> = TooltipPrimitive.Provider;\n\nconst Tooltip: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>\n> = TooltipPrimitive.Root;\n\nconst TooltipTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>\n> = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'mly-z-50 mly-overflow-hidden mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-2 mly-py-1 mly-text-xs mly-animate-in mly-fade-in-0 mly-zoom-in-95',\n className\n )}\n {...props}\n />\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n>;\n\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { BaseButton } from '@/editor/components/base-button';\nimport { cn } from '@/editor/utils/classname';\nimport { BubbleMenuItem } from './text-menu/text-bubble-menu';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\nexport function BubbleMenuButton(item: BubbleMenuItem) {\n const { tooltip } = item;\n\n const content = (\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n {...(item.command ? { onClick: item.command } : {})}\n data-state={item?.isActive?.()}\n className={cn(\n '!mly-size-7 mly-px-2.5 disabled:mly-cursor-not-allowed',\n item?.className\n )}\n type=\"button\"\n disabled={item.disbabled}\n >\n {item.icon ? (\n <item.icon\n className={cn(\n 'mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]',\n item?.iconClassName\n )}\n />\n ) : (\n <span\n className={cn(\n 'mly-text-sm mly-font-medium mly-text-slate-600',\n item?.nameClassName\n )}\n >\n {item.name}\n </span>\n )}\n </BaseButton>\n );\n\n if (tooltip) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n }\n\n return content;\n}\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { LogoView } from './logo-view';\n\nexport const allowedLogoSize = ['sm', 'md', 'lg'] as const;\nexport type AllowedLogoSize = (typeof allowedLogoSize)[number];\n\nexport const allowedLogoAlignment = ['left', 'center', 'right'] as const;\nexport type AllowedLogoAlignment = (typeof allowedLogoAlignment)[number];\n\ninterface LogoOptions {\n src: string;\n alt?: string;\n title?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n}\n\nexport interface LogoAttributes {\n src?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n\n showIfKey: string;\n isSrcVariable?: boolean;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n logo: {\n setLogoImage: (options: LogoOptions) => ReturnType;\n setLogoAttributes: (attributes: Partial<LogoAttributes>) => ReturnType;\n };\n }\n}\n\nconst DEFAULT_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_LOGO_SIZE: AllowedLogoSize = 'sm';\n\nexport const logoSizes: Record<AllowedLogoSize, string> = {\n sm: '40px',\n md: '48px',\n lg: '64px',\n};\n\nexport const LogoExtension = TiptapImage.extend({\n name: 'logo',\n priority: 1000,\n\n addAttributes() {\n return {\n ...this.parent?.(),\n 'maily-component': {\n default: 'logo',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element: Element) =>\n element.getAttribute('data-maily-component'),\n },\n size: {\n default: DEFAULT_LOGO_SIZE,\n parseHTML: (element) =>\n element.getAttribute('data-size') as AllowedLogoSize,\n renderHTML: (attributes) => {\n return {\n 'data-size': attributes.size,\n };\n },\n },\n alignment: {\n default: DEFAULT_ALIGNMENT,\n parseHTML: (element) =>\n element.getAttribute('data-alignment') as AllowedLogoAlignment,\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n };\n },\n addCommands() {\n return {\n setLogoImage:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n setLogoAttributes:\n (attributes) =>\n ({ commands }) => {\n return commands.updateAttributes('logo', attributes);\n },\n };\n },\n parseHTML() {\n return [\n {\n tag: `img[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n addNodeView() {\n return ReactNodeViewRenderer(LogoView, {\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { useCallback, useEffect } from 'react';\nimport { useState } from 'react';\nimport { LogoAttributes, logoSizes } from './logo';\nimport { ImageStatus, ImageStatusLabel } from '../image/image-view';\nimport { useImageUploadOptions } from '@/editor/extensions/image-upload/image-upload';\nimport { cn } from '@/editor/utils/classname';\n\nexport function LogoView(props: NodeViewProps) {\n const { node, editor, updateAttributes } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n const [isPlaceholderImage, setIsPlaceholderImage] = useState(false);\n const [isDraggingOver, setIsDraggingOver] = useState(false);\n\n const { onImageUpload, allowedMimeTypes = [] } =\n useImageUploadOptions(editor);\n\n let {\n alignment = 'center',\n src: logoSrc,\n isSrcVariable,\n size = 'sm',\n } = (node.attrs || {}) as LogoAttributes;\n\n const hasImageSrc = !!logoSrc;\n const isDroppable =\n !!onImageUpload && editor.isEditable && !isSrcVariable && status === 'idle';\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isDroppable || !e.target.files || e.target.files.length === 0) {\n return;\n }\n\n const file = e.target.files[0];\n await handleImageUpload(file);\n };\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n if (!isDroppable) {\n return;\n }\n\n try {\n setStatus('loading');\n const imageUrl = await onImageUpload(file);\n updateAttributes({ src: imageUrl });\n setIsPlaceholderImage(false);\n setStatus('loaded');\n } catch (error) {\n console.error('Error uploading image:', error);\n setStatus('error');\n }\n },\n [onImageUpload, updateAttributes]\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(true);\n },\n [onImageUpload]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n },\n [onImageUpload]\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n const files = e.dataTransfer?.files;\n if (!files || files?.length === 0) {\n return;\n }\n\n const firstFile = files[0];\n if (!allowedMimeTypes.includes(firstFile.type)) {\n return;\n }\n\n await handleImageUpload(firstFile);\n },\n [handleImageUpload]\n );\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!logoSrc) {\n return;\n }\n\n setStatus('loading');\n const isPlaceHolder =\n editor?.extensionStorage?.imageUpload?.placeholderImages?.has(logoSrc) ??\n false;\n setIsPlaceholderImage(isPlaceHolder);\n const img = new Image();\n img.src = logoSrc;\n img.onload = () => {\n setStatus('loaded');\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [logoSrc]);\n\n const logoSize = logoSizes[size];\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n style={{\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n }}\n className={cn('mly-image-drop-zone', isDraggingOver && 'mly-drag-over')}\n {...(isDroppable\n ? {\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n }\n : {})}\n >\n {!hasImageSrc && status === 'idle' && (\n <ImageStatusLabel\n status=\"idle\"\n minHeight={logoSize}\n isDropZone={isDroppable}\n />\n )}\n\n {!hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={logoSize} />\n )}\n\n {hasImageSrc && isSrcVariable && (\n <ImageStatusLabel status=\"variable\" minHeight={logoSize} />\n )}\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={logoSize} />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" minHeight={logoSize} />\n )}\n\n {isDroppable && (\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"mly-absolute mly-inset-0 mly-opacity-0\"\n multiple={false}\n />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <img\n src={logoSrc}\n alt=\"Logo\"\n style={{\n height: logoSize,\n width: logoSize,\n cursor: 'default',\n marginBottom: 0,\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment] || {}),\n }}\n draggable={editor.isEditable}\n />\n )}\n </NodeViewWrapper>\n );\n}\n","import {\n type CSSProperties,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { type NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Ban, BracesIcon, GrabIcon, ImageOffIcon, Loader2 } from 'lucide-react';\nimport { useImageUploadOptions } from '@/editor/extensions/image-upload/image-upload';\nimport { cn } from '@/editor/utils/classname';\nimport { useEvent } from '@/editor/utils/use-event';\nimport { getAspectRatio, getNewHeight } from '@/editor/utils/aspect-ratio';\n\nconst MIN_WIDTH = 20;\nexport const IMAGE_MAX_WIDTH = 600;\nexport const IMAGE_MAX_HEIGHT = 400;\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport function ImageView(props: NodeViewProps) {\n const { node, updateAttributes, selected, editor } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n const [isPlaceholderImage, setIsPlaceholderImage] = useState(false);\n\n const { onImageUpload, allowedMimeTypes = [] } =\n useImageUploadOptions(editor);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const [resizingStyle, setResizingStyle] = useState<\n Pick<CSSProperties, 'width' | 'height'> | undefined\n >();\n\n const [isDraggingOver, setIsDraggingOver] = useState(false);\n\n const handleMouseDown = useEvent(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const imageParent = document.querySelector(\n '.ProseMirror-selectednode'\n ) as HTMLDivElement;\n\n if (!imgRef.current || !imageParent || !selected) {\n return;\n }\n\n const imageParentWidth = Math.max(\n imageParent.offsetWidth,\n IMAGE_MAX_WIDTH\n );\n\n event.preventDefault();\n const direction = event.currentTarget.dataset.direction || '--';\n const initialXPosition = event.clientX;\n const initialYPosition = event.clientY;\n const currentWidth = imgRef.current.width;\n const currentHeight = imgRef.current.height;\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n const transformX = direction[1] === 'w' ? -1 : 1;\n const transformY = direction[0] === 'n' ? -1 : 1;\n\n const removeListeners = () => {\n window.removeEventListener('mousemove', mouseMoveHandler);\n window.removeEventListener('mouseup', removeListeners);\n const aspectRatio = getAspectRatio(newWidth, newHeight);\n updateAttributes({ width: newWidth, height: newHeight, aspectRatio });\n setResizingStyle(undefined);\n };\n\n const mouseMoveHandler = (event: MouseEvent) => {\n newWidth = Math.max(\n currentWidth + transformX * (event.clientX - initialXPosition),\n MIN_WIDTH\n );\n newHeight = Math.max(\n currentHeight + transformY * (event.clientY - initialYPosition),\n MIN_WIDTH\n );\n\n if (newWidth > imageParentWidth) {\n newWidth = imageParentWidth;\n }\n if (newHeight > IMAGE_MAX_HEIGHT) {\n newHeight = IMAGE_MAX_HEIGHT;\n }\n\n // If aspect ratio is locked, calculate height based on aspect ratio\n if (node.attrs.lockAspectRatio) {\n newHeight = getNewHeight(newWidth, node.attrs.aspectRatio);\n }\n\n setResizingStyle({ width: newWidth, height: newHeight });\n // If mouse is up, remove event listeners\n if (!event.buttons) {\n return removeListeners();\n }\n };\n\n window.addEventListener('mousemove', mouseMoveHandler);\n window.addEventListener('mouseup', removeListeners);\n }\n );\n\n const dragCornerButton = useCallback(\n (direction: string) => {\n if (isPlaceholderImage) {\n return null;\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onMouseDown={handleMouseDown}\n data-direction={direction}\n className=\"mly-bg-rose-500\"\n style={{\n position: 'absolute',\n height: '10px',\n width: '10px',\n ...{ n: { top: 0 }, s: { bottom: 0 } }[direction[0]],\n ...{ w: { left: 0 }, e: { right: 0 } }[direction[1]],\n cursor: `${direction}-resize`,\n }}\n />\n );\n },\n [handleMouseDown, isPlaceholderImage]\n );\n\n let {\n alignment = 'center',\n width,\n height,\n src,\n borderRadius,\n } = node.attrs || {};\n\n const {\n externalLink,\n isExternalLinkVariable,\n isSrcVariable,\n showIfKey,\n aspectRatio: defaultAspectRatio,\n borderRadius: _,\n lockAspectRatio,\n ...attrs\n } = node.attrs || {};\n\n const hasImageSrc = !!attrs.src;\n const isDroppable =\n !!onImageUpload &&\n editor.isEditable &&\n !hasImageSrc &&\n !isSrcVariable &&\n status === 'idle';\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isDroppable || !e.target.files || e.target.files.length === 0) {\n return;\n }\n\n const file = e.target.files[0];\n await handleImageUpload(file);\n };\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n if (!isDroppable) {\n return;\n }\n\n try {\n setStatus('loading');\n const imageUrl = await onImageUpload(file);\n updateAttributes({ src: imageUrl });\n setIsPlaceholderImage(false);\n setStatus('loaded');\n } catch (error) {\n console.error('Error uploading image:', error);\n setStatus('error');\n }\n },\n [onImageUpload, updateAttributes]\n );\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!src || isSrcVariable) {\n return;\n }\n\n setStatus('loading');\n const isPlaceHolder =\n editor?.extensionStorage?.imageUpload?.placeholderImages?.has(src) ??\n false;\n setIsPlaceholderImage(isPlaceHolder);\n const img = new Image();\n img.src = src;\n img.onload = () => {\n setStatus('loaded');\n // for some reason Apple Mail doesn't respect the width and height attributes\n // update the dimensions to ensure that the image is not stretched\n const { naturalWidth, naturalHeight } = img;\n const wrapper = wrapperRef?.current;\n\n if (!wrapper || width !== 'auto' || !naturalWidth) {\n return;\n }\n\n const wrapperWidth = wrapper.offsetWidth;\n const aspectRatio = getAspectRatio(naturalWidth, naturalHeight);\n const calculatedHeight = Math.min(\n getNewHeight(wrapperWidth, aspectRatio),\n naturalHeight\n );\n\n updateAttributes({\n width: Math.min(wrapperWidth, naturalWidth),\n height: Math.min(calculatedHeight, naturalHeight),\n aspectRatio,\n });\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [src]);\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(true);\n },\n [onImageUpload]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n },\n [onImageUpload]\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n const files = e.dataTransfer?.files;\n if (!files || files?.length === 0) {\n return;\n }\n\n const firstFile = files[0];\n if (!allowedMimeTypes.includes(firstFile.type)) {\n return;\n }\n\n await handleImageUpload(firstFile);\n },\n [handleImageUpload]\n );\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n className={cn('mly-image-drop-zone', isDraggingOver && 'mly-drag-over')}\n style={{\n ...(hasImageSrc && status === 'loaded'\n ? {\n width: width ? `${width}px` : undefined,\n height: height ? `${height}px` : undefined,\n ...resizingStyle,\n }\n : {}),\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n maxWidth: '100%',\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment as string] || {}),\n }}\n ref={wrapperRef}\n {...(isDroppable\n ? {\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n }\n : {})}\n >\n {!hasImageSrc && status === 'idle' && (\n <ImageStatusLabel\n status=\"idle\"\n minHeight={height}\n isDropZone={isDroppable}\n />\n )}\n\n {!hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={height} />\n )}\n\n {hasImageSrc && isSrcVariable && (\n <ImageStatusLabel status=\"variable\" minHeight={height} />\n )}\n\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={height} />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" minHeight={height} />\n )}\n\n {isDroppable && (\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"mly-absolute mly-inset-0 mly-opacity-0\"\n multiple={false}\n />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <>\n <img\n {...attrs}\n ref={imgRef}\n style={{\n ...resizingStyle,\n cursor: 'default',\n objectFit: 'fill',\n marginBottom: 0,\n borderRadius,\n width: resizingStyle?.width\n ? `${resizingStyle.width}px`\n : width\n ? `${width}px`\n : 'auto',\n height: resizingStyle?.height\n ? `${resizingStyle.height}px`\n : height\n ? `${height}px`\n : 'auto',\n }}\n draggable={editor.isEditable}\n className={cn(\n isPlaceholderImage && 'mly-animate-pulse mly-opacity-40'\n )}\n />\n\n {selected && editor.isEditable && !isPlaceholderImage && (\n <>\n {/* Don't use a simple border as it pushes other content around. */}\n {[\n { left: 0, top: 0, height: '100%', width: '1px' },\n { right: 0, top: 0, height: '100%', width: '1px' },\n { top: 0, left: 0, width: '100%', height: '1px' },\n { bottom: 0, left: 0, width: '100%', height: '1px' },\n ].map((style, i) => (\n <div\n key={i}\n className=\"mly-bg-rose-500\"\n style={{\n position: 'absolute',\n ...style,\n }}\n />\n ))}\n {dragCornerButton('nw')}\n {dragCornerButton('ne')}\n {dragCornerButton('sw')}\n {dragCornerButton('se')}\n </>\n )}\n </>\n )}\n </NodeViewWrapper>\n );\n}\n\ntype ImageStatusLabelProps = {\n status: ImageStatus | 'variable';\n minHeight?: number | string;\n isDropZone?: boolean;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nexport function ImageStatusLabel(props: ImageStatusLabelProps) {\n const { status, minHeight, className, style, isDropZone, ...rest } = props;\n\n return (\n <div\n {...rest}\n className={cn(\n 'mly-flex mly-items-center mly-justify-center mly-gap-2 mly-rounded-lg mly-bg-soft-gray mly-px-4 mly-py-2 mly-text-sm mly-font-medium',\n {\n 'mly-text-gray-500 hover:mly-bg-soft-gray/60': status === 'loading',\n 'mly-text-red-500 hover:mly-bg-soft-gray/60': status === 'error',\n },\n className\n )}\n style={{\n ...(minHeight\n ? {\n minHeight,\n }\n : {}),\n ...style,\n }}\n >\n {status === 'idle' && !isDropZone && (\n <>\n <ImageOffIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>No image selected</span>\n </>\n )}\n\n {status === 'idle' && isDropZone && (\n <>\n <GrabIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Click or Drop image here</span>\n </>\n )}\n\n {status === 'loading' && (\n <>\n <Loader2 className=\"mly-size-4 mly-animate-spin mly-stroke-[2.5]\" />\n <span>Loading image...</span>\n </>\n )}\n {status === 'error' && (\n <>\n <Ban className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Error loading image</span>\n </>\n )}\n {status === 'variable' && (\n <>\n <BracesIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Variable Image URL</span>\n </>\n )}\n </div>\n );\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react';\n\nexport const useEvent = <T extends (...args: any[]) => any>(handler: T): T => {\n const handlerRef = useRef<T | null>(null);\n\n useLayoutEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n return useCallback((...args: Parameters<T>): ReturnType<T> => {\n if (handlerRef.current === null) {\n throw new Error('Handler is not assigned');\n }\n return handlerRef.current(...args);\n }, []) as T;\n};\n","/**\n * Calculates the aspect ratio from image dimensions\n * @param width - The width of the image\n * @param height - The height of the image\n * @returns The aspect ratio as width/height\n */\nexport function getAspectRatio(width: number, height: number): number {\n return width / height;\n}\n\n/**\n * Calculates new height based on width and aspect ratio\n * @param width - The new width\n * @param aspectRatio - The aspect ratio (width/height)\n * @returns The corresponding height\n */\nexport function getNewHeight(width: number, aspectRatio: number): number {\n if (width <= 0 || aspectRatio <= 0) {\n return 0;\n }\n return width / aspectRatio;\n}\n\n/**\n * Calculates new width based on height and aspect ratio\n * @param height - The new height\n * @param aspectRatio - The aspect ratio (width/height)\n * @returns The corresponding width\n */\nexport function getNewWidth(height: number, aspectRatio: number): number {\n return height * aspectRatio;\n}\n","import { Editor } from '@tiptap/core';\nimport { Eye, InfoIcon } from 'lucide-react';\nimport { memo, useMemo, useRef, useState } from 'react';\nimport { cn } from '../utils/classname';\nimport { useVariableOptions } from '../utils/node-options';\nimport { processVariables } from '../utils/variable';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { InputAutocomplete } from './ui/input-autocomplete';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\ntype ShowPopoverProps = {\n showIfKey?: string;\n onShowIfKeyValueChange?: (when: string) => void;\n\n editor: Editor;\n};\n\nfunction _ShowPopover(props: ShowPopoverProps) {\n const { showIfKey = '', onShowIfKeyValueChange, editor } = props;\n\n const opts = useVariableOptions(editor);\n const variables = opts?.variables;\n const renderVariable = opts?.renderVariable;\n const [isUpdatingKey, setIsUpdatingKey] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const autoCompleteOptions = useMemo(() => {\n return processVariables(variables, {\n query: showIfKey || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, showIfKey, editor]);\n\n const isValidWhenKey = showIfKey || autoCompleteOptions.includes(showIfKey);\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (open) {\n return;\n }\n\n setIsUpdatingKey(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly-flex mly-size-7 mly-items-center mly-justify-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2',\n showIfKey &&\n 'mly-bg-rose-100 mly-text-rose-800 data-[state=open]:mly-bg-rose-100 hover:mly-bg-rose-100'\n )}\n >\n <Eye className=\"mly-h-3 mly-w-3 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Show block conditionally</TooltipContent>\n </Tooltip>\n <PopoverContent\n className=\"mly-flex mly-w-max mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"end\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <div className=\"mly-flex mly-items-center mly-gap-1.5 mly-px-1.5 mly-text-sm mly-leading-none\">\n Show if\n <Tooltip>\n <TooltipTrigger>\n <InfoIcon\n className={cn('mly-size-3 mly-stroke-[2.5] mly-text-gray-500')}\n />\n </TooltipTrigger>\n <TooltipContent\n sideOffset={14}\n className=\"mly-max-w-[285px]\"\n align=\"start\"\n >\n Show the block if the selected variable is true.\n </TooltipContent>\n </Tooltip>\n </div>\n\n {!isUpdatingKey && (\n <button\n onClick={() => {\n setIsUpdatingKey(true);\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: showIfKey,\n valid: !!isValidWhenKey,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n {isUpdatingKey && (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setIsUpdatingKey(false);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setIsUpdatingKey(false);\n }\n }}\n >\n <InputAutocomplete\n editor={editor}\n value={showIfKey || ''}\n onValueChange={(value) => {\n onShowIfKeyValueChange?.(value);\n }}\n onOutsideClick={() => {\n setIsUpdatingKey(false);\n }}\n onSelectOption={(value) => {\n onShowIfKeyValueChange?.(value);\n setIsUpdatingKey(false);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={inputRef}\n />\n </form>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport const ShowPopover = memo(_ShowPopover);\n","import type { Editor } from '@tiptap/core';\nimport { type VariableOptions } from '@/editor/nodes/variable/variable';\nimport { useMemo } from 'react';\n\nexport function getNodeOptions<T extends Record<string, unknown>>(\n editor: Editor,\n name: string\n): T {\n const node = editor.extensionManager.extensions.find(\n (extension) => extension.name === name\n );\n\n if (!node) {\n throw new Error(`Node ${name} not found`);\n }\n\n return node.options as T;\n}\n\nexport function getVariableOptions(editor: Editor) {\n return getNodeOptions<VariableOptions>(editor, 'variable');\n}\n\nexport function useVariableOptions(editor: Editor) {\n return useMemo(() => {\n return getVariableOptions(editor);\n }, [editor]);\n}\n","import type {\n VariableFunctionOptions,\n Variables,\n Variable,\n} from '@/extensions';\n\nexport function processVariables(\n variables: Variables,\n options: VariableFunctionOptions\n): Array<Variable> {\n const { query } = options;\n const queryLower = query.toLowerCase();\n\n let filteredVariables: Array<Variable> = [];\n if (Array.isArray(variables)) {\n filteredVariables = variables.filter((variable) =>\n variable.name.toLowerCase().startsWith(queryLower)\n );\n\n if (\n query.length > 0 &&\n !filteredVariables.some((variable) => variable.name === query)\n ) {\n filteredVariables.push({ name: query, required: true });\n }\n\n return filteredVariables;\n } else if (typeof variables === 'function') {\n return variables(options);\n } else {\n throw new Error(`Invalid variables type. Expected 'Array' or 'Function', but received '${typeof variables}'.\n\nYou can check out the documentation for more information: https://github.com/arikchakma/maily.to/blob/main/packages/core/readme.md`);\n }\n}\n","import { useCallback } from 'react';\nimport { useEffect } from 'react';\nimport { RefObject } from 'react';\n\nexport function useOutsideClick(\n ref: RefObject<HTMLElement>,\n callback: () => void\n) {\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n callback();\n }\n },\n [ref, callback]\n );\n\n useEffect(() => {\n document.addEventListener('mousedown', handleClick);\n document.addEventListener('touchstart', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n document.removeEventListener('touchstart', handleClick);\n };\n }, [handleClick]);\n}\n","import { VariableSuggestionsPopoverRef } from '@/editor/nodes/variable/variable-suggestions-popover';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { useOutsideClick } from '@/editor/utils/use-outside-click';\nimport { Editor } from '@tiptap/core';\nimport { CornerDownLeft } from 'lucide-react';\nimport { forwardRef, HTMLAttributes, useRef } from 'react';\n\ntype InputAutocompleteProps = HTMLAttributes<HTMLInputElement> & {\n value: string;\n onValueChange: (value: string) => void;\n\n autoCompleteOptions?: string[];\n onSelectOption?: (option: string) => void;\n\n onOutsideClick?: () => void;\n triggerChar?: string;\n placeholder?: string;\n\n editor: Editor;\n};\n\nexport const InputAutocomplete = forwardRef<\n HTMLInputElement,\n InputAutocompleteProps\n>((props, ref) => {\n const {\n value = '',\n onValueChange,\n className,\n onOutsideClick,\n onSelectOption,\n autoCompleteOptions = [],\n triggerChar = '',\n editor,\n ...inputProps\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<VariableSuggestionsPopoverRef>(null);\n const VariableSuggestionPopoverComponent =\n useVariableOptions(editor)?.variableSuggestionsPopover;\n\n useOutsideClick(containerRef, () => {\n onOutsideClick?.();\n });\n\n const isTriggeringVariable = value.startsWith(triggerChar);\n\n return (\n <div className={cn('mly-relative')} ref={containerRef}>\n <label className=\"mly-relative\">\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n placeholder=\"e.g. items\"\n type=\"text\"\n {...inputProps}\n ref={ref}\n value={value}\n onChange={(e) => {\n onValueChange(e.target.value);\n }}\n className={cn(\n 'mly-h-7 mly-w-40 mly-rounded-md mly-bg-white mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray hover:mly-bg-soft-gray focus:mly-bg-soft-gray focus:mly-outline-none',\n className\n )}\n onKeyDown={(e) => {\n if (!popoverRef.current || !isTriggeringVariable) {\n return;\n }\n const { moveUp, moveDown, select } = popoverRef.current;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n moveDown();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n moveUp();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n spellCheck={false}\n />\n <div className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center\">\n <CornerDownLeft className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n </label>\n\n {isTriggeringVariable && (\n <div className=\"mly-absolute mly-left-0 mly-top-8\">\n <VariableSuggestionPopoverComponent\n items={autoCompleteOptions.map((option) => {\n return {\n name: option,\n };\n })}\n onSelectItem={(item) => {\n onSelectOption?.(item.name);\n }}\n ref={popoverRef}\n />\n </div>\n )}\n </div>\n );\n});\n\nInputAutocomplete.displayName = 'InputAutocomplete';\n","'use client';\n\nimport { HexColorPicker, HexColorInput } from 'react-colorful';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ReactNode } from 'react';\n\ntype ColorPickerProps = {\n color: string;\n onColorChange: (color: string) => void;\n\n borderColor?: string;\n backgroundColor?: string;\n tooltip?: string;\n className?: string;\n\n children?: ReactNode;\n onClose?: (color: string) => void;\n suggestedColors?: string[];\n};\n\nexport function ColorPicker(props: ColorPickerProps) {\n const {\n color,\n onColorChange,\n borderColor,\n backgroundColor,\n tooltip,\n className,\n\n children,\n onClose,\n\n suggestedColors = [],\n } = props;\n\n const handleColorChange = (color: string) => {\n // HACK: This is a workaround for a bug in tiptap\n // https://github.com/ueberdosis/tiptap/issues/3580\n //\n // ERROR: flushSync was called from inside a lifecycle\n //\n // To fix this, we need to make sure that the onChange\n // callback is run after the current execution context.\n queueMicrotask(() => {\n onColorChange(color);\n });\n };\n\n const popoverButton = (\n <PopoverTrigger asChild>\n {children || (\n <BaseButton\n variant=\"ghost\"\n className=\"!mly-size-7 mly-shrink-0\"\n size=\"sm\"\n type=\"button\"\n >\n <div\n className={cn(\n 'mly-h-4 mly-w-4 mly-shrink-0 mly-rounded mly-border-2 mly-border-gray-700',\n className\n )}\n style={{\n ...(borderColor ? { borderColor } : {}),\n backgroundColor: backgroundColor || 'transparent',\n }}\n />\n </BaseButton>\n )}\n </PopoverTrigger>\n );\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (!open) {\n onClose?.(color);\n }\n }}\n >\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n className=\"mly-w-full mly-rounded-none mly-border-0 !mly-bg-transparent !mly-p-0 mly-shadow-none mly-drop-shadow-md\"\n sideOffset={8}\n >\n <div className=\"mly-min-w-[260px] mly-rounded-xl mly-border mly-border-gray-200 mly-bg-white mly-p-4\">\n <HexColorPicker\n color={color}\n onChange={handleColorChange}\n className=\"mly-flex !mly-w-full mly-flex-col mly-gap-4\"\n />\n <HexColorInput\n alpha={true}\n color={color}\n onChange={handleColorChange}\n className=\"mly-mt-4 mly-w-full mly-min-w-0 mly-rounded-lg mly-border mly-border-gray-200 mly-bg-white mly-px-2 mly-py-1.5 mly-text-sm mly-uppercase focus-visible:mly-border-gray-400 focus-visible:mly-outline-none\"\n prefixed\n />\n\n {suggestedColors.length > 0 && (\n <div>\n <div className=\"-mly-mx-4 mly-my-4 mly-h-px mly-bg-gray-200\" />\n\n <h2 className=\"mly-text-xs mly-text-gray-500\">Recently used</h2>\n\n <div className=\"mly-mt-2 mly-flex mly-flex-wrap mly-gap-0.5\">\n {suggestedColors.map((suggestedColor) => (\n <BaseButton\n key={suggestedColor}\n variant=\"ghost\"\n size=\"sm\"\n className=\"!mly-size-7 mly-shrink-0\"\n type=\"button\"\n onClick={() => handleColorChange(suggestedColor)}\n >\n <div\n className=\"mly-h-4 mly-w-4 mly-shrink-0 mly-rounded\"\n style={{\n backgroundColor: suggestedColor,\n }}\n />\n </BaseButton>\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import { cn } from '@/editor/utils/classname';\n\ntype Props = {\n type?: 'horizontal' | 'vertical';\n className?: string;\n};\n\nexport function Divider(props: Props) {\n const { type = 'vertical', className } = props;\n\n return (\n <div\n className={cn(\n 'mly-shrink-0 mly-bg-gray-200',\n type === 'vertical' ? 'mly-mx-0.5 mly-w-px' : 'mly-my-0.5 mly-h-px',\n className\n )}\n />\n );\n}\n","import { Link, LinkIcon, LucideIcon } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { useRef, useState } from 'react';\nimport { Tooltip, TooltipTrigger, TooltipContent } from './tooltip';\nimport { DEFAULT_PLACEHOLDER_URL, useMailyContext } from '@/editor/provider';\nimport { InputAutocomplete } from './input-autocomplete';\nimport { processVariables } from '@/editor/utils/variable';\nimport { useMemo } from 'react';\nimport { Editor } from '@tiptap/core';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { DEFAULT_VARIABLE_TRIGGER_CHAR } from '@/editor/nodes/variable/variable';\n\ntype LinkInputPopoverProps = {\n defaultValue?: string;\n isVariable?: boolean;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n\n icon?: LucideIcon;\n tooltip?: string;\n\n editor: Editor;\n};\n\nexport function LinkInputPopover(props: LinkInputPopoverProps) {\n const {\n defaultValue = '',\n onValueChange,\n tooltip,\n icon: Icon = Link,\n editor,\n\n isVariable,\n } = props;\n\n const [isOpen, setIsOpen] = useState(false);\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n\n const { placeholderUrl = DEFAULT_PLACEHOLDER_URL } = useMailyContext();\n const options = useVariableOptions(editor);\n\n const renderVariable = options?.renderVariable;\n const variables = options?.variables;\n const variableTriggerCharacter =\n options?.suggestion?.char ?? DEFAULT_VARIABLE_TRIGGER_CHAR;\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = defaultValue.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, variableTriggerCharacter, defaultValue, editor]);\n\n const popoverButton = (\n <PopoverTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"!mly-size-7\"\n data-state={!!defaultValue}\n >\n <Icon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </BaseButton>\n </PopoverTrigger>\n );\n\n return (\n <Popover\n open={isOpen}\n onOpenChange={(open) => {\n setIsOpen(open);\n if (open) {\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }\n }}\n >\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly-w-max mly-rounded-none mly-border-none mly-bg-transparent !mly-p-0 mly-shadow-none\"\n sideOffset={8}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const input = linkInputRef.current;\n if (!input) {\n return;\n }\n\n onValueChange?.(input.value);\n setIsOpen(false);\n }}\n >\n <div className=\"mly-isolate mly-flex mly-rounded-lg\">\n {!isEditing && (\n <div className=\"mly-flex mly-h-8 mly-items-center mly-rounded-lg mly-border mly-border-gray-300 mly-bg-white mly-px-0.5\">\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: defaultValue,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n </div>\n )}\n\n {isEditing && (\n <div className=\"mly-relative\">\n <div className=\"mly-absolute mly-inset-y-0 mly-left-1.5 mly-z-10 mly-flex mly-items-center\">\n <LinkIcon className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n\n <InputAutocomplete\n editor={editor}\n value={defaultValue}\n onValueChange={(value) => {\n onValueChange?.(value);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder={placeholderUrl}\n className=\"-mly-ms-px mly-block mly-h-8 mly-w-56 mly-rounded-lg mly-border mly-border-gray-300 mly-px-2 mly-py-1.5 mly-pl-6 mly-pr-6 mly-text-sm mly-shadow-sm mly-outline-none placeholder:mly-text-gray-400\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable =\n autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n }\n\n onValueChange?.(value, isVariable);\n setIsOpen(false);\n }}\n />\n </div>\n )}\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n","'use client';\n\nimport { BlockGroupItem } from '@/blocks/types';\nimport { createContext, PropsWithChildren, useContext } from 'react';\nimport { DEFAULT_SLASH_COMMANDS } from './extensions/slash-command/default-slash-commands';\n\nexport const DEFAULT_PLACEHOLDER_URL = 'https://maily.to/';\n\nexport type MailyContextType = {\n placeholderUrl?: string;\n blocks?: BlockGroupItem[];\n};\n\nexport const MailyContext = createContext<MailyContextType>({\n placeholderUrl: DEFAULT_PLACEHOLDER_URL,\n blocks: DEFAULT_SLASH_COMMANDS,\n});\n\ntype MailyProviderProps = PropsWithChildren<MailyContextType>;\n\nexport function MailyProvider(props: MailyProviderProps) {\n const { children, ...defaultValues } = props;\n\n return (\n <MailyContext.Provider value={defaultValues}>\n {children}\n </MailyContext.Provider>\n );\n}\n\nexport function useMailyContext() {\n const values = useContext(MailyContext);\n if (!values) {\n throw new Error('Missing MailyContext.Provider in the component tree');\n }\n\n return values;\n}\n","import { FootprintsIcon, Heading1 } from 'lucide-react';\nimport { button, linkCard } from '@/blocks/button';\nimport { htmlCodeBlock } from '@/blocks/code';\nimport { image, inlineImage, logo } from '@/blocks/image';\nimport { columns, divider, repeat, section, spacer } from '@/blocks/layout';\nimport { bulletList, orderedList } from '@/blocks/list';\nimport { BlockGroupItem } from '@/blocks/types';\nimport {\n blockquote,\n clearLine,\n footer,\n hardBreak,\n heading1,\n heading2,\n heading3,\n text,\n} from '@/blocks/typography';\nimport {\n headerLogoWithCoverImage,\n headerLogoWithTextHorizontal,\n headerLogoWithTextVertical,\n} from '@/blocks/headers';\nimport {\n footerCopyrightText,\n footerCommunityFeedbackCta,\n footerCompanySignature,\n} from '@/blocks/footers';\n\nexport const DEFAULT_SLASH_COMMANDS: BlockGroupItem[] = [\n {\n title: 'Blocks',\n commands: [\n text,\n heading1,\n heading2,\n heading3,\n bulletList,\n orderedList,\n image,\n logo,\n inlineImage,\n columns,\n section,\n repeat,\n divider,\n spacer,\n button,\n linkCard,\n hardBreak,\n blockquote,\n footer,\n clearLine,\n ],\n },\n {\n title: 'Components',\n commands: [\n {\n id: 'headers',\n title: 'Headers',\n description: 'Add pre-designed headers block',\n searchTerms: ['header', 'headers'],\n icon: <Heading1 className=\"mly-h-4 mly-w-4\" />,\n preview: 'https://cdn.usemaily.com/previews/header-preview-xyz.png',\n commands: [\n headerLogoWithTextVertical,\n headerLogoWithTextHorizontal,\n headerLogoWithCoverImage,\n ],\n },\n {\n id: 'footers',\n title: 'Footers',\n description: 'Add pre-designed footers block',\n searchTerms: ['footers'],\n icon: <FootprintsIcon className=\"mly-h-4 mly-w-4\" />,\n commands: [\n footerCopyrightText,\n footerCommunityFeedbackCta,\n footerCompanySignature,\n ],\n },\n htmlCodeBlock,\n ],\n },\n];\n","import type { BlockItem } from './types';\nimport { MousePointer, ArrowUpRightSquare } from 'lucide-react';\n\nexport const button: BlockItem = {\n title: 'Button',\n description: 'Add a call to action button to email.',\n searchTerms: ['link', 'button', 'cta'],\n icon: <MousePointer className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setButton().run();\n },\n};\n\nexport const linkCard: BlockItem = {\n title: 'Link Card',\n description: 'Add a link card to email.',\n searchTerms: ['link', 'button', 'image'],\n icon: <ArrowUpRightSquare className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLinkCard().run();\n },\n render: (editor) => {\n return editor.extensionManager.extensions.findIndex(\n (ext) => ext.name === 'linkCard'\n ) === -1\n ? null\n : true;\n },\n};\n","import { CodeXmlIcon } from 'lucide-react';\nimport { BlockItem } from './types';\n\nexport const htmlCodeBlock: BlockItem = {\n title: 'Custom HTML',\n description: 'Insert a custom HTML block',\n searchTerms: ['html', 'code', 'custom'],\n icon: <CodeXmlIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setHtmlCodeBlock({ language: 'html' })\n .run();\n },\n};\n","import { NodeSelection, Selection, TextSelection } from '@tiptap/pm/state';\nimport type { BlockItem } from './types';\nimport { ImageIcon } from 'lucide-react';\n\nexport const image: BlockItem = {\n title: 'Image',\n description: 'Full width image',\n searchTerms: ['image'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setImage({ src: '' }).run();\n },\n};\n\nexport const logo: BlockItem = {\n title: 'Logo',\n description: 'Add your brand logo',\n searchTerms: ['image', 'logo'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLogoImage({ src: '' }).run();\n },\n};\n\nexport const inlineImage: BlockItem = {\n title: 'Inline Image',\n description: 'Inline image',\n searchTerms: ['image', 'inline'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setInlineImage({\n src: 'https://maily.to/brand/logo.png',\n })\n // @ts-ignore\n .command((props) => {\n const { tr, state, view, editor } = props;\n const { from } = range;\n\n const node = state.doc.nodeAt(from);\n if (!node) {\n return false;\n }\n\n const selection = TextSelection.create(\n tr.doc,\n from,\n from + node.nodeSize\n );\n tr.setSelection(selection);\n return true;\n })\n .run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n ColumnsIcon,\n Repeat2,\n MoveVertical,\n RectangleHorizontal,\n Minus,\n} from 'lucide-react';\n\nexport const columns: BlockItem = {\n title: 'Columns',\n description: 'Add columns to email.',\n searchTerms: ['layout', 'columns'],\n icon: <ColumnsIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setColumns()\n .focus(editor.state.selection.head - 2)\n .run();\n },\n};\n\nexport const section: BlockItem = {\n title: 'Section',\n description: 'Add a section to email.',\n searchTerms: ['layout', 'section'],\n icon: <RectangleHorizontal className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSection().run();\n },\n};\n\nexport const repeat: BlockItem = {\n title: 'Repeat',\n description: 'Loop over an array of items.',\n searchTerms: ['repeat', 'for', 'loop'],\n icon: <Repeat2 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setRepeat().run();\n },\n};\n\nexport const spacer: BlockItem = {\n title: 'Spacer',\n description: 'Add space between blocks.',\n searchTerms: ['space', 'gap', 'divider'],\n icon: <MoveVertical className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSpacer({ height: 'sm' }).run();\n },\n};\n\nexport const divider: BlockItem = {\n title: 'Divider',\n description: 'Add a horizontal divider.',\n searchTerms: ['divider', 'line'],\n icon: <Minus className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHorizontalRule().run();\n },\n};\n","import type { BlockItem } from './types';\nimport { List, ListOrdered } from 'lucide-react';\n\nexport const bulletList: BlockItem = {\n title: 'Bullet List',\n description: 'Create a simple bullet list.',\n searchTerms: ['unordered', 'point'],\n icon: <List className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n};\n\nexport const orderedList: BlockItem = {\n title: 'Numbered List',\n description: 'Create a list with numbering.',\n searchTerms: ['ordered'],\n icon: <ListOrdered className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n Text,\n Heading1,\n Heading2,\n Heading3,\n DivideIcon,\n TextQuote,\n FootprintsIcon,\n EraserIcon,\n} from 'lucide-react';\n\nexport const text: BlockItem = {\n title: 'Text',\n description: 'Just start typing with plain text.',\n searchTerms: ['p', 'paragraph'],\n icon: <Text className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n};\n\nexport const heading1: BlockItem = {\n title: 'Heading 1',\n description: 'Big heading.',\n searchTerms: ['h1', 'title', 'big', 'large'],\n icon: <Heading1 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n};\n\nexport const heading2: BlockItem = {\n title: 'Heading 2',\n description: 'Medium heading.',\n searchTerms: ['h2', 'subtitle', 'medium'],\n icon: <Heading2 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n};\n\nexport const heading3: BlockItem = {\n title: 'Heading 3',\n description: 'Small heading.',\n searchTerms: ['h3', 'subtitle', 'small'],\n icon: <Heading3 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n};\n\nexport const hardBreak: BlockItem = {\n title: 'Hard Break',\n description: 'Add a break between lines.',\n searchTerms: ['break', 'line'],\n icon: <DivideIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHardBreak().run();\n },\n};\n\nexport const blockquote: BlockItem = {\n title: 'Blockquote',\n description: 'Add blockquote.',\n searchTerms: ['quote', 'blockquote'],\n icon: <TextQuote className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBlockquote().run();\n },\n};\n\nexport const footer: BlockItem = {\n title: 'Footer',\n description: 'Add a footer text to email.',\n searchTerms: ['footer', 'text'],\n icon: <FootprintsIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setFooter().run();\n },\n};\n\nexport const clearLine: BlockItem = {\n title: 'Clear Line',\n description: 'Clear the current line.',\n searchTerms: ['clear', 'line'],\n icon: <EraserIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().selectParentNode().deleteSelection().run();\n },\n};\n","import { SVGProps } from 'react';\n\nexport function LogoWithCoverImageIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.97634 1.4502H9.02405C9.70389 1.4502 10.2476 1.45019 10.687 1.48609C11.1379 1.52293 11.527 1.6003 11.8849 1.78263C12.4588 2.07504 12.9254 2.54164 13.2178 3.11553C13.4001 3.47338 13.4775 3.86253 13.5143 4.31342C13.5502 4.75277 13.5502 5.29652 13.5502 5.97637V8.02403C13.5502 8.70388 13.5502 9.24763 13.5143 9.68698C13.4775 10.1379 13.4001 10.527 13.2178 10.8849C12.9254 11.4588 12.4588 11.9254 11.8849 12.2178C11.527 12.4001 11.1379 12.4775 10.687 12.5143C10.2476 12.5502 9.70387 12.5502 9.02402 12.5502H4.97636C4.29651 12.5502 3.75276 12.5502 3.31341 12.5143C2.86252 12.4775 2.47337 12.4001 2.11552 12.2178C1.54163 11.9254 1.07504 11.4588 0.782626 10.8849C0.600293 10.527 0.522922 10.1379 0.486083 9.68698C0.450187 9.24764 0.45019 8.70389 0.450195 8.02405V5.97635C0.45019 5.29651 0.450187 4.75276 0.486083 4.31342C0.522922 3.86253 0.600293 3.47338 0.782626 3.11553C1.07504 2.54164 1.54163 2.07504 2.11552 1.78263C2.47337 1.6003 2.86252 1.52293 3.31341 1.48609C3.75276 1.45019 4.2965 1.4502 4.97634 1.4502ZM3.40298 2.58243C3.02012 2.61372 2.79184 2.67259 2.61491 2.76274C2.248 2.94969 1.94968 3.248 1.76273 3.61492C1.67258 3.79185 1.61371 4.02013 1.58243 4.40299C1.55062 4.79228 1.55019 5.29106 1.55019 6.0002V8.0002C1.55019 8.70934 1.55062 9.20812 1.58243 9.59741C1.61371 9.98028 1.67258 10.2086 1.76273 10.3855C1.94968 10.7524 2.248 11.0507 2.61491 11.2377C2.79184 11.3278 3.02012 11.3867 3.40298 11.418C3.79227 11.4498 4.29105 11.4502 5.00019 11.4502H9.00019C9.70933 11.4502 10.2081 11.4498 10.5974 11.418C10.9803 11.3867 11.2086 11.3278 11.3855 11.2377C11.7524 11.0507 12.0507 10.7524 12.2377 10.3855C12.3278 10.2086 12.3867 9.98028 12.418 9.59741C12.4498 9.20812 12.4502 8.70934 12.4502 8.0002V6.0002C12.4502 5.29106 12.4498 4.79228 12.418 4.40299C12.3867 4.02013 12.3278 3.79185 12.2377 3.61492C12.0507 3.248 11.7524 2.94969 11.3855 2.76274C11.2086 2.67259 10.9803 2.61372 10.5974 2.58243C10.2081 2.55063 9.70933 2.5502 9.00019 2.5502H5.00019C4.29105 2.5502 3.79227 2.55063 3.40298 2.58243Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.1999 0.450195C4.50366 0.450195 4.7499 0.696438 4.7499 1.00019V2.75019C4.7499 3.05395 4.50366 3.30019 4.1999 3.30019C3.89614 3.30019 3.6499 3.05395 3.6499 2.75019V1.00019C3.6499 0.696438 3.89614 0.450195 4.1999 0.450195Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.8 0.450195C10.1037 0.450195 10.35 0.696438 10.35 1.00019V2.75019C10.35 3.05395 10.1037 3.30019 9.8 3.30019C9.49625 3.30019 9.25 3.05395 9.25 2.75019V1.00019C9.25 0.696438 9.49625 0.450195 9.8 0.450195Z\"\n fill=\"currentColor\"\n />\n <mask id=\"path-4-inside-1_1046_19527\" fill=\"white\">\n <rect x=\"3\" y=\"4\" width=\"8\" height=\"3\" rx=\"0.5\" />\n </mask>\n <rect\n x=\"3\"\n y=\"4\"\n width=\"8\"\n height=\"3\"\n rx=\"0.5\"\n stroke=\"black\"\n strokeWidth=\"2\"\n mask=\"url(#path-4-inside-1_1046_19527)\"\n />\n <rect\n x=\"6.25\"\n y=\"8.25\"\n width=\"4.5\"\n height=\"0.5\"\n rx=\"0.25\"\n stroke=\"black\"\n strokeWidth=\"0.5\"\n />\n <rect x=\"3\" y=\"8\" width=\"2\" height=\"1\" rx=\"0.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function LogoWithTextHorizonIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.97634 1.4502H9.02405C9.70389 1.4502 10.2476 1.45019 10.687 1.48609C11.1379 1.52293 11.527 1.6003 11.8849 1.78263C12.4588 2.07504 12.9254 2.54164 13.2178 3.11553C13.4001 3.47338 13.4775 3.86253 13.5143 4.31342C13.5502 4.75277 13.5502 5.29652 13.5502 5.97637V8.02403C13.5502 8.70388 13.5502 9.24763 13.5143 9.68698C13.4775 10.1379 13.4001 10.527 13.2178 10.8849C12.9254 11.4588 12.4588 11.9254 11.8849 12.2178C11.527 12.4001 11.1379 12.4775 10.687 12.5143C10.2476 12.5502 9.70387 12.5502 9.02402 12.5502H4.97636C4.29651 12.5502 3.75276 12.5502 3.31341 12.5143C2.86252 12.4775 2.47337 12.4001 2.11552 12.2178C1.54163 11.9254 1.07504 11.4588 0.782626 10.8849C0.600293 10.527 0.522922 10.1379 0.486083 9.68698C0.450187 9.24764 0.45019 8.70389 0.450195 8.02405V5.97635C0.45019 5.29651 0.450187 4.75276 0.486083 4.31342C0.522922 3.86253 0.600293 3.47338 0.782626 3.11553C1.07504 2.54164 1.54163 2.07504 2.11552 1.78263C2.47337 1.6003 2.86252 1.52293 3.31341 1.48609C3.75276 1.45019 4.2965 1.4502 4.97634 1.4502ZM3.40298 2.58243C3.02012 2.61372 2.79184 2.67259 2.61491 2.76274C2.248 2.94969 1.94968 3.248 1.76273 3.61492C1.67258 3.79185 1.61371 4.02013 1.58243 4.40299C1.55062 4.79228 1.55019 5.29106 1.55019 6.0002V8.0002C1.55019 8.70934 1.55062 9.20812 1.58243 9.59741C1.61371 9.98028 1.67258 10.2086 1.76273 10.3855C1.94968 10.7524 2.248 11.0507 2.61491 11.2377C2.79184 11.3278 3.02012 11.3867 3.40298 11.418C3.79227 11.4498 4.29105 11.4502 5.00019 11.4502H9.00019C9.70933 11.4502 10.2081 11.4498 10.5974 11.418C10.9803 11.3867 11.2086 11.3278 11.3855 11.2377C11.7524 11.0507 12.0507 10.7524 12.2377 10.3855C12.3278 10.2086 12.3867 9.98028 12.418 9.59741C12.4498 9.20812 12.4502 8.70934 12.4502 8.0002V6.0002C12.4502 5.29106 12.4498 4.79228 12.418 4.40299C12.3867 4.02013 12.3278 3.79185 12.2377 3.61492C12.0507 3.248 11.7524 2.94969 11.3855 2.76274C11.2086 2.67259 10.9803 2.61372 10.5974 2.58243C10.2081 2.55063 9.70933 2.5502 9.00019 2.5502H5.00019C4.29105 2.5502 3.79227 2.55063 3.40298 2.58243Z\"\n fill=\"currentColor\"\n />\n <rect\n x=\"6.25\"\n y=\"6.75\"\n width=\"4.5\"\n height=\"0.5\"\n rx=\"0.25\"\n stroke=\"black\"\n strokeWidth=\"0.5\"\n />\n <rect x=\"3\" y=\"6.5\" width=\"2\" height=\"1\" rx=\"0.5\" fill=\"currentColor\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.1999 0.450195C4.50366 0.450195 4.7499 0.696438 4.7499 1.00019V2.75019C4.7499 3.05395 4.50366 3.30019 4.1999 3.30019C3.89614 3.30019 3.6499 3.05395 3.6499 2.75019V1.00019C3.6499 0.696438 3.89614 0.450195 4.1999 0.450195Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.8 0.450195C10.1037 0.450195 10.35 0.696438 10.35 1.00019V2.75019C10.35 3.05395 10.1037 3.30019 9.8 3.30019C9.49625 3.30019 9.25 3.05395 9.25 2.75019V1.00019C9.25 0.696438 9.49625 0.450195 9.8 0.450195Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function LogoWithTextVerticalIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.97634 1.4502H9.02405C9.70389 1.4502 10.2476 1.45019 10.687 1.48609C11.1379 1.52293 11.527 1.6003 11.8849 1.78263C12.4588 2.07504 12.9254 2.54164 13.2178 3.11553C13.4001 3.47338 13.4775 3.86253 13.5143 4.31342C13.5502 4.75277 13.5502 5.29652 13.5502 5.97637V8.02403C13.5502 8.70388 13.5502 9.24763 13.5143 9.68698C13.4775 10.1379 13.4001 10.527 13.2178 10.8849C12.9254 11.4588 12.4588 11.9254 11.8849 12.2178C11.527 12.4001 11.1379 12.4775 10.687 12.5143C10.2476 12.5502 9.70387 12.5502 9.02402 12.5502H4.97636C4.29651 12.5502 3.75276 12.5502 3.31341 12.5143C2.86252 12.4775 2.47337 12.4001 2.11552 12.2178C1.54163 11.9254 1.07504 11.4588 0.782626 10.8849C0.600293 10.527 0.522922 10.1379 0.486083 9.68698C0.450187 9.24764 0.45019 8.70389 0.450195 8.02405V5.97635C0.45019 5.29651 0.450187 4.75276 0.486083 4.31342C0.522922 3.86253 0.600293 3.47338 0.782626 3.11553C1.07504 2.54164 1.54163 2.07504 2.11552 1.78263C2.47337 1.6003 2.86252 1.52293 3.31341 1.48609C3.75276 1.45019 4.2965 1.4502 4.97634 1.4502ZM3.40298 2.58243C3.02012 2.61372 2.79184 2.67259 2.61491 2.76274C2.248 2.94969 1.94968 3.248 1.76273 3.61492C1.67258 3.79185 1.61371 4.02013 1.58243 4.40299C1.55062 4.79228 1.55019 5.29106 1.55019 6.0002V8.0002C1.55019 8.70934 1.55062 9.20812 1.58243 9.59741C1.61371 9.98028 1.67258 10.2086 1.76273 10.3855C1.94968 10.7524 2.248 11.0507 2.61491 11.2377C2.79184 11.3278 3.02012 11.3867 3.40298 11.418C3.79227 11.4498 4.29105 11.4502 5.00019 11.4502H9.00019C9.70933 11.4502 10.2081 11.4498 10.5974 11.418C10.9803 11.3867 11.2086 11.3278 11.3855 11.2377C11.7524 11.0507 12.0507 10.7524 12.2377 10.3855C12.3278 10.2086 12.3867 9.98028 12.418 9.59741C12.4498 9.20812 12.4502 8.70934 12.4502 8.0002V6.0002C12.4502 5.29106 12.4498 4.79228 12.418 4.40299C12.3867 4.02013 12.3278 3.79185 12.2377 3.61492C12.0507 3.248 11.7524 2.94969 11.3855 2.76274C11.2086 2.67259 10.9803 2.61372 10.5974 2.58243C10.2081 2.55063 9.70933 2.5502 9.00019 2.5502H5.00019C4.29105 2.5502 3.79227 2.55063 3.40298 2.58243Z\"\n fill=\"currentColor\"\n />\n <rect\n x=\"4.25\"\n y=\"8.25\"\n width=\"5.5\"\n height=\"0.5\"\n rx=\"0.25\"\n stroke=\"black\"\n strokeWidth=\"0.5\"\n />\n <rect x=\"6\" y=\"6\" width=\"2\" height=\"1\" rx=\"0.5\" fill=\"currentColor\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.1999 0.450195C4.50366 0.450195 4.7499 0.696438 4.7499 1.00019V2.75019C4.7499 3.05395 4.50366 3.30019 4.1999 3.30019C3.89614 3.30019 3.6499 3.05395 3.6499 2.75019V1.00019C3.6499 0.696438 3.89614 0.450195 4.1999 0.450195Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.8 0.450195C10.1037 0.450195 10.35 0.696438 10.35 1.00019V2.75019C10.35 3.05395 10.1037 3.30019 9.8 3.30019C9.49625 3.30019 9.25 3.05395 9.25 2.75019V1.00019C9.25 0.696438 9.49625 0.450195 9.8 0.450195Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { LogoWithCoverImageIcon } from '@/editor/components/icons/logo-with-cover-image';\nimport { BlockItem } from './types';\nimport { LogoWithTextHorizonIcon } from '@/editor/components/icons/logo-with-text-horizon';\nimport { LogoWithTextVerticalIcon } from '@/editor/components/icons/logo-with-text-vertical';\n\nexport const headerLogoWithTextHorizontal: BlockItem = {\n title: 'Logo with Text (Horizontal)',\n description: 'Logo and a text horizontally',\n searchTerms: ['logo', 'text'],\n icon: <LogoWithTextHorizonIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .deleteRange(range)\n .insertContent({\n type: 'columns',\n attrs: { showIfKey: null, gap: 8 },\n content: [\n {\n type: 'column',\n attrs: {\n columnId: '36de3eda-0677-47c3-a8b7-e071dec9ce30',\n width: 'auto',\n verticalAlign: 'middle',\n },\n content: [\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '32',\n height: '32',\n alignment: 'left',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: '6feb593e-374a-4479-a1c7-872c60c2f4e0',\n width: 'auto',\n verticalAlign: 'bottom',\n },\n content: [\n {\n type: 'heading',\n attrs: {\n textAlign: 'right',\n level: 3,\n showIfKey: null,\n },\n content: [\n {\n type: 'text',\n marks: [{ type: 'bold' }],\n text: 'Weekly Newsletter',\n },\n ],\n },\n ],\n },\n ],\n })\n .run();\n },\n};\n\nexport const headerLogoWithTextVertical: BlockItem = {\n title: 'Logo with Text (Vertical)',\n description: 'Logo and a text vertically',\n searchTerms: ['logo', 'text'],\n icon: <LogoWithTextVerticalIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .deleteRange(range)\n .insertContent([\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '48',\n height: '48',\n alignment: 'center',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n { type: 'spacer', attrs: { height: 8, showIfKey: null } },\n {\n type: 'heading',\n attrs: { textAlign: 'center', level: 2, showIfKey: null },\n content: [{ type: 'text', text: 'Maily' }],\n },\n ])\n .run();\n },\n};\n\nexport const headerLogoWithCoverImage: BlockItem = {\n title: 'Logo with Cover Image',\n description: 'Logo and a cover image',\n searchTerms: ['logo', 'cover', 'image'],\n icon: <LogoWithCoverImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n const todayFormatted = new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n editor\n .chain()\n .deleteRange(range)\n .insertContent([\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/og-image.png',\n alt: null,\n title: null,\n width: 600,\n height: 314,\n alignment: 'center',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n {\n type: 'columns',\n attrs: { showIfKey: null, gap: 8 },\n content: [\n {\n type: 'column',\n attrs: {\n columnId: '36de3eda-0677-47c3-a8b7-e071dec9ce30',\n width: 'auto',\n verticalAlign: 'middle',\n },\n content: [\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '48',\n height: '48',\n alignment: 'left',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: '6feb593e-374a-4479-a1c7-872c60c2f4e0',\n width: 'auto',\n verticalAlign: 'middle',\n },\n content: [\n {\n type: 'paragraph',\n attrs: { textAlign: 'right', showIfKey: null },\n content: [\n {\n type: 'text',\n marks: [{ type: 'bold' }],\n text: 'Weekly Newsletter',\n },\n { type: 'hardBreak' },\n {\n type: 'text',\n marks: [\n { type: 'textStyle', attrs: { color: '#929292' } },\n ],\n text: todayFormatted,\n },\n ],\n },\n ],\n },\n ],\n },\n ])\n .run();\n },\n};\n","import {\n CopyrightIcon,\n LayoutTemplateIcon,\n RectangleHorizontalIcon,\n} from 'lucide-react';\nimport { BlockItem } from './types';\n\nexport const footerCopyrightText: BlockItem = {\n title: 'Footer Copyright',\n description: 'Copyright text for the footer.',\n searchTerms: ['footer', 'copyright'],\n icon: <CopyrightIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n const currentYear = new Date().getFullYear();\n\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent({\n type: 'paragraph',\n attrs: { textAlign: 'center', showIfKey: null },\n content: [\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '#AAAAAA' } }],\n text: `Maily © ${currentYear}. All rights reserved.`,\n },\n ],\n })\n .run();\n },\n};\n\nexport const footerCommunityFeedbackCta: BlockItem = {\n title: 'Footer Community Feedback CTA',\n description: 'Community feedback CTA for the footer.',\n searchTerms: ['footer', 'community', 'feedback', 'cta'],\n icon: <RectangleHorizontalIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent([\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '42',\n height: '42',\n alignment: 'left',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n { type: 'spacer', attrs: { height: 16, showIfKey: null } },\n {\n type: 'footer',\n attrs: { textAlign: null, 'maily-component': 'footer' },\n content: [\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '' } }],\n text: 'Enjoyed this month’s update?',\n },\n { type: 'hardBreak' },\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '' } }],\n text: \"And, as always, we'd love your feedback – simply reply to the email or reach out via the Discord community!\",\n },\n ],\n },\n ])\n .run();\n },\n};\n\nexport const footerCompanySignature: BlockItem = {\n title: 'Footer Company Signature',\n description: 'Company signature for the footer.',\n searchTerms: ['footer', 'company', 'signature'],\n icon: <LayoutTemplateIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent([\n { type: 'horizontalRule' },\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '48',\n height: '48',\n alignment: 'center',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n { type: 'spacer', attrs: { height: 16, showIfKey: null } },\n {\n type: 'heading',\n attrs: { textAlign: 'center', level: 3, showIfKey: null },\n content: [{ type: 'text', text: 'Maily' }],\n },\n { type: 'spacer', attrs: { height: 4, showIfKey: null } },\n {\n type: 'footer',\n attrs: { textAlign: 'center', 'maily-component': 'footer' },\n content: [\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '' } }],\n text: '1234 Example Street, Example, DE 19801, United States',\n },\n { type: 'hardBreak' },\n {\n type: 'text',\n marks: [\n {\n type: 'link',\n attrs: {\n href: 'https://maily.to',\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly-no-underline',\n isUrlVariable: false,\n },\n },\n { type: 'textStyle', attrs: { color: '#64748b' } },\n { type: 'underline' },\n ],\n text: 'VISIT COMPANY',\n },\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '#64748b' } }],\n text: ' | ',\n },\n {\n type: 'text',\n marks: [\n {\n type: 'link',\n attrs: {\n href: 'https://maily.to',\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly-no-underline',\n isUrlVariable: false,\n },\n },\n { type: 'textStyle', attrs: { color: '#64748b' } },\n { type: 'underline' },\n ],\n text: 'VISIT OUR BLOG',\n },\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '#64748b' } }],\n text: ' | ',\n },\n {\n type: 'text',\n marks: [\n {\n type: 'link',\n attrs: {\n href: 'https://maily.to',\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly-no-underline',\n isUrlVariable: false,\n },\n },\n { type: 'textStyle', attrs: { color: '#64748b' } },\n { type: 'underline' },\n ],\n text: 'UNSUBSCRIBE',\n },\n ],\n },\n {\n type: 'paragraph',\n attrs: { textAlign: 'center', showIfKey: null },\n content: [\n {\n type: 'inlineImage',\n attrs: {\n height: 20,\n width: 20,\n src: 'https://cdn.usemaily.com/images/icons/linkedin.png',\n isSrcVariable: false,\n alt: null,\n title: null,\n externalLink: 'https://www.linkedin.com/in/arikchakma/',\n isExternalLinkVariable: false,\n },\n },\n { type: 'text', text: ' ' },\n {\n type: 'inlineImage',\n attrs: {\n height: 20,\n width: 20,\n src: 'https://cdn.usemaily.com/images/icons/youtube.png',\n isSrcVariable: false,\n alt: null,\n title: null,\n externalLink: 'https://www.youtube.com/arikchakma',\n isExternalLinkVariable: false,\n },\n },\n { type: 'text', text: ' ' },\n {\n type: 'inlineImage',\n attrs: {\n height: 20,\n width: 20,\n src: 'https://cdn.usemaily.com/images/icons/twitter.png',\n isSrcVariable: false,\n alt: null,\n title: null,\n externalLink: 'https://x.com/imarikchakma',\n isExternalLinkVariable: false,\n },\n },\n ],\n },\n ])\n .run();\n },\n};\n","import { Editor, mergeAttributes, Node } from '@tiptap/core';\nimport { Node as TNode } from '@tiptap/pm/model';\nimport { PluginKey } from '@tiptap/pm/state';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport Suggestion, { SuggestionOptions } from '@tiptap/suggestion';\nimport {\n VariableSuggestionsPopover,\n VariableSuggestionsPopoverType,\n} from './variable-suggestions-popover';\nimport { DefaultRenderVariable, VariableView } from './variable-view';\n\nexport type Variable = {\n name: string;\n // Default is true\n required?: boolean;\n // default is true\n valid?: boolean;\n};\n\nexport type VariableFunctionOptions = {\n query: string;\n from: 'content-variable' | 'bubble-variable' | 'repeat-variable';\n editor: Editor;\n};\n\nexport type VariablesFunction = (\n opts: VariableFunctionOptions\n) => Array<Variable>;\n\nexport type Variables = Array<Variable> | VariablesFunction;\n\nexport const DEFAULT_VARIABLE_TRIGGER_CHAR = '@';\nexport const DEFAULT_VARIABLES: Variables = [];\nexport const DEFAULT_RENDER_VARIABLE_FUNCTION: RenderVariableFunction =\n DefaultRenderVariable;\nexport const DEFAULT_VARIABLE_SUGGESTION_POPOVER = VariableSuggestionsPopover;\n\nexport type RenderVariableOptions = {\n variable: Variable;\n fallback?: string;\n editor: Editor;\n from: 'content-variable' | 'bubble-variable' | 'button-variable';\n};\n\nexport type RenderVariableFunction = (\n opts: RenderVariableOptions\n) => JSX.Element | null;\n\nexport type VariableOptions = {\n renderLabel: (props: { options: VariableOptions; node: TNode }) => string;\n suggestion: Omit<SuggestionOptions, 'editor'>;\n\n /**\n * Variables is the array of variables that will be used to render the variable pill.\n */\n variables: Variables;\n\n /**\n * Render variable is the function that will be used to render the variable pill.\n * @default DefaultRenderVariable\n */\n renderVariable: RenderVariableFunction;\n\n /**\n * Variable suggestion popover is the component that will be used to render\n * the variable suggestions for the content, bubble menu variables\n * @default VariableSuggestionPopover\n */\n variableSuggestionsPopover: VariableSuggestionsPopoverType;\n};\n\nexport type VariableStorage = {\n popover: boolean;\n};\n\nexport const VariablePluginKey = new PluginKey('variable');\n\nexport const VariableExtension = Node.create<VariableOptions, VariableStorage>({\n name: 'variable',\n group: 'inline',\n inline: true,\n selectable: true,\n atom: true,\n\n addStorage() {\n return {\n popover: false,\n };\n },\n\n addOptions() {\n return {\n variables: DEFAULT_VARIABLES,\n variableSuggestionsPopover: DEFAULT_VARIABLE_SUGGESTION_POPOVER,\n renderVariable: DEFAULT_RENDER_VARIABLE_FUNCTION,\n\n renderLabel(props) {\n const { node } = props;\n return `${node.attrs.label ?? node.attrs.id}`;\n },\n\n suggestion: {\n char: '@',\n pluginKey: VariablePluginKey,\n command: ({ editor, range, props }) => {\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: ({ state, range }) => {\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 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 fallback: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-fallback'),\n renderHTML: (attributes) => {\n if (!attributes.fallback) {\n return {};\n }\n\n return {\n 'data-fallback': attributes.fallback,\n };\n },\n },\n\n required: {\n default: true,\n parseHTML: (element) => element.hasAttribute('data-required'),\n renderHTML: (attributes) => {\n return {\n 'data-required': attributes?.required ?? true,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({ 'data-type': this.name }, HTMLAttributes),\n this.options.renderLabel({\n options: this.options,\n node,\n }),\n ];\n },\n\n renderText({ node }) {\n return this.options.renderLabel({\n options: this.options,\n node,\n });\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = 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 isMention = true;\n tr.insertText(\n this.options.suggestion.char || '',\n pos,\n pos + node.nodeSize\n );\n\n return false;\n }\n });\n\n return isMention;\n }),\n };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(VariableView, {\n className: 'mly-relative mly-inline-block',\n as: 'div',\n });\n },\n});\n","import { cn } from '@/editor/utils/classname';\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n Braces,\n CornerDownLeftIcon,\n} from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { Variable } from './variable';\n\nexport type VariableSuggestionsPopoverProps = {\n items: Variable[];\n onSelectItem: (item: Variable) => void;\n};\n\nexport type VariableSuggestionsPopoverRef = {\n moveUp: () => void;\n moveDown: () => void;\n select: () => void;\n};\n\nexport type VariableSuggestionsPopoverType = React.ForwardRefExoticComponent<\n VariableSuggestionsPopoverProps &\n React.RefAttributes<VariableSuggestionsPopoverRef>\n>;\n\nexport const VariableSuggestionsPopover: VariableSuggestionsPopoverType =\n forwardRef((props, ref) => {\n const { items, onSelectItem } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const scrollSelectedIntoView = (index: number) => {\n const container = scrollContainerRef.current;\n const selectedItem = itemRefs.current[index];\n\n if (!container || !selectedItem) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const itemRect = selectedItem.getBoundingClientRect();\n\n const padding = 4;\n if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom + padding;\n } else if (itemRect.top < containerRect.top) {\n container.scrollTop += itemRect.top - containerRect.top - padding;\n }\n };\n\n useEffect(() => {\n setSelectedIndex(0);\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n itemRefs.current = items.map(() => null);\n }, [items]);\n\n useEffect(() => {\n scrollSelectedIntoView(selectedIndex);\n }, [selectedIndex]);\n\n useImperativeHandle(ref, () => ({\n moveUp: () => {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n },\n moveDown: () => {\n setSelectedIndex((selectedIndex + 1) % items.length);\n },\n select: () => {\n const item = items[selectedIndex];\n if (!item) {\n return;\n }\n\n onSelectItem(item);\n },\n }));\n\n return (\n <div className=\"mly-z-50 mly-w-64 mly-rounded-lg mly-border mly-border-gray-200 mly-bg-white mly-shadow-md mly-transition-all\">\n <div className=\"mly-flex mly-items-center mly-justify-between mly-gap-2 mly-border-b mly-border-gray-200 mly-bg-soft-gray/40 mly-px-1 mly-py-1.5 mly-text-gray-500\">\n <span className=\"mly-text-xs mly-uppercase\">Variables</span>\n <VariableIcon>\n <Braces className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n </div>\n\n <div\n ref={scrollContainerRef}\n className=\"mly-max-h-52 mly-overflow-y-auto mly-scrollbar-thin mly-scrollbar-track-transparent mly-scrollbar-thumb-gray-200\"\n >\n <div className=\"mly-flex mly-w-fit mly-min-w-full mly-flex-col mly-gap-0.5 mly-p-1\">\n {items?.length ? (\n items?.map((item, index: number) => (\n <button\n key={index}\n ref={(el) => (itemRefs.current[index] = el)}\n onClick={() => onSelectItem(item)}\n className={cn(\n 'mly-flex mly-w-fit mly-min-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-font-mono mly-text-sm mly-text-gray-900 hover:mly-bg-soft-gray',\n index === selectedIndex\n ? 'mly-bg-soft-gray'\n : 'mly-bg-white'\n )}\n >\n <Braces className=\"mly-size-3 mly-stroke-[2.5] mly-text-rose-600\" />\n {item.name}\n </button>\n ))\n ) : (\n <div className=\"mly-flex mly-h-7 mly-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-font-mono mly-text-[13px] mly-text-gray-900 hover:mly-bg-soft-gray\">\n No result\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mly-flex mly-items-center mly-justify-between mly-gap-2 mly-border-t mly-border-gray-200 mly-px-1 mly-py-1.5 mly-text-gray-500\">\n <div className=\"mly-flex mly-items-center mly-gap-1\">\n <VariableIcon>\n <ArrowDownIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n <VariableIcon>\n <ArrowUpIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n <span className=\"mly-text-xs mly-text-gray-500\">Navigate</span>\n </div>\n <VariableIcon>\n <CornerDownLeftIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n </div>\n </div>\n );\n });\n\ntype VariableIconProps = {\n className?: string;\n children: React.ReactNode;\n};\n\nfunction VariableIcon(props: VariableIconProps) {\n const { className, children } = props;\n\n return (\n <div\n className={cn(\n 'mly-flex mly-size-5 mly-items-center mly-justify-center mly-rounded-md mly-border',\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { getNodeOptions } from '@/editor/utils/node-options';\nimport { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { AlertTriangle, Braces, Pencil } from 'lucide-react';\nimport { useMemo } from 'react';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n VariableOptions,\n type RenderVariableFunction,\n} from './variable';\n\nexport function VariableView(props: NodeViewProps) {\n const { node, updateAttributes, editor } = props;\n const { id, fallback, required } = node.attrs;\n\n const renderVariable = useMemo(() => {\n const variableRender =\n getNodeOptions<VariableOptions>(editor, 'variable')?.renderVariable ??\n DEFAULT_RENDER_VARIABLE_FUNCTION;\n\n return variableRender;\n }, [editor]);\n\n return (\n <NodeViewWrapper\n className=\"react-component mly-inline-block mly-leading-none\"\n draggable=\"false\"\n >\n <Popover\n onOpenChange={(open) => {\n editor.storage.variable.popover = open;\n }}\n >\n <PopoverTrigger>\n {renderVariable({\n variable: { name: id, required: required, valid: true },\n fallback,\n editor,\n from: 'content-variable',\n })}\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch mly-text-midnight-gray\">\n <label className=\"mly-relative\">\n <span className=\"mly-inline-block mly-px-2 mly-text-xs mly-text-midnight-gray\">\n Variable\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={id ?? ''}\n onChange={(e) => {\n updateAttributes({\n id: e.target.value,\n });\n }}\n placeholder=\"ie. name...\"\n className=\"mly-h-7 mly-w-36 mly-rounded-md mly-bg-soft-gray mly-px-2 mly-text-sm mly-text-midnight-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n />\n </label>\n\n <Divider className=\"mly-mx-1.5\" />\n\n <label className=\"mly-relative\">\n <span className=\"mly-inline-block mly-px-2 mly-pl-1 mly-text-xs mly-text-midnight-gray\">\n Default\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={fallback ?? ''}\n onChange={(e) => {\n updateAttributes({\n fallback: e.target.value,\n });\n }}\n placeholder=\"ie. John Doe...\"\n className=\"mly-h-7 mly-w-32 mly-rounded-md mly-bg-soft-gray mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n />\n <div className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center\">\n <Pencil className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n </label>\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\nexport const DefaultRenderVariable: RenderVariableFunction = (props) => {\n const { variable, fallback, from } = props;\n const { name, required, valid } = variable;\n\n if (from === 'button-variable') {\n return (\n <div className=\"mly-inline-grid mly-h-7 mly-max-w-xs mly-grid-cols-[12px_1fr] mly-items-center mly-gap-1.5 mly-rounded-md mly-border mly-border-[var(--button-var-border-color)] mly-px-2 mly-font-mono mly-text-sm\">\n <Braces className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n <span className=\"mly-min-w-0 mly-truncate mly-text-left\">{name}</span>\n </div>\n );\n }\n\n if (from === 'bubble-variable') {\n return (\n <div\n className={cn(\n 'mly-inline-grid mly-h-7 mly-min-w-28 mly-max-w-xs mly-grid-cols-[12px_1fr] mly-items-center mly-gap-1.5 mly-rounded-md mly-border mly-px-2 mly-font-mono mly-text-sm hover:mly-bg-soft-gray',\n !valid &&\n 'mly-border-rose-400 mly-bg-rose-50 mly-text-rose-600 hover:mly-bg-rose-100'\n )}\n >\n <Braces className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5] mly-text-rose-600\" />\n <span className=\"mly-min-w-0 mly-truncate mly-text-left\">{name}</span>\n </div>\n );\n }\n\n return (\n <span\n tabIndex={-1}\n className=\"mly-inline-flex mly-items-center mly-gap-[var(--variable-icon-gap)] mly-rounded-full mly-border mly-border-gray-200 mly-px-1.5 mly-py-0.5 mly-leading-none\"\n >\n <Braces className=\"mly-size-[var(--variable-icon-size)] mly-shrink-0 mly-stroke-[2.5] mly-text-rose-600\" />\n {name}\n {required && !fallback && (\n <AlertTriangle className=\"mly-size-[var(--variable-icon-size)] mly-shrink-0 mly-stroke-[2.5]\" />\n )}\n </span>\n );\n};\n","import { useId } from 'react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ChevronDownIcon, LucideIcon } from 'lucide-react';\nimport { SVGIcon } from '../icons/grid-lines';\n\ntype SelectProps = {\n label: string;\n options: {\n value: string;\n label: string;\n }[];\n\n value: string;\n onValueChange: (value: string) => void;\n\n tooltip?: string;\n className?: string;\n\n icon?: LucideIcon | SVGIcon;\n iconClassName?: string;\n};\n\nexport function Select(props: SelectProps) {\n const {\n label,\n options,\n value,\n onValueChange,\n tooltip,\n className,\n icon: Icon,\n iconClassName,\n } = props;\n\n const selectId = `mly${useId()}`;\n\n const content = (\n <div className=\"mly-relative\">\n <label htmlFor={selectId} className=\"mly-sr-only\">\n {label}\n </label>\n\n {Icon && (\n <div className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-left-2 mly-z-20 mly-flex mly-items-center\">\n <Icon className={cn('mly-size-3', iconClassName)} />\n </div>\n )}\n\n <select\n id={selectId}\n className={cn(\n 'mly-flex mly-min-h-7 mly-max-w-max mly-appearance-none mly-items-center mly-rounded-md mly-bg-white mly-px-1.5 mly-py-0.5 mly-pr-7 mly-text-sm mly-text-midnight-gray mly-ring-offset-white mly-transition-colors hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 active:mly-bg-soft-gray',\n !!Icon && 'mly-pl-7',\n className\n )}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <span className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-right-0 mly-z-10 mly-flex mly-h-full mly-w-7 mly-items-center mly-justify-center mly-text-gray-600 peer-disabled:mly-opacity-50\">\n <ChevronDownIcon\n size={16}\n strokeWidth={2}\n aria-hidden=\"true\"\n role=\"img\"\n />\n </span>\n </div>\n );\n\n if (!tooltip) {\n return content;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n","import { AlignmentSwitch } from '@/editor/components/alignment-switch';\nimport { BaseButton } from '@/editor/components/base-button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { ShowPopover } from '@/editor/components/show-popover';\nimport { ColorPicker } from '@/editor/components/ui/color-picker';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { LinkInputPopover } from '@/editor/components/ui/link-input-popover';\nimport { Select } from '@/editor/components/ui/select';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { CSSProperties, useMemo } from 'react';\nimport {\n allowedButtonBorderRadius,\n AllowedButtonVariant,\n allowedButtonVariant,\n ButtonAttributes,\n} from './button';\nimport { ButtonLabelInput } from './button-label-input';\n\nexport function ButtonView(props: NodeViewProps) {\n const { node, editor, getPos, updateAttributes } = props;\n const {\n text,\n isTextVariable,\n alignment,\n variant,\n borderRadius: _radius,\n buttonColor,\n textColor,\n url: externalLink,\n showIfKey = '',\n isUrlVariable,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n } = node.attrs as ButtonAttributes;\n\n const opts = useVariableOptions(editor);\n const renderVariable = opts?.renderVariable;\n\n const sizes = useMemo(\n () => ({\n small: {\n paddingX: 24,\n paddingY: 6,\n },\n medium: {\n paddingX: 32,\n paddingY: 10,\n },\n large: {\n paddingX: 40,\n paddingY: 14,\n },\n }),\n []\n );\n\n const size = useMemo(() => {\n return Object.entries(sizes).find(\n ([, { paddingX, paddingY }]) =>\n paddingRight === paddingX && paddingTop === paddingY\n )?.[0] as 'small' | 'medium' | 'large';\n }, [paddingRight, paddingTop, sizes]);\n\n return (\n <NodeViewWrapper\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n data-type=\"button\"\n style={{\n textAlign: alignment,\n }}\n >\n <Popover open={props.selected && editor.isEditable}>\n <PopoverTrigger asChild>\n <div>\n <button\n className={cn(\n 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors disabled:mly-pointer-events-none disabled:mly-opacity-50',\n 'mly-font-semibold mly-no-underline',\n {\n '!mly-rounded-full': _radius === 'round',\n '!mly-rounded-md': _radius === 'smooth',\n '!mly-rounded-none': _radius === 'sharp',\n }\n )}\n tabIndex={-1}\n style={\n {\n backgroundColor:\n variant === 'filled' ? buttonColor : 'transparent',\n color: textColor,\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: buttonColor,\n // decrease the border color opacity to 80%\n // so that it's not too prominent\n '--button-var-border-color': `${textColor}80`,\n\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n } as CSSProperties\n }\n onClick={(e) => {\n e.preventDefault();\n if (!editor.isEditable) {\n return;\n }\n\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n {isTextVariable\n ? renderVariable({\n variable: { name: text, valid: true },\n fallback: text,\n from: 'button-variable',\n editor,\n })\n : text}\n </button>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch mly-text-midnight-gray\">\n <ButtonLabelInput\n value={text}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n text: value,\n isTextVariable: isVariable ?? false,\n });\n }}\n isVariable={isTextVariable}\n editor={editor}\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <Select\n label=\"Border Radius\"\n value={_radius}\n options={allowedButtonBorderRadius.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n borderRadius: value,\n });\n }}\n tooltip=\"Border Radius\"\n className=\"mly-capitalize\"\n />\n\n <Select\n label=\"Style\"\n value={variant}\n options={allowedButtonVariant.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n variant: value,\n });\n }}\n tooltip=\"Style\"\n className=\"mly-capitalize\"\n />\n\n <Select\n label=\"Size\"\n value={size}\n options={[\n { value: 'small', label: 'Small' },\n { value: 'medium', label: 'Medium' },\n { value: 'large', label: 'Large' },\n ]}\n onValueChange={(value) => {\n const { paddingX, paddingY } =\n sizes[value as 'small' | 'medium' | 'large'];\n\n updateAttributes({\n paddingTop: paddingY,\n paddingRight: paddingX,\n paddingBottom: paddingY,\n paddingLeft: paddingX,\n });\n }}\n tooltip=\"Size\"\n />\n </div>\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <AlignmentSwitch\n alignment={alignment}\n onAlignmentChange={(alignment) => {\n updateAttributes({\n alignment,\n });\n }}\n />\n\n <LinkInputPopover\n defaultValue={externalLink || ''}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n url: value,\n isUrlVariable: isVariable ?? false,\n });\n }}\n tooltip=\"Update External Link\"\n editor={editor}\n isVariable={isUrlVariable}\n />\n </div>\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <BackgroundColorPickerPopup\n variant={variant}\n color={buttonColor}\n onChange={(color) => {\n updateAttributes({\n buttonColor: color,\n });\n }}\n />\n\n <TextColorPickerPopup\n color={textColor}\n onChange={(color) => {\n updateAttributes({\n textColor: color,\n });\n }}\n />\n </div>\n\n <Divider />\n\n <ShowPopover\n showIfKey={showIfKey}\n onShowIfKeyValueChange={(value) => {\n updateAttributes({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\ntype ColorPickerProps = {\n variant?: AllowedButtonVariant;\n color: string;\n onChange: (color: string) => void;\n};\n\nfunction BackgroundColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange, variant } = props;\n\n return (\n <ColorPicker\n color={color}\n onColorChange={onChange}\n tooltip=\"Background Color\"\n >\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n >\n <div\n className=\"mly-h-4 mly-w-4 mly-shrink-0 mly-rounded-full mly-shadow\"\n style={{\n backgroundColor: variant === 'filled' ? color : 'transparent',\n borderStyle: 'solid',\n borderWidth: 2,\n borderColor: variant === 'filled' ? 'white' : color,\n }}\n />\n </BaseButton>\n </ColorPicker>\n );\n}\n\nfunction TextColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange } = props;\n\n return (\n <ColorPicker color={color} onColorChange={onChange} tooltip=\"Text Color\">\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n >\n <div className=\"mly-flex mly-flex-col mly-items-center mly-justify-center mly-gap-[1px]\">\n <span className=\"mly-font-bolder mly-font-mono mly-text-xs mly-text-midnight-gray\">\n A\n </span>\n <div\n className=\"mly-h-[2px] mly-w-3 mly-shrink-0 mly-rounded-md mly-shadow\"\n style={{ backgroundColor: color }}\n />\n </div>\n </BaseButton>\n </ColorPicker>\n );\n}\n","import { InputAutocomplete } from '@/editor/components/ui/input-autocomplete';\nimport { DEFAULT_VARIABLE_TRIGGER_CHAR } from '@/editor/nodes/variable/variable';\nimport { DEFAULT_PLACEHOLDER_URL, useMailyContext } from '@/editor/provider';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { processVariables } from '@/editor/utils/variable';\nimport { Editor } from '@tiptap/core';\nimport { useMemo, useRef, useState } from 'react';\n\ntype ButtonLabelInputProps = {\n value: string;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n isVariable?: boolean;\n\n editor: Editor;\n};\n\nexport function ButtonLabelInput(props: ButtonLabelInputProps) {\n const { value, onValueChange, isVariable, editor } = props;\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const { placeholderUrl = DEFAULT_PLACEHOLDER_URL } = useMailyContext();\n const otps = useVariableOptions(editor);\n const variables = otps?.variables;\n const variableTriggerCharacter =\n otps?.suggestion?.char ?? DEFAULT_VARIABLE_TRIGGER_CHAR;\n const renderVariable = otps?.renderVariable;\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = value.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, value, editor]);\n\n return (\n <div className=\"mly-isolate mly-flex mly-rounded-lg\">\n {!isEditing && (\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: value,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n\n {isEditing && (\n <InputAutocomplete\n editor={editor}\n value={value}\n onValueChange={(value) => {\n onValueChange?.(value);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder={placeholderUrl}\n className=\"mly-h-7 mly-w-40 mly-rounded-md mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray hover:mly-bg-soft-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable = autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n }\n onValueChange?.(value, isVariable);\n }}\n />\n )}\n </div>\n );\n}\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { ImageView } from './image-view';\n\nconst DEFAULT_IMAGE_BORDER_RADIUS = 0;\n\nexport const ImageExtension = TiptapImage.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: 'auto',\n parseHTML: (element) => {\n return (\n element.getAttribute('width') ||\n (element.style?.width || element.style?.inlineSize)?.replace(\n 'px',\n ''\n ) ||\n null\n );\n },\n renderHTML: ({ width }) => ({ width }),\n },\n height: {\n default: 'auto',\n parseHTML: (element) => {\n return (\n element.getAttribute('height') ||\n (element.style?.height || element.style?.blockSize)?.replace(\n 'px',\n ''\n ) ||\n null\n );\n },\n renderHTML: ({ height }) => ({ height }),\n },\n alignment: {\n default: 'center',\n renderHTML: ({ alignment }) => ({ 'data-alignment': alignment }),\n parseHTML: (element) =>\n element.getAttribute('data-alignment') || 'center',\n },\n\n externalLink: {\n default: null,\n renderHTML: ({ externalLink }) => {\n if (!externalLink) {\n return {};\n }\n return {\n 'data-external-link': externalLink,\n };\n },\n parseHTML: (element) => {\n const externalLink = element.getAttribute('data-external-link');\n return externalLink ? { externalLink } : null;\n },\n },\n\n // Later we will remove this attribute\n // and use the `externalLink` attribute instead\n // when implement the URL variable feature\n isExternalLinkVariable: {\n default: false,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-is-external-link-variable') === 'true'\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.isExternalLinkVariable) {\n return {};\n }\n\n return {\n 'data-is-external-link-variable': 'true',\n };\n },\n },\n\n borderRadius: {\n default: DEFAULT_IMAGE_BORDER_RADIUS,\n parseHTML: (element) => {\n return Number(element.getAttribute('data-border-radius'));\n },\n renderHTML: (attributes) => {\n return {\n 'data-border-radius': attributes.borderRadius,\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n\n aspectRatio: {\n default: null,\n parseHTML: (element) => {\n return element.getAttribute('data-aspect-ratio') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes?.aspectRatio) {\n return {};\n }\n\n return {\n 'data-aspect-ratio': attributes?.aspectRatio,\n };\n },\n },\n\n lockAspectRatio: {\n default: true,\n parseHTML: (element) => {\n return element.getAttribute('data-lock-aspect-ratio') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.lockAspectRatio) {\n return {};\n }\n\n return {\n 'data-lock-aspect-ratio': 'true',\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ImageView, {\n className: 'mly-relative',\n });\n },\n});\n","import TiptapLink from '@tiptap/extension-link';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n customLink: {\n setIsUrlVariable: (isUrlVariable: boolean) => ReturnType;\n };\n }\n}\n\nexport const LinkExtension = TiptapLink.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n isUrlVariable: {\n default: false,\n },\n };\n },\n addCommands() {\n return {\n ...this.parent?.(),\n\n setIsUrlVariable:\n (isUrlVariable) =>\n ({ chain }) => {\n return chain().setMark('link', { isUrlVariable }).run();\n },\n };\n },\n});\n","import TiptapHeading from '@tiptap/extension-heading';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\nexport const HeadingExtension = TiptapHeading.extend({\n addAttributes() {\n return {\n ...(this?.parent?.() || {}),\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n});\n","import TiptapParagraph from '@tiptap/extension-paragraph';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\nexport const ParagraphExtension = TiptapParagraph.extend({\n addAttributes() {\n return {\n ...(this?.parent?.() || {}),\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { RepeatView } from './repeat-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\ntype RepeatAttributes = {\n each: string;\n isUpdatingKey: boolean;\n showIfKey: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n repeat: {\n setRepeat: () => ReturnType;\n updateRepeat: (attrs: Partial<RepeatAttributes>) => ReturnType;\n };\n }\n}\n\nexport const RepeatExtension = Node.create({\n name: 'repeat',\n group: 'block',\n content: '(block|columns)+',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n each: {\n default: 'items',\n parseHTML: (element) => {\n return element.getAttribute('each') || '';\n },\n renderHTML: (attributes) => {\n if (!attributes.each) {\n return {};\n }\n\n return {\n each: attributes.each,\n };\n },\n },\n isUpdatingKey: {\n default: false,\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n setRepeat:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateRepeat: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(RepeatView, {\n contentDOMElementTag: 'div',\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper, NodeViewContent } from '@tiptap/react';\nimport { Repeat2 } from 'lucide-react';\n\nexport function RepeatView(props: NodeViewProps) {\n const { editor, getPos } = props;\n\n return (\n <NodeViewWrapper\n data-type=\"repeat\"\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n className=\"mly-relative\"\n >\n <NodeViewContent className=\"is-editable\" />\n\n <div\n role=\"button\"\n data-repeat-indicator=\"\"\n className=\"mly-absolute mly-inset-y-0 mly-right-0 mly-flex mly-translate-x-full mly-cursor-pointer mly-flex-col mly-items-center mly-gap-1 mly-opacity-60\"\n contentEditable={false}\n onClick={() => {\n editor.commands.setNodeSelection(getPos());\n }}\n >\n <Repeat2 className=\"mly-size-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n <div className=\"mly-w-[1.5px] mly-grow mly-rounded-full mly-bg-rose-300\" />\n </div>\n </NodeViewWrapper>\n );\n}\n","import Placeholder from '@tiptap/extension-placeholder';\n\nexport const PlaceholderExtension = Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === 'heading') {\n return `Heading ${node.attrs.level}`;\n } else if (node.type.name === 'htmlCodeBlock') {\n return 'Type your HTML code...';\n } else if (\n ['columns', 'column', 'section', 'repeat', 'show', 'blockquote'].includes(\n node.type.name\n )\n ) {\n return '';\n }\n\n return 'Write something or / to see commands';\n },\n includeChildren: true,\n});\n","import { Editor, Extension } from '@tiptap/core';\nimport Suggestion, { SuggestionOptions } from '@tiptap/suggestion';\n\nexport type SlashCommandOptions = {\n suggestion: Omit<SuggestionOptions, 'editor'>;\n};\n\nexport const SlashCommandExtension = Extension.create<SlashCommandOptions>({\n name: 'slash-command',\n addOptions() {\n return {\n suggestion: {\n char: '/',\n command: ({ editor, range, props }) => {\n props.command({ editor, range });\n },\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n});\n","import { BlockGroupItem, BlockItem } from '@/blocks/types';\nimport { cn } from '@/editor/utils/classname';\nimport { Editor, Range } from '@tiptap/core';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport {\n forwardRef,\n Fragment,\n KeyboardEvent,\n RefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport tippy, { GetReferenceClientRect, Instance } from 'tippy.js';\nimport { DEFAULT_SLASH_COMMANDS } from './default-slash-commands';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { SlashCommandItem } from './slash-command-item';\nimport { filterSlashCommands } from './slash-command-search';\n\ntype CommandListProps = {\n items: BlockGroupItem[];\n command: (item: BlockItem) => void;\n editor: Editor;\n range: Range;\n query: string;\n};\n\nconst CommandList = forwardRef<unknown, CommandListProps>((props, ref) => {\n const { items: groups, command, editor, range, query } = props;\n\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0);\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n const [hoveredItemKey, setHoveredItemKey] = useState<string | null>(null);\n\n const prevQuery = useRef('');\n const prevSelectedGroupIndex = useRef(0);\n const prevSelectedCommandIndex = useRef(0);\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const item = groups[groupIndex].commands[commandIndex];\n if (!item) {\n return;\n }\n\n command(item);\n },\n [command]\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n const navigationKeys = [\n 'ArrowUp',\n 'ArrowDown',\n 'Enter',\n 'ArrowLeft',\n 'ArrowRight',\n ];\n if (navigationKeys.includes(event.key)) {\n let newCommandIndex = selectedCommandIndex;\n let newGroupIndex = selectedGroupIndex;\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n\n const group = groups?.[selectedGroupIndex];\n const isInsideSubCommand = group && 'id' in group;\n if (!isInsideSubCommand) {\n return false;\n }\n\n editor\n .chain()\n .focus()\n .insertContentAt(range, `/${prevQuery.current}`)\n .run();\n setTimeout(() => {\n setSelectedGroupIndex(prevSelectedGroupIndex.current);\n setSelectedCommandIndex(prevSelectedCommandIndex.current);\n }, 0);\n return true;\n case 'ArrowRight':\n event.preventDefault();\n\n const command =\n groups?.[selectedGroupIndex]?.commands?.[selectedCommandIndex];\n const isSelectingSubCommand = command && 'commands' in command;\n if (!isSelectingSubCommand) {\n return false;\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex);\n prevQuery.current = query;\n prevSelectedGroupIndex.current = selectedGroupIndex;\n prevSelectedCommandIndex.current = selectedCommandIndex;\n return true;\n case 'Enter':\n if (!groups.length) {\n return false;\n }\n selectItem(selectedGroupIndex, selectedCommandIndex);\n\n prevQuery.current = query;\n prevSelectedGroupIndex.current = selectedGroupIndex;\n prevSelectedCommandIndex.current = selectedCommandIndex;\n return true;\n case 'ArrowUp':\n if (!groups.length) {\n return false;\n }\n newCommandIndex = selectedCommandIndex - 1;\n newGroupIndex = selectedGroupIndex;\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1;\n newCommandIndex = groups[newGroupIndex]?.commands.length - 1 || 0;\n }\n if (newGroupIndex < 0) {\n newGroupIndex = groups.length - 1;\n newCommandIndex = groups[newGroupIndex]?.commands.length - 1 || 0;\n }\n setSelectedGroupIndex(newGroupIndex);\n setSelectedCommandIndex(newCommandIndex);\n return true;\n case 'ArrowDown':\n if (!groups.length) {\n return false;\n }\n const commands = groups[selectedGroupIndex].commands;\n newCommandIndex = selectedCommandIndex + 1;\n newGroupIndex = selectedGroupIndex;\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0;\n newGroupIndex = selectedGroupIndex + 1;\n }\n if (groups.length - 1 < newGroupIndex) {\n newGroupIndex = 0;\n }\n setSelectedGroupIndex(newGroupIndex);\n setSelectedCommandIndex(newCommandIndex);\n return true;\n default:\n return false;\n }\n }\n },\n }));\n\n const commandListContainer = useRef<HTMLDivElement>(null);\n const activeCommandRef = useRef<HTMLButtonElement | null>(null);\n\n useLayoutEffect(() => {\n const container = commandListContainer?.current;\n const activeCommandContainer = activeCommandRef?.current;\n if (!container || !activeCommandContainer) {\n return;\n }\n\n const { offsetTop, offsetHeight } = activeCommandContainer;\n container.style.transition = 'none';\n container.scrollTop = offsetTop - offsetHeight;\n }, [\n selectedGroupIndex,\n selectedCommandIndex,\n commandListContainer,\n activeCommandRef,\n ]);\n\n useEffect(() => {\n setSelectedGroupIndex(0);\n setSelectedCommandIndex(0);\n }, [groups]);\n\n useEffect(() => {\n return () => {\n prevQuery.current = '';\n prevSelectedGroupIndex.current = 0;\n prevSelectedCommandIndex.current = 0;\n };\n }, []);\n\n if (!groups || groups.length === 0) {\n return null;\n }\n\n return (\n <TooltipProvider>\n <div className=\"mly-z-50 mly-w-72 mly-overflow-hidden mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-shadow-md mly-transition-all\">\n <div\n id=\"slash-command\"\n ref={commandListContainer}\n className=\"mly-no-scrollbar mly-h-auto mly-max-h-[330px] mly-overflow-y-auto\"\n >\n {groups.map((group, groupIndex) => (\n <Fragment key={groupIndex}>\n <span\n className={cn(\n 'mly-block mly-border-b mly-border-gray-200 mly-bg-soft-gray mly-p-2 mly-text-xs mly-uppercase mly-text-gray-400',\n groupIndex > 0 ? 'mly-border-t' : ''\n )}\n >\n {group.title}\n </span>\n <div className=\"mly-space-y-0.5 mly-p-1\">\n {group.commands.map((item, commandIndex) => {\n const itemKey = `${groupIndex}-${commandIndex}`;\n return (\n <SlashCommandItem\n key={itemKey}\n item={item}\n groupIndex={groupIndex}\n commandIndex={commandIndex}\n selectedGroupIndex={selectedGroupIndex}\n selectedCommandIndex={selectedCommandIndex}\n selectItem={() => selectItem(groupIndex, commandIndex)}\n editor={editor}\n activeCommandRef={activeCommandRef}\n hoveredItemKey={hoveredItemKey}\n onHover={(isHovered) =>\n setHoveredItemKey(isHovered ? itemKey : null)\n }\n />\n );\n })}\n </div>\n </Fragment>\n ))}\n </div>\n <div className=\"mly-border-t mly-border-gray-200 mly-px-1 mly-py-3 mly-pl-4\">\n <div className=\"mly-flex mly-items-center\">\n <p className=\"mly-text-center mly-text-xs mly-text-gray-400\">\n <kbd className=\"mly-rounded mly-border mly-border-gray-200 mly-p-1 mly-px-2 mly-font-medium\">\n ↑\n </kbd>\n <kbd className=\"mly-ml-1 mly-rounded mly-border mly-border-gray-200 mly-p-1 mly-px-2 mly-font-medium\">\n ↓\n </kbd>{' '}\n to navigate\n </p>\n <span aria-hidden=\"true\" className=\"mly-select-none mly-px-1\">\n ·\n </span>\n <p className=\"mly-text-center mly-text-xs mly-text-gray-400\">\n <kbd className=\"mly-rounded mly-border mly-border-gray-200 mly-p-1 mly-px-1.5 mly-font-medium\">\n Enter\n </kbd>{' '}\n to select\n </p>\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n});\n\nexport function getSlashCommandSuggestions(\n groups: BlockGroupItem[] = DEFAULT_SLASH_COMMANDS\n): Omit<SuggestionOptions, 'editor'> {\n return {\n items: ({ query, editor }) => {\n return filterSlashCommands({ query, editor, groups });\n },\n allow: ({ editor }) => {\n const isInsideHTMLCodeBlock = editor.isActive('htmlCodeBlock');\n if (isInsideHTMLCodeBlock) {\n return false;\n }\n\n return true;\n },\n render: () => {\n let component: ReactRenderer<any>;\n let popup: Instance<any>[] | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(CommandList, {\n props,\n editor: props.editor,\n });\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'top-start',\n });\n },\n onUpdate: (props) => {\n const currentPopup = popup?.[0];\n if (!currentPopup || currentPopup?.state?.isDestroyed) {\n return;\n }\n\n component?.updateProps(props);\n currentPopup.setProps({\n getReferenceClientRect: props.clientRect,\n });\n },\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n const currentPopup = popup?.[0];\n if (!currentPopup?.state?.isDestroyed) {\n currentPopup?.destroy();\n }\n\n component?.destroy();\n return true;\n }\n\n return component?.ref?.onKeyDown(props);\n },\n onExit: () => {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n const currentPopup = popup?.[0];\n if (!currentPopup.state.isDestroyed) {\n currentPopup.destroy();\n }\n\n component?.destroy();\n },\n };\n },\n };\n}\n","import type { Editor } from '@tiptap/core';\nimport { BlockItem } from '@/blocks';\nimport { ChevronRightIcon } from 'lucide-react';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@/editor/components/ui/tooltip';\nimport { useCallback, useState, useRef, useEffect, RefObject } from 'react';\nimport { cn } from '@/editor/utils/classname';\n\ntype SlashCommandItemProps = {\n item: BlockItem;\n groupIndex: number;\n commandIndex: number;\n selectedGroupIndex: number;\n selectedCommandIndex: number;\n editor: Editor;\n activeCommandRef: RefObject<HTMLButtonElement> | null;\n selectItem: (groupIndex: number, commandIndex: number) => void;\n hoveredItemKey: string | null;\n onHover: (isHovered: boolean) => void;\n};\n\nexport function SlashCommandItem(props: SlashCommandItemProps) {\n const {\n item,\n groupIndex,\n commandIndex,\n selectedGroupIndex,\n selectedCommandIndex,\n editor,\n activeCommandRef,\n selectItem,\n hoveredItemKey,\n onHover,\n } = props;\n\n const [open, setOpen] = useState(false);\n const isActive =\n groupIndex === selectedGroupIndex && commandIndex === selectedCommandIndex;\n\n const itemKey = `${groupIndex}-${commandIndex}`;\n const isHovered = hoveredItemKey === itemKey;\n\n const isSubCommand = item && 'commands' in item;\n\n // show tooltip only if this item is hovered OR (active/keyboard selected AND no other item is hovered)\n const shouldOpenTooltip =\n !!item?.preview && (isHovered || (isActive && !hoveredItemKey));\n\n const hasRenderFunction = typeof item.render === 'function';\n const renderFunctionValue = hasRenderFunction ? item.render?.(editor) : null;\n\n let value = (\n <>\n <div className=\"mly-flex mly-h-6 mly-w-6 mly-shrink-0 mly-items-center mly-justify-center\">\n {item.icon}\n </div>\n <div className=\"mly-grow\">\n <p className=\"mly-font-medium\">{item.title}</p>\n <p className=\"mly-text-xs mly-text-gray-400\">{item.description}</p>\n </div>\n\n {isSubCommand && (\n <span className=\"mly-block mly-px-1 mly-text-gray-400\">\n <ChevronRightIcon className=\"mly-size-3.5 mly-stroke-[2.5]\" />\n </span>\n )}\n </>\n );\n\n if (renderFunctionValue !== null && renderFunctionValue !== true) {\n value = renderFunctionValue!;\n }\n\n const openTimerRef = useRef<number>(0);\n const handleDelayedOpen = useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n const delay = 200;\n openTimerRef.current = window.setTimeout(() => {\n setOpen(true);\n openTimerRef.current = 0;\n }, delay);\n }, [setOpen]);\n\n useEffect(() => {\n if (shouldOpenTooltip) {\n handleDelayedOpen();\n } else {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }\n }, [shouldOpenTooltip]);\n\n useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n\n return (\n <Tooltip open={open} key={`${groupIndex}-${commandIndex}`}>\n <TooltipTrigger asChild>\n <button\n className={cn(\n 'mly-flex mly-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-text-sm mly-text-gray-900 hover:mly-bg-gray-100 hover:mly-text-gray-900',\n isActive\n ? 'mly-bg-gray-100 mly-text-gray-900'\n : 'mly-bg-transparent'\n )}\n onClick={() => selectItem(groupIndex, commandIndex)}\n onMouseEnter={() => onHover(true)}\n onMouseLeave={() => onHover(false)}\n type=\"button\"\n ref={isActive ? activeCommandRef : null}\n >\n {value}\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"right\"\n sideOffset={10}\n className=\"mly-w-52 mly-rounded-lg mly-border-none mly-p-1 mly-shadow\"\n >\n {typeof item.preview === 'function' ? (\n item?.preview(editor)\n ) : (\n <>\n <figure className=\"mly-relative mly-aspect-[2.5] mly-w-full mly-overflow-hidden mly-rounded-md mly-border mly-border-gray-200\">\n <img\n src={item?.preview}\n alt={item?.title}\n className=\"mly-absolute mly-inset-0 mly-h-full mly-w-full mly-object-cover\"\n />\n </figure>\n <p className=\"mly-mt-2 mly-px-0.5 mly-text-gray-500\">\n {item.description}\n </p>\n </>\n )}\n </TooltipContent>\n </Tooltip>\n );\n}\n","import { BlockGroupItem, BlockItem } from '@/blocks';\nimport { Editor } from '@tiptap/core';\n\ntype SlashCommandFilterOptions = {\n readonly groups: BlockGroupItem[];\n query: string;\n editor: Editor;\n};\n\nexport function filterSlashCommands(options: SlashCommandFilterOptions) {\n const { groups, query, editor } = options;\n const newGroups = [...groups];\n let searchQuery = query?.toLowerCase();\n\n const subCommandMatch = searchQuery.match(/^([^.]+)\\./);\n\n // so if we are inside a subcommand we need to\n // filter the commands based on the remaining search\n if (subCommandMatch) {\n const [match, subCommandId] = subCommandMatch;\n const subCommandGroup = findSubCommandGroup(groups, subCommandId);\n\n if (subCommandGroup) {\n // headers.something -> headers. -> something (remainingSearch)\n const remainingSearch = searchQuery.slice(match.length);\n const filteredCommands = subCommandGroup.commands.filter(\n (item) => !remainingSearch || isCommandMatch(item, remainingSearch)\n );\n\n return filteredCommands.length\n ? [\n {\n ...subCommandGroup,\n commands: filteredCommands,\n },\n ]\n : [];\n }\n }\n\n const filteredGroups = newGroups\n .map((group) => {\n return {\n ...group,\n commands: group.commands.flatMap((item) =>\n processCommand({ item, search: searchQuery, editor })\n ),\n };\n })\n .filter((group) => group.commands.length > 0);\n\n return filteredGroups;\n}\n\ntype SubCommandGroup = BlockItem & {\n id: string;\n commands: BlockItem[];\n};\n\nfunction findSubCommandGroup(\n groups: BlockGroupItem[],\n subCommandId: string\n): SubCommandGroup | undefined {\n return groups\n .flatMap((group) => group.commands)\n .find(\n (item) =>\n 'commands' in item &&\n item.id?.toLowerCase() === subCommandId.toLowerCase()\n ) as SubCommandGroup | undefined;\n}\n\nfunction containsText(text: string | undefined, search: string): boolean {\n if (!text) {\n return false;\n }\n\n return text.toLowerCase().includes(search.toLowerCase());\n}\n\nfunction isCommandMatch(item: BlockItem, search: string): boolean {\n return (\n containsText(item.title, search) ||\n containsText(item.description, search) ||\n (item.searchTerms?.some((term) => containsText(term, search)) ?? false)\n );\n}\n\nfunction isSubCommand(item: BlockItem): item is SubCommandGroup {\n return 'commands' in item && Array.isArray(item.commands) && !!item.id;\n}\n\ntype ProcessCommandOptions = {\n item: BlockItem;\n search: string;\n editor: Editor;\n};\n\nfunction processCommand(options: ProcessCommandOptions): BlockItem[] {\n const { item, search, editor } = options;\n\n const show = item?.render?.(editor);\n if (show === null) {\n return [];\n }\n\n const isSearching = search.length > 0;\n if (isSubCommand(item)) {\n // if we are not searching, we want to return a navigable command\n // that will navigate to the group so that we can navigate into it\n // using the arrow keys / enter key\n // @ts-expect-error\n const navigableCommand: BlockItem = {\n ...item,\n command: (options) => {\n const { editor, range } = options;\n editor.chain().focus().insertContentAt(range, `/${item.id}.`).run();\n },\n };\n\n // first check if the item matches the search\n const matched = isCommandMatch(navigableCommand, search);\n if (matched) {\n return [navigableCommand];\n }\n\n // so the main command does not match the search\n // we need to check if any of the commands match the search\n // if they do, we return the commands instead of the main command\n const hasMatchingCommands =\n navigableCommand?.commands?.some((command) =>\n isCommandMatch(command, search)\n ) ?? false;\n\n if (!hasMatchingCommands) {\n return [];\n }\n\n return navigableCommand?.commands ?? [];\n }\n\n return !isSearching || isCommandMatch(item, search) ? [item] : [];\n}\n","import {\n getVariableOptions,\n useVariableOptions,\n} from '@/editor/utils/node-options';\nimport { processVariables } from '@/editor/utils/variable';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport { forwardRef, useImperativeHandle, useRef } from 'react';\nimport tippy, { GetReferenceClientRect } from 'tippy.js';\nimport {\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n Variable as VariableType,\n} from './variable';\nimport { VariableSuggestionsPopoverRef } from './variable-suggestions-popover';\n\nexport type VariableListProps = {\n command: (params: { id: string; required: boolean }) => void;\n items: VariableType[];\n} & SuggestionOptions;\n\nexport const VariableList = forwardRef((props: VariableListProps, ref) => {\n const { items = [], editor } = props;\n\n const popoverRef = useRef<VariableSuggestionsPopoverRef>(null);\n const VariableSuggestionPopoverComponent =\n useVariableOptions(editor)?.variableSuggestionsPopover;\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!popoverRef.current) {\n return false;\n }\n\n const { moveUp, moveDown, select } = popoverRef.current || {};\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveUp();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveDown();\n return true;\n }\n\n if (event.key === 'Enter') {\n select();\n return true;\n }\n\n return false;\n },\n }));\n\n return (\n <VariableSuggestionPopoverComponent\n items={items}\n onSelectItem={(value) => {\n props.command({\n id: value.name,\n required: value.required ?? true,\n });\n }}\n ref={popoverRef}\n />\n );\n});\n\nVariableList.displayName = 'VariableList';\n\nexport function getVariableSuggestions(\n char: string = DEFAULT_VARIABLE_TRIGGER_CHAR\n): Omit<SuggestionOptions, 'editor'> {\n return {\n char,\n items: ({ query, editor }) => {\n const variables = getVariableOptions(editor)?.variables;\n\n return processVariables(variables, {\n query,\n editor,\n from: 'content-variable',\n });\n },\n\n render: () => {\n let component: ReactRenderer<any>;\n let popup: InstanceType<any> | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(VariableList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\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 as GetReferenceClientRect,\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup?.[0].hide();\n return true;\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n popup?.[0].destroy();\n component.destroy();\n },\n };\n },\n };\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';\nimport { TextSelection } from '@tiptap/pm/state';\nimport {\n NodeViewContent,\n NodeViewProps,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n} from '@tiptap/react';\nimport html from 'highlight.js/lib/languages/xml';\nimport { createLowlight, common } from 'lowlight';\nimport { HTMLCodeBlockView } from './html-view';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '@/extensions';\n\nconst lowlight = createLowlight(common);\nlowlight.register('html', html);\n\nexport type HtmlCodeBlockAttributes = {\n activeTab: string;\n showIfKey: string;\n language: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n htmlCodeBlock: {\n /**\n * Set a code block\n * @param attributes Code block attributes\n * @example editor.commands.setCodeBlock({ language: 'javascript' })\n */\n setHtmlCodeBlock: (attributes?: { language: string }) => ReturnType;\n /**\n * Toggle a code block\n * @param attributes Code block attributes\n * @example editor.commands.toggleCodeBlock({ language: 'javascript' })\n */\n toggleHtmlCodeBlock: (attributes?: { language: string }) => ReturnType;\n updateHtmlCodeBlock: (\n attrs: Partial<HtmlCodeBlockAttributes>\n ) => ReturnType;\n };\n }\n}\n\nexport const HTMLCodeBlockExtension = CodeBlockLowlight.extend({\n name: 'htmlCodeBlock',\n content: '(text|variable)*',\n\n addAttributes() {\n return {\n ...this.parent?.(),\n activeTab: 'code',\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(HTMLCodeBlockView, {\n className: 'mly-relative',\n attrs: ({ node }) => ({\n 'data-active-tab': node?.attrs?.activeTab || 'code',\n }),\n });\n },\n\n addCommands() {\n return {\n setHtmlCodeBlock:\n (attributes) =>\n ({ commands }) => {\n return commands.setNode(this.name, attributes);\n },\n toggleHtmlCodeBlock:\n (attributes) =>\n ({ commands }) => {\n return commands.toggleNode(this.name, 'paragraph', attributes);\n },\n updateHtmlCodeBlock: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addKeyboardShortcuts() {\n return {\n ...this.parent?.(),\n 'Mod-a': ({ editor }) => {\n const { selection } = editor.state;\n const $pos = selection.$anchor;\n\n // resolve the position to the code block node\n // and check if the node is a code block\n const node = $pos.node($pos.depth);\n if (node.type.name !== this.name) {\n return false;\n }\n\n // find the depth of the code block node\n // to get the correct start and end position\n // usually when we are inside a code block\n // the depth is the same as the code block node\n let depth = $pos.depth;\n for (let d = depth; d > 0; d--) {\n if ($pos.node(d).type.name === this.name) {\n depth = d;\n break;\n }\n }\n\n // find the start and end position of the code block\n // and set the selection to the code block\n const start = $pos.before(depth) + 1; // +1 to move inside the code block\n const end = $pos.after(depth) - 1; // -1 to stay inside the code block\n\n const from = editor.state.doc.resolve(start);\n const to = editor.state.doc.resolve(end);\n if (from && to) {\n const transaction = editor.state.tr.setSelection(\n TextSelection.between(from, to)\n );\n editor.view.dispatch(transaction);\n return true;\n }\n\n return false;\n },\n };\n },\n}).configure({\n lowlight,\n});\n","import { cn } from '@/editor/utils/classname';\nimport { NodeViewProps } from '@tiptap/core';\nimport { NodeViewContent, NodeViewWrapper } from '@tiptap/react';\nimport { useMemo } from 'react';\nimport { HtmlCodeBlockAttributes } from './html';\n\nexport function HTMLCodeBlockView(props: NodeViewProps) {\n const { node, updateAttributes } = props;\n\n let { language, activeTab = 'code' } = node.attrs as HtmlCodeBlockAttributes;\n activeTab ||= 'code';\n\n const languageClass = language ? `language-${language}` : '';\n\n const html = useMemo(() => {\n const text = node.content.content.reduce((acc, cur) => {\n if (cur.type.name === 'text') {\n return acc + cur.text;\n } else if (cur.type.name === 'variable') {\n const { id: variable, fallback } = cur?.attrs || {};\n const formattedVariable = fallback\n ? `{{${variable},fallback=${fallback}}}`\n : `{{${variable}}}`;\n return acc + formattedVariable;\n }\n\n return acc;\n }, '');\n\n const htmlParser = new DOMParser();\n const htmlDoc = htmlParser.parseFromString(text, 'text/html');\n const style = htmlDoc.querySelectorAll('style');\n const body = htmlDoc.body;\n const combinedStyle = Array.from(style)\n .map((s) => s.innerHTML)\n .join('\\n');\n\n return `<style>${combinedStyle}</style>${body.innerHTML}`;\n }, [activeTab]);\n\n const isEmpty = html === '';\n\n return (\n <NodeViewWrapper\n draggable={false}\n data-drag-handle={false}\n data-type=\"htmlCodeBlock\"\n >\n {activeTab === 'code' && (\n <pre className=\"mly-my-0 mly-rounded-lg mly-border mly-border-gray-200 mly-bg-white mly-p-2 mly-text-black\">\n <NodeViewContent\n as=\"code\"\n className={cn('is-editable', languageClass)}\n />\n </pre>\n )}\n\n {activeTab === 'preview' && (\n <div\n className={cn(\n 'mly-not-prose mly-rounded-lg mly-border mly-border-gray-200 mly-p-2',\n isEmpty && 'mly-min-h-[42px]'\n )}\n ref={(node) => {\n if (!node || node?.shadowRoot) {\n return;\n }\n const shadow = node.attachShadow({ mode: 'open' });\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`\n * { font-family: 'Inter', sans-serif; }\n blockquote, h1, h2, h3, img, li, ol, p, ul {\n margin-top: 0;\n margin-bottom: 0;\n }\n `);\n shadow.adoptedStyleSheets = [sheet];\n const container = document.createElement('div');\n container.innerHTML = html;\n shadow.appendChild(container);\n }}\n contentEditable={false}\n onClick={() => {\n if (!isEmpty) {\n return;\n }\n\n updateAttributes({\n activeTab: 'code',\n });\n }}\n />\n )}\n </NodeViewWrapper>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,6BAA0C;AASnC,IAAM,QAAQ,uBAAAA,QAAY,OAAmC;AAAA,EAClE,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,oBAAI,IAAI;AAAA,IAClB;AAAA,EACF;AACF,CAAC;;;ACfD,kBAA0B;AAC1B,uCAAuD;AAEhD,IAAM,iBAAiB,iCAAAC,eAAqB,OAAO;AAAA,EACxD,gBAAgB;AACd,WAAO;AAAA,MACL,IAAI,sBAAU;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,OAAO,MAAM,MAAM;AAC7B,gBAAM,aAAa,CAAC;AAEpB,gBAAM,EAAE,GAAG,IAAI;AACf,gBAAM,QAAQ,MAAM;AACpB,gBAAM,MAAM,MAAM;AAElB,aAAG,OAAO,QAAQ,GAAG,KAAK,KAAK,OAAO,UAAU,CAAC,EAAE;AAAA,YACjD,GAAG,QAAQ,IAAI,KAAK;AAAA,YACpB,GAAG,QAAQ,IAAI,GAAG;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,aAAa;AACX,WAAO;AAAA,MACL,gBAAgB;AAAA,QACd,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC5BD,mBAAkC;AAmB3B,SAAS,kBAAkB,SAAmC;AACnE,QAAM,EAAE,QAAQ,eAAe,iBAAiB,IAAI;AAEpD,WAAS,kBAAkB,MAAkB,MAAY,KAAc;AAxBzE;AAyBI,UAAM,iBAAiB,IAAI,gBAAgB,IAAI;AAE/C,UAAM,EAAE,IAAI,OAAO,IAAI,KAAK;AAC5B,UAAM,YAAY,OAAO,MAAM,MAAM,OAAO;AAAA,MAC1C,KAAK;AAAA,MACL,eAAe;AAAA,MACf,KAAK,KAAK;AAAA,MACV,cAAc;AAAA,MACd,wBAAwB;AAAA,IAC1B,CAAC;AACD,uDAAQ,qBAAR,mBAA0B,gBAA1B,mBAAuC,sBAAvC,mBAA0D;AAAA,MACxD;AAAA;AAGF,UAAM,cACJ,QAAQ,SACJ,KAAK,MAAM,IAAI,QAAQ,GAAG,IAC1B,KAAK,MAAM,UAAU;AAE3B,UAAM,cAAc,GAAG,OAAO,YAAY,KAAK,SAAS;AACxD,SAAK,SAAS,WAAW;AAEzB,mDAAgB,MACb,KAAK,CAAC,gBAAgB;AACrB,YAAM,WAAW,KAAK,MAAM;AAG5B,YAAM,YAAY,CAAC,SACjB,KAAK,KAAK,SAAS,WAAW,KAAK,MAAM,QAAQ;AAEnD,WAAK,MAAM,IAAI,YAAY,CAAC,MAAMC,SAAQ;AACxC,YAAI,UAAU,IAAI,GAAG;AACnB,mBAAS,cAAcA,MAAK,QAAW,iCAClC,KAAK,QAD6B;AAAA,YAErC,KAAK;AAAA,UACP,EAAC;AACD,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAED,WAAK,SAAS,QAAQ;AAAA,IACxB,GACC,MAAM,CAAC,UAAU;AAChB,cAAQ,MAAM,uBAAuB,KAAK;AAAA,IAC5C,GACC,QAAQ,MAAM;AACb,aAAO,iBAAiB,YAAY,kBAAkB;AAAA,QACpD;AAAA,MACF;AACA,UAAI,gBAAgB,cAAc;AAAA,IACpC;AAAA,EACJ;AAEA,SAAO,IAAI,oBAAO;AAAA,IAChB,KAAK,IAAI,uBAAU,aAAa;AAAA,IAChC,OAAO;AAAA,MACL,YAAY,CAAC,MAAM,UAAU;AAjFnC;AAkFQ,YACE,CAAC;AAAA;AAAA,QAGD,GAAC,iBAAM,iBAAN,mBAAoB,UAApB,mBAA2B,SAC5B;AACA,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,MAAM,KAAK,MAAM,aAAa,KAAK,EAAE;AAAA,UAAO,CAAC,SAC1D,qDAAkB,SAAS,KAAK;AAAA,QAClC;AACA,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO;AAAA,QACT;AAEA,cAAM,MAAM,KAAK,YAAY;AAAA,UAC3B,MAAM,MAAM;AAAA,UACZ,KAAK,MAAM;AAAA,QACb,CAAC;AACD,YAAI,CAAC,KAAK;AACR,iBAAO;AAAA,QACT;AAEA,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAEtB,eAAO,QAAQ,CAAC,SAAS,kBAAkB,MAAM,MAAM,IAAI,GAAG,CAAC;AAC/D,eAAO;AAAA,MACT;AAAA,MACA,aAAa,CAAC,MAAM,UAAU;AAhHpC;AAiHQ,YAAI,CAAC,iBAAiB,GAAC,iBAAM,kBAAN,mBAAqB,UAArB,mBAA4B,SAAQ;AACzD,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,MAAM,KAAK,MAAM,cAAc,KAAK,EAAE;AAAA,UAAO,CAAC,SAC3D,qDAAkB,SAAS,KAAK;AAAA,QAClC;AACA,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO;AAAA,QACT;AAEA,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAEtB,eAAO,QAAQ,CAAC,SAAS,kBAAkB,MAAM,IAAI,CAAC;AACtD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AChIA,IAAAC,eAAkC;AAClC,mBAAwB;AAOjB,IAAM,uBAAuB,uBAAU,OAA2B;AAAA,EACvE,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,mBAAmB,oBAAI,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,wBAAwB;AACtB,UAAM,EAAE,cAAc,IAAI,KAAK;AAE/B,QAAI,CAAC,eAAe;AAClB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO;AAAA,MACL,kBAAkB;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,kBAAkB,KAAK,QAAQ;AAAA,QAC/B,eAAe,KAAK,QAAQ;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,SAAS,sBAAsB,QAAoC;AACxE,aAAO,sBAAQ,MAAM;AACnB,UAAM,OAAO,OAAO,iBAAiB,WAAW;AAAA,MAC9C,CAAC,cAAc,UAAU,SAAS;AAAA,IACpC;AAEA,YAAO,6BAAM,YAAW,CAAC;AAAA,EAC3B,GAAG,CAAC,MAAM,CAAC;AACb;;;AC3DA,IAAAC,gBAAwC;AAExC,yBAAuB;AACvB,iCAAqB;AACrB,IAAAC,8BAAsB;AACtB,kCAAsB;AACtB,kCAAsB;AACtB,IAAAC,4BAAoB;AACpB,iCAAsB;AACtB,gCAAqB;AACrB,6BAAkB;AAClB,kCAAuB;;;ACXvB,IAAAC,eAAsC;AAc/B,IAAM,SAAS,kBAAK,OAAsB;AAAA,EAC/C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EAET,gBAAgB;AACd,WAAO;AAAA,MACL,mBAAmB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,wBAAwB,WAAW,iBAAiB;AAAA,UACtD;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YAAY,mCAAS,aAAa;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,QAAQ,KAAK,IAAI;AAAA,MACnC;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,uCAAuC,CAAC;AAAA,EACzD;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,8BAAgB,KAAK,QAAQ,gBAAgBA,iBAAgB;AAAA,QAC3D,OACE;AAAA,MACJ,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACzDD,IAAAC,eAAsC;;;ACiC/B,SAAS,iBACd,MACA,OACS;AACT,SAAO,CAAC,EAAE,SAAS,MACjB,SAAS,QAAQ,CAAC,EAAE,IAAI,OAAO,SAAS,MAAM;AAC5C,QAAI,UAAU;AACZ,UAAI,UAAU;AAEd,SAAG,UAAU,OAAO,QAAQ,CAAC,UAAU;AACrC,cAAM,IAAI;AAAA,UACR,MAAM,MAAM;AAAA,UACZ,MAAM,IAAI;AAAA,UACV,CAAC,MAAM,QAAQ;AACb,gBAAI,KAAK,KAAK,SAAS,MAAM;AAC3B,wBAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI,YAAY,MAAM;AACpB,cAAM,OAAO,MAAM,IAAI,OAAO,OAAO;AACrC,YAAI,MAAM;AACR,aAAG,cAAc,SAAS,MAAM,kCAC3B,KAAK,QACL,MACJ;AAAA,QACH,OAAO;AACL,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,eAAG,iBAAiB,SAAS,KAAK,KAAK;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,UAAU;AACrB,WAAG,aAAa,GAAG,SAAS;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AACL;;;AC1EA,IAAAC,eAAsC;AAE/B,IAAM,mCAAmC;AACzC,IAAM,wBAAwB;AAC9B,IAAM,+BAA+B;AACrC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AAEtC,IAAM,6BAA6B;AACnC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,8BAA8B;AAEpC,IAAM,8BAA8B;AACpC,IAAM,gCAAgC;AACtC,IAAM,iCAAiC;AACvC,IAAM,+BAA+B;AAErC,IAAM,8BAA8B;AA+BpC,IAAM,mBAAmB,kBAAK,OAAO;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA7DhC;AA8DU,iBAAO,QAAO,8CAAS,UAAT,mBAAgB,iBAAhB,mBAA8B,QAAQ,UAAU,GAAG;AAAA,QACnE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,cAAc;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,kBAAkB,WAAW,YAAY;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,iBAAiB;AAAA,QACf,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,MAAM;AAAA,QACvB;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,iBAAiB;AAC/B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,qBAAqB,WAAW,eAAe,gBAAgB,WAAW,eAAe;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,OAAO,KAAK;AAAA,QAC1C;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,WAAW;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA1GhC;AA2GU,iBACE,QAAO,8CAAS,UAAT,mBAAgB,gBAAhB,mBAA6B,QAAQ,UAAU,GAAG,KAAK;AAAA,QAElE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,iBAAiB,WAAW,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,MAAM;AAAA,QACvB;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,iBAAiB,WAAW,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA1IhC;AA2IU,iBAAO,QAAO,8CAAS,UAAT,mBAAgB,eAAhB,mBAA4B,QAAQ,UAAU,GAAG,KAAK;AAAA,QACtE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,YAAY;AAC1B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,gBAAgB,WAAW,UAAU;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAzJ7B;AA0JU,yBAAO,8CAAS,UAAT,mBAAgB,iBAAhB,mBAA8B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QACjE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,cAAc;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,kBAAkB,WAAW,YAAY;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAvK7B;AAwKU,yBAAO,8CAAS,UAAT,mBAAgB,kBAAhB,mBAA+B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAClE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,mBAAmB,WAAW,aAAa;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AArL7B;AAsLU,yBAAO,8CAAS,UAAT,mBAAgB,gBAAhB,mBAA6B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAChE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,iBAAiB,WAAW,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AAnMhC;AAoMU,iBAAO,QAAO,8CAAS,UAAT,mBAAgB,cAAhB,mBAA2B,QAAQ,UAAU,GAAG,KAAK;AAAA,QACrE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,WAAW,WAAW;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAlN7B;AAmNU,yBAAO,8CAAS,UAAT,mBAAgB,gBAAhB,mBAA6B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAChE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,aAAa,WAAW;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAhO7B;AAiOU,yBAAO,8CAAS,UAAT,mBAAgB,iBAAhB,mBAA8B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QACjE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,cAAc;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,cAAc,WAAW;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AA9O7B;AA+OU,yBAAO,8CAAS,UAAT,mBAAgB,eAAhB,mBAA4B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAC/D,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,YAAY;AAC1B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,YAAY,WAAW;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,MAAM,KAAK;AAAA,UACb;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACF,eAAe,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,aAAa;AAAA,IACf,IAAIA;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,aAAa,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,aAAa;AAAA,QACb,OAAO;AAAA,QACP,OAAO,eAAe,SAAS,qBAAqB,WAAW,sBAAsB,YAAY,oBAAoB,UAAU;AAAA,MACjI;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,UACE,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,YACE,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE;AAAA,gBACA,8BAAgBA,iBAAgB;AAAA,cAC9B,aAAa;AAAA,cACb,OAAO;AAAA,cACP,OAAO;AAAA,YACT,CAAC;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AFlUM,IAAM,wBAAwB;AAE9B,IAAM,SAAS,kBAAK,OAAsB;AAAA,EAC/C,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,gBAAgB;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,OAAO,QAAQ,aAAa,aAAa,CAAC;AAAA,QAClE,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,eAAe,WAAW;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,CAAC,YACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEF,eACE,CAAC,WACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,iBAAiB,UAAU,EAAE,OAAO,CAAC;AAAA,MACvD;AAAA,MAEF,oBACE,CAAC,cACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,iBAAiB,UAAU,EAAE,UAAU,CAAC;AAAA,MAC1D;AAAA,MAEF,aACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,WAAW,QAAQ;AAAA,MACrC;AAAA,IACJ;AAAA,EACF;AAAA,EACA,WAAW,EAAE,gBAAAC,iBAAgB,KAAK,GAAG;AACnC,UAAM,EAAE,OAAO,IAAI,KAAK;AAExB,WAAO;AAAA,MACL;AAAA,UACA;AAAA,QACE;AAAA,UACE,wBAAwB,KAAK;AAAA,QAC/B;AAAA,QACA,KAAK,QAAQ;AAAA,QACbA;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,iBAAiB;AAAA,UACjB,OAAO,WAAW,MAAM,uBAAuB,MAAM;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,6BAA6B,KAAK,IAAI,KAAK,CAAC;AAAA,EAC7D;AACF,CAAC;;;AGlHD,IAAAC,eAAsC;AACtC,IAAAC,gBAAsC;;;ACDtC,IAAAC,gBAA+C;;;ACA/C,YAAuB;;;ACAvB,kBAAsC;AACtC,4BAAoC;AAEpC,IAAM,cAAU,2CAAoB;AAAA,EAClC,QAAQ;AACV,CAAC;AAEM,SAAS,MAAM,QAAsB;AAC1C,SAAO,YAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACTO,IAAM,qCAAqC,OAAO,OAAO;AAAA,EAC9D,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AACpB,CAAC;;;AFOK;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,IAA+B,QAAQ;AAAvC,iBAAE,aAAW,KAThB,IASG,IAAsB,kBAAtB,IAAsB,CAApB,aAAW;AACZ,WACE;AAAA,MAAC;AAAA,sDACK,qCADL;AAAA,QAEC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,UACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;AGvBpB,IAAAC,SAAuB;AACvB,uBAAkC;AAiB9B,IAAAC,sBAAA;AAbJ,IAAM,UAEe;AAErB,IAAM,iBAEe;AAErB,IAAM,iBAAuB,kBAG3B,CAAC,IAA2D,QAAK;AAAhE,eAAE,aAAW,QAAQ,UAAU,aAAa,EAlB/C,IAkBG,IAAkD,kBAAlD,IAAkD,CAAhD,aAAW,SAAkB;AAChC,sDAAkB,yBAAjB,EACC;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,OACI;AAAA,EACN,GACF;AAAA,CACD;AAKD,eAAe,cAA+B,yBAAQ;;;ACrCtD,IAAAC,SAAuB;AAUjB,IAAAC,sBAAA;AAHN,IAAM,WAAiB;AAAA,EACrB,CAAC,IAAyB,QAAQ;AAAjC,iBAAE,YARL,IAQG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;;;ALUL,IAAAC,sBAAA;AA1BX,SAAS,kBAAkB,OAAsB;AACtD,QAAM,EAAE,OAAO,aAAa,MAAM,WAAW,OAAAC,QAAO,WAAW,SAAS,IACtE,MAAM,KAAK;AACb,QAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,mBACT,MAAM,YAAY,0BACpB;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,oBAAkB,OAAO;AAAA,MAEzB,wDAAC,WAAQ,MAAM,MAAM,UACnB;AAAA,qDAAC,kBAAe,SAAO,MACrB;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,SAAS,CAAC,MAAM;AACd,gBAAE,eAAe;AACjB,oBAAM,MAAM,OAAO;AACnB,qBAAO,SAAS,iBAAiB,GAAG;AAAA,YACtC;AAAA,YAEA,wDAAC,SAAI,WAAU,oFACZ;AAAA,cAAAA,UACC,6CAAC,SAAI,WAAU,mDACb;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAKA;AAAA,kBACL,KAAI;AAAA,kBACJ,WAAU;AAAA,kBACV,WAAW,OAAO;AAAA;AAAA,cACpB,GACF;AAAA,cAEF,6CAAC,SAAI,WAAU,sCACb,wDAAC,SAAI,WAAW,GAAG,uBAAuB,GACxC;AAAA,8DAAC,SAAI,WAAU,qDACb;AAAA,+DAAC,QAAG,WAAU,4CACX,iBACH;AAAA,kBACC,aACC,6CAAC,UAAK,WAAU,gHACb,qBACH;AAAA,kBACC;AAAA,kBACF,YAAY,CAAC,aACZ,6CAAC,UAAK,WAAU,6FACb,oBACH;AAAA,mBAEJ;AAAA,gBACA,8CAAC,OAAE,WAAU,8CACV;AAAA;AAAA,kBAAa;AAAA,kBACb,YACC,6CAAC,OAAE,MAAM,MAAM,WAAU,qBACtB,qBACH,IACE;AAAA,mBACN;AAAA,iBACF,GACF;AAAA,eACF;AAAA;AAAA,QACF,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,YACzC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,YAE1C;AAAA,4DAAC,WAAM,WAAU,4BACf;AAAA,6DAAC,UAAK,WAAU,kDAAiD,mBAEjE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,MAAK;AAAA,oBACL,OAAOA;AAAA,oBACP,UAAU,CAAC,MAAM;AACf,4BAAM,iBAAiB;AAAA,wBACrB,OAAO,EAAE,OAAO;AAAA,sBAClB,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAM,WAAU,4BACf;AAAA,6DAAC,UAAK,WAAU,kDAAiD,mBAEjE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM;AACf,4BAAM,iBAAiB;AAAA,wBACrB,OAAO,EAAE,OAAO;AAAA,sBAClB,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAM,WAAU,4BACf;AAAA,6DAAC,UAAK,WAAU,kDAAiD,yBAEjE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM;AACf,4BAAM,iBAAiB;AAAA,wBACrB,aAAa,EAAE,OAAO;AAAA,sBACxB,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,8CAAC,SAAI,WAAU,sCACb;AAAA,8DAAC,WAAM,WAAU,4BACf;AAAA,+DAAC,UAAK,WAAU,kDAAiD,wBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,WAAW,EAAE,OAAO;AAAA,wBACtB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,gBAEA,8CAAC,WAAM,WAAU,4BACf;AAAA,+DAAC,UAAK,WAAU,kDAAiD,kBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,MAAM,EAAE,OAAO;AAAA,wBACjB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,iBACF;AAAA,cAEA,8CAAC,SAAI,WAAU,sCACb;AAAA,8DAAC,WAAM,WAAU,4BACf;AAAA,+DAAC,UAAK,WAAU,kDAAiD,wBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,WAAW,EAAE,OAAO;AAAA,wBACtB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,gBAEA,8CAAC,WAAM,WAAU,4BACf;AAAA,+DAAC,UAAK,WAAU,kDAAiD,uBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,UAAU,EAAE,OAAO;AAAA,wBACrB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ADhLO,IAAM,oBAAoB,kBAAK,OAAO;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,gBAAgB;AAAA,QACd,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,2BAA2B,KAAK,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA;AAAA,QACE;AAAA,UACE,wBAAwB,KAAK;AAAA,QAC/B;AAAA,QACAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,aACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,gBAAgB,KAAK;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,qCAAsB,mBAAmB;AAAA,MAC9C,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AOxFD,mBAA+B;AAC/B,IAAAC,gBAA8B;AAC9B,IAAAC,eAA6B;AAC7B,IAAAC,eAA+B;;;ACH/B,IAAAC,eAAsC;AACtC,kBAA6B;AAEtB,IAAM,uBAAuB;AAG7B,IAAM,gCAA4D;AA0BlE,IAAM,kBAAkB,kBAAK,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,aAAa,gBAAgB,SAAK,YAAAC,IAAO;AAAA,QACnD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,UAAU;AACxB,mBAAO;AAAA,cACL,sBAAkB,YAAAA,IAAO;AAAA,YAC3B;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,kBAAkB,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,MAAM,MAAM,QAAQ,UAAU,EAAE,KAAK;AAAA,QAC/C,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,SAAS,WAAW,UAAU,sBAAsB;AAClE,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,UAAU,WAAW,KAAK,eAAe,WAAW,KAAK;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAxE7B;AAwEgC,2DAAS,UAAT,mBAAgB,kBAAiB;AAAA;AAAA,QACzD,YAAY,CAAC,eAAe;AAC1B,gBAAM,EAAE,cAAc,IAAI;AAC1B,cACE,CAAC,iBACD,kBAAkB,+BAClB;AACA,mBAAO,CAAC;AAAA,UACV;AAEA,cAAI,kBAAkB,UAAU;AAC9B,mBAAO;AAAA,cACL,OAAO;AAAA,YACT;AAAA,UACF,WAAW,kBAAkB,UAAU;AACrC,mBAAO;AAAA,cACL,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,cAAc,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,8BAAgBA,iBAAgB;AAAA,QAC9B,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AD7GM,SAAS,qBAAqB,QAAgB,MAAc;AACjE,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,aAAO,6BAAe,CAAC,SAAS,KAAK,KAAK,SAAS,IAAI,EAAE,MAAM,SAAS;AAC1E;AA6JO,SAAS,WAAW,QAAgB,MAA2B;AACpE,QAAM,cAAc,qBAAqB,QAAQ,SAAS;AAC1D,QAAM,aAAa,qBAAqB,QAAQ,QAAQ;AACxD,MAAI,CAAC,eAAe,CAAC,YAAY;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,SAAS,IAAI,OAAO;AAGnC,QAAM,OAAO,YAAY;AACzB,MAAI,kBAAkB;AACtB,OAAK,QAAQ,QAAQ,CAAC,OAAO,GAAG,UAAU;AAvL5C;AAwLI,QACE,MAAM,GAAG,WAAW,IAAI,OACxB,oCAAO,UAAP,mBAAc,gBAAa,sBAAW,SAAX,mBAAiB,UAAjB,mBAAwB,WACnD;AACA,wBAAkB;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,kBACJ,SAAS,SAAS,kBAAkB,IAAI,kBAAkB;AAE5D,MAAI,kBAAkB,KAAK,mBAAmB,KAAK,YAAY;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,YAAY;AAChC,OAAK,QAAQ,QAAQ,CAAC,OAAO,GAAG,UAAU;AACxC,QAAI,QAAQ,iBAAiB;AAC3B,uBAAiB,MAAM;AAAA,IACzB;AAAA,EACF,CAAC;AAED,QAAM,KAAK,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC;AACtC,QAAM,gBAAgB,4BAAc,KAAK,GAAG,IAAI,QAAQ,aAAa,CAAC;AACtE,KAAG,aAAa,aAAa;AAE7B,WAAS,EAAE;AACX,SAAO;AACT;;;AElNA,IAAAC,eAAgC;AAChC,IAAAA,gBAAqB;AAErB,IAAAC,eAA6B;AAEtB,IAAM,sBAAsB;AAgB5B,IAAM,mBAAmB,mBAAK,OAAO;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,OAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,QACtC;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,KAAK;AACnB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,QAAQ,WAAW,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO,CAAC;AAAA,UACR,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,cAAU,aAAAC,IAAO;AAAA,cACnB;AAAA,cACA,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,cAAU,aAAAA,IAAO;AAAA,cACnB;AAAA,cACA,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACF,eAAe,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,8BAAgBA,iBAAgB;AAAA,QAC9B,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,WAAO;AAAA,MACL,KAAK,MAAM;AACT,eAAO,WAAW,KAAK,QAAQ,MAAM;AAAA,MACvC;AAAA,MACA,aAAa,MAAM;AACjB,eAAO,WAAW,KAAK,QAAQ,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACvID,IAAAC,gBAAsC;AACtC,IAAAC,iBAAsC;;;ACDtC,IAAAC,uBAAmD;;;ACAnD,IAAAC,SAAuB;AACvB,wBAAqB;AAuDV,IAAAC,sBAAA;AAvCX,IAAM,aAAmB;AAAA,EACvB,CACE,IAOA,QACG;AARH,iBACE;AAAA;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IAvBhB,IAmBI,IAKK,kBALL,IAKK;AAAA,MAJH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAKF,UAAM,OAAO,UAAU,yBAAO;AAC9B,UAAM,YACJ;AACF,UAAM,iBAAiB;AAAA,MACrB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SACE;AAAA,MACF,WAAW;AAAA,MACX,OACE;AAAA,MACF,MAAM;AAAA,IACR;AACA,UAAM,cAAc;AAAA,MAClB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,eAAe,OAAO;AAAA,MACtB,YAAY,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,6CAAC,uBAAK,WAAW,SAAS,OAAc,MAAO;AAAA,EACxD;AACF;AAEA,WAAW,cAAc;;;AC1DzB,IAAAC,SAAuB;AACvB,uBAAkC;AAoBhC,IAAAC,sBAAA;AAhBF,IAAM,kBAEe;AAErB,IAAM,UAEe;AAErB,IAAM,iBAEe;AAErB,IAAM,iBAAuB,kBAG3B,CAAC,IAAyC,QAAK;AAA9C,eAAE,aAAW,aAAa,EAtB7B,IAsBG,IAAgC,kBAAhC,IAAgC,CAA9B,aAAW;AACd;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,OACI;AAAA,EACN;AAAA,CACD;AAKD,eAAe,cAA+B,yBAAQ;;;ACf9C,IAAAC,sBAAA;AAjBD,SAAS,iBAAiB,MAAsB;AALvD;AAME,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,UACJ;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,OACA,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC,IAHlD;AAAA,MAIC,eAAY,kCAAM,aAAN;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA,6BAAM;AAAA,MACR;AAAA,MACA,MAAK;AAAA,MACL,UAAU,KAAK;AAAA,MAEd,eAAK,OACJ;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,6BAAM;AAAA,UACR;AAAA;AAAA,MACF,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,6BAAM;AAAA,UACR;AAAA,UAEC,eAAK;AAAA;AAAA,MACR;AAAA;AAAA,EAEJ;AAGF,MAAI,SAAS;AACX,WACE,8CAAC,WACC;AAAA,mDAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,MACjC,6CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,OAC1C;AAAA,EAEJ;AAEA,SAAO;AACT;;;ACnDA,6BAAwB;AACxB,IAAAC,iBAAsC;;;ACAtC,IAAAC,gBAAgC;AAChC,IAAAA,gBAAuC;AACvC,IAAAA,gBAAyB;;;ACHzB,IAAAC,gBAMO;AACP,IAAAA,gBAAoD;AACpD,0BAAiE;;;ACRjE,IAAAC,gBAAqD;AAE9C,IAAM,WAAW,CAAoC,YAAkB;AAC5E,QAAM,iBAAa,sBAAiB,IAAI;AAExC,qCAAgB,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AAEZ,aAAO,2BAAY,IAAI,SAAuC;AAC5D,QAAI,WAAW,YAAY,MAAM;AAC/B,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,WAAO,WAAW,QAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC,CAAC;AACP;;;ACTO,SAAS,eAAe,OAAe,QAAwB;AACpE,SAAO,QAAQ;AACjB;AAQO,SAAS,aAAa,OAAe,aAA6B;AACvE,MAAI,SAAS,KAAK,eAAe,GAAG;AAClC,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;;;AF4FQ,IAAAC,sBAAA;AAnGR,IAAM,YAAY;AACX,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AAIzB,SAAS,UAAU,OAAsB;AAC9C,QAAM,EAAE,MAAM,kBAAAC,mBAAkB,UAAU,OAAO,IAAI;AAErD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAsB,MAAM;AACxD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAElE,QAAM,EAAE,eAAe,mBAAmB,CAAC,EAAE,IAC3C,sBAAsB,MAAM;AAE9B,QAAM,iBAAa,sBAAuB,IAAI;AAC9C,QAAM,aAAS,sBAAyB,IAAI;AAE5C,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAExC;AAEF,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,KAAK;AAE1D,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAA4C;AAC3C,YAAM,cAAc,SAAS;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,WAAW,CAAC,eAAe,CAAC,UAAU;AAChD;AAAA,MACF;AAEA,YAAM,mBAAmB,KAAK;AAAA,QAC5B,YAAY;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,YAAM,YAAY,MAAM,cAAc,QAAQ,aAAa;AAC3D,YAAM,mBAAmB,MAAM;AAC/B,YAAM,mBAAmB,MAAM;AAC/B,YAAM,eAAe,OAAO,QAAQ;AACpC,YAAM,gBAAgB,OAAO,QAAQ;AACrC,UAAI,WAAW;AACf,UAAI,YAAY;AAChB,YAAM,aAAa,UAAU,CAAC,MAAM,MAAM,KAAK;AAC/C,YAAM,aAAa,UAAU,CAAC,MAAM,MAAM,KAAK;AAE/C,YAAM,kBAAkB,MAAM;AAC5B,eAAO,oBAAoB,aAAa,gBAAgB;AACxD,eAAO,oBAAoB,WAAW,eAAe;AACrD,cAAM,cAAc,eAAe,UAAU,SAAS;AACtD,QAAAA,kBAAiB,EAAE,OAAO,UAAU,QAAQ,WAAW,YAAY,CAAC;AACpE,yBAAiB,MAAS;AAAA,MAC5B;AAEA,YAAM,mBAAmB,CAACC,WAAsB;AAC9C,mBAAW,KAAK;AAAA,UACd,eAAe,cAAcA,OAAM,UAAU;AAAA,UAC7C;AAAA,QACF;AACA,oBAAY,KAAK;AAAA,UACf,gBAAgB,cAAcA,OAAM,UAAU;AAAA,UAC9C;AAAA,QACF;AAEA,YAAI,WAAW,kBAAkB;AAC/B,qBAAW;AAAA,QACb;AACA,YAAI,YAAY,kBAAkB;AAChC,sBAAY;AAAA,QACd;AAGA,YAAI,KAAK,MAAM,iBAAiB;AAC9B,sBAAY,aAAa,UAAU,KAAK,MAAM,WAAW;AAAA,QAC3D;AAEA,yBAAiB,EAAE,OAAO,UAAU,QAAQ,UAAU,CAAC;AAEvD,YAAI,CAACA,OAAM,SAAS;AAClB,iBAAO,gBAAgB;AAAA,QACzB;AAAA,MACF;AAEA,aAAO,iBAAiB,aAAa,gBAAgB;AACrD,aAAO,iBAAiB,WAAW,eAAe;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,uBAAmB;AAAA,IACvB,CAAC,cAAsB;AACrB,UAAI,oBAAoB;AACtB,eAAO;AAAA,MACT;AAEA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,aAAa;AAAA,UACb,kBAAgB;AAAA,UAChB,WAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,OAAO;AAAA,aACJ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,IAChD,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,IAL9C;AAAA,YAML,QAAQ,GAAG,SAAS;AAAA,UACtB;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,CAAC,iBAAiB,kBAAkB;AAAA,EACtC;AAEA,MAAI;AAAA,IACF,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,KAAK,SAAS,CAAC;AAEnB,QASI,UAAK,SAAS,CAAC,GARjB;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,cAAc;AAAA,IACd;AAAA,EApJJ,IAsJM,IADC,kBACD,IADC;AAAA,IAPH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIF,QAAM,cAAc,CAAC,CAAC,MAAM;AAC5B,QAAM,cACJ,CAAC,CAAC,iBACF,OAAO,cACP,CAAC,eACD,CAAC,iBACD,WAAW;AAEb,QAAM,mBAAmB,CAAO,MAA2C;AACzE,QAAI,CAAC,eAAe,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,MAAM,WAAW,GAAG;AAClE;AAAA,IACF;AAEA,UAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAC7B,UAAM,kBAAkB,IAAI;AAAA,EAC9B;AAEA,QAAM,wBAAoB;AAAA,IACxB,CAAO,SAAe;AACpB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,UAAI;AACF,kBAAU,SAAS;AACnB,cAAM,WAAW,MAAM,cAAc,IAAI;AACzC,QAAAD,kBAAiB,EAAE,KAAK,SAAS,CAAC;AAClC,8BAAsB,KAAK;AAC3B,kBAAU,QAAQ;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAC7C,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,IACA,CAAC,eAAeA,iBAAgB;AAAA,EAClC;AAIA,+BAAU,MAAM;AA/LlB,QAAAE,KAAA;AAgMI,QAAI,CAAC,OAAO,eAAe;AACzB;AAAA,IACF;AAEA,cAAU,SAAS;AACnB,UAAM,iBACJ,kBAAAA,MAAA,iCAAQ,qBAAR,gBAAAA,IAA0B,gBAA1B,mBAAuC,sBAAvC,mBAA0D,IAAI,SAA9D,YACA;AACF,0BAAsB,aAAa;AACnC,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,MAAM;AACV,QAAI,SAAS,MAAM;AACjB,gBAAU,QAAQ;AAGlB,YAAM,EAAE,cAAc,cAAc,IAAI;AACxC,YAAM,UAAU,yCAAY;AAE5B,UAAI,CAAC,WAAW,UAAU,UAAU,CAAC,cAAc;AACjD;AAAA,MACF;AAEA,YAAM,eAAe,QAAQ;AAC7B,YAAM,cAAc,eAAe,cAAc,aAAa;AAC9D,YAAM,mBAAmB,KAAK;AAAA,QAC5B,aAAa,cAAc,WAAW;AAAA,QACtC;AAAA,MACF;AAEA,MAAAF,kBAAiB;AAAA,QACf,OAAO,KAAK,IAAI,cAAc,YAAY;AAAA,QAC1C,QAAQ,KAAK,IAAI,kBAAkB,aAAa;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,UAAU,MAAM;AAClB,gBAAU,OAAO;AAAA,IACnB;AAEA,WAAO,MAAM;AACX,UAAI,MAAM;AACV,UAAI,SAAS;AACb,UAAI,UAAU;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,QAAM,qBAAiB;AAAA,IACrB,CAAC,MAAuB;AACtB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,wBAAkB,IAAI;AAAA,IACxB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,MAAuB;AACtB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,wBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAO,MAAuB;AAzQlC,UAAAE;AA0QM,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,wBAAkB,KAAK;AACvB,YAAM,SAAQA,MAAA,EAAE,iBAAF,gBAAAA,IAAgB;AAC9B,UAAI,CAAC,UAAS,+BAAO,YAAW,GAAG;AACjC;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,CAAC;AACzB,UAAI,CAAC,iBAAiB,SAAS,UAAU,IAAI,GAAG;AAC9C;AAAA,MACF;AAEA,YAAM,kBAAkB,SAAS;AAAA,IACnC;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAW,OAAO;AAAA,MAClB,oBAAkB,OAAO;AAAA,MACzB,WAAW,GAAG,uBAAuB,kBAAkB,eAAe;AAAA,MACtE,OAAO,gDACD,eAAe,WAAW,WAC1B;AAAA,QACE,OAAO,QAAQ,GAAG,KAAK,OAAO;AAAA,QAC9B,QAAQ,SAAS,GAAG,MAAM,OAAO;AAAA,SAC9B,iBAEL,CAAC,IAPA;AAAA,QAQL,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,QAEV,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,UAAU;AAAA,UACN;AAAA,QACF,QAAQ,EAAE,YAAY,QAAQ,aAAa,OAAO;AAAA,QAClD,MAAM,EAAE,aAAa,OAAO;AAAA,QAC5B,OAAO,EAAE,YAAY,OAAO;AAAA,MAC9B,EAAE,SAAmB,KAAK,CAAC;AAAA,MAE7B,KAAK;AAAA,OACA,cACD;AAAA,MACE,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,IACA,CAAC,IAhCN;AAAA,MAkCE;AAAA,SAAC,eAAe,WAAW,UAC1B;AAAA,UAAC;AAAA;AAAA,YACC,QAAO;AAAA,YACP,WAAW;AAAA,YACX,YAAY;AAAA;AAAA,QACd;AAAA,QAGD,CAAC,eAAe,WAAW,aAAa,CAAC,iBACxC,6CAAC,oBAAiB,QAAO,WAAU,WAAW,QAAQ;AAAA,QAGvD,eAAe,iBACd,6CAAC,oBAAiB,QAAO,YAAW,WAAW,QAAQ;AAAA,QAGxD,eAAe,WAAW,aAAa,CAAC,iBACvC,6CAAC,oBAAiB,QAAO,WAAU,WAAW,QAAQ;AAAA,QAEvD,eAAe,WAAW,WAAW,CAAC,iBACrC,6CAAC,oBAAiB,QAAO,SAAQ,WAAW,QAAQ;AAAA,QAGrD,eACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAU;AAAA,YACV,UAAU;AAAA;AAAA,QACZ;AAAA,QAGD,eAAe,WAAW,YAAY,CAAC,iBACtC,8EACE;AAAA;AAAA,YAAC;AAAA,6CACK,QADL;AAAA,cAEC,KAAK;AAAA,cACL,OAAO,iCACF,gBADE;AAAA,gBAEL,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd;AAAA,gBACA,QAAO,+CAAe,SAClB,GAAG,cAAc,KAAK,OACtB,QACE,GAAG,KAAK,OACR;AAAA,gBACN,SAAQ,+CAAe,UACnB,GAAG,cAAc,MAAM,OACvB,SACE,GAAG,MAAM,OACT;AAAA,cACR;AAAA,cACA,WAAW,OAAO;AAAA,cAClB,WAAW;AAAA,gBACT,sBAAsB;AAAA,cACxB;AAAA;AAAA,UACF;AAAA,UAEC,YAAY,OAAO,cAAc,CAAC,sBACjC,8EAEG;AAAA;AAAA,cACC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,QAAQ,OAAO,MAAM;AAAA,cAChD,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,QAAQ,OAAO,MAAM;AAAA,cACjD,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,QAAQ,QAAQ,MAAM;AAAA,cAChD,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,QAAQ,QAAQ,MAAM;AAAA,YACrD,EAAE,IAAI,CAAC,OAAO,MACZ;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,UAAU;AAAA,mBACP;AAAA;AAAA,cAJA;AAAA,YAMP,CACD;AAAA,YACA,iBAAiB,IAAI;AAAA,YACrB,iBAAiB,IAAI;AAAA,YACrB,iBAAiB,IAAI;AAAA,YACrB,iBAAiB,IAAI;AAAA,aACxB;AAAA,WAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAQO,SAAS,iBAAiB,OAA8B;AAC7D,QAAqE,YAA7D,UAAQ,WAAW,WAAW,OAAO,WAra/C,IAqauE,IAAT,iBAAS,IAAT,CAApD,UAAQ,aAAW,aAAW,SAAO;AAE7C,SACE;AAAA,IAAC;AAAA,qCACK,OADL;AAAA,MAEC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,UACE,+CAA+C,WAAW;AAAA,UAC1D,8CAA8C,WAAW;AAAA,QAC3D;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,kCACD,YACA;AAAA,QACE;AAAA,MACF,IACA,CAAC,IACF;AAAA,MAGJ;AAAA,mBAAW,UAAU,CAAC,cACrB,8EACE;AAAA,uDAAC,oCAAa,WAAU,+BAA8B;AAAA,UACtD,6CAAC,UAAK,+BAAiB;AAAA,WACzB;AAAA,QAGD,WAAW,UAAU,cACpB,8EACE;AAAA,uDAAC,gCAAS,WAAU,+BAA8B;AAAA,UAClD,6CAAC,UAAK,sCAAwB;AAAA,WAChC;AAAA,QAGD,WAAW,aACV,8EACE;AAAA,uDAAC,+BAAQ,WAAU,gDAA+C;AAAA,UAClE,6CAAC,UAAK,8BAAgB;AAAA,WACxB;AAAA,QAED,WAAW,WACV,8EACE;AAAA,uDAAC,2BAAI,WAAU,+BAA8B;AAAA,UAC7C,6CAAC,UAAK,iCAAmB;AAAA,WAC3B;AAAA,QAED,WAAW,cACV,8EACE;AAAA,uDAAC,kCAAW,WAAU,+BAA8B;AAAA,UACpD,6CAAC,UAAK,gCAAkB;AAAA,WAC1B;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ADjVI,IAAAC,sBAAA;AAnIG,SAAS,SAAS,OAAsB;AAC7C,QAAM,EAAE,MAAM,QAAQ,kBAAAC,kBAAiB,IAAI;AAE3C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAsB,MAAM;AACxD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,KAAK;AAE1D,QAAM,EAAE,eAAe,mBAAmB,CAAC,EAAE,IAC3C,sBAAsB,MAAM;AAE9B,MAAI;AAAA,IACF,YAAY;AAAA,IACZ,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,EACT,IAAK,KAAK,SAAS,CAAC;AAEpB,QAAM,cAAc,CAAC,CAAC;AACtB,QAAM,cACJ,CAAC,CAAC,iBAAiB,OAAO,cAAc,CAAC,iBAAiB,WAAW;AAEvE,QAAM,mBAAmB,CAAO,MAA2C;AACzE,QAAI,CAAC,eAAe,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,MAAM,WAAW,GAAG;AAClE;AAAA,IACF;AAEA,UAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAC7B,UAAM,kBAAkB,IAAI;AAAA,EAC9B;AAEA,QAAM,wBAAoB;AAAA,IACxB,CAAO,SAAe;AACpB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,UAAI;AACF,kBAAU,SAAS;AACnB,cAAM,WAAW,MAAM,cAAc,IAAI;AACzC,QAAAA,kBAAiB,EAAE,KAAK,SAAS,CAAC;AAClC,8BAAsB,KAAK;AAC3B,kBAAU,QAAQ;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAC7C,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,IACA,CAAC,eAAeA,iBAAgB;AAAA,EAClC;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,MAAuB;AACtB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,wBAAkB,IAAI;AAAA,IACxB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,MAAuB;AACtB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,wBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAO,MAAuB;AAtFlC;AAuFM,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,wBAAkB,KAAK;AACvB,YAAM,SAAQ,OAAE,iBAAF,mBAAgB;AAC9B,UAAI,CAAC,UAAS,+BAAO,YAAW,GAAG;AACjC;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,CAAC;AACzB,UAAI,CAAC,iBAAiB,SAAS,UAAU,IAAI,GAAG;AAC9C;AAAA,MACF;AAEA,YAAM,kBAAkB,SAAS;AAAA,IACnC;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAIA,+BAAU,MAAM;AA/GlB;AAgHI,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,cAAU,SAAS;AACnB,UAAM,iBACJ,wDAAQ,qBAAR,mBAA0B,gBAA1B,mBAAuC,sBAAvC,mBAA0D,IAAI,aAA9D,YACA;AACF,0BAAsB,aAAa;AACnC,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,MAAM;AACV,QAAI,SAAS,MAAM;AACjB,gBAAU,QAAQ;AAAA,IACpB;AACA,QAAI,UAAU,MAAM;AAClB,gBAAU,OAAO;AAAA,IACnB;AAEA,WAAO,MAAM;AACX,UAAI,MAAM;AACV,UAAI,SAAS;AACb,UAAI,UAAU;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,WAAW,UAAU,IAAI;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAW,OAAO;AAAA,MAClB,oBAAkB,OAAO;AAAA,MACzB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,QAEV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,WAAW,GAAG,uBAAuB,kBAAkB,eAAe;AAAA,OACjE,cACD;AAAA,MACE,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,IACA,CAAC,IAlBN;AAAA,MAoBE;AAAA,SAAC,eAAe,WAAW,UAC1B;AAAA,UAAC;AAAA;AAAA,YACC,QAAO;AAAA,YACP,WAAW;AAAA,YACX,YAAY;AAAA;AAAA,QACd;AAAA,QAGD,CAAC,eAAe,WAAW,aAAa,CAAC,iBACxC,6CAAC,oBAAiB,QAAO,WAAU,WAAW,UAAU;AAAA,QAGzD,eAAe,iBACd,6CAAC,oBAAiB,QAAO,YAAW,WAAW,UAAU;AAAA,QAE1D,eAAe,WAAW,aAAa,CAAC,iBACvC,6CAAC,oBAAiB,QAAO,WAAU,WAAW,UAAU;AAAA,QAEzD,eAAe,WAAW,WAAW,CAAC,iBACrC,6CAAC,oBAAiB,QAAO,SAAQ,WAAW,UAAU;AAAA,QAGvD,eACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAU;AAAA,YACV,UAAU;AAAA;AAAA,QACZ;AAAA,QAGD,eAAe,WAAW,YAAY,CAAC,iBACtC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,eACV;AAAA,cACF,QAAQ,EAAE,YAAY,QAAQ,aAAa,OAAO;AAAA,cAClD,MAAM,EAAE,aAAa,OAAO;AAAA,cAC5B,OAAO,EAAE,YAAY,OAAO;AAAA,YAC9B,EAAE,SAAS,KAAK,CAAC;AAAA,YAEnB,WAAW,OAAO;AAAA;AAAA,QACpB;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AD/MO,IAAM,kBAAkB,CAAC,MAAM,MAAM,IAAI;AAGzC,IAAM,uBAAuB,CAAC,QAAQ,UAAU,OAAO;AA6B9D,IAAM,oBAA0C;AACzC,IAAM,oBAAqC;AAE3C,IAAM,YAA6C;AAAA,EACxD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,gBAAgB,uBAAAC,QAAY,OAAO;AAAA,EAC9C,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,gBAAgB;AAlDlB;AAmDI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,mBAAmB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,wBAAwB,WAAW,iBAAiB;AAAA,UACtD;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YACV,QAAQ,aAAa,sBAAsB;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,aAAa,WAAW;AAAA,QAClC,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,aAAa,WAAW;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,aAAa,gBAAgB;AAAA,QACvC,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,kBAAkB,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,sBAAsB,MAAM;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AACZ,WAAO;AAAA,MACL,cACE,CAAC,YACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACF,mBACE,CAAC,eACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,iBAAiB,QAAQ,UAAU;AAAA,MACrD;AAAA,IACJ;AAAA,EACF;AAAA,EACA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,6BAA6B,KAAK,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AACZ,eAAO,sCAAsB,UAAU;AAAA,MACrC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AJvGK,IAAAC,uBAAA;AApCC,SAAS,gBAAgB,OAA6B;AAC3D,QAAM,EAAE,WAAW,cAAc,kBAAkB,IAAI;AACvD,QAAM,YAAY,qBAAqB;AAAA,IACrC;AAAA,EACF,IACI,eACA;AAEJ,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,WAAW,SAAS;AAE5C,SACE,+CAAC,WACC;AAAA,mDAAC,WACC;AAAA,oDAAC,kBAAe,SAAO,MACrB;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,UACF;AAAA,UAEA,wDAAC,gBAAgB,MAAhB,EAAqB,WAAU,oCAAmC;AAAA;AAAA,MACrE,GACF;AAAA,MACA,8CAAC,kBAAe,YAAY,GAAG,uBAAS;AAAA,OAC1C;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,OAAM;AAAA,QACN,iBAAiB,CAAC,MAAM;AACtB,YAAE,eAAe;AAAA,QACnB;AAAA,QACA,kBAAkB,CAAC,MAAM;AACvB,YAAE,eAAe;AAAA,QACnB;AAAA,QAEC,iBAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,cACf,SAAS,MAAM;AAAA,cACf,UAAU,MAAM,QAAQ;AAAA;AAAA,YAJnB;AAAA,UAKP;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;;;ASrFA,IAAAC,uBAA8B;AAC9B,IAAAC,iBAAgD;;;ACAhD,IAAAC,iBAAwB;AAEjB,SAAS,eACd,QACA,MACG;AACH,QAAM,OAAO,OAAO,iBAAiB,WAAW;AAAA,IAC9C,CAAC,cAAc,UAAU,SAAS;AAAA,EACpC;AAEA,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,QAAQ,IAAI,YAAY;AAAA,EAC1C;AAEA,SAAO,KAAK;AACd;AAEO,SAAS,mBAAmB,QAAgB;AACjD,SAAO,eAAgC,QAAQ,UAAU;AAC3D;AAEO,SAAS,mBAAmB,QAAgB;AACjD,aAAO,wBAAQ,MAAM;AACnB,WAAO,mBAAmB,MAAM;AAAA,EAClC,GAAG,CAAC,MAAM,CAAC;AACb;;;ACrBO,SAAS,iBACd,WACA,SACiB;AACjB,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,oBAAqC,CAAC;AAC1C,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,wBAAoB,UAAU;AAAA,MAAO,CAAC,aACpC,SAAS,KAAK,YAAY,EAAE,WAAW,UAAU;AAAA,IACnD;AAEA,QACE,MAAM,SAAS,KACf,CAAC,kBAAkB,KAAK,CAAC,aAAa,SAAS,SAAS,KAAK,GAC7D;AACA,wBAAkB,KAAK,EAAE,MAAM,OAAO,UAAU,KAAK,CAAC;AAAA,IACxD;AAEA,WAAO;AAAA,EACT,WAAW,OAAO,cAAc,YAAY;AAC1C,WAAO,UAAU,OAAO;AAAA,EAC1B,OAAO;AACL,UAAM,IAAI,MAAM,yEAAyE,OAAO,SAAS;AAAA;AAAA,mIAEsB;AAAA,EACjI;AACF;;;AClCA,IAAAC,iBAA4B;AAC5B,IAAAA,iBAA0B;AAGnB,SAAS,gBACd,KACA,UACA;AACA,QAAM,kBAAc;AAAA,IAClB,CAAC,MAA+B;AAC9B,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAc,GAAG;AAC1D,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,CAAC,KAAK,QAAQ;AAAA,EAChB;AAEA,gCAAU,MAAM;AACd,aAAS,iBAAiB,aAAa,WAAW;AAClD,aAAS,iBAAiB,cAAc,WAAW;AACnD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,WAAW;AACrD,eAAS,oBAAoB,cAAc,WAAW;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAClB;;;ACnBA,IAAAC,uBAA+B;AAC/B,IAAAC,iBAAmD;AA6C7C,IAAAC,uBAAA;AA7BC,IAAM,wBAAoB,2BAG/B,CAAC,OAAO,QAAQ;AA1BlB;AA2BE,QAUI,YATF;AAAA,YAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,CAAC;AAAA,IACvB,cAAc;AAAA,IACd;AAAA,EAnCJ,IAqCM,IADC,uBACD,IADC;AAAA,IARH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIF,QAAM,mBAAe,uBAAuB,IAAI;AAChD,QAAM,iBAAa,uBAAsC,IAAI;AAC7D,QAAM,sCACJ,wBAAmB,MAAM,MAAzB,mBAA4B;AAE9B,kBAAgB,cAAc,MAAM;AAClC;AAAA,EACF,CAAC;AAED,QAAM,uBAAuB,MAAM,WAAW,WAAW;AAEzD,SACE,+CAAC,SAAI,WAAW,GAAG,cAAc,GAAG,KAAK,cACvC;AAAA,mDAAC,WAAM,WAAU,gBACf;AAAA;AAAA,QAAC;AAAA,sEACK,qCADL;AAAA,UAEC,aAAY;AAAA,UACZ,MAAK;AAAA,YACD,aAJL;AAAA,UAKC;AAAA,UACA;AAAA,UACA,UAAU,CAAC,MAAM;AACf,0BAAc,EAAE,OAAO,KAAK;AAAA,UAC9B;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,WAAW,CAAC,MAAM;AAChB,gBAAI,CAAC,WAAW,WAAW,CAAC,sBAAsB;AAChD;AAAA,YACF;AACA,kBAAM,EAAE,QAAQ,UAAU,OAAO,IAAI,WAAW;AAEhD,gBAAI,EAAE,QAAQ,aAAa;AACzB,gBAAE,eAAe;AACjB,uBAAS;AAAA,YACX,WAAW,EAAE,QAAQ,WAAW;AAC9B,gBAAE,eAAe;AACjB,qBAAO;AAAA,YACT,WAAW,EAAE,QAAQ,SAAS;AAC5B,gBAAE,eAAe;AACjB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA,YAAY;AAAA;AAAA,MACd;AAAA,MACA,8CAAC,SAAI,WAAU,oEACb,wDAAC,uCAAe,WAAU,2DAA0D,GACtF;AAAA,OACF;AAAA,IAEC,wBACC,8CAAC,SAAI,WAAU,qCACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,oBAAoB,IAAI,CAAC,WAAW;AACzC,iBAAO;AAAA,YACL,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,QACD,cAAc,CAAC,SAAS;AACtB,2DAAiB,KAAK;AAAA,QACxB;AAAA,QACA,KAAK;AAAA;AAAA,IACP,GACF;AAAA,KAEJ;AAEJ,CAAC;AAED,kBAAkB,cAAc;;;AJhE1B,IAAAC,uBAAA;AA7BN,SAAS,aAAa,OAAyB;AAC7C,QAAM,EAAE,YAAY,IAAI,wBAAwB,OAAO,IAAI;AAE3D,QAAM,OAAO,mBAAmB,MAAM;AACtC,QAAM,YAAY,6BAAM;AACxB,QAAM,iBAAiB,6BAAM;AAC7B,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AACxD,QAAM,eAAW,uBAAyB,IAAI;AAE9C,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,aAAa;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,IACF,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,WAAW,MAAM,CAAC;AAEjC,QAAM,iBAAiB,aAAa,oBAAoB,SAAS,SAAS;AAE1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,CAAC,SAAS;AACtB,YAAI,MAAM;AACR;AAAA,QACF;AAEA,yBAAiB,KAAK;AAAA,MACxB;AAAA,MAEA;AAAA,uDAAC,WACC;AAAA,wDAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aACE;AAAA,cACJ;AAAA,cAEA,wDAAC,4BAAI,WAAU,oCAAmC;AAAA;AAAA,UACpD,GACF;AAAA,UACA,8CAAC,kBAAe,YAAY,GAAG,sCAAwB;AAAA,WACzD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,YAAY;AAAA,YACZ,OAAM;AAAA,YACN,iBAAiB,CAAC,MAAM;AACtB,gBAAE,eAAe;AAAA,YACnB;AAAA,YACA,kBAAkB,CAAC,MAAM;AACvB,gBAAE,eAAe;AAAA,YACnB;AAAA,YAEA;AAAA,6DAAC,SAAI,WAAU,iFAAgF;AAAA;AAAA,gBAE7F,+CAAC,WACC;AAAA,gEAAC,kBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW,GAAG,+CAA+C;AAAA;AAAA,kBAC/D,GACF;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,YAAY;AAAA,sBACZ,WAAU;AAAA,sBACV,OAAM;AAAA,sBACP;AAAA;AAAA,kBAED;AAAA,mBACF;AAAA,iBACF;AAAA,cAEC,CAAC,iBACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM;AACb,qCAAiB,IAAI;AACrB,+BAAW,MAAM;AA9F/B;AA+FgB,qCAAS,YAAT,mBAAkB;AAAA,oBACpB,GAAG,CAAC;AAAA,kBACN;AAAA,kBAEC,yBAAe;AAAA,oBACd,UAAU;AAAA,sBACR,MAAM;AAAA,sBACN,OAAO,CAAC,CAAC;AAAA,oBACX;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,oBACN;AAAA,kBACF,CAAC;AAAA;AAAA,cACH;AAAA,cAED,iBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU,CAAC,MAAM;AACf,sBAAE,eAAe;AACjB,qCAAiB,KAAK;AAAA,kBACxB;AAAA,kBACA,WAAW,CAAC,MAAM;AAChB,wBAAI,EAAE,QAAQ,UAAU;AACtB,uCAAiB,KAAK;AAAA,oBACxB;AAAA,kBACF;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA,OAAO,aAAa;AAAA,sBACpB,eAAe,CAAC,UAAU;AACxB,yFAAyB;AAAA,sBAC3B;AAAA,sBACA,gBAAgB,MAAM;AACpB,yCAAiB,KAAK;AAAA,sBACxB;AAAA,sBACA,gBAAgB,CAAC,UAAU;AACzB,yFAAyB;AACzB,yCAAiB,KAAK;AAAA,sBACxB;AAAA,sBACA;AAAA,sBACA,KAAK;AAAA;AAAA,kBACP;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,IAAM,kBAAc,qBAAK,YAAY;;;AK/I5C,4BAA8C;AA0DpC,IAAAC,uBAAA;AArCH,SAAS,YAAY,OAAyB;AACnD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IAEA,kBAAkB,CAAC;AAAA,EACrB,IAAI;AAEJ,QAAM,oBAAoB,CAACC,WAAkB;AAQ3C,mBAAe,MAAM;AACnB,oBAAcA,MAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,QAAM,gBACJ,8CAAC,kBAAe,SAAO,MACpB,sBACC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,MAAK;AAAA,MACL,MAAK;AAAA,MAEL;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAO,iCACD,cAAc,EAAE,YAAY,IAAI,CAAC,IADhC;AAAA,YAEL,iBAAiB,mBAAmB;AAAA,UACtC;AAAA;AAAA,MACF;AAAA;AAAA,EACF,GAEJ;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,CAAC,SAAS;AACtB,YAAI,CAAC,MAAM;AACT,6CAAU;AAAA,QACZ;AAAA,MACF;AAAA,MAEC;AAAA,kBACC,+CAAC,WACC;AAAA,wDAAC,kBAAe,SAAO,MAAE,yBAAc;AAAA,UACvC,8CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,WAC1C,IAEA;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,YAAY;AAAA,YAEZ,yDAAC,SAAI,WAAU,wFACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,UAAU;AAAA,kBACV,WAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP;AAAA,kBACA,UAAU;AAAA,kBACV,WAAU;AAAA,kBACV,UAAQ;AAAA;AAAA,cACV;AAAA,cAEC,gBAAgB,SAAS,KACxB,+CAAC,SACC;AAAA,8DAAC,SAAI,WAAU,+CAA8C;AAAA,gBAE7D,8CAAC,QAAG,WAAU,iCAAgC,2BAAa;AAAA,gBAE3D,8CAAC,SAAI,WAAU,+CACZ,0BAAgB,IAAI,CAAC,mBACpB;AAAA,kBAAC;AAAA;AAAA,oBAEC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,SAAS,MAAM,kBAAkB,cAAc;AAAA,oBAE/C;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO;AAAA,0BACL,iBAAiB;AAAA,wBACnB;AAAA;AAAA,oBACF;AAAA;AAAA,kBAZK;AAAA,gBAaP,CACD,GACH;AAAA,iBACF;AAAA,eAEJ;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AClII,IAAAC,uBAAA;AAJG,SAAS,QAAQ,OAAc;AACpC,QAAM,EAAE,OAAO,YAAY,UAAU,IAAI;AAEzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS,aAAa,wBAAwB;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ACnBA,IAAAC,wBAA2C;AAG3C,IAAAC,iBAAiC;;;ACAjC,IAAAC,iBAA6D;;;ACH7D,IAAAC,wBAAyC;;;ACCzC,IAAAC,uBAAiD;AAMzC,IAAAC,uBAAA;AAJD,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,UAAU,KAAK;AAAA,EACrC,MAAM,8CAAC,qCAAa,WAAU,mBAAkB;AAAA,EAChD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,IAAI;AAAA,EAC5D;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,UAAU,OAAO;AAAA,EACvC,MAAM,8CAAC,2CAAmB,WAAU,mBAAkB;AAAA,EACtD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,YAAY,EAAE,IAAI;AAAA,EAC9D;AAAA,EACA,QAAQ,CAAC,WAAW;AAClB,WAAO,OAAO,iBAAiB,WAAW;AAAA,MACxC,CAAC,QAAQ,IAAI,SAAS;AAAA,IACxB,MAAM,KACF,OACA;AAAA,EACN;AACF;;;AC9BA,IAAAC,uBAA4B;AAOpB,IAAAC,uBAAA;AAJD,IAAM,gBAA2B;AAAA,EACtC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,QAAQ,QAAQ;AAAA,EACtC,MAAM,8CAAC,oCAAY,WAAU,mBAAkB;AAAA,EAC/C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EAEjB,iBAAiB,EAAE,UAAU,OAAO,CAAC,EACrC,IAAI;AAAA,EACT;AACF;;;AClBA,IAAAC,gBAAwD;AAExD,IAAAC,uBAA0B;AAMlB,IAAAC,uBAAA;AAJD,IAAM,QAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,OAAO;AAAA,EACrB,MAAM,8CAAC,kCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI;AAAA,EACtE;AACF;AAEO,IAAM,OAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,MAAM;AAAA,EAC7B,MAAM,8CAAC,kCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,aAAa,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI;AAAA,EAC1E;AACF;AAEO,IAAM,cAAyB;AAAA,EACpC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,QAAQ;AAAA,EAC/B,MAAM,8CAAC,kCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EAEjB,eAAe;AAAA,MACd,KAAK;AAAA,IACP,CAAC,EAEA,QAAQ,CAAC,UAAU;AAClB,YAAM,EAAE,IAAI,OAAO,MAAM,QAAAC,QAAO,IAAI;AACpC,YAAM,EAAE,KAAK,IAAI;AAEjB,YAAM,OAAO,MAAM,IAAI,OAAO,IAAI;AAClC,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,4BAAc;AAAA,QAC9B,GAAG;AAAA,QACH;AAAA,QACA,OAAO,KAAK;AAAA,MACd;AACA,SAAG,aAAa,SAAS;AACzB,aAAO;AAAA,IACT,CAAC,EACA,IAAI;AAAA,EACT;AACF;;;AC5DA,IAAAC,uBAMO;AAMC,IAAAC,uBAAA;AAJD,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,SAAS;AAAA,EACjC,MAAM,8CAAC,oCAAY,WAAU,mBAAkB;AAAA,EAC/C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EAEjB,WAAW,EACX,MAAM,OAAO,MAAM,UAAU,OAAO,CAAC,EACrC,IAAI;AAAA,EACT;AACF;AAEO,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,SAAS;AAAA,EACjC,MAAM,8CAAC,4CAAoB,WAAU,mBAAkB;AAAA,EACvD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,WAAW,EAAE,IAAI;AAAA,EAC7D;AACF;AAEO,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,OAAO,MAAM;AAAA,EACrC,MAAM,8CAAC,gCAAQ,WAAU,mBAAkB;AAAA,EAC3C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,IAAI;AAAA,EAC5D;AACF;AAEO,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,OAAO,SAAS;AAAA,EACvC,MAAM,8CAAC,qCAAa,WAAU,mBAAkB;AAAA,EAChD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,QAAQ,KAAK,CAAC,EAAE,IAAI;AAAA,EAC5E;AACF;AAEO,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,WAAW,MAAM;AAAA,EAC/B,MAAM,8CAAC,8BAAM,WAAU,mBAAkB;AAAA,EACzC,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,kBAAkB,EAAE,IAAI;AAAA,EACpE;AACF;;;ACpEA,IAAAC,uBAAkC;AAM1B,IAAAC,uBAAA;AAJD,IAAM,aAAwB;AAAA,EACnC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,aAAa,OAAO;AAAA,EAClC,MAAM,8CAAC,6BAAK,WAAU,mBAAkB;AAAA,EACxC,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,iBAAiB,EAAE,IAAI;AAAA,EACnE;AACF;AAEO,IAAM,cAAyB;AAAA,EACpC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS;AAAA,EACvB,MAAM,8CAAC,oCAAY,WAAU,mBAAkB;AAAA,EAC/C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,kBAAkB,EAAE,IAAI;AAAA,EACpE;AACF;;;ACtBA,IAAAC,wBASO;AAMC,IAAAC,uBAAA;AAJD,IAAM,OAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,KAAK,WAAW;AAAA,EAC9B,MAAM,8CAAC,8BAAK,WAAU,mBAAkB;AAAA,EACxC,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,WAAW,aAAa,WAAW,EACnC,IAAI;AAAA,EACT;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,MAAM,SAAS,OAAO,OAAO;AAAA,EAC3C,MAAM,8CAAC,kCAAS,WAAU,mBAAkB;AAAA,EAC5C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,QAAQ,WAAW,EAAE,OAAO,EAAE,CAAC,EAC/B,IAAI;AAAA,EACT;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,MAAM,YAAY,QAAQ;AAAA,EACxC,MAAM,8CAAC,kCAAS,WAAU,mBAAkB;AAAA,EAC5C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,QAAQ,WAAW,EAAE,OAAO,EAAE,CAAC,EAC/B,IAAI;AAAA,EACT;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,MAAM,YAAY,OAAO;AAAA,EACvC,MAAM,8CAAC,kCAAS,WAAU,mBAAkB;AAAA,EAC5C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,QAAQ,WAAW,EAAE,OAAO,EAAE,CAAC,EAC/B,IAAI;AAAA,EACT;AACF;AAEO,IAAM,YAAuB;AAAA,EAClC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,MAAM;AAAA,EAC7B,MAAM,8CAAC,oCAAW,WAAU,mBAAkB;AAAA,EAC9C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,aAAa,EAAE,IAAI;AAAA,EAC/D;AACF;AAEO,IAAM,aAAwB;AAAA,EACnC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,YAAY;AAAA,EACnC,MAAM,8CAAC,mCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,iBAAiB,EAAE,IAAI;AAAA,EACnE;AACF;AAEO,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,MAAM;AAAA,EAC9B,MAAM,8CAAC,wCAAe,WAAU,mBAAkB;AAAA,EAClD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,IAAI;AAAA,EAC5D;AACF;AAEO,IAAM,YAAuB;AAAA,EAClC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,MAAM;AAAA,EAC7B,MAAM,8CAAC,oCAAW,WAAU,mBAAkB;AAAA,EAC9C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,IAAI;AAAA,EAClE;AACF;;;AC9GI,IAAAC,uBAAA;AAFG,SAAS,uBAAuB,OAAgC;AACrE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,OACF,QANL;AAAA,MAQC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA,8CAAC,UAAK,IAAG,8BAA6B,MAAK,SACzC,wDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,OAAM,GAClD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,IAAG;AAAA,YACH,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,IAAG;AAAA,YACH,QAAO;AAAA,YACP,aAAY;AAAA;AAAA,QACd;AAAA,QACA,8CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,OAAM,MAAK,gBAAe;AAAA;AAAA;AAAA,EACtE;AAEJ;;;ACnDI,IAAAC,uBAAA;AAFG,SAAS,wBAAwB,OAAgC;AACtE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,OACF,QANL;AAAA,MAQC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,IAAG;AAAA,YACH,QAAO;AAAA,YACP,aAAY;AAAA;AAAA,QACd;AAAA,QACA,8CAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,KAAI,QAAO,KAAI,IAAG,OAAM,MAAK,gBAAe;AAAA,QACtE;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACtCI,IAAAC,uBAAA;AAFG,SAAS,yBAAyB,OAAgC;AACvE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,OACF,QANL;AAAA,MAQC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,IAAG;AAAA,YACH,QAAO;AAAA,YACP,aAAY;AAAA;AAAA,QACd;AAAA,QACA,8CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,OAAM,MAAK,gBAAe;AAAA,QACpE;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACjCQ,IAAAC,uBAAA;AAJD,IAAM,+BAA0C;AAAA,EACrD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,MAAM;AAAA,EAC5B,MAAM,8CAAC,2BAAwB,WAAU,mBAAkB;AAAA,EAC3D,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,YAAY,KAAK,EACjB,cAAc;AAAA,MACb,MAAM;AAAA,MACN,OAAO,EAAE,WAAW,MAAM,KAAK,EAAE;AAAA,MACjC,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,eAAe;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd,wBAAwB;AAAA,gBACxB,eAAe;AAAA,gBACf,WAAW;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,eAAe;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,WAAW;AAAA,cACb;AAAA,cACA,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;AAAA,kBACxB,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,IAAI;AAAA,EACT;AACF;AAEO,IAAM,6BAAwC;AAAA,EACnD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,MAAM;AAAA,EAC5B,MAAM,8CAAC,4BAAyB,WAAU,mBAAkB;AAAA,EAC5D,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,YAAY,KAAK,EACjB,cAAc;AAAA,MACb;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc;AAAA,UACd,wBAAwB;AAAA,UACxB,eAAe;AAAA,UACf,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,GAAG,WAAW,KAAK,EAAE;AAAA,MACxD;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,UAAU,OAAO,GAAG,WAAW,KAAK;AAAA,QACxD,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF,CAAC,EACA,IAAI;AAAA,EACT;AACF;AAEO,IAAM,2BAAsC;AAAA,EACjD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,SAAS,OAAO;AAAA,EACtC,MAAM,8CAAC,0BAAuB,WAAU,mBAAkB;AAAA,EAC1D,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,UAAM,kBAAiB,oBAAI,KAAK,GAAE,mBAAmB,SAAS;AAAA,MAC5D,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AAED,WACG,MAAM,EACN,YAAY,KAAK,EACjB,cAAc;AAAA,MACb;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc;AAAA,UACd,wBAAwB;AAAA,UACxB,eAAe;AAAA,UACf,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,MAAM,KAAK,EAAE;AAAA,QACjC,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,eAAe;AAAA,YACjB;AAAA,YACA,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,kBACL,KAAK;AAAA,kBACL,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,WAAW;AAAA,kBACX,cAAc;AAAA,kBACd,wBAAwB;AAAA,kBACxB,eAAe;AAAA,kBACf,WAAW;AAAA,gBACb;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,eAAe;AAAA,YACjB;AAAA,YACA,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO,EAAE,WAAW,SAAS,WAAW,KAAK;AAAA,gBAC7C,SAAS;AAAA,kBACP;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;AAAA,oBACxB,MAAM;AAAA,kBACR;AAAA,kBACA,EAAE,MAAM,YAAY;AAAA,kBACpB;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,sBACL,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE;AAAA,oBACnD;AAAA,oBACA,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,IAAI;AAAA,EACT;AACF;;;AC5MA,IAAAC,wBAIO;AAOC,IAAAC,uBAAA;AAJD,IAAM,sBAAiC;AAAA,EAC5C,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,WAAW;AAAA,EACnC,MAAM,8CAAC,uCAAc,WAAU,mBAAkB;AAAA,EACjD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,UAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAE3C,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc;AAAA,MACb,MAAM;AAAA,MACN,OAAO,EAAE,WAAW,UAAU,WAAW,KAAK;AAAA,MAC9C,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE,CAAC;AAAA,UAC1D,MAAM,cAAW,WAAW;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAC,EACA,IAAI;AAAA,EACT;AACF;AAEO,IAAM,6BAAwC;AAAA,EACnD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,aAAa,YAAY,KAAK;AAAA,EACtD,MAAM,8CAAC,iDAAwB,WAAU,mBAAkB;AAAA,EAC3D,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc;AAAA,MACb;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc;AAAA,UACd,wBAAwB;AAAA,UACxB,eAAe;AAAA,UACf,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,IAAI,WAAW,KAAK,EAAE;AAAA,MACzD;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,MAAM,mBAAmB,SAAS;AAAA,QACtD,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,GAAG,EAAE,CAAC;AAAA,YACnD,MAAM;AAAA,UACR;AAAA,UACA,EAAE,MAAM,YAAY;AAAA,UACpB;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,GAAG,EAAE,CAAC;AAAA,YACnD,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,IAAI;AAAA,EACT;AACF;AAEO,IAAM,yBAAoC;AAAA,EAC/C,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,WAAW,WAAW;AAAA,EAC9C,MAAM,8CAAC,4CAAmB,WAAU,mBAAkB;AAAA,EACtD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,cAAc;AAAA,MACb,EAAE,MAAM,iBAAiB;AAAA,MACzB;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc;AAAA,UACd,wBAAwB;AAAA,UACxB,eAAe;AAAA,UACf,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,IAAI,WAAW,KAAK,EAAE;AAAA,MACzD;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,UAAU,OAAO,GAAG,WAAW,KAAK;AAAA,QACxD,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MAC3C;AAAA,MACA,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,GAAG,WAAW,KAAK,EAAE;AAAA,MACxD;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,UAAU,mBAAmB,SAAS;AAAA,QAC1D,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,GAAG,EAAE,CAAC;AAAA,YACnD,MAAM;AAAA,UACR;AAAA,UACA,EAAE,MAAM,YAAY;AAAA,UACpB;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,eAAe;AAAA,gBACjB;AAAA,cACF;AAAA,cACA,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE;AAAA,cACjD,EAAE,MAAM,YAAY;AAAA,YACtB;AAAA,YACA,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE,CAAC;AAAA,YAC1D,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,eAAe;AAAA,gBACjB;AAAA,cACF;AAAA,cACA,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE;AAAA,cACjD,EAAE,MAAM,YAAY;AAAA,YACtB;AAAA,YACA,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE,CAAC;AAAA,YAC1D,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,eAAe;AAAA,gBACjB;AAAA,cACF;AAAA,cACA,EAAE,MAAM,aAAa,OAAO,EAAE,OAAO,UAAU,EAAE;AAAA,cACjD,EAAE,MAAM,YAAY;AAAA,YACtB;AAAA,YACA,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,UAAU,WAAW,KAAK;AAAA,QAC9C,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,KAAK;AAAA,cACL,eAAe;AAAA,cACf,KAAK;AAAA,cACL,OAAO;AAAA,cACP,cAAc;AAAA,cACd,wBAAwB;AAAA,YAC1B;AAAA,UACF;AAAA,UACA,EAAE,MAAM,QAAQ,MAAM,KAAK;AAAA,UAC3B;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,KAAK;AAAA,cACL,eAAe;AAAA,cACf,KAAK;AAAA,cACL,OAAO;AAAA,cACP,cAAc;AAAA,cACd,wBAAwB;AAAA,YAC1B;AAAA,UACF;AAAA,UACA,EAAE,MAAM,QAAQ,MAAM,KAAK;AAAA,UAC3B;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,KAAK;AAAA,cACL,eAAe;AAAA,cACf,KAAK;AAAA,cACL,OAAO;AAAA,cACP,cAAc;AAAA,cACd,wBAAwB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,IAAI;AAAA,EACT;AACF;;;AXrLc,IAAAC,uBAAA;AAlCP,IAAM,yBAA2C;AAAA,EACtD;AAAA,IACE,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,aAAa,CAAC,UAAU,SAAS;AAAA,QACjC,MAAM,8CAAC,kCAAS,WAAU,mBAAkB;AAAA,QAC5C,SAAS;AAAA,QACT,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,aAAa,CAAC,SAAS;AAAA,QACvB,MAAM,8CAAC,wCAAe,WAAU,mBAAkB;AAAA,QAClD,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AD7DI,IAAAC,uBAAA;AAlBG,IAAM,0BAA0B;AAOhC,IAAM,mBAAe,8BAAgC;AAAA,EAC1D,gBAAgB;AAAA,EAChB,QAAQ;AACV,CAAC;AAcM,SAAS,kBAAkB;AAChC,QAAM,aAAS,2BAAW,YAAY;AACtC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,SAAO;AACT;;;AD7BA,IAAAC,iBAAwB;;;AcRxB,IAAAC,gBAA8C;AAE9C,IAAAC,gBAA0B;AAC1B,IAAAC,iBAAsC;AACtC,wBAA8C;;;ACH9C,IAAAC,wBAKO;AACP,IAAAC,iBAMO;AA6EC,IAAAC,uBAAA;AA1DD,IAAM,iCACX,2BAAW,CAAC,OAAO,QAAQ;AACzB,QAAM,EAAE,OAAO,aAAa,IAAI;AAEhC,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,CAAC;AACpD,QAAM,yBAAqB,uBAAuB,IAAI;AACtD,QAAM,eAAW,uBAAqC,CAAC,CAAC;AAExD,QAAM,yBAAyB,CAAC,UAAkB;AAChD,UAAM,YAAY,mBAAmB;AACrC,UAAM,eAAe,SAAS,QAAQ,KAAK;AAE3C,QAAI,CAAC,aAAa,CAAC,cAAc;AAC/B;AAAA,IACF;AAEA,UAAM,gBAAgB,UAAU,sBAAsB;AACtD,UAAM,WAAW,aAAa,sBAAsB;AAEpD,UAAM,UAAU;AAChB,QAAI,SAAS,SAAS,cAAc,QAAQ;AAC1C,gBAAU,aAAa,SAAS,SAAS,cAAc,SAAS;AAAA,IAClE,WAAW,SAAS,MAAM,cAAc,KAAK;AAC3C,gBAAU,aAAa,SAAS,MAAM,cAAc,MAAM;AAAA,IAC5D;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,qBAAiB,CAAC;AAClB,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,YAAY;AAAA,IACzC;AACA,aAAS,UAAU,MAAM,IAAI,MAAM,IAAI;AAAA,EACzC,GAAG,CAAC,KAAK,CAAC;AAEV,gCAAU,MAAM;AACd,2BAAuB,aAAa;AAAA,EACtC,GAAG,CAAC,aAAa,CAAC;AAElB,0CAAoB,KAAK,OAAO;AAAA,IAC9B,QAAQ,MAAM;AACZ,wBAAkB,gBAAgB,MAAM,SAAS,KAAK,MAAM,MAAM;AAAA,IACpE;AAAA,IACA,UAAU,MAAM;AACd,wBAAkB,gBAAgB,KAAK,MAAM,MAAM;AAAA,IACrD;AAAA,IACA,QAAQ,MAAM;AACZ,YAAM,OAAO,MAAM,aAAa;AAChC,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AAEA,mBAAa,IAAI;AAAA,IACnB;AAAA,EACF,EAAE;AAEF,SACE,+CAAC,SAAI,WAAU,iHACb;AAAA,mDAAC,SAAI,WAAU,sJACb;AAAA,oDAAC,UAAK,WAAU,6BAA4B,uBAAS;AAAA,MACrD,8CAAC,gBACC,wDAAC,gCAAO,WAAU,+BAA8B,GAClD;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QAEV,wDAAC,SAAI,WAAU,sEACZ,0CAAO,UACN,+BAAO,IAAI,CAAC,MAAM,UAChB;AAAA,UAAC;AAAA;AAAA,YAEC,KAAK,CAAC,OAAQ,SAAS,QAAQ,KAAK,IAAI;AAAA,YACxC,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,WAAW;AAAA,cACT;AAAA,cACA,UAAU,gBACN,qBACA;AAAA,YACN;AAAA,YAEA;AAAA,4DAAC,gCAAO,WAAU,iDAAgD;AAAA,cACjE,KAAK;AAAA;AAAA;AAAA,UAXD;AAAA,QAYP,KAGF,8CAAC,SAAI,WAAU,gLAA+K,uBAE9L,GAEJ;AAAA;AAAA,IACF;AAAA,IAEA,+CAAC,SAAI,WAAU,kIACb;AAAA,qDAAC,SAAI,WAAU,uCACb;AAAA,sDAAC,gBACC,wDAAC,uCAAc,WAAU,+BAA8B,GACzD;AAAA,QACA,8CAAC,gBACC,wDAAC,qCAAY,WAAU,+BAA8B,GACvD;AAAA,QACA,8CAAC,UAAK,WAAU,iCAAgC,sBAAQ;AAAA,SAC1D;AAAA,MACA,8CAAC,gBACC,wDAAC,4CAAmB,WAAU,+BAA8B,GAC9D;AAAA,OACF;AAAA,KACF;AAEJ,CAAC;AAOH,SAAS,aAAa,OAA0B;AAC9C,QAAM,EAAE,WAAW,SAAS,IAAI;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;ACxJA,IAAAC,iBAAgC;AAChC,IAAAC,wBAA8C;AAC9C,IAAAD,iBAAwB;AA6BhB,IAAAE,uBAAA;AAtBD,SAAS,aAAa,OAAsB;AACjD,QAAM,EAAE,MAAM,kBAAAC,mBAAkB,OAAO,IAAI;AAC3C,QAAM,EAAE,IAAI,UAAU,SAAS,IAAI,KAAK;AAExC,QAAM,qBAAiB,wBAAQ,MAAM;AAxBvC;AAyBI,UAAM,kBACJ,0BAAgC,QAAQ,UAAU,MAAlD,mBAAqD,mBAArD,YACA;AAEF,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,cAAc,CAAC,SAAS;AACtB,mBAAO,QAAQ,SAAS,UAAU;AAAA,UACpC;AAAA,UAEA;AAAA,0DAAC,kBACE,yBAAe;AAAA,cACd,UAAU,EAAE,MAAM,IAAI,UAAoB,OAAO,KAAK;AAAA,cACtD;AAAA,cACA;AAAA,cACA,MAAM;AAAA,YACR,CAAC,GACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,gBACzC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,gBAE1C,wDAAC,mBACC,yDAAC,SAAI,WAAU,qDACb;AAAA,iEAAC,WAAM,WAAU,gBACf;AAAA,kEAAC,UAAK,WAAU,gEAA+D,sBAE/E;AAAA,oBACA;AAAA,sBAAC;AAAA,uDACK,qCADL;AAAA,wBAEC,OAAO,kBAAM;AAAA,wBACb,UAAU,CAAC,MAAM;AACf,0BAAAA,kBAAiB;AAAA,4BACf,IAAI,EAAE,OAAO;AAAA,0BACf,CAAC;AAAA,wBACH;AAAA,wBACA,aAAY;AAAA,wBACZ,WAAU;AAAA;AAAA,oBACZ;AAAA,qBACF;AAAA,kBAEA,8CAAC,WAAQ,WAAU,cAAa;AAAA,kBAEhC,+CAAC,WAAM,WAAU,gBACf;AAAA,kEAAC,UAAK,WAAU,yEAAwE,qBAExF;AAAA,oBACA;AAAA,sBAAC;AAAA,uDACK,qCADL;AAAA,wBAEC,OAAO,8BAAY;AAAA,wBACnB,UAAU,CAAC,MAAM;AACf,0BAAAA,kBAAiB;AAAA,4BACf,UAAU,EAAE,OAAO;AAAA,0BACrB,CAAC;AAAA,wBACH;AAAA,wBACA,aAAY;AAAA,wBACZ,WAAU;AAAA;AAAA,oBACZ;AAAA,oBACA,8CAAC,SAAI,WAAU,oEACb,wDAAC,gCAAO,WAAU,2DAA0D,GAC9E;AAAA,qBACF;AAAA,mBACF,GACF;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEO,IAAM,wBAAgD,CAAC,UAAU;AACtE,QAAM,EAAE,UAAU,UAAU,KAAK,IAAI;AACrC,QAAM,EAAE,MAAM,UAAU,MAAM,IAAI;AAElC,MAAI,SAAS,mBAAmB;AAC9B,WACE,+CAAC,SAAI,WAAU,uMACb;AAAA,oDAAC,gCAAO,WAAU,iDAAgD;AAAA,MAClE,8CAAC,UAAK,WAAU,0CAA0C,gBAAK;AAAA,OACjE;AAAA,EAEJ;AAEA,MAAI,SAAS,mBAAmB;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,CAAC,SACC;AAAA,QACJ;AAAA,QAEA;AAAA,wDAAC,gCAAO,WAAU,mEAAkE;AAAA,UACpF,8CAAC,UAAK,WAAU,0CAA0C,gBAAK;AAAA;AAAA;AAAA,IACjE;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,sDAAC,gCAAO,WAAU,wFAAuF;AAAA,QACxG;AAAA,QACA,YAAY,CAAC,YACZ,8CAAC,uCAAc,WAAU,sEAAqE;AAAA;AAAA;AAAA,EAElG;AAEJ;;;AFnHO,IAAM,gCAAgC;AACtC,IAAM,oBAA+B,CAAC;AACtC,IAAM,mCACX;AACK,IAAM,sCAAsC;AAwC5C,IAAM,oBAAoB,IAAI,wBAAU,UAAU;AAElD,IAAM,oBAAoB,mBAAK,OAAyC;AAAA,EAC7E,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,WAAW;AAAA,MACX,4BAA4B;AAAA,MAC5B,gBAAgB;AAAA,MAEhB,YAAY,OAAO;AAhGzB;AAiGQ,cAAM,EAAE,KAAK,IAAI;AACjB,eAAO,IAAG,UAAK,MAAM,UAAX,YAAoB,KAAK,MAAM,EAAE;AAAA,MAC7C;AAAA,MAEA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,CAAC,EAAE,QAAQ,OAAO,MAAM,MAAM;AAxG/C;AA2GU,gBAAM,YAAY,OAAO,KAAK,MAAM,UAAU,IAAI;AAClD,gBAAM,iBAAgB,4CAAW,SAAX,mBAAiB,WAAW;AAElD,cAAI,eAAe;AACjB,kBAAM,MAAM;AAAA,UACd;AAEA,iBACG,MAAM,EACN,MAAM,EACN,gBAAgB,OAAO;AAAA,YACtB;AAAA,cACE,MAAM,KAAK;AAAA,cACX,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF,CAAC,EACA,IAAI;AAEP,uBAAO,aAAa,MAApB,mBAAuB;AAAA,QACzB;AAAA,QACA,OAAO,CAAC,EAAE,OAAO,MAAM,MAAM;AAC3B,gBAAM,QAAQ,MAAM,IAAI,QAAQ,MAAM,IAAI;AAC1C,gBAAM,OAAO,MAAM,OAAO,MAAM,KAAK,IAAI;AACzC,gBAAM,QAAQ,CAAC,CAAC,MAAM,OAAO,KAAK,aAAa,UAAU,IAAI;AAE7D,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,IAAI;AAAA,QACF,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,SAAS;AAAA,QACtD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,IAAI;AAClB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,WAAW,WAAW;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,YAAY;AAAA,QACzD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,cAAc,WAAW;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,eAAe;AAAA,QAC5D,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,UAAU;AACxB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,iBAAiB,WAAW;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,eAAe;AAAA,QAC5D,YAAY,CAAC,eAAe;AA7LpC;AA8LU,iBAAO;AAAA,YACL,kBAAiB,8CAAY,aAAZ,YAAwB;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,MAAM,gBAAAC,gBAAe,GAAG;AACnC,WAAO;AAAA,MACL;AAAA,UACA,+BAAgB,EAAE,aAAa,KAAK,KAAK,GAAGA,eAAc;AAAA,MAC1D,KAAK,QAAQ,YAAY;AAAA,QACvB,SAAS,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,KAAK,GAAG;AACnB,WAAO,KAAK,QAAQ,YAAY;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,uBAAuB;AACrB,WAAO;AAAA,MACL,WAAW,MACT,KAAK,OAAO,SAAS,QAAQ,CAAC,EAAE,IAAI,MAAM,MAAM;AAC9C,YAAI,YAAY;AAChB,cAAM,EAAE,UAAU,IAAI;AACtB,cAAM,EAAE,OAAO,OAAO,IAAI;AAE1B,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AAEA,cAAM,IAAI,aAAa,SAAS,GAAG,QAAQ,CAAC,MAAM,QAAQ;AACxD,cAAI,KAAK,KAAK,SAAS,KAAK,MAAM;AAChC,wBAAY;AACZ,eAAG;AAAA,cACD,KAAK,QAAQ,WAAW,QAAQ;AAAA,cAChC;AAAA,cACA,MAAM,KAAK;AAAA,YACb;AAEA,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAED,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,wBAAwB;AACtB,WAAO;AAAA,UACL,kBAAAC,SAAW;AAAA,QACT,QAAQ,KAAK;AAAA,SACV,KAAK,QAAQ,WACjB;AAAA,IACH;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,cAAc;AAAA,MACzC,WAAW;AAAA,MACX,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACF,CAAC;;;AdvMO,IAAAC,uBAAA;AA9CD,SAAS,iBAAiB,OAA8B;AAxB/D;AAyBE,QAAM;AAAA,IACJ,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb;AAAA,IAEA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,CAAC,UAAU;AAEtD,QAAM,mBAAe,uBAAyB,IAAI;AAElD,QAAM,EAAE,iBAAiB,wBAAwB,IAAI,gBAAgB;AACrE,QAAM,UAAU,mBAAmB,MAAM;AAEzC,QAAM,iBAAiB,mCAAS;AAChC,QAAM,YAAY,mCAAS;AAC3B,QAAM,4BACJ,8CAAS,eAAT,mBAAqB,SAArB,YAA6B;AAE/B,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,UAAM,iBAAiB,aAAa;AAAA,MAClC,IAAI,OAAO,0BAA0B,GAAG;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,kBAAkB;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,IACF,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,0BAA0B,cAAc,MAAM,CAAC;AAE9D,QAAM,gBACJ,8CAAC,kBAAe,SAAO,MACrB;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAU;AAAA,MACV,cAAY,CAAC,CAAC;AAAA,MAEd,wDAAC,QAAK,WAAU,wEAAuE;AAAA;AAAA,EACzF,GACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,cAAc,CAAC,SAAS;AACtB,kBAAU,IAAI;AACd,YAAI,MAAM;AACR,qBAAW,MAAM;AAjF3B,gBAAAC;AAkFY,aAAAA,MAAA,aAAa,YAAb,gBAAAA,IAAsB;AAAA,UACxB,GAAG,CAAC;AAAA,QACN;AAAA,MACF;AAAA,MAEC;AAAA,kBACC,+CAAC,WACC;AAAA,wDAAC,kBAAe,SAAO,MAAE,yBAAc;AAAA,UACvC,8CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,WAC1C,IAEA;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,YAE1C;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU,CAAC,MAAM;AACf,oBAAE,eAAe;AACjB,wBAAM,QAAQ,aAAa;AAC3B,sBAAI,CAAC,OAAO;AACV;AAAA,kBACF;AAEA,iEAAgB,MAAM;AACtB,4BAAU,KAAK;AAAA,gBACjB;AAAA,gBAEA,yDAAC,SAAI,WAAU,uCACZ;AAAA,mBAAC,aACA,8CAAC,SAAI,WAAU,2GACb;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS,MAAM;AACb,qCAAa,IAAI;AACjB,mCAAW,MAAM;AAzHrC,8BAAAA;AA0HsB,2BAAAA,MAAA,aAAa,YAAb,gBAAAA,IAAsB;AAAA,wBACxB,GAAG,CAAC;AAAA,sBACN;AAAA,sBAEC,yBAAe;AAAA,wBACd,UAAU;AAAA,0BACR,MAAM;AAAA,0BACN,OAAO;AAAA,wBACT;AAAA,wBACA,UAAU;AAAA,wBACV,MAAM;AAAA,wBACN;AAAA,sBACF,CAAC;AAAA;AAAA,kBACH,GACF;AAAA,kBAGD,aACC,+CAAC,SAAI,WAAU,gBACb;AAAA,kEAAC,SAAI,WAAU,8EACb,wDAAC,kCAAS,WAAU,2DAA0D,GAChF;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC;AAAA,wBACA,OAAO;AAAA,wBACP,eAAe,CAAC,UAAU;AACxB,yEAAgB;AAAA,wBAClB;AAAA,wBACA;AAAA,wBACA,KAAK;AAAA,wBACL,aAAa;AAAA,wBACb,WAAU;AAAA,wBACV,aAAa;AAAA,wBACb,gBAAgB,CAAC,UAAU;AA5J7C,8BAAAA;AA6JoB,gCAAMC,eACJD,MAAA,oBAAoB,SAAS,KAAK,MAAlC,OAAAA,MAAuC;AACzC,8BAAIC,aAAY;AACd,yCAAa,KAAK;AAAA,0BACpB;AAEA,yEAAgB,OAAOA;AACvB,oCAAU,KAAK;AAAA,wBACjB;AAAA;AAAA,oBACF;AAAA,qBACF;AAAA,mBAEJ;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AiB9KA,IAAAC,iBAAsB;AAGtB,IAAAC,wBAA4C;AAmCxC,IAAAC,uBAAA;AAfG,SAAS,OAAO,OAAoB;AACzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,UAAM,sBAAM,CAAC;AAE9B,QAAM,UACJ,+CAAC,SAAI,WAAU,gBACb;AAAA,kDAAC,WAAM,SAAS,UAAU,WAAU,eACjC,iBACH;AAAA,IAEC,QACC,8CAAC,SAAI,WAAU,oGACb,wDAAC,QAAK,WAAW,GAAG,cAAc,aAAa,GAAG,GACpD;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,WAAW;AAAA,UACT;AAAA,UACA,CAAC,CAAC,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA,QACA,UAAU,CAAC,UAAU,cAAc,MAAM,OAAO,KAAK;AAAA,QAEpD,kBAAQ,IAAI,CAAC,WACZ,8CAAC,YAA0B,OAAO,OAAO,OACtC,iBAAO,SADG,OAAO,KAEpB,CACD;AAAA;AAAA,IACH;AAAA,IAEA,8CAAC,UAAK,WAAU,0LACd;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAY;AAAA,QACZ,MAAK;AAAA;AAAA,IACP,GACF;AAAA,KACF;AAGF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SACE,+CAAC,WACC;AAAA,kDAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,IACjC,8CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,KAC1C;AAEJ;;;ACxEA,IAAAC,iBAA+C;AAC/C,IAAAA,iBAAuC;;;ACVvC,IAAAC,iBAA0C;AAqCtC,IAAAC,uBAAA;AA3BG,SAAS,iBAAiB,OAA8B;AAhB/D;AAiBE,QAAM,EAAE,OAAO,eAAe,YAAY,OAAO,IAAI;AAErD,QAAM,mBAAe,uBAAyB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,CAAC,UAAU;AAEtD,QAAM,EAAE,iBAAiB,wBAAwB,IAAI,gBAAgB;AACrE,QAAM,OAAO,mBAAmB,MAAM;AACtC,QAAM,YAAY,6BAAM;AACxB,QAAM,4BACJ,wCAAM,eAAN,mBAAkB,SAAlB,YAA0B;AAC5B,QAAM,iBAAiB,6BAAM;AAE7B,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,UAAM,iBAAiB,MAAM;AAAA,MAC3B,IAAI,OAAO,0BAA0B,GAAG;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,kBAAkB;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,IACF,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,OAAO,MAAM,CAAC;AAE7B,SACE,+CAAC,SAAI,WAAU,uCACZ;AAAA,KAAC,aACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AACb,uBAAa,IAAI;AACjB,qBAAW,MAAM;AAhD7B,gBAAAC;AAiDc,aAAAA,MAAA,aAAa,YAAb,gBAAAA,IAAsB;AAAA,UACxB,GAAG,CAAC;AAAA,QACN;AAAA,QAEC,yBAAe;AAAA,UACd,UAAU;AAAA,YACR,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA;AAAA,IACH;AAAA,IAGD,aACC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,eAAe,CAACC,WAAU;AACxB,yDAAgBA;AAAA,QAClB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,aAAa;AAAA,QACb,WAAU;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB,CAACA,WAAU;AA7ErC,cAAAD;AA8EY,gBAAME,eAAaF,MAAA,oBAAoB,SAASC,MAAK,MAAlC,OAAAD,MAAuC;AAC1D,cAAIE,aAAY;AACd,yBAAa,KAAK;AAAA,UACpB;AACA,yDAAgBD,QAAOC;AAAA,QACzB;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;ADJY,IAAAC,uBAAA;AA3DL,SAAS,WAAW,OAAsB;AAC/C,QAAM,EAAE,MAAM,QAAQ,QAAQ,kBAAAC,kBAAiB,IAAI;AACnD,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,KAAK;AAET,QAAM,OAAO,mBAAmB,MAAM;AACtC,QAAM,iBAAiB,6BAAM;AAE7B,QAAM,YAAQ;AAAA,IACZ,OAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,QACN,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,WAAO,wBAAQ,MAAM;AAjE7B;AAkEI,YAAO,YAAO,QAAQ,KAAK,EAAE;AAAA,MAC3B,CAAC,CAAC,EAAE,EAAE,UAAU,SAAS,CAAC,MACxB,iBAAiB,YAAY,eAAe;AAAA,IAChD,MAHO,mBAGH;AAAA,EACN,GAAG,CAAC,cAAc,YAAY,KAAK,CAAC;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,OAAO;AAAA,MAClB,oBAAkB,OAAO;AAAA,MACzB,aAAU;AAAA,MACV,OAAO;AAAA,QACL,WAAW;AAAA,MACb;AAAA,MAEA,yDAAC,WAAQ,MAAM,MAAM,YAAY,OAAO,YACtC;AAAA,sDAAC,kBAAe,SAAO,MACrB,wDAAC,SACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,gBACE,qBAAqB,YAAY;AAAA,gBACjC,mBAAmB,YAAY;AAAA,gBAC/B,qBAAqB,YAAY;AAAA,cACnC;AAAA,YACF;AAAA,YACA,UAAU;AAAA,YACV,OACE;AAAA,cACE,iBACE,YAAY,WAAW,cAAc;AAAA,cACvC,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,aAAa;AAAA;AAAA;AAAA,cAGb,6BAA6B,GAAG,SAAS;AAAA,cAEzC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YAEF,SAAS,CAAC,MAAM;AACd,gBAAE,eAAe;AACjB,kBAAI,CAAC,OAAO,YAAY;AACtB;AAAA,cACF;AAEA,oBAAM,MAAM,OAAO;AACnB,qBAAO,SAAS,iBAAiB,GAAG;AAAA,YACtC;AAAA,YAEC,2BACG,eAAe;AAAA,cACb,UAAU,EAAE,MAAMA,OAAM,OAAO,KAAK;AAAA,cACpC,UAAUA;AAAA,cACV,MAAM;AAAA,cACN;AAAA,YACF,CAAC,IACDA;AAAA;AAAA,QACN,GACF,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,YACzC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,YAE1C,wDAAC,mBACC,yDAAC,SAAI,WAAU,qDACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,kBACP,eAAe,CAAC,OAAO,eAAe;AACpC,oBAAAD,kBAAiB;AAAA,sBACf,MAAM;AAAA,sBACN,gBAAgB,kCAAc;AAAA,oBAChC,CAAC;AAAA,kBACH;AAAA,kBACA,YAAY;AAAA,kBACZ;AAAA;AAAA,cACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,oBACP,SAAS,0BAA0B,IAAI,CAAC,WAAW;AAAA,sBACjD;AAAA,sBACA,OAAO;AAAA,oBACT,EAAE;AAAA,oBACF,eAAe,CAAC,UAAU;AACxB,sBAAAA,kBAAiB;AAAA,wBACf,cAAc;AAAA,sBAChB,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA,oBACR,WAAU;AAAA;AAAA,gBACZ;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,oBACP,SAAS,qBAAqB,IAAI,CAAC,WAAW;AAAA,sBAC5C;AAAA,sBACA,OAAO;AAAA,oBACT,EAAE;AAAA,oBACF,eAAe,CAAC,UAAU;AACxB,sBAAAA,kBAAiB;AAAA,wBACf,SAAS;AAAA,sBACX,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA,oBACR,WAAU;AAAA;AAAA,gBACZ;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,oBACP,SAAS;AAAA,sBACP,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,sBACjC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,sBACnC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,oBACnC;AAAA,oBACA,eAAe,CAAC,UAAU;AACxB,4BAAM,EAAE,UAAU,SAAS,IACzB,MAAM,KAAqC;AAE7C,sBAAAA,kBAAiB;AAAA,wBACf,YAAY;AAAA,wBACZ,cAAc;AAAA,wBACd,eAAe;AAAA,wBACf,aAAa;AAAA,sBACf,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA;AAAA,gBACV;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,mBAAmB,CAACE,eAAc;AAChC,sBAAAF,kBAAiB;AAAA,wBACf,WAAAE;AAAA,sBACF,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,cAAc,gBAAgB;AAAA,oBAC9B,eAAe,CAAC,OAAO,eAAe;AACpC,sBAAAF,kBAAiB;AAAA,wBACf,KAAK;AAAA,wBACL,eAAe,kCAAc;AAAA,sBAC/B,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA,oBACR;AAAA,oBACA,YAAY;AAAA;AAAA,gBACd;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,OAAO;AAAA,oBACP,UAAU,CAAC,UAAU;AACnB,sBAAAA,kBAAiB;AAAA,wBACf,aAAa;AAAA,sBACf,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,UAAU;AACnB,sBAAAA,kBAAiB;AAAA,wBACf,WAAW;AAAA,sBACb,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,wBAAwB,CAAC,UAAU;AACjC,oBAAAA,kBAAiB;AAAA,sBACf,WAAW;AAAA,oBACb,CAAC;AAAA,kBACH;AAAA,kBACA;AAAA;AAAA,cACF;AAAA,eACF,GACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAQA,SAAS,2BAA2B,OAAyB;AAC3D,QAAM,EAAE,OAAO,UAAU,QAAQ,IAAI;AAErC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAe;AAAA,MACf,SAAQ;AAAA,MAER;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAU;AAAA,UAEV;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,iBAAiB,YAAY,WAAW,QAAQ;AAAA,gBAChD,aAAa;AAAA,gBACb,aAAa;AAAA,gBACb,aAAa,YAAY,WAAW,UAAU;AAAA,cAChD;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,qBAAqB,OAAyB;AACrD,QAAM,EAAE,OAAO,SAAS,IAAI;AAE5B,SACE,8CAAC,eAAY,OAAc,eAAe,UAAU,SAAQ,cAC1D;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAU;AAAA,MAEV,yDAAC,SAAI,WAAU,2EACb;AAAA,sDAAC,UAAK,WAAU,oEAAmE,eAEnF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,MAAM;AAAA;AAAA,QAClC;AAAA,SACF;AAAA;AAAA,EACF,GACF;AAEJ;;;AnC7UO,IAAM,2BAAiD;AACvD,IAAM,yBAA+C;AACrD,IAAM,+BAA0D;AAChE,IAAM,kCAAkC;AACxC,IAAM,4BAA4B;AAElC,IAAM,6BAA6B;AACnC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,8BAA8B;AAEpC,IAAM,uBAAuB,CAAC,UAAU,SAAS;AAGjD,IAAM,4BAA4B,CAAC,SAAS,UAAU,OAAO;AAkC7D,IAAM,kBAAkB,mBAAK,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,WAAW,KAAK;AAAA,QAC9C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,aAAa,WAAW;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,uBAAuB,MAAM;AAAA,QAC3D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,gBAAgB;AAC9B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,yBAAyB;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,UAAU,KAAK;AAAA,QAC7C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,YAAY,WAAW;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAIA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,sBAAsB,MAAM;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,gBAAgB,KAAK;AAAA,QAE9C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,kBAAkB,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,cAAc,KAAK;AAAA,QACjD;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,gBAAgB,WAAW;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,oBAAoB,KACzC;AAAA,QAEJ;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,sBAAsB,WAAW;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,mBAAmB,KACxC;AAAA,QAEJ;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,qBAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,iBAAiB,KAAK;AAAA,QAE/C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,mBAAmB,WAAW;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,MAEA,YAAY;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO;AAAA,YACL,QAAQ,aAAa,kBAAkB,KACrC,2BAA2B,SAAS;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO;AAAA,YACL,QAAQ,aAAa,oBAAoB,KACvC,6BAA6B,SAAS;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,sBAAsB,WAAW;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO;AAAA,YACL,QAAQ,aAAa,qBAAqB,KACxC,8BAA8B,SAAS;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,uBAAuB,WAAW;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO;AAAA,YACL,QAAQ,aAAa,mBAAmB,KACtC,4BAA4B,SAAS;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,qBAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAG,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,+BAAgBA,iBAAgB;AAAA,QAC9B,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO,CAAC;AAAA,UACR,SAAS,CAAC;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,MACF,cAAc,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,YAAY;AAAA,MACvC,sBAAsB;AAAA,MACtB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AqCjTD,IAAAC,0BAAwB;AACxB,IAAAC,iBAAsC;AAItC,IAAM,8BAA8B;AAE7B,IAAM,iBAAiB,wBAAAC,QAAY,OAAO;AAAA,EAC/C,gBAAgB;AARlB;AASI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AAbhC,cAAAC,KAAA;AAcU,iBACE,QAAQ,aAAa,OAAO,OAC3B,OAAAA,MAAA,QAAQ,UAAR,gBAAAA,IAAe,YAAS,aAAQ,UAAR,mBAAe,gBAAvC,mBAAoD;AAAA,YACnD;AAAA,YACA;AAAA,gBAEF;AAAA,QAEJ;AAAA,QACA,YAAY,CAAC,EAAE,MAAM,OAAO,EAAE,MAAM;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA3BhC,cAAAA,KAAA;AA4BU,iBACE,QAAQ,aAAa,QAAQ,OAC5B,OAAAA,MAAA,QAAQ,UAAR,gBAAAA,IAAe,aAAU,aAAQ,UAAR,mBAAe,eAAxC,mBAAoD;AAAA,YACnD;AAAA,YACA;AAAA,gBAEF;AAAA,QAEJ;AAAA,QACA,YAAY,CAAC,EAAE,OAAO,OAAO,EAAE,OAAO;AAAA,MACxC;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,YAAY,CAAC,EAAE,UAAU,OAAO,EAAE,kBAAkB,UAAU;AAAA,QAC9D,WAAW,CAAC,YACV,QAAQ,aAAa,gBAAgB,KAAK;AAAA,MAC9C;AAAA,MAEA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,YAAY,CAAC,EAAE,aAAa,MAAM;AAChC,cAAI,CAAC,cAAc;AACjB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YAAY;AACtB,gBAAM,eAAe,QAAQ,aAAa,oBAAoB;AAC9D,iBAAO,eAAe,EAAE,aAAa,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB;AAAA,QACtB,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,gCAAgC,MAAM;AAAA,QAE/D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,wBAAwB;AACtC,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,kCAAkC;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,MAEA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,OAAO,QAAQ,aAAa,oBAAoB,CAAC;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,sBAAsB,WAAW;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,sBAAsB,MAAM;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,mBAAmB,KAAK;AAAA,QACtD;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,EAAC,yCAAY,cAAa;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,qBAAqB,yCAAY;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,MAEA,iBAAiB;AAAA,QACf,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,wBAAwB,MAAM;AAAA,QAC5D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,iBAAiB;AAC/B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,0BAA0B;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AACZ,eAAO,sCAAsB,WAAW;AAAA,MACtC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AC3KD,4BAAuB;AAUhB,IAAM,gBAAgB,sBAAAC,QAAW,OAAO;AAAA,EAC7C,gBAAgB;AAXlB;AAYI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,eAAe;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AAnBhB;AAoBI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAGL,kBACE,CAAC,kBACD,CAAC,EAAE,MAAM,MAAM;AACb,eAAO,MAAM,EAAE,QAAQ,QAAQ,EAAE,cAAc,CAAC,EAAE,IAAI;AAAA,MACxD;AAAA,IACJ;AAAA,EACF;AACF,CAAC;;;AC9BD,+BAA0B;AAGnB,IAAM,mBAAmB,yBAAAC,QAAc,OAAO;AAAA,EACnD,gBAAgB;AAJlB;AAKI,WAAO,mCACD,kCAAM,WAAN,kCAAoB,CAAC,IADpB;AAAA,MAEL,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC3BD,iCAA4B;AAGrB,IAAM,qBAAqB,2BAAAC,QAAgB,OAAO;AAAA,EACvD,gBAAgB;AAJlB;AAKI,WAAO,mCACD,kCAAM,WAAN,kCAAoB,CAAC,IADpB;AAAA,MAEL,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC3BD,IAAAC,gBAAsC;AACtC,IAAAC,iBAAsC;;;ACDtC,IAAAC,iBAAgE;AAChE,IAAAC,wBAAwB;AAYlB,IAAAC,uBAAA;AAVC,SAAS,WAAW,OAAsB;AAC/C,QAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,OAAO;AAAA,MAClB,oBAAkB,OAAO;AAAA,MACzB,WAAU;AAAA,MAEV;AAAA,sDAAC,kCAAgB,WAAU,eAAc;AAAA,QAEzC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,yBAAsB;AAAA,YACtB,WAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,SAAS,MAAM;AACb,qBAAO,SAAS,iBAAiB,OAAO,CAAC;AAAA,YAC3C;AAAA,YAEA;AAAA,4DAAC,iCAAQ,WAAU,sDAAqD;AAAA,cACxE,8CAAC,SAAI,WAAU,2DAA0D;AAAA;AAAA;AAAA,QAC3E;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADRO,IAAM,kBAAkB,mBAAK,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,MAAM,KAAK;AAAA,QACzC;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,MAAM;AACpB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,MAAM,WAAW;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,+BAAgBA,iBAAgB;AAAA,QAC9B,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO,CAAC;AAAA,UACR,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACF,cAAc,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,YAAY;AAAA,MACvC,sBAAsB;AAAA,MACtB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AxDrEM,IAAM,WAAW,wBAAU,OAAwB;AAAA,EACxD,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,gBAAgB;AAAA,UACd,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,OAAO;AAAA,QACT;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,UAAM,aAA6B;AAAA,MACjC,0BAAAC,QAAS,OAAO;AAAA,QACd,SAAS;AAAA,MACX,CAAC;AAAA,MACD,mBAAAC,QAAW,UAAU;AAAA,QACnB,MAAM;AAAA,UACJ,gBAAgB;AAAA,YACd,OACE;AAAA,UACJ;AAAA,QACF;AAAA,QACA,YAAY;AAAA,UACV,gBAAgB;AAAA,YACd,OACE;AAAA,UACJ;AAAA,QACF;AAAA,QACA,YAAY;AAAA,UACV,gBAAgB;AAAA,YACd,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX,gBAAgB;AAAA,YACd,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,2BAAAC;AAAA,MACA,MAAM,UAAU,EAAE,OAAO,CAAC,4BAAAC,QAAU,MAAM,2BAAAC,QAAS,IAAI,EAAE,CAAC;AAAA,MAC1D,4BAAAD,QAAU,UAAU;AAAA,MACpB,4BAAAE,QAAU,UAAU;AAAA,QAClB,OAAO,CAAC,4BAAAC,QAAU,MAAM,0BAAAC,QAAQ,MAAM,OAAO,IAAI;AAAA,MACnD,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA,uBAAAC;AAAA,MACA,4BAAAC,QAAW,UAAU;AAAA,QACnB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,MACD,iBAAiB,UAAU;AAAA,QACzB,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,QAChB,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD,mBAAmB,UAAU;AAAA,QAC3B,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,QAAQ,aAAa,OAAO;AACnC,iBAAW,KAAK,kBAAkB,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAAA,IACpE;AAEA,QAAI,KAAK,QAAQ,WAAW,OAAO;AACjC,iBAAW,KAAK,eAAe;AAAA,IACjC;AAEA,QAAI,KAAK,QAAQ,YAAY,OAAO;AAClC,iBAAW,KAAK,gBAAgB;AAAA,IAClC;AAEA,QAAI,KAAK,QAAQ,YAAY,OAAO;AAClC,iBAAW,KAAK,gBAAgB;AAAA,IAClC;AAEA,QAAI,KAAK,QAAQ,WAAW,OAAO;AACjC,iBAAW,KAAK,eAAe;AAAA,IACjC;AAEA,QAAI,KAAK,QAAQ,WAAW,OAAO;AACjC,iBAAW,KAAK,eAAe;AAAA,IACjC;AAEA,QAAI,KAAK,QAAQ,WAAW,OAAO;AACjC,iBAAW,KAAK,MAAM;AAAA,IACxB;AAEA,QAAI,KAAK,QAAQ,SAAS,OAAO;AAC/B,iBAAW,KAAK,aAAa;AAAA,IAC/B;AAEA,QAAI,KAAK,QAAQ,UAAU,OAAO;AAChC,iBAAW,KAAK,cAAc;AAAA,IAChC;AAEA,QAAI,KAAK,QAAQ,SAAS,OAAO;AAC/B,iBAAW,KAAK,cAAc,UAAU,KAAK,QAAQ,IAAI,CAAC;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT;AACF,CAAC;;;A0DlKD,mCAAwB;AAEjB,IAAM,uBAAuB,6BAAAC,QAAY,UAAU;AAAA,EACxD,aAAa,CAAC,EAAE,KAAK,MAAM;AACzB,QAAI,KAAK,KAAK,SAAS,WAAW;AAChC,aAAO,WAAW,KAAK,MAAM,KAAK;AAAA,IACpC,WAAW,KAAK,KAAK,SAAS,iBAAiB;AAC7C,aAAO;AAAA,IACT,WACE,CAAC,WAAW,UAAU,WAAW,UAAU,QAAQ,YAAY,EAAE;AAAA,MAC/D,KAAK,KAAK;AAAA,IACZ,GACA;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACnB,CAAC;;;ACnBD,IAAAC,gBAAkC;AAClC,IAAAC,qBAA8C;AAMvC,IAAM,wBAAwB,wBAAU,OAA4B;AAAA,EACzE,MAAM;AAAA,EACN,aAAa;AACX,WAAO;AAAA,MACL,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,QAAQ,OAAO,MAAM,MAAM;AACrC,gBAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,wBAAwB;AACtB,WAAO;AAAA,UACL,mBAAAC,SAAW;AAAA,QACT,QAAQ,KAAK;AAAA,SACV,KAAK,QAAQ,WACjB;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;ACxBD,IAAAC,iBAA8B;AAE9B,IAAAA,iBAWO;AACP,mBAAwD;;;ACfxD,IAAAC,wBAAiC;AAMjC,IAAAC,iBAAoE;AA+ChE,IAAAC,uBAAA;AA/BG,SAAS,iBAAiB,OAA8B;AAxB/D;AAyBE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,WACJ,eAAe,sBAAsB,iBAAiB;AAExD,QAAM,UAAU,GAAG,UAAU,IAAI,YAAY;AAC7C,QAAM,YAAY,mBAAmB;AAErC,QAAMC,gBAAe,QAAQ,cAAc;AAG3C,QAAM,oBACJ,CAAC,EAAC,6BAAM,aAAY,aAAc,YAAY,CAAC;AAEjD,QAAM,oBAAoB,OAAO,KAAK,WAAW;AACjD,QAAM,sBAAsB,qBAAoB,UAAK,WAAL,8BAAc,UAAU;AAExE,MAAI,QACF,gFACE;AAAA,kDAAC,SAAI,WAAU,6EACZ,eAAK,MACR;AAAA,IACA,+CAAC,SAAI,WAAU,YACb;AAAA,oDAAC,OAAE,WAAU,mBAAmB,eAAK,OAAM;AAAA,MAC3C,8CAAC,OAAE,WAAU,iCAAiC,eAAK,aAAY;AAAA,OACjE;AAAA,IAECA,iBACC,8CAAC,UAAK,WAAU,wCACd,wDAAC,0CAAiB,WAAU,iCAAgC,GAC9D;AAAA,KAEJ;AAGF,MAAI,wBAAwB,QAAQ,wBAAwB,MAAM;AAChE,YAAQ;AAAA,EACV;AAEA,QAAM,mBAAe,uBAAe,CAAC;AACrC,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,WAAO,aAAa,aAAa,OAAO;AACxC,UAAM,QAAQ;AACd,iBAAa,UAAU,OAAO,WAAW,MAAM;AAC7C,cAAQ,IAAI;AACZ,mBAAa,UAAU;AAAA,IACzB,GAAG,KAAK;AAAA,EACV,GAAG,CAAC,OAAO,CAAC;AAEZ,gCAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,wBAAkB;AAAA,IACpB,OAAO;AACL,aAAO,aAAa,aAAa,OAAO;AACxC,mBAAa,UAAU;AACvB,cAAQ,KAAK;AAAA,IACf;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAEtB,gCAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,aAAa,SAAS;AACxB,eAAO,aAAa,aAAa,OAAO;AACxC,qBAAa,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,+CAAC,WAAQ,MACP;AAAA,kDAAC,kBAAe,SAAO,MACrB;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,WACI,sCACA;AAAA,QACN;AAAA,QACA,SAAS,MAAM,WAAW,YAAY,YAAY;AAAA,QAClD,cAAc,MAAM,QAAQ,IAAI;AAAA,QAChC,cAAc,MAAM,QAAQ,KAAK;AAAA,QACjC,MAAK;AAAA,QACL,KAAK,WAAW,mBAAmB;AAAA,QAElC;AAAA;AAAA,IACH,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,WAAU;AAAA,QAET,iBAAO,KAAK,YAAY,aACvB,6BAAM,QAAQ,UAEd,gFACE;AAAA,wDAAC,YAAO,WAAU,8GAChB;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,6BAAM;AAAA,cACX,KAAK,6BAAM;AAAA,cACX,WAAU;AAAA;AAAA,UACZ,GACF;AAAA,UACA,8CAAC,OAAE,WAAU,yCACV,eAAK,aACR;AAAA,WACF;AAAA;AAAA,IAEJ;AAAA,OAvCwB,GAAG,UAAU,IAAI,YAAY,EAwCvD;AAEJ;;;AC3IO,SAAS,oBAAoB,SAAoC;AACtE,QAAM,EAAE,QAAQ,OAAO,OAAO,IAAI;AAClC,QAAM,YAAY,CAAC,GAAG,MAAM;AAC5B,MAAI,cAAc,+BAAO;AAEzB,QAAM,kBAAkB,YAAY,MAAM,YAAY;AAItD,MAAI,iBAAiB;AACnB,UAAM,CAAC,OAAO,YAAY,IAAI;AAC9B,UAAM,kBAAkB,oBAAoB,QAAQ,YAAY;AAEhE,QAAI,iBAAiB;AAEnB,YAAM,kBAAkB,YAAY,MAAM,MAAM,MAAM;AACtD,YAAM,mBAAmB,gBAAgB,SAAS;AAAA,QAChD,CAAC,SAAS,CAAC,mBAAmB,eAAe,MAAM,eAAe;AAAA,MACpE;AAEA,aAAO,iBAAiB,SACpB;AAAA,QACE,iCACK,kBADL;AAAA,UAEE,UAAU;AAAA,QACZ;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAEA,QAAM,iBAAiB,UACpB,IAAI,CAAC,UAAU;AACd,WAAO,iCACF,QADE;AAAA,MAEL,UAAU,MAAM,SAAS;AAAA,QAAQ,CAAC,SAChC,eAAe,EAAE,MAAM,QAAQ,aAAa,OAAO,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS,CAAC;AAE9C,SAAO;AACT;AAOA,SAAS,oBACP,QACA,cAC6B;AAC7B,SAAO,OACJ,QAAQ,CAAC,UAAU,MAAM,QAAQ,EACjC;AAAA,IACC,CAAC,SAAM;AAlEb;AAmEQ,2BAAc,UACd,UAAK,OAAL,mBAAS,mBAAkB,aAAa,YAAY;AAAA;AAAA,EACxD;AACJ;AAEA,SAAS,aAAaC,OAA0B,QAAyB;AACvE,MAAI,CAACA,OAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAOA,MAAK,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC;AACzD;AAEA,SAAS,eAAe,MAAiB,QAAyB;AAhFlE;AAiFE,SACE,aAAa,KAAK,OAAO,MAAM,KAC/B,aAAa,KAAK,aAAa,MAAM,OACpC,gBAAK,gBAAL,mBAAkB,KAAK,CAAC,SAAS,aAAa,MAAM,MAAM,OAA1D,YAAgE;AAErE;AAEA,SAAS,aAAa,MAA0C;AAC9D,SAAO,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAK;AACtE;AAQA,SAAS,eAAe,SAA6C;AAlGrE;AAmGE,QAAM,EAAE,MAAM,QAAQ,OAAO,IAAI;AAEjC,QAAM,QAAO,kCAAM,WAAN,8BAAe;AAC5B,MAAI,SAAS,MAAM;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAc,OAAO,SAAS;AACpC,MAAI,aAAa,IAAI,GAAG;AAKtB,UAAM,mBAA8B,iCAC/B,OAD+B;AAAA,MAElC,SAAS,CAACC,aAAY;AACpB,cAAM,EAAE,QAAAC,SAAQ,MAAM,IAAID;AAC1B,QAAAC,QAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,OAAO,IAAI,KAAK,EAAE,GAAG,EAAE,IAAI;AAAA,MACpE;AAAA,IACF;AAGA,UAAM,UAAU,eAAe,kBAAkB,MAAM;AACvD,QAAI,SAAS;AACX,aAAO,CAAC,gBAAgB;AAAA,IAC1B;AAKA,UAAM,uBACJ,gEAAkB,aAAlB,mBAA4B;AAAA,MAAK,CAAC,YAChC,eAAe,SAAS,MAAM;AAAA,UADhC,YAEK;AAEP,QAAI,CAAC,qBAAqB;AACxB,aAAO,CAAC;AAAA,IACV;AAEA,YAAO,0DAAkB,aAAlB,YAA8B,CAAC;AAAA,EACxC;AAEA,SAAO,CAAC,eAAe,eAAe,MAAM,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC;AAClE;;;AFyDY,IAAAC,uBAAA;AAxKZ,IAAM,kBAAc,2BAAsC,CAAC,OAAO,QAAQ;AACxE,QAAM,EAAE,OAAO,QAAQ,SAAS,QAAQ,OAAO,MAAM,IAAI;AAEzD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,yBAAS,CAAC;AAC9D,QAAM,CAAC,sBAAsB,uBAAuB,QAAI,yBAAS,CAAC;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAwB,IAAI;AAExE,QAAM,gBAAY,uBAAO,EAAE;AAC3B,QAAM,6BAAyB,uBAAO,CAAC;AACvC,QAAM,+BAA2B,uBAAO,CAAC;AAEzC,QAAM,iBAAa;AAAA,IACjB,CAAC,YAAoB,iBAAyB;AAC5C,YAAM,OAAO,OAAO,UAAU,EAAE,SAAS,YAAY;AACrD,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,IACd;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,0CAAoB,KAAK,OAAO;AAAA,IAC9B,WAAW,CAAC,EAAE,MAAM,MAAgC;AAvDxD;AAwDM,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,eAAe,SAAS,MAAM,GAAG,GAAG;AACtC,YAAI,kBAAkB;AACtB,YAAI,gBAAgB;AAEpB,gBAAQ,MAAM,KAAK;AAAA,UACjB,KAAK;AACH,kBAAM,eAAe;AAErB,kBAAM,QAAQ,iCAAS;AACvB,kBAAM,qBAAqB,SAAS,QAAQ;AAC5C,gBAAI,CAAC,oBAAoB;AACvB,qBAAO;AAAA,YACT;AAEA,mBACG,MAAM,EACN,MAAM,EACN,gBAAgB,OAAO,IAAI,UAAU,OAAO,EAAE,EAC9C,IAAI;AACP,uBAAW,MAAM;AACf,oCAAsB,uBAAuB,OAAO;AACpD,sCAAwB,yBAAyB,OAAO;AAAA,YAC1D,GAAG,CAAC;AACJ,mBAAO;AAAA,UACT,KAAK;AACH,kBAAM,eAAe;AAErB,kBAAMC,YACJ,4CAAS,wBAAT,mBAA8B,aAA9B,mBAAyC;AAC3C,kBAAM,wBAAwBA,YAAW,cAAcA;AACvD,gBAAI,CAAC,uBAAuB;AAC1B,qBAAO;AAAA,YACT;AAEA,uBAAW,oBAAoB,oBAAoB;AACnD,sBAAU,UAAU;AACpB,mCAAuB,UAAU;AACjC,qCAAyB,UAAU;AACnC,mBAAO;AAAA,UACT,KAAK;AACH,gBAAI,CAAC,OAAO,QAAQ;AAClB,qBAAO;AAAA,YACT;AACA,uBAAW,oBAAoB,oBAAoB;AAEnD,sBAAU,UAAU;AACpB,mCAAuB,UAAU;AACjC,qCAAyB,UAAU;AACnC,mBAAO;AAAA,UACT,KAAK;AACH,gBAAI,CAAC,OAAO,QAAQ;AAClB,qBAAO;AAAA,YACT;AACA,8BAAkB,uBAAuB;AACzC,4BAAgB;AAChB,gBAAI,kBAAkB,GAAG;AACvB,8BAAgB,qBAAqB;AACrC,kCAAkB,YAAO,aAAa,MAApB,mBAAuB,SAAS,UAAS,KAAK;AAAA,YAClE;AACA,gBAAI,gBAAgB,GAAG;AACrB,8BAAgB,OAAO,SAAS;AAChC,kCAAkB,YAAO,aAAa,MAApB,mBAAuB,SAAS,UAAS,KAAK;AAAA,YAClE;AACA,kCAAsB,aAAa;AACnC,oCAAwB,eAAe;AACvC,mBAAO;AAAA,UACT,KAAK;AACH,gBAAI,CAAC,OAAO,QAAQ;AAClB,qBAAO;AAAA,YACT;AACA,kBAAM,WAAW,OAAO,kBAAkB,EAAE;AAC5C,8BAAkB,uBAAuB;AACzC,4BAAgB;AAChB,gBAAI,SAAS,SAAS,IAAI,iBAAiB;AACzC,gCAAkB;AAClB,8BAAgB,qBAAqB;AAAA,YACvC;AACA,gBAAI,OAAO,SAAS,IAAI,eAAe;AACrC,8BAAgB;AAAA,YAClB;AACA,kCAAsB,aAAa;AACnC,oCAAwB,eAAe;AACvC,mBAAO;AAAA,UACT;AACE,mBAAO;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,EAAE;AAEF,QAAM,2BAAuB,uBAAuB,IAAI;AACxD,QAAM,uBAAmB,uBAAiC,IAAI;AAE9D,sCAAgB,MAAM;AACpB,UAAM,YAAY,6DAAsB;AACxC,UAAM,yBAAyB,qDAAkB;AACjD,QAAI,CAAC,aAAa,CAAC,wBAAwB;AACzC;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,aAAa,IAAI;AACpC,cAAU,MAAM,aAAa;AAC7B,cAAU,YAAY,YAAY;AAAA,EACpC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,gCAAU,MAAM;AACd,0BAAsB,CAAC;AACvB,4BAAwB,CAAC;AAAA,EAC3B,GAAG,CAAC,MAAM,CAAC;AAEX,gCAAU,MAAM;AACd,WAAO,MAAM;AACX,gBAAU,UAAU;AACpB,6BAAuB,UAAU;AACjC,+BAAyB,UAAU;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SACE,8CAAC,mBACC,yDAAC,SAAI,WAAU,qIACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,KAAK;AAAA,QACL,WAAU;AAAA,QAET,iBAAO,IAAI,CAAC,OAAO,eAClB,+CAAC,2BACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aAAa,IAAI,iBAAiB;AAAA,cACpC;AAAA,cAEC,gBAAM;AAAA;AAAA,UACT;AAAA,UACA,8CAAC,SAAI,WAAU,2BACZ,gBAAM,SAAS,IAAI,CAAC,MAAM,iBAAiB;AAC1C,kBAAM,UAAU,GAAG,UAAU,IAAI,YAAY;AAC7C,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,YAAY,MAAM,WAAW,YAAY,YAAY;AAAA,gBACrD;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,SAAS,CAAC,cACR,kBAAkB,YAAY,UAAU,IAAI;AAAA;AAAA,cAXzC;AAAA,YAaP;AAAA,UAEJ,CAAC,GACH;AAAA,aA9Ba,UA+Bf,CACD;AAAA;AAAA,IACH;AAAA,IACA,8CAAC,SAAI,WAAU,+DACb,yDAAC,SAAI,WAAU,6BACb;AAAA,qDAAC,OAAE,WAAU,iDACX;AAAA,sDAAC,SAAI,WAAU,+EAA8E,oBAE7F;AAAA,QACA,8CAAC,SAAI,WAAU,wFAAuF,oBAEtG;AAAA,QAAO;AAAA,QAAI;AAAA,SAEb;AAAA,MACA,8CAAC,UAAK,eAAY,QAAO,WAAU,4BAA2B,kBAE9D;AAAA,MACA,+CAAC,OAAE,WAAU,iDACX;AAAA,sDAAC,SAAI,WAAU,iFAAgF,mBAE/F;AAAA,QAAO;AAAA,QAAI;AAAA,SAEb;AAAA,OACF,GACF;AAAA,KACF,GACF;AAEJ,CAAC;AAEM,SAAS,2BACd,SAA2B,wBACQ;AACnC,SAAO;AAAA,IACL,OAAO,CAAC,EAAE,OAAO,OAAO,MAAM;AAC5B,aAAO,oBAAoB,EAAE,OAAO,QAAQ,OAAO,CAAC;AAAA,IACtD;AAAA,IACA,OAAO,CAAC,EAAE,OAAO,MAAM;AACrB,YAAM,wBAAwB,OAAO,SAAS,eAAe;AAC7D,UAAI,uBAAuB;AACzB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,MAAM;AACZ,UAAI;AACJ,UAAI,QAAgC;AAEpC,aAAO;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,sBAAY,IAAI,6BAAc,aAAa;AAAA,YACzC;AAAA,YACA,QAAQ,MAAM;AAAA,UAChB,CAAC;AAED,sBAAQ,aAAAC,SAAM,QAAQ;AAAA,YACpB,wBAAwB,MAAM;AAAA,YAC9B,UAAU,MAAM,SAAS;AAAA,YACzB,SAAS,UAAU;AAAA,YACnB,cAAc;AAAA,YACd,aAAa;AAAA,YACb,SAAS;AAAA,YACT,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,QACA,UAAU,CAAC,UAAU;AAxS7B;AAySU,gBAAM,eAAe,+BAAQ;AAC7B,cAAI,CAAC,kBAAgB,kDAAc,UAAd,mBAAqB,cAAa;AACrD;AAAA,UACF;AAEA,iDAAW,YAAY;AACvB,uBAAa,SAAS;AAAA,YACpB,wBAAwB,MAAM;AAAA,UAChC,CAAC;AAAA,QACH;AAAA,QACA,WAAW,CAAC,UAAU;AAnT9B;AAoTU,cAAI,MAAM,MAAM,QAAQ,UAAU;AAChC,kBAAM,eAAe,+BAAQ;AAC7B,gBAAI,GAAC,kDAAc,UAAd,mBAAqB,cAAa;AACrC,2DAAc;AAAA,YAChB;AAEA,mDAAW;AACX,mBAAO;AAAA,UACT;AAEA,kBAAO,4CAAW,QAAX,mBAAgB,UAAU;AAAA,QACnC;AAAA,QACA,QAAQ,MAAM;AACZ,cAAI,CAAC,SAAS,EAAC,+BAAQ,OAAM,CAAC,WAAW;AACvC;AAAA,UACF;AAEA,gBAAM,eAAe,+BAAQ;AAC7B,cAAI,CAAC,aAAa,MAAM,aAAa;AACnC,yBAAa,QAAQ;AAAA,UACvB;AAEA,iDAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AG1UA,IAAAC,iBAA8B;AAE9B,IAAAA,iBAAwD;AACxD,IAAAC,gBAA8C;AAgD1C,IAAAC,uBAAA;AApCG,IAAM,mBAAe,2BAAW,CAAC,OAA0B,QAAQ;AApB1E;AAqBE,QAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,IAAI;AAE/B,QAAM,iBAAa,uBAAsC,IAAI;AAC7D,QAAM,sCACJ,wBAAmB,MAAM,MAAzB,mBAA4B;AAE9B,0CAAoB,KAAK,OAAO;AAAA,IAC9B,WAAW,CAAC,EAAE,MAAM,MAAgC;AAClD,UAAI,CAAC,WAAW,SAAS;AACvB,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,QAAQ,UAAU,OAAO,IAAI,WAAW,WAAW,CAAC;AAC5D,UAAI,MAAM,QAAQ,WAAW;AAC3B,cAAM,eAAe;AACrB,eAAO;AACP,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,aAAa;AAC7B,cAAM,eAAe;AACrB,iBAAS;AACT,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,SAAS;AACzB,eAAO;AACP,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,EACF,EAAE;AAEF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,CAAC,UAAU;AA1D/B,YAAAC;AA2DQ,cAAM,QAAQ;AAAA,UACZ,IAAI,MAAM;AAAA,UACV,WAAUA,MAAA,MAAM,aAAN,OAAAA,MAAkB;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,KAAK;AAAA;AAAA,EACP;AAEJ,CAAC;AAED,aAAa,cAAc;AAEpB,SAAS,uBACd,OAAe,+BACoB;AACnC,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,EAAE,OAAO,OAAO,MAAM;AA5ElC;AA6EM,YAAM,aAAY,wBAAmB,MAAM,MAAzB,mBAA4B;AAE9C,aAAO,iBAAiB,WAAW;AAAA,QACjC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IAEA,QAAQ,MAAM;AACZ,UAAI;AACJ,UAAI,QAAkC;AAEtC,aAAO;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,sBAAY,IAAI,6BAAc,cAAc;AAAA,YAC1C;AAAA,YACA,QAAQ,MAAM;AAAA,UAChB,CAAC;AAED,cAAI,CAAC,MAAM,YAAY;AACrB;AAAA,UACF;AAEA,sBAAQ,cAAAC,SAAM,QAAQ;AAAA,YACpB,wBAAwB,MAAM;AAAA,YAC9B,UAAU,MAAM,SAAS;AAAA,YACzB,SAAS,UAAU;AAAA,YACnB,cAAc;AAAA,YACd,aAAa;AAAA,YACb,SAAS;AAAA,YACT,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,QAEA,SAAS,OAAO;AAhHxB;AAiHU,oBAAU,YAAY,KAAK;AAE3B,cAAI,CAAC,MAAM,YAAY;AACrB;AAAA,UACF;AAEA,+CAAQ,OAAR,mBAAY,SAAS;AAAA,YACnB,wBAAwB,MAAM;AAAA,UAChC;AAAA,QACF;AAAA,QAEA,UAAU,OAAO;AA5HzB;AA6HU,cAAI,MAAM,MAAM,QAAQ,UAAU;AAChC,2CAAQ,GAAG;AACX,mBAAO;AAAA,UACT;AAEA,kBAAO,eAAU,QAAV,mBAAe,UAAU;AAAA,QAClC;AAAA,QAEA,SAAS;AACP,cAAI,CAAC,SAAS,EAAC,+BAAQ,OAAM,CAAC,WAAW;AACvC;AAAA,UACF;AAEA,yCAAQ,GAAG;AACX,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC/IA,2CAA8B;AAC9B,IAAAC,gBAA8B;AAC9B,IAAAC,iBAKO;AACP,iBAAiB;AACjB,sBAAuC;;;ACRvC,IAAAC,iBAAiD;AACjD,IAAAA,iBAAwB;AAwCpB,IAAAC,uBAAA;AArCG,SAAS,kBAAkB,OAAsB;AACtD,QAAM,EAAE,MAAM,kBAAAC,kBAAiB,IAAI;AAEnC,MAAI,EAAE,UAAU,YAAY,OAAO,IAAI,KAAK;AAC5C,4BAAc;AAEd,QAAM,gBAAgB,WAAW,YAAY,QAAQ,KAAK;AAE1D,QAAMC,YAAO,wBAAQ,MAAM;AACzB,UAAMC,QAAO,KAAK,QAAQ,QAAQ,OAAO,CAAC,KAAK,QAAQ;AACrD,UAAI,IAAI,KAAK,SAAS,QAAQ;AAC5B,eAAO,MAAM,IAAI;AAAA,MACnB,WAAW,IAAI,KAAK,SAAS,YAAY;AACvC,cAAM,EAAE,IAAI,UAAU,SAAS,KAAI,2BAAK,UAAS,CAAC;AAClD,cAAM,oBAAoB,WACtB,KAAK,QAAQ,aAAa,QAAQ,OAClC,KAAK,QAAQ;AACjB,eAAO,MAAM;AAAA,MACf;AAEA,aAAO;AAAA,IACT,GAAG,EAAE;AAEL,UAAM,aAAa,IAAI,UAAU;AACjC,UAAM,UAAU,WAAW,gBAAgBA,OAAM,WAAW;AAC5D,UAAM,QAAQ,QAAQ,iBAAiB,OAAO;AAC9C,UAAM,OAAO,QAAQ;AACrB,UAAM,gBAAgB,MAAM,KAAK,KAAK,EACnC,IAAI,CAAC,MAAM,EAAE,SAAS,EACtB,KAAK,IAAI;AAEZ,WAAO,UAAU,aAAa,WAAW,KAAK,SAAS;AAAA,EACzD,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,UAAUD,UAAS;AAEzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,oBAAkB;AAAA,MAClB,aAAU;AAAA,MAET;AAAA,sBAAc,UACb,8CAAC,SAAI,WAAU,8FACb;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAW,GAAG,eAAe,aAAa;AAAA;AAAA,QAC5C,GACF;AAAA,QAGD,cAAc,aACb;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,WAAW;AAAA,YACb;AAAA,YACA,KAAK,CAACE,UAAS;AACb,kBAAI,CAACA,UAAQA,SAAA,gBAAAA,MAAM,aAAY;AAC7B;AAAA,cACF;AACA,oBAAM,SAASA,MAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACjD,oBAAM,QAAQ,IAAI,cAAc;AAChC,oBAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMjB;AACD,qBAAO,qBAAqB,CAAC,KAAK;AAClC,oBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,wBAAU,YAAYF;AACtB,qBAAO,YAAY,SAAS;AAAA,YAC9B;AAAA,YACA,iBAAiB;AAAA,YACjB,SAAS,MAAM;AACb,kBAAI,CAAC,SAAS;AACZ;AAAA,cACF;AAEA,cAAAD,kBAAiB;AAAA,gBACf,WAAW;AAAA,cACb,CAAC;AAAA,YACH;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ADjFA,IAAM,eAAW,gCAAe,sBAAM;AACtC,SAAS,SAAS,QAAQ,WAAAI,OAAI;AA8BvB,IAAM,yBAAyB,qCAAAC,QAAkB,OAAO;AAAA,EAC7D,MAAM;AAAA,EACN,SAAS;AAAA,EAET,gBAAgB;AAjDlB;AAkDI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,WAAW;AAAA,MACX,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,mBAAmB;AAAA,MAC9C,WAAW;AAAA,MACX,OAAO,CAAC,EAAE,KAAK,MAAG;AA7ExB;AA6E4B;AAAA,UACpB,qBAAmB,kCAAM,UAAN,mBAAa,cAAa;AAAA,QAC/C;AAAA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,kBACE,CAAC,eACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,QAAQ,KAAK,MAAM,UAAU;AAAA,MAC/C;AAAA,MACF,qBACE,CAAC,eACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,WAAW,KAAK,MAAM,aAAa,UAAU;AAAA,MAC/D;AAAA,MACF,qBAAqB,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,uBAAuB;AAnGzB;AAoGI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,SAAS,CAAC,EAAE,OAAO,MAAM;AACvB,cAAM,EAAE,UAAU,IAAI,OAAO;AAC7B,cAAM,OAAO,UAAU;AAIvB,cAAM,OAAO,KAAK,KAAK,KAAK,KAAK;AACjC,YAAI,KAAK,KAAK,SAAS,KAAK,MAAM;AAChC,iBAAO;AAAA,QACT;AAMA,YAAI,QAAQ,KAAK;AACjB,iBAAS,IAAI,OAAO,IAAI,GAAG,KAAK;AAC9B,cAAI,KAAK,KAAK,CAAC,EAAE,KAAK,SAAS,KAAK,MAAM;AACxC,oBAAQ;AACR;AAAA,UACF;AAAA,QACF;AAIA,cAAM,QAAQ,KAAK,OAAO,KAAK,IAAI;AACnC,cAAM,MAAM,KAAK,MAAM,KAAK,IAAI;AAEhC,cAAM,OAAO,OAAO,MAAM,IAAI,QAAQ,KAAK;AAC3C,cAAM,KAAK,OAAO,MAAM,IAAI,QAAQ,GAAG;AACvC,YAAI,QAAQ,IAAI;AACd,gBAAM,cAAc,OAAO,MAAM,GAAG;AAAA,YAClC,4BAAc,QAAQ,MAAM,EAAE;AAAA,UAChC;AACA,iBAAO,KAAK,SAAS,WAAW;AAChC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF,CAAC,EAAE,UAAU;AAAA,EACX;AACF,CAAC;","names":["TiptapColor","TipTapHorizontalRule","pos","import_core","import_core","import_extension_paragraph","import_extension_heading","import_core","HTMLAttributes","import_core","import_core","HTMLAttributes","HTMLAttributes","import_core","import_react","import_react","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","image","HTMLAttributes","import_state","import_uuid","import_core","import_core","uuidv4","HTMLAttributes","import_core","import_uuid","uuidv4","HTMLAttributes","import_core","import_react","import_lucide_react","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react","import_react","import_jsx_runtime","updateAttributes","event","_a","import_jsx_runtime","updateAttributes","TiptapImage","import_jsx_runtime","import_lucide_react","import_react","import_react","import_react","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","color","import_jsx_runtime","import_lucide_react","import_react","import_react","import_lucide_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_state","import_lucide_react","import_jsx_runtime","editor","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_core","import_state","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","updateAttributes","HTMLAttributes","Suggestion","import_jsx_runtime","_a","isVariable","import_react","import_lucide_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","_a","value","isVariable","import_jsx_runtime","updateAttributes","text","alignment","HTMLAttributes","import_extension_image","import_react","TiptapImage","_a","TiptapLink","TiptapHeading","TiptapParagraph","import_core","import_react","import_react","import_lucide_react","import_jsx_runtime","HTMLAttributes","Document","StarterKit","Underline","TextStyle","ListItem","TextAlign","Paragraph","Heading","Focus","Dropcursor","Placeholder","import_core","import_suggestion","Suggestion","import_react","import_lucide_react","import_react","import_jsx_runtime","isSubCommand","text","options","editor","import_jsx_runtime","command","tippy","import_react","import_tippy","import_jsx_runtime","_a","tippy","import_state","import_react","import_react","import_jsx_runtime","updateAttributes","html","text","node","html","CodeBlockLowlight"]}
1
+ {"version":3,"sources":["../../src/extensions.ts","../../src/editor/extensions/color.ts","../../src/editor/extensions/horizontal-rule.tsx","../../src/editor/plugins/image-upload/image-upload-plugin.ts","../../src/editor/extensions/image-upload/image-upload.ts","../../src/editor/extensions/maily-kit.tsx","../../src/editor/nodes/footer.ts","../../src/editor/nodes/spacer.ts","../../src/editor/utils/update-attribute.ts","../../src/editor/nodes/section/section.ts","../../src/editor/extensions/link-card.ts","../../src/editor/nodes/link-card.tsx","../../src/editor/components/input.tsx","../../src/editor/utils/classname.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/class-group-utils.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/lru-cache.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/parse-class-name.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/sort-modifiers.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/config-utils.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/merge-classlist.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/tw-join.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/from-theme.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/validators.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/default-config.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/merge-configs.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../../../../node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/src/lib/tw-merge.ts","../../src/editor/utils/constants.ts","../../src/editor/components/popover.tsx","../../src/editor/components/textarea.tsx","../../src/editor/utils/columns.ts","../../src/editor/nodes/columns/column.ts","../../src/editor/nodes/columns/columns.ts","../../src/editor/nodes/button/button.tsx","../../src/editor/components/alignment-switch.tsx","../../src/editor/components/base-button.tsx","../../src/editor/components/ui/tooltip.tsx","../../src/editor/components/bubble-menu-button.tsx","../../src/editor/nodes/logo/logo.ts","../../src/editor/nodes/logo/logo-view.tsx","../../src/editor/nodes/image/image-view.tsx","../../src/editor/utils/use-event.ts","../../src/editor/utils/aspect-ratio.ts","../../src/editor/components/ui/color-picker.tsx","../../src/editor/components/ui/divider.tsx","../../src/editor/components/ui/link-input-popover.tsx","../../src/editor/provider.tsx","../../src/editor/extensions/slash-command/default-slash-commands.tsx","../../src/blocks/button.tsx","../../src/blocks/code.tsx","../../src/blocks/image.tsx","../../src/blocks/layout.tsx","../../src/blocks/list.tsx","../../src/blocks/typography.tsx","../../src/editor/components/icons/logo-with-cover-image.tsx","../../src/editor/components/icons/logo-with-text-horizon.tsx","../../src/editor/components/icons/logo-with-text-vertical.tsx","../../src/blocks/headers.tsx","../../src/blocks/footers.tsx","../../src/editor/utils/node-options.ts","../../src/editor/utils/use-outside-click.ts","../../src/editor/components/ui/input-autocomplete.tsx","../../src/editor/utils/variable.ts","../../src/editor/nodes/variable/variable.ts","../../src/editor/nodes/variable/variable-suggestions-popover.tsx","../../src/editor/nodes/variable/variable-view.tsx","../../src/editor/components/ui/select.tsx","../../src/editor/nodes/button/button-view.tsx","../../src/editor/nodes/button/button-label-input.tsx","../../src/editor/nodes/image/image.ts","../../src/editor/nodes/link.ts","../../src/editor/nodes/heading/heading.ts","../../src/editor/nodes/paragraph/paragraph.ts","../../src/editor/nodes/repeat/repeat.ts","../../src/editor/nodes/repeat/repeat-view.tsx","../../src/editor/extensions/placeholder.ts","../../src/editor/extensions/slash-command/slash-command.ts","../../src/editor/extensions/slash-command/slash-command-view.tsx","../../src/editor/extensions/slash-command/slash-command-item.tsx","../../src/editor/extensions/slash-command/slash-command-search.tsx","../../src/editor/nodes/variable/variable-suggestions.tsx","../../src/editor/nodes/html/html.tsx","../../src/editor/nodes/html/html-view.tsx"],"sourcesContent":["export * from './editor/extensions/color';\nexport * from './editor/extensions/horizontal-rule';\nexport * from './editor/extensions/image-upload/image-upload';\nexport * from './editor/plugins/image-upload/image-upload-plugin';\nexport * from './editor/extensions/maily-kit';\nexport * from './editor/extensions/placeholder';\nexport * from './editor/extensions/slash-command/slash-command';\nexport * from './editor/extensions/slash-command/slash-command-view';\nexport * from './editor/nodes/button/button';\nexport * from './editor/nodes/columns/column';\nexport * from './editor/nodes/columns/columns';\nexport * from './editor/nodes/footer';\nexport * from './editor/nodes/image/image';\nexport * from './editor/nodes/link';\nexport * from './editor/nodes/logo/logo';\nexport * from './editor/nodes/repeat/repeat';\nexport * from './editor/nodes/section/section';\nexport * from './editor/nodes/spacer';\nexport * from './editor/nodes/variable/variable';\nexport * from './editor/nodes/variable/variable-suggestions';\nexport * from './editor/nodes/html/html';\n","import TiptapColor, { ColorOptions } from '@tiptap/extension-color';\n\ntype ColorStorage = {\n /**\n * Last 5 used colors\n */\n colors: Set<string>;\n};\n\nexport const Color = TiptapColor.extend<ColorOptions, ColorStorage>({\n addStorage() {\n return {\n colors: new Set(),\n };\n },\n});\n","import { InputRule } from '@tiptap/core';\nimport { HorizontalRule as TipTapHorizontalRule } from '@tiptap/extension-horizontal-rule';\n\nexport const HorizontalRule = TipTapHorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({ state, range }) => {\n const attributes = {};\n\n const { tr } = state;\n const start = range.from;\n const end = range.to;\n\n tr.insert(start - 1, this.type.create(attributes)).delete(\n tr.mapping.map(start),\n tr.mapping.map(end)\n );\n },\n }),\n ];\n },\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'mly:relative',\n },\n };\n },\n});\n","import { Editor } from '@tiptap/core';\nimport { Node } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\n\nexport type ImageUploadPluginOptions = {\n editor: Editor;\n /**\n * Allows you to define a list of allowed mime types for dropped or pasted images.\n * @default ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml']\n */\n allowedMimeTypes?: string[];\n\n /**\n * The onImageUpload callback that is called when an image is dropped or pasted.\n * @param file the image file\n * @returns Returns the image URL as a string.\n */\n onImageUpload?: (file: Blob) => Promise<string>;\n};\n\nexport function ImageUploadPlugin(options: ImageUploadPluginOptions) {\n const { editor, onImageUpload, allowedMimeTypes } = options;\n\n function handleImageUpload(view: EditorView, file: File, pos?: number) {\n const placeholderSrc = URL.createObjectURL(file);\n\n const { tr, schema } = view.state;\n const imageNode = schema.nodes.image.create({\n src: placeholderSrc,\n isSrcVariable: false,\n alt: file.name,\n externalLink: '',\n isExternalLinkVariable: false,\n });\n editor?.extensionStorage?.imageUpload?.placeholderImages?.add(\n placeholderSrc\n );\n\n const resolvedPos =\n pos !== undefined\n ? view.state.doc.resolve(pos)\n : view.state.selection.$head;\n\n const transaction = tr.insert(resolvedPos.pos, imageNode);\n view.dispatch(transaction);\n\n onImageUpload?.(file)\n .then((uploadedSrc) => {\n const updateTr = view.state.tr;\n\n // Find the placeholder image node\n const predicate = (node: Node) =>\n node.type.name === 'image' && node.attrs.src === placeholderSrc;\n\n view.state.doc.descendants((node, pos) => {\n if (predicate(node)) {\n updateTr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n src: uploadedSrc,\n });\n return false;\n }\n });\n\n view.dispatch(updateTr);\n })\n .catch((error) => {\n console.error('Image upload failed', error);\n })\n .finally(() => {\n editor.extensionStorage.imageUpload.placeholderImages.delete(\n placeholderSrc\n );\n URL.revokeObjectURL(placeholderSrc);\n });\n }\n\n return new Plugin({\n key: new PluginKey('imageUpload'),\n props: {\n handleDrop: (view, event) => {\n if (\n !onImageUpload ||\n // we'll handle drops in the ImageView component\n // this is just for dropping images in empty areas\n !event.dataTransfer?.files?.length\n ) {\n return false;\n }\n\n const images = Array.from(event.dataTransfer.files).filter((file) =>\n allowedMimeTypes?.includes(file.type)\n );\n if (images.length === 0) {\n return false;\n }\n\n const pos = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n if (!pos) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n images.forEach((file) => handleImageUpload(view, file, pos.pos));\n return true;\n },\n handlePaste: (view, event) => {\n if (!onImageUpload || !event.clipboardData?.files?.length) {\n return false;\n }\n\n const images = Array.from(event.clipboardData.files).filter((file) =>\n allowedMimeTypes?.includes(file.type)\n );\n if (images.length === 0) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n images.forEach((file) => handleImageUpload(view, file));\n return true;\n },\n },\n });\n}\n","import {\n ImageUploadPlugin,\n ImageUploadPluginOptions,\n} from '@/editor/plugins/image-upload/image-upload-plugin';\nimport { Editor, Extension } from '@tiptap/core';\nimport { useMemo } from 'react';\n\nexport type ImageUploadOptions = Omit<ImageUploadPluginOptions, 'editor'> & {};\nexport type ImageUploadStorage = {\n placeholderImages: Set<string>;\n};\n\nexport const ImageUploadExtension = Extension.create<ImageUploadOptions>({\n name: 'imageUpload',\n\n addOptions() {\n return {\n allowedMimeTypes: [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n ],\n onImageUpload: undefined,\n };\n },\n\n addStorage() {\n return {\n placeholderImages: new Set(),\n };\n },\n\n addProseMirrorPlugins() {\n const { onImageUpload } = this.options;\n\n if (!onImageUpload) {\n return [];\n }\n\n return [\n ImageUploadPlugin({\n editor: this.editor,\n allowedMimeTypes: this.options.allowedMimeTypes,\n onImageUpload: this.options.onImageUpload,\n }),\n ];\n },\n});\n\nexport function useImageUploadOptions(editor: Editor): ImageUploadOptions {\n return useMemo(() => {\n const node = editor.extensionManager.extensions.find(\n (extension) => extension.name === 'imageUpload'\n );\n\n return node?.options || {};\n }, [editor]);\n}\n","import { AnyExtension, Extension } from '@tiptap/core';\n\nimport StarterKit from '@tiptap/starter-kit';\nimport ListItem from '@tiptap/extension-list-item';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Heading from '@tiptap/extension-heading';\nimport Underline from '@tiptap/extension-underline';\nimport Document from '@tiptap/extension-document';\nimport Focus from '@tiptap/extension-focus';\nimport Dropcursor from '@tiptap/extension-dropcursor';\n\nimport { Color } from './color';\nimport { HorizontalRule } from './horizontal-rule';\nimport { Footer } from '../nodes/footer';\nimport { Spacer } from '../nodes/spacer';\nimport { LinkCardExtension, LinkCardOptions } from './link-card';\nimport { ColumnsExtension } from '../nodes/columns/columns';\nimport { ColumnExtension } from '../nodes/columns/column';\nimport { SectionExtension } from '../nodes/section/section';\nimport { ButtonExtension } from '../nodes/button/button';\nimport { LogoExtension } from '../nodes/logo/logo';\nimport { ImageExtension } from '../nodes/image/image';\nimport { LinkExtension } from '../nodes/link';\nimport { LinkOptions } from '@tiptap/extension-link';\nimport { HeadingExtension } from '../nodes/heading/heading';\nimport { ParagraphExtension } from '../nodes/paragraph/paragraph';\nimport { RepeatExtension } from '../nodes/repeat/repeat';\n\nexport type MailyKitOptions = {\n linkCard?: Partial<LinkCardOptions> | false;\n repeat?: Partial<{}> | false;\n section?: Partial<{}> | false;\n columns?: Partial<{}> | false;\n column?: Partial<{}> | false;\n button?: Partial<{}> | false;\n spacer?: Partial<{}> | false;\n logo?: Partial<{}> | false;\n image?: Partial<{}> | false;\n link?: Partial<LinkOptions> | false;\n};\n\nexport const MailyKit = Extension.create<MailyKitOptions>({\n name: 'maily-kit',\n\n addOptions() {\n return {\n link: {\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly:no-underline',\n },\n openOnClick: false,\n },\n };\n },\n\n addExtensions() {\n const extensions: AnyExtension[] = [\n Document.extend({\n content: '(block|columns)+',\n }),\n StarterKit.configure({\n code: {\n HTMLAttributes: {\n class:\n 'mly:px-1 mly:relative mly:py-0.5 mly:bg-[#efefef] mly:text-sm mly:rounded-md mly:tracking-normal mly:font-normal',\n },\n },\n blockquote: {\n HTMLAttributes: {\n class:\n 'mly:not-prose mly:border-l-4 mly:border-gray-300 mly:pl-4 mly:mt-4 mly:mb-4 mly:relative',\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: 'mly:relative',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'mly:relative',\n },\n },\n heading: false,\n paragraph: false,\n horizontalRule: false,\n dropcursor: false,\n document: false,\n }) as AnyExtension,\n Underline,\n Color.configure({ types: [TextStyle.name, ListItem.name] }),\n TextStyle.configure(),\n TextAlign.configure({\n types: [Paragraph.name, Heading.name, Footer.name],\n }),\n HorizontalRule,\n Footer,\n Focus,\n Dropcursor.configure({\n color: '#555',\n width: 3,\n class: 'ProseMirror-dropcursor',\n }),\n HeadingExtension.configure({\n levels: [1, 2, 3],\n HTMLAttributes: {\n class: 'mly:relative',\n },\n }),\n ParagraphExtension.configure({\n HTMLAttributes: {\n class: 'mly:relative',\n },\n }),\n ];\n\n if (this.options.linkCard !== false) {\n extensions.push(LinkCardExtension.configure(this.options.linkCard));\n }\n\n if (this.options.repeat !== false) {\n extensions.push(RepeatExtension);\n }\n\n if (this.options.section !== false) {\n extensions.push(SectionExtension);\n }\n\n if (this.options.columns !== false) {\n extensions.push(ColumnsExtension);\n }\n\n if (this.options.column !== false) {\n extensions.push(ColumnExtension);\n }\n\n if (this.options.button !== false) {\n extensions.push(ButtonExtension);\n }\n\n if (this.options.spacer !== false) {\n extensions.push(Spacer);\n }\n\n if (this.options.logo !== false) {\n extensions.push(LogoExtension);\n }\n\n if (this.options.image !== false) {\n extensions.push(ImageExtension);\n }\n\n if (this.options.link !== false) {\n extensions.push(LinkExtension.configure(this.options.link));\n }\n\n return extensions;\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\n\nexport interface FooterOptions {\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n footer: {\n setFooter: () => ReturnType;\n };\n }\n}\n\nexport const Footer = Node.create<FooterOptions>({\n name: 'footer',\n group: 'block',\n content: 'inline*',\n\n addAttributes() {\n return {\n 'maily-component': {\n default: 'footer',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element) => element?.getAttribute('data-maily-component'),\n },\n };\n },\n\n addCommands() {\n return {\n setFooter:\n () =>\n ({ commands }) => {\n return commands.setNode(this.name);\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'small[data-maily-component=\"footer\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'small',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class:\n 'footer mly:block mly:text-[13px] mly:text-slate-500 mly:relative',\n }),\n 0,\n ];\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from './section/section';\n\nexport interface SpacerOptions {\n height: number;\n showIfKey: string;\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n spacer: {\n setSpacer: (options: { height: number }) => ReturnType;\n setSpacerSize: (height: number) => ReturnType;\n setSpacerShowIfKey: (showIfKey: string) => ReturnType;\n unsetSpacer: () => ReturnType;\n };\n }\n}\n\nexport const DEFAULT_SPACER_HEIGHT = 8;\n\nexport const Spacer = Node.create<SpacerOptions>({\n name: 'spacer',\n priority: 1000,\n\n group: 'block',\n draggable: true,\n addAttributes() {\n return {\n height: {\n default: DEFAULT_SPACER_HEIGHT,\n parseHTML: (element) => Number(element.getAttribute('data-height')),\n renderHTML: (attributes) => {\n return {\n 'data-height': attributes.height,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSpacer:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n height: options.height,\n },\n });\n },\n\n setSpacerSize:\n (height) =>\n ({ commands }) => {\n return commands.updateAttributes('spacer', { height });\n },\n\n setSpacerShowIfKey:\n (showIfKey) =>\n ({ commands }) => {\n return commands.updateAttributes('spacer', { showIfKey });\n },\n\n unsetSpacer:\n () =>\n ({ commands }) => {\n return commands.deleteNode('spacer');\n },\n };\n },\n renderHTML({ HTMLAttributes, node }) {\n const { height } = node.attrs as SpacerOptions;\n\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n this.options.HTMLAttributes,\n HTMLAttributes,\n {\n class: 'spacer mly:relative mly:full mly:z-50',\n contenteditable: false,\n style: `height: ${height}px;--spacer-height: ${height}px;`,\n }\n ),\n ];\n },\n parseHTML() {\n return [{ tag: `div[data-maily-component=\"${this.name}\"]` }];\n },\n});\n","import { Command } from '@tiptap/core';\n\nexport function updateAttribute(\n type: string,\n attr: string,\n value: any\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n tr.setNodeAttribute(lastPos, attr, value);\n }\n }\n\n return true;\n });\n}\n\nexport function updateAttributes(\n type: string,\n attrs: Record<string, any>\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n const node = state.doc.nodeAt(lastPos);\n if (node) {\n tr.setNodeMarkup(lastPos, null, {\n ...node.attrs,\n ...attrs,\n });\n } else {\n for (const [key, value] of Object.entries(attrs)) {\n tr.setNodeAttribute(lastPos, key, value);\n }\n }\n }\n\n if (type === 'button') {\n tr.setSelection(tr.selection);\n }\n }\n\n return true;\n });\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes, Node } from '@tiptap/core';\n\nexport const DEFAULT_SECTION_BACKGROUND_COLOR = '#f7f7f7';\nexport const DEFAULT_SECTION_ALIGN = 'left';\nexport const DEFAULT_SECTION_BORDER_WIDTH = 2;\nexport const DEFAULT_SECTION_BORDER_COLOR = '#e2e2e2';\nexport const DEFAULT_SECTION_BORDER_RADIUS = 0;\n\nexport const DEFAULT_SECTION_MARGIN_TOP = 0;\nexport const DEFAULT_SECTION_MARGIN_RIGHT = 0;\nexport const DEFAULT_SECTION_MARGIN_BOTTOM = 0;\nexport const DEFAULT_SECTION_MARGIN_LEFT = 0;\n\nexport const DEFAULT_SECTION_PADDING_TOP = 0;\nexport const DEFAULT_SECTION_PADDING_RIGHT = 0;\nexport const DEFAULT_SECTION_PADDING_BOTTOM = 0;\nexport const DEFAULT_SECTION_PADDING_LEFT = 0;\n\nexport const DEFAULT_SECTION_SHOW_IF_KEY = null;\n\ntype SectionAttributes = {\n borderRadius: number;\n backgroundColor: string;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n marginTop: number;\n marginRight: number;\n marginBottom: number;\n marginLeft: number;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string | null;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n section: {\n setSection: () => ReturnType;\n updateSection: (attrs: Partial<SectionAttributes>) => ReturnType;\n };\n }\n}\n\nexport const SectionExtension = Node.create({\n name: 'section',\n group: 'block',\n content: '(block|columns)+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n borderRadius: {\n default: 0,\n parseHTML: (element) => {\n return Number(element?.style?.borderRadius?.replace(/['\"]+/g, ''));\n },\n renderHTML: (attributes) => {\n if (!attributes.borderRadius) {\n return {};\n }\n\n return {\n style: `border-radius: ${attributes.borderRadius}px`,\n };\n },\n },\n backgroundColor: {\n default: DEFAULT_SECTION_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return element.style.backgroundColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n\n return {\n style: `background-color: ${attributes.backgroundColor};--bg-color: ${attributes.backgroundColor}`,\n };\n },\n },\n align: {\n default: DEFAULT_SECTION_ALIGN,\n parseHTML: (element) => {\n return element.getAttribute('align') || DEFAULT_SECTION_ALIGN;\n },\n renderHTML(attributes) {\n if (!attributes.align) {\n return {};\n }\n\n return {\n align: attributes.align,\n };\n },\n },\n borderWidth: {\n default: DEFAULT_SECTION_BORDER_WIDTH,\n parseHTML: (element) => {\n return (\n Number(element?.style?.borderWidth?.replace(/['\"]+/g, '')) || 0\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.borderWidth) {\n return {};\n }\n\n return {\n style: `border-width: ${attributes.borderWidth}px`,\n };\n },\n },\n borderColor: {\n default: DEFAULT_SECTION_BORDER_COLOR,\n parseHTML: (element) => {\n return element.style.borderColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.borderColor) {\n return {};\n }\n\n return {\n style: `border-color: ${attributes.borderColor}`,\n };\n },\n },\n paddingTop: {\n default: DEFAULT_SECTION_PADDING_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.paddingTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.paddingTop) {\n return {};\n }\n\n return {\n style: `padding-top: ${attributes.paddingTop}px`,\n };\n },\n },\n paddingRight: {\n default: DEFAULT_SECTION_PADDING_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.paddingRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingRight) {\n return {};\n }\n\n return {\n style: `padding-right: ${attributes.paddingRight}px`,\n };\n },\n },\n paddingBottom: {\n default: DEFAULT_SECTION_PADDING_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.paddingBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingBottom) {\n return {};\n }\n\n return {\n style: `padding-bottom: ${attributes.paddingBottom}px`,\n };\n },\n },\n paddingLeft: {\n default: DEFAULT_SECTION_PADDING_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.paddingLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingLeft) {\n return {};\n }\n\n return {\n style: `padding-left: ${attributes.paddingLeft}px`,\n };\n },\n },\n marginTop: {\n default: DEFAULT_SECTION_MARGIN_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.marginTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.marginTop) {\n return {};\n }\n\n return {\n marginTop: attributes.marginTop,\n };\n },\n },\n marginRight: {\n default: DEFAULT_SECTION_MARGIN_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.marginRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginRight) {\n return {};\n }\n\n return {\n marginRight: attributes.marginRight,\n };\n },\n },\n marginBottom: {\n default: DEFAULT_SECTION_MARGIN_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.marginBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginBottom) {\n return {};\n }\n\n return {\n marginBottom: attributes.marginBottom,\n };\n },\n },\n marginLeft: {\n default: DEFAULT_SECTION_MARGIN_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.marginLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginLeft) {\n return {};\n }\n\n return {\n marginLeft: attributes.marginLeft,\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSection:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n type: this.name,\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateSection: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const {\n marginTop = 0,\n marginRight = 0,\n marginBottom = 0,\n marginLeft = 0,\n } = HTMLAttributes;\n\n return [\n 'table',\n {\n 'data-type': this.name,\n border: 0,\n cellpadding: 0,\n cellspacing: 0,\n class: 'mly:w-full mly:border-separate mly:relative mly:table-fixed',\n style: `margin-top: ${marginTop}px; margin-right: ${marginRight}px; margin-bottom: ${marginBottom}px; margin-left: ${marginLeft}px;`,\n },\n [\n 'tbody',\n {\n class: 'mly:w-full',\n },\n [\n 'tr',\n {\n class: 'mly:w-full',\n },\n [\n 'td',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'section-cell',\n style: 'border-style: solid',\n class: 'mly:w-full mly:[text-align:revert-layer]',\n }),\n 0,\n ],\n ],\n ],\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'table[data-type=\"section\"]',\n },\n ];\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { LinkCardComponent } from '../nodes/link-card';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n linkCard: {\n setLinkCard: () => ReturnType;\n };\n }\n}\n\nexport type LinkCardOptions = {};\n\nexport const LinkCardExtension = Node.create({\n name: 'linkCard',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n mailyComponent: {\n default: 'linkCard',\n },\n title: {\n default: '',\n },\n description: {\n default: '',\n },\n link: {\n default: '',\n },\n linkTitle: {\n default: '',\n },\n image: {\n default: '',\n },\n subTitle: {\n default: '',\n },\n badgeText: {\n default: '',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `a[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n HTMLAttributes\n ),\n ];\n },\n\n addCommands() {\n return {\n setLinkCard:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n mailyComponent: this.name,\n },\n });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(LinkCardComponent, {\n className: 'mly:relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Input } from '../components/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../components/popover';\nimport { Textarea } from '../components/textarea';\nimport { cn } from '../utils/classname';\n\nexport function LinkCardComponent(props: NodeViewProps) {\n const { title, description, link, linkTitle, image, badgeText, subTitle } =\n props.node.attrs;\n const { getPos, editor } = props;\n\n return (\n <NodeViewWrapper\n className={`react-component ${\n props.selected && 'ProseMirror-selectednode'\n }`}\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n >\n <Popover open={props.selected}>\n <PopoverTrigger asChild>\n <div\n tabIndex={-1}\n onClick={(e) => {\n e.preventDefault();\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n <div className=\"mly:no-prose mly:flex mly:flex-col mly:rounded-lg mly:border mly:border-gray-300\">\n {image && (\n <div className=\"mly:relative mly:mb-1.5 mly:w-full mly:shrink-0\">\n <img\n src={image}\n alt=\"link-card\"\n className=\"mly:no-prose mly:mb-0! mly:h-full mly:w-full mly:rounded-t-lg\"\n draggable={editor.isEditable}\n />\n </div>\n )}\n <div className=\"mly:flex mly:items-stretch mly:p-3\">\n <div className={cn('mly:flex mly:flex-col')}>\n <div className=\"!mly:mb-1.5 mly:flex mly:items-center mly:gap-1.5\">\n <h2 className=\"!mly:mb-0 mly:text-lg! mly:font-semibold\">\n {title}\n </h2>\n {badgeText && (\n <span className=\"!mly:font-base mly:rounded-md mly:bg-yellow-200 mly:px-2 mly:py-1 mly:font-semibold mly:leading-none text-xs\">\n {badgeText}\n </span>\n )}{' '}\n {subTitle && !badgeText && (\n <span className=\"!mly:font-base mly:font-regular mly:rounded-md mly:leading-none mly:text-gray-400 text-xs\">\n {subTitle}\n </span>\n )}\n </div>\n <p className=\"!mly:my-0 mly:text-base! mly:text-gray-500\">\n {description}{' '}\n {linkTitle ? (\n <a href={link} className=\"mly:font-semibold\">\n {linkTitle}\n </a>\n ) : null}\n </p>\n </div>\n </div>\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"mly:flex mly:w-96 mly:flex-col mly:gap-2\"\n sideOffset={10}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Image\n </span>\n <Input\n placeholder=\"Add Image\"\n type=\"url\"\n value={image}\n onChange={(e) => {\n props.updateAttributes({\n image: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Title\n </span>\n <Input\n placeholder=\"Add title\"\n value={title}\n onChange={(e) => {\n props.updateAttributes({\n title: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Description\n </span>\n <Textarea\n placeholder=\"Add description here\"\n value={description}\n onChange={(e) => {\n props.updateAttributes({\n description: e.target.value,\n });\n }}\n />\n </label>\n\n <div className=\"mly:grid mly:grid-cols-2 mly:gap-2\">\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Link Title\n </span>\n <Input\n placeholder=\"Add link title here\"\n value={linkTitle}\n onChange={(e) => {\n props.updateAttributes({\n linkTitle: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Link\n </span>\n <Input\n placeholder=\"Add link here\"\n value={link}\n onChange={(e) => {\n props.updateAttributes({\n link: e.target.value,\n });\n }}\n />\n </label>\n </div>\n\n <div className=\"mly:grid mly:grid-cols-2 mly:gap-2\">\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Badge Text\n </span>\n <Input\n placeholder=\"Add badge text here\"\n value={badgeText}\n onChange={(e) => {\n props.updateAttributes({\n badgeText: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly:w-full mly:space-y-1\">\n <span className=\"mly:text-xs mly:font-normal mly:text-slate-400\">\n Sub Title\n </span>\n <Input\n placeholder=\"Add sub title here\"\n value={subTitle}\n onChange={(e) => {\n props.updateAttributes({\n subTitle: e.target.value,\n });\n }}\n />\n </label>\n </div>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '../utils/constants';\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n type={type}\n className={cn(\n 'mly:flex mly:h-10 mly:w-full mly:rounded-md mly:border mly:border-gray-200 mly:bg-white mly:px-3 mly:py-2 mly:text-sm mly:ring-offset-white mly:file:border-0 mly:file:bg-transparent mly:file:text-sm mly:file:font-medium mly:placeholder:text-gray-500 mly:focus-visible:outline-hidden mly:focus-visible:ring-2 mly:focus-visible:ring-gray-400 mly:focus-visible:ring-offset-2 mly:disabled:cursor-not-allowed mly:disabled:opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n prefix: 'mly',\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, classGroups } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n for (const classGroupId in classGroups) {\n processClassesRecursively(classGroups[classGroupId]!, classMap, classGroupId, theme)\n }\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig, ParsedClassName } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\nconst MODIFIER_SEPARATOR = ':'\nconst MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { prefix, experimentalParseClassName } = config\n\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = (className: string): ParsedClassName => {\n const modifiers = []\n\n let bracketDepth = 0\n let parenDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + MODIFIER_SEPARATOR_LENGTH\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n } else if (currentCharacter === '(') {\n parenDepth++\n } else if (currentCharacter === ')') {\n parenDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier)\n const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR\n const parseClassNameOriginal = parseClassName\n parseClassName = (className) =>\n className.startsWith(fullPrefix)\n ? parseClassNameOriginal(className.substring(fullPrefix.length))\n : {\n isExternal: true,\n modifiers: [],\n hasImportantModifier: false,\n baseClassName: className,\n maybePostfixModifierPosition: undefined,\n }\n }\n\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName\n parseClassName = (className) =>\n experimentalParseClassName({ className, parseClassName: parseClassNameOriginal })\n }\n\n return parseClassName\n}\n\nconst stripImportantModifier = (baseClassName: string) => {\n if (baseClassName.endsWith(IMPORTANT_MODIFIER)) {\n return baseClassName.substring(0, baseClassName.length - 1)\n }\n\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n if (baseClassName.startsWith(IMPORTANT_MODIFIER)) {\n return baseClassName.substring(1)\n }\n\n return baseClassName\n}\n","import { AnyConfig } from './types'\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const createSortModifiers = (config: AnyConfig) => {\n const orderSensitiveModifiers = Object.fromEntries(\n config.orderSensitiveModifiers.map((modifier) => [modifier, true]),\n )\n\n const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isPositionSensitive = modifier[0] === '[' || orderSensitiveModifiers[modifier]\n\n if (isPositionSensitive) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n }\n\n return sortModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { createSortModifiers } from './sort-modifiers'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds, sortModifiers } =\n configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n } = parseClassName(originalClassName)\n\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n let hasPostfixModifier = !!maybePostfixModifierPosition\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isFraction = (value: string) => fractionRegex.test(value)\n\nexport const isNumber = (value: string) => !!value && !Number.isNaN(Number(value))\n\nexport const isInteger = (value: string) => !!value && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nexport const isAny = () => true\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n\nexport const isAnyNonArbitrary = (value: string) =>\n !isArbitraryValue(value) && !isArbitraryVariable(value)\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, isLabelSize, isNever)\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, isLabelLength, isLengthOnly)\n\nexport const isArbitraryNumber = (value: string) =>\n getIsArbitraryValue(value, isLabelNumber, isNumber)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, isLabelPosition, isNever)\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, isLabelImage, isImage)\n\nexport const isArbitraryShadow = (value: string) =>\n getIsArbitraryValue(value, isLabelShadow, isShadow)\n\nexport const isArbitraryVariable = (value: string) => arbitraryVariableRegex.test(value)\n\nexport const isArbitraryVariableLength = (value: string) =>\n getIsArbitraryVariable(value, isLabelLength)\n\nexport const isArbitraryVariableFamilyName = (value: string) =>\n getIsArbitraryVariable(value, isLabelFamilyName)\n\nexport const isArbitraryVariablePosition = (value: string) =>\n getIsArbitraryVariable(value, isLabelPosition)\n\nexport const isArbitraryVariableSize = (value: string) => getIsArbitraryVariable(value, isLabelSize)\n\nexport const isArbitraryVariableImage = (value: string) =>\n getIsArbitraryVariable(value, isLabelImage)\n\nexport const isArbitraryVariableShadow = (value: string) =>\n getIsArbitraryVariable(value, isLabelShadow, true)\n\n// Helpers\n\nconst getIsArbitraryValue = (\n value: string,\n testLabel: (label: string) => boolean,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst getIsArbitraryVariable = (\n value: string,\n testLabel: (label: string) => boolean,\n shouldMatchNoLabel = false,\n) => {\n const result = arbitraryVariableRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n return shouldMatchNoLabel\n }\n\n return false\n}\n\n// Labels\n\nconst isLabelPosition = (label: string) => label === 'position' || label === 'percentage'\n\nconst isLabelImage = (label: string) => label === 'image' || label === 'url'\n\nconst isLabelSize = (label: string) => label === 'length' || label === 'size' || label === 'bg-size'\n\nconst isLabelLength = (label: string) => label === 'length'\n\nconst isLabelNumber = (label: string) => label === 'number'\n\nconst isLabelFamilyName = (label: string) => label === 'family-name'\n\nconst isLabelShadow = (label: string) => label === 'shadow'\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isAnyNonArbitrary,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n\n const themeColor = fromTheme('color')\n const themeFont = fromTheme('font')\n const themeText = fromTheme('text')\n const themeFontWeight = fromTheme('font-weight')\n const themeTracking = fromTheme('tracking')\n const themeLeading = fromTheme('leading')\n const themeBreakpoint = fromTheme('breakpoint')\n const themeContainer = fromTheme('container')\n const themeSpacing = fromTheme('spacing')\n const themeRadius = fromTheme('radius')\n const themeShadow = fromTheme('shadow')\n const themeInsetShadow = fromTheme('inset-shadow')\n const themeTextShadow = fromTheme('text-shadow')\n const themeDropShadow = fromTheme('drop-shadow')\n const themeBlur = fromTheme('blur')\n const themePerspective = fromTheme('perspective')\n const themeAspect = fromTheme('aspect')\n const themeEase = fromTheme('ease')\n const themeAnimate = fromTheme('animate')\n\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n\n const scaleBreak = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const scalePosition = () =>\n [\n 'center',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top',\n 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top',\n 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom',\n 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom',\n ] as const\n const scalePositionWithArbitrary = () =>\n [...scalePosition(), isArbitraryVariable, isArbitraryValue] as const\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const scaleOverscroll = () => ['auto', 'contain', 'none'] as const\n const scaleUnambiguousSpacing = () =>\n [isArbitraryVariable, isArbitraryValue, themeSpacing] as const\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()] as const\n const scaleGridTemplateColsRows = () =>\n [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridColRowStartAndEnd = () =>\n [\n 'auto',\n { span: ['full', isInteger, isArbitraryVariable, isArbitraryValue] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleGridColRowStartOrEnd = () =>\n [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridAutoColsRows = () =>\n ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue] as const\n const scaleAlignPrimaryAxis = () =>\n [\n 'start',\n 'end',\n 'center',\n 'between',\n 'around',\n 'evenly',\n 'stretch',\n 'baseline',\n 'center-safe',\n 'end-safe',\n ] as const\n const scaleAlignSecondaryAxis = () =>\n ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'] as const\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()] as const\n const scaleSizing = () =>\n [\n isFraction,\n 'auto',\n 'full',\n 'dvw',\n 'dvh',\n 'lvw',\n 'lvh',\n 'svw',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue] as const\n const scaleBgPosition = () =>\n [\n ...scalePosition(),\n isArbitraryVariablePosition,\n isArbitraryPosition,\n { position: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleBgRepeat = () => ['no-repeat', { repeat: ['', 'x', 'y', 'space', 'round'] }] as const\n const scaleBgSize = () =>\n [\n 'auto',\n 'cover',\n 'contain',\n isArbitraryVariableSize,\n isArbitrarySize,\n { size: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleGradientStopPosition = () =>\n [isPercent, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleRadius = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n 'full',\n themeRadius,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleBorderWidth = () =>\n ['', isNumber, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'] as const\n const scaleBlendMode = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const scaleMaskImagePosition = () =>\n [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition] as const\n const scaleBlur = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeBlur,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()] as const\n\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n ],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest'],\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [\n {\n aspect: [\n 'auto',\n 'square',\n isFraction,\n isArbitraryValue,\n isArbitraryVariable,\n themeAspect,\n ],\n },\n ],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [\n { columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer] },\n ],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': scaleBreak() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': scaleBreak() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: scalePositionWithArbitrary() }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: scaleOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': scaleOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': scaleOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: scaleOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': scaleOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': scaleOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: scaleInset() }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': scaleInset() }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': scaleInset() }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: scaleInset() }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: scaleInset() }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: scaleInset() }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: scaleInset() }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: scaleInset() }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: scaleInset() }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [\n {\n basis: [\n isFraction,\n 'full',\n 'auto',\n themeContainer,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['nowrap', 'wrap', 'wrap-reverse'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [\n {\n order: [\n isInteger,\n 'first',\n 'last',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': scaleGridTemplateColsRows() }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{ col: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': scaleGridTemplateColsRows() }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{ row: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': scaleGridAutoColsRows() }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': scaleGridAutoColsRows() }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: scaleUnambiguousSpacing() }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': scaleUnambiguousSpacing() }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': scaleUnambiguousSpacing() }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: [...scaleAlignPrimaryAxis(), 'normal'] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': [...scaleAlignSecondaryAxis(), 'normal'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...scaleAlignPrimaryAxis()] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: [...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [\n { self: ['auto', ...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] },\n ],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': scaleAlignPrimaryAxis() }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': [...scaleAlignSecondaryAxis(), 'baseline'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: scaleUnambiguousSpacing() }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: scaleUnambiguousSpacing() }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: scaleUnambiguousSpacing() }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: scaleUnambiguousSpacing() }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: scaleUnambiguousSpacing() }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: scaleUnambiguousSpacing() }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: scaleUnambiguousSpacing() }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: scaleUnambiguousSpacing() }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: scaleUnambiguousSpacing() }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: scaleMargin() }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: scaleMargin() }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: scaleMargin() }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: scaleMargin() }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: scaleMargin() }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: scaleMargin() }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: scaleMargin() }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: scaleMargin() }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: scaleMargin() }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{ 'space-x': scaleUnambiguousSpacing() }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{ 'space-y': scaleUnambiguousSpacing() }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n\n // --------------\n // --- Sizing ---\n // --------------\n\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{ size: scaleSizing() }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{ w: [themeContainer, 'screen', ...scaleSizing()] }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [\n {\n 'min-w': [\n themeContainer,\n 'screen',\n /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none',\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n themeContainer,\n 'screen',\n 'none',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n { screen: [themeBreakpoint] },\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{ h: ['screen', 'lh', ...scaleSizing()] }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{ 'min-h': ['screen', 'lh', 'none', ...scaleSizing()] }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{ 'max-h': ['screen', 'lh', ...scaleSizing()] }],\n\n // ------------------\n // --- Typography ---\n // ------------------\n\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [\n { text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{ font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber] }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [\n {\n 'font-stretch': [\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n isPercent,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{ tracking: [themeTracking, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [\n { 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber] },\n ],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryVariable, isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [\n { list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: scaleColor() }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: scaleColor() }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...scaleLineStyle(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n {\n decoration: [\n isNumber,\n 'from-font',\n 'auto',\n isArbitraryVariable,\n isArbitraryLength,\n ],\n },\n ],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: scaleColor() }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [\n { 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: scaleUnambiguousSpacing() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{ wrap: ['break-word', 'anywhere', 'normal'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // -------------------\n // --- Backgrounds ---\n // -------------------\n\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: scaleBgPosition() }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: scaleBgRepeat() }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: scaleBgSize() }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n {\n linear: [\n { to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue],\n },\n isArbitraryVariableImage,\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: scaleColor() }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: scaleColor() }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: scaleColor() }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: scaleColor() }],\n\n // ---------------\n // --- Borders ---\n // ---------------\n\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: scaleRadius() }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': scaleRadius() }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': scaleRadius() }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': scaleRadius() }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': scaleRadius() }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': scaleRadius() }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': scaleRadius() }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': scaleRadius() }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': scaleRadius() }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': scaleRadius() }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': scaleRadius() }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': scaleRadius() }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': scaleRadius() }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': scaleRadius() }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': scaleRadius() }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: scaleBorderWidth() }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': scaleBorderWidth() }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': scaleBorderWidth() }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': scaleBorderWidth() }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': scaleBorderWidth() }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': scaleBorderWidth() }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': scaleBorderWidth() }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': scaleBorderWidth() }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': scaleBorderWidth() }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{ 'divide-x': scaleBorderWidth() }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{ 'divide-y': scaleBorderWidth() }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{ divide: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: scaleColor() }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': scaleColor() }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': scaleColor() }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': scaleColor() }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': scaleColor() }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': scaleColor() }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': scaleColor() }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': scaleColor() }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': scaleColor() }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: scaleColor() }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: [...scaleLineStyle(), 'none', 'hidden'] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [\n { 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [\n { outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: scaleColor() }],\n\n // ---------------\n // --- Effects ---\n // ---------------\n\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [\n {\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{ shadow: scaleColor() }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [\n {\n 'inset-shadow': [\n 'none',\n themeInsetShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{ 'inset-shadow': scaleColor() }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{ ring: scaleBorderWidth() }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{ ring: scaleColor() }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{ 'ring-offset': [isNumber, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{ 'ring-offset': scaleColor() }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{ 'inset-ring': scaleBorderWidth() }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{ 'inset-ring': scaleColor() }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [\n {\n 'text-shadow': [\n 'none',\n themeTextShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{ 'text-shadow': scaleColor() }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': scaleBlendMode() }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [\n { 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n 'mask-no-clip',\n ],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{ mask: ['add', 'subtract', 'intersect', 'exclude'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{ 'mask-linear': [isNumber] }],\n 'mask-image-linear-from-pos': [{ 'mask-linear-from': scaleMaskImagePosition() }],\n 'mask-image-linear-to-pos': [{ 'mask-linear-to': scaleMaskImagePosition() }],\n 'mask-image-linear-from-color': [{ 'mask-linear-from': scaleColor() }],\n 'mask-image-linear-to-color': [{ 'mask-linear-to': scaleColor() }],\n 'mask-image-t-from-pos': [{ 'mask-t-from': scaleMaskImagePosition() }],\n 'mask-image-t-to-pos': [{ 'mask-t-to': scaleMaskImagePosition() }],\n 'mask-image-t-from-color': [{ 'mask-t-from': scaleColor() }],\n 'mask-image-t-to-color': [{ 'mask-t-to': scaleColor() }],\n 'mask-image-r-from-pos': [{ 'mask-r-from': scaleMaskImagePosition() }],\n 'mask-image-r-to-pos': [{ 'mask-r-to': scaleMaskImagePosition() }],\n 'mask-image-r-from-color': [{ 'mask-r-from': scaleColor() }],\n 'mask-image-r-to-color': [{ 'mask-r-to': scaleColor() }],\n 'mask-image-b-from-pos': [{ 'mask-b-from': scaleMaskImagePosition() }],\n 'mask-image-b-to-pos': [{ 'mask-b-to': scaleMaskImagePosition() }],\n 'mask-image-b-from-color': [{ 'mask-b-from': scaleColor() }],\n 'mask-image-b-to-color': [{ 'mask-b-to': scaleColor() }],\n 'mask-image-l-from-pos': [{ 'mask-l-from': scaleMaskImagePosition() }],\n 'mask-image-l-to-pos': [{ 'mask-l-to': scaleMaskImagePosition() }],\n 'mask-image-l-from-color': [{ 'mask-l-from': scaleColor() }],\n 'mask-image-l-to-color': [{ 'mask-l-to': scaleColor() }],\n 'mask-image-x-from-pos': [{ 'mask-x-from': scaleMaskImagePosition() }],\n 'mask-image-x-to-pos': [{ 'mask-x-to': scaleMaskImagePosition() }],\n 'mask-image-x-from-color': [{ 'mask-x-from': scaleColor() }],\n 'mask-image-x-to-color': [{ 'mask-x-to': scaleColor() }],\n 'mask-image-y-from-pos': [{ 'mask-y-from': scaleMaskImagePosition() }],\n 'mask-image-y-to-pos': [{ 'mask-y-to': scaleMaskImagePosition() }],\n 'mask-image-y-from-color': [{ 'mask-y-from': scaleColor() }],\n 'mask-image-y-to-color': [{ 'mask-y-to': scaleColor() }],\n 'mask-image-radial': [{ 'mask-radial': [isArbitraryVariable, isArbitraryValue] }],\n 'mask-image-radial-from-pos': [{ 'mask-radial-from': scaleMaskImagePosition() }],\n 'mask-image-radial-to-pos': [{ 'mask-radial-to': scaleMaskImagePosition() }],\n 'mask-image-radial-from-color': [{ 'mask-radial-from': scaleColor() }],\n 'mask-image-radial-to-color': [{ 'mask-radial-to': scaleColor() }],\n 'mask-image-radial-shape': [{ 'mask-radial': ['circle', 'ellipse'] }],\n 'mask-image-radial-size': [\n { 'mask-radial': [{ closest: ['side', 'corner'], farthest: ['side', 'corner'] }] },\n ],\n 'mask-image-radial-pos': [{ 'mask-radial-at': scalePosition() }],\n 'mask-image-conic-pos': [{ 'mask-conic': [isNumber] }],\n 'mask-image-conic-from-pos': [{ 'mask-conic-from': scaleMaskImagePosition() }],\n 'mask-image-conic-to-pos': [{ 'mask-conic-to': scaleMaskImagePosition() }],\n 'mask-image-conic-from-color': [{ 'mask-conic-from': scaleColor() }],\n 'mask-image-conic-to-color': [{ 'mask-conic-to': scaleColor() }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{ mask: ['alpha', 'luminance', 'match'] }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [\n { 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n ],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{ mask: scaleBgPosition() }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{ mask: scaleBgRepeat() }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{ mask: scaleBgSize() }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{ 'mask-type': ['alpha', 'luminance'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{ mask: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------\n // --- Filters ---\n // ---------------\n\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [\n {\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: scaleBlur() }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [\n {\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeDropShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{ 'drop-shadow': scaleColor() }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [\n {\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': scaleBlur() }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [\n { 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [\n { 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [\n { 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [\n { 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [\n { 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [\n { 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [\n { 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [\n { 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n\n // --------------\n // --- Tables ---\n // --------------\n\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': scaleUnambiguousSpacing() }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n '',\n 'all',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{ transition: ['normal', 'discrete'] }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue] }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [\n { ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------\n // --- Transforms ---\n // ------------------\n\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{ backface: ['hidden', 'visible'] }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [\n { perspective: [themePerspective, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{ 'perspective-origin': scalePositionWithArbitrary() }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: scaleRotate() }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{ 'rotate-x': scaleRotate() }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{ 'rotate-y': scaleRotate() }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{ 'rotate-z': scaleRotate() }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: scaleScale() }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': scaleScale() }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': scaleScale() }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{ 'scale-z': scaleScale() }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{ skew: scaleSkew() }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': scaleSkew() }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': scaleSkew() }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [\n { transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu'] },\n ],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{ origin: scalePositionWithArbitrary() }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{ transform: ['3d', 'flat'] }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{ translate: scaleTranslate() }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': scaleTranslate() }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': scaleTranslate() }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{ 'translate-z': scaleTranslate() }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: scaleColor() }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: scaleColor() }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [\n { scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light'] },\n ],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{ 'field-sizing': ['fixed', 'content'] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['auto', 'none'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', '', 'y', 'x'] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': scaleUnambiguousSpacing() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{ touch: ['auto', 'none', 'manipulation'] }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{ 'touch-pan': ['x', 'left', 'right'] }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{ 'touch-pan': ['y', 'up', 'down'] }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n {\n 'will-change': [\n 'auto',\n 'scroll',\n 'contents',\n 'transform',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n\n // -----------\n // --- SVG ---\n // -----------\n\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: ['none', ...scaleColor()] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [\n {\n stroke: [\n isNumber,\n isArbitraryVariableLength,\n isArbitraryLength,\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: ['none', ...scaleColor()] }],\n\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-x',\n 'border-w-y',\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-x',\n 'border-color-y',\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n orderSensitiveModifiers: [\n '*',\n '**',\n 'after',\n 'backdrop',\n 'before',\n 'details-content',\n 'file',\n 'first-letter',\n 'first-line',\n 'marker',\n 'placeholder',\n 'selection',\n ],\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension, NoInfer } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n overrideConfigProperties(baseConfig.theme, override.theme)\n overrideConfigProperties(baseConfig.classGroups, override.classGroups)\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups)\n overrideConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n override.conflictingClassGroupModifiers,\n )\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers)\n\n mergeConfigProperties(baseConfig.theme, extend.theme)\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups)\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups)\n mergeConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n extend.conflictingClassGroupModifiers,\n )\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers')\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key)\n }\n }\n}\n\nconst mergeArrayProperties = <Key extends string>(\n baseObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n mergeObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n key: Key,\n) => {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","export const AUTOCOMPLETE_PASSWORD_MANAGERS_OFF = Object.freeze({\n autoComplete: 'off',\n 'data-1p-ignore': true,\n 'data-form-type': 'other',\n});\n","'use client';\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\n\nimport { cn } from '../utils/classname';\n\nconst Popover: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>\n> = PopoverPrimitive.Root;\n\nconst PopoverTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger>\n> = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {\n portal?: boolean;\n }\n>(\n (\n { className, align = 'center', sideOffset = 4, portal = false, ...props },\n ref\n ) => {\n const content = (\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'mly:z-9999 mly:w-72 mly:rounded-md mly:border mly:border-gray-200 mly:bg-white mly:p-4 mly:text-gray-950 mly:shadow-md mly:outline-hidden',\n 'mly-editor',\n className\n )}\n {...props}\n />\n );\n\n if (!portal) {\n return content;\n }\n\n return <PopoverPrimitive.Portal>{content}</PopoverPrimitive.Portal>;\n }\n);\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\n\nexport interface TextAreaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextAreaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'mly:flex mly:min-h-24 mly:w-full mly:rounded-md mly:border mly:border-gray-200 mly:bg-white mly:px-3 mly:py-2 mly:text-sm mly:ring-offset-white mly:file:border-0 mly:file:bg-transparent mly:file:text-sm mly:file:font-medium mly:placeholder:text-gray-500 mly:focus-visible:outline-hidden mly:focus-visible:ring-2 mly:focus-visible:ring-gray-400 mly:focus-visible:ring-offset-2 mly:disabled:cursor-not-allowed mly:disabled:opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","import { Editor } from '@tiptap/react';\nimport { Fragment, Node } from '@tiptap/pm/model';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { v4 as uuidv4 } from 'uuid';\nimport { findParentNode } from '@tiptap/core';\nimport { DEFAULT_COLUMN_WIDTH } from '../nodes/columns/column';\n\nexport function getColumnCount(editor: Editor) {\n return getClosestNodeByName(editor, 'columns')?.node?.childCount || 0;\n}\n\nexport function getClosestNodeByName(editor: Editor, name: string) {\n const { state } = editor.view;\n return findParentNode((node) => node.type.name === name)(state.selection);\n}\n\nexport function addColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const calculatedWidth = +Number(100 / (columnsNode.childCount + 1)).toFixed(\n 2\n );\n const newColumn = state.schema.nodes.column.create(\n {\n width: calculatedWidth,\n columnId: uuidv4(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n columnsNode.content.forEach((child, _, index) => {\n if (\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId\n ) {\n activeColumnIndex = index;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n updatedContent.splice(activeColumnIndex + 1, 0, newColumn);\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, activeColumnIndex + 1)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function removeColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n // If there is only one column, remove the entire columns node\n if (columnsNode.childCount === 1) {\n const transaction = tr.delete(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize\n );\n dispatch(transaction);\n editor.view.focus();\n return;\n }\n\n const calculatedWidth = +Number(100 / (columnsNode.childCount - 1)).toFixed(\n 2\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n let isRemoved = false;\n columnsNode.content.forEach((child, _, index) => {\n const isActiveColumn =\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId;\n if (isActiveColumn && !isRemoved) {\n activeColumnIndex = index;\n isRemoved = true;\n return;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n const isLastColumn = activeColumnIndex === columnsNode.childCount - 1;\n\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, isLastColumn ? activeColumnIndex - 1 : activeColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function goToColumn(editor: Editor, type: 'next' | 'previous') {\n const columnsNode = getClosestNodeByName(editor, 'columns');\n const columnNode = getClosestNodeByName(editor, 'column');\n if (!columnsNode || !columnNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const cols = columnsNode.node;\n let currColumnIndex = 0;\n cols.content.forEach((child, _, index) => {\n if (\n child.eq(columnNode.node) &&\n child?.attrs?.columnId === columnNode.node?.attrs?.columnId\n ) {\n currColumnIndex = index;\n }\n });\n\n const nextColumnIndex =\n type === 'next' ? currColumnIndex + 1 : currColumnIndex - 1;\n // if the next column index is out of bounds, return\n if (nextColumnIndex < 0 || nextColumnIndex >= cols.childCount) {\n return false;\n }\n\n let nextColumnPos = columnsNode.pos;\n cols.content.forEach((child, _, index) => {\n if (index < nextColumnIndex) {\n nextColumnPos += child.nodeSize;\n }\n });\n\n const tr = state.tr.setTime(Date.now());\n const textSelection = TextSelection.near(tr.doc.resolve(nextColumnPos));\n tr.setSelection(textSelection);\n\n dispatch(tr);\n return true;\n}\n\nexport function updateColumnWidth(\n editor: Editor,\n index: number,\n width: string = 'auto'\n) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n const { selection } = state;\n\n const beforeNodeEnd = columnsNodePos + columnsNode.nodeSize;\n const selectionRelative = {\n from: selection.from - columnsNodePos,\n to: selection.to - columnsNodePos,\n };\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: i === index ? width : child?.attrs?.width,\n },\n child.content\n )\n );\n });\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n beforeNodeEnd,\n updatedColumnsNode\n );\n\n const newSelection = TextSelection.create(\n transaction.doc,\n columnsNodePos + selectionRelative.from,\n columnsNodePos + selectionRelative.to\n );\n\n dispatch(transaction.setSelection(newSelection));\n return true;\n}\n\nexport function addColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n // If the index is out of bounds, append the column to the end\n // of the columns node\n const columnIndex = index < 0 ? columnsNode.childCount : index;\n // Keep the original width of the columns\n // and set the new column width to auto\n const { state } = editor.view;\n const newColumn = state.schema.nodes.column.create(\n {\n width: DEFAULT_COLUMN_WIDTH,\n columnId: uuidv4(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n // append the new column to the columns node\n // at the specified index\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(child);\n if (i === columnIndex) {\n updatedContent.push(newColumn);\n }\n });\n\n if (index === -1) {\n updatedContent.push(newColumn);\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = state.tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the new column\n // if the index is out of bounds, set the selection\n // to the last column\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, columnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n editor.view.dispatch(transaction);\n return true;\n}\n\nexport function removeColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n if (i !== index) {\n updatedContent.push(child);\n }\n });\n\n if (index === -1) {\n updatedContent.pop();\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the next column\n // if the index is out of bounds, set the selection\n // to the last column\n const nextColumnIndex =\n index === columnsNode.childCount - 1 ? index - 1 : index;\n const nextColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, nextColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(nextColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n return true;\n}\n\nexport function getColumnWidths(editor: Editor): {\n id: string;\n width: string;\n}[] {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return [];\n }\n\n const columnsWidth: { id: string; width: string }[] = [];\n columnsNode.content.forEach((child) => {\n const { columnId, width } = child.attrs;\n columnsWidth.push({ id: columnId, width });\n });\n\n return columnsWidth;\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { Node, mergeAttributes } from '@tiptap/core';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const DEFAULT_COLUMN_WIDTH = 'auto';\n\nexport type AllowedColumnVerticalAlign = 'top' | 'middle' | 'bottom';\nexport const DEFAULT_COLUMN_VERTICAL_ALIGN: AllowedColumnVerticalAlign = 'top';\n\ninterface ColumnAttributes {\n verticalAlign: AllowedColumnVerticalAlign;\n backgroundColor: string;\n borderRadius: number;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n column: {\n updateColumn: (attrs: Partial<ColumnAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnExtension = Node.create({\n name: 'column',\n content: 'block+',\n isolating: true,\n\n addAttributes() {\n return {\n columnId: {\n default: null,\n parseHTML: (element) =>\n element.getAttribute('data-column-id') || uuidv4(),\n renderHTML: (attributes) => {\n if (!attributes.columnId) {\n return {\n 'data-column-id': uuidv4(),\n };\n }\n\n return {\n 'data-column-id': attributes.columnId,\n };\n },\n },\n width: {\n default: DEFAULT_COLUMN_WIDTH,\n parseHTML: (element) =>\n element.style.width.replace(/['\"]+/g, '') || DEFAULT_COLUMN_WIDTH,\n renderHTML: (attributes) => {\n if (!attributes.width || attributes.width === DEFAULT_COLUMN_WIDTH) {\n return {};\n }\n\n return {\n style: `width: ${attributes.width}%;max-width:${attributes.width}%`,\n };\n },\n },\n verticalAlign: {\n default: DEFAULT_COLUMN_VERTICAL_ALIGN,\n parseHTML: (element) => element?.style?.verticalAlign || 'top',\n renderHTML: (attributes) => {\n const { verticalAlign } = attributes;\n if (\n !verticalAlign ||\n verticalAlign === DEFAULT_COLUMN_VERTICAL_ALIGN\n ) {\n return {};\n }\n\n if (verticalAlign === 'middle') {\n return {\n style: `display: flex;flex-direction: column;justify-content: center;`,\n };\n } else if (verticalAlign === 'bottom') {\n return {\n style: `display: flex;flex-direction: column;justify-content: flex-end;`,\n };\n }\n },\n },\n };\n },\n\n addCommands() {\n return {\n updateColumn: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'column',\n class: 'hide-scrollbars',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"column\"]',\n },\n ];\n },\n});\n","import { goToColumn } from '@/editor/utils/columns';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes } from '@tiptap/core';\nimport { Node } from '@tiptap/core';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const DEFAULT_COLUMNS_GAP = 8;\n\ninterface ColumnsAttributes {\n showIfKey: string;\n gap: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n setColumns: () => ReturnType;\n updateColumns: (attrs: Partial<ColumnsAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnsExtension = Node.create({\n name: 'columns',\n group: 'columns',\n content: 'column+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n gap: {\n default: DEFAULT_COLUMNS_GAP,\n parseHTML: (element) => {\n return Number(element.style.gap) || DEFAULT_COLUMNS_GAP;\n },\n renderHTML(attributes) {\n if (!attributes.gap) {\n return {};\n }\n\n return {\n style: `gap: ${attributes.gap}px`,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setColumns:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'column',\n attrs: {\n columnId: uuidv4(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: uuidv4(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n ],\n });\n },\n updateColumns: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'columns',\n class: 'mly:relative',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"columns\"]',\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => {\n return goToColumn(this.editor, 'next');\n },\n 'Shift-Tab': () => {\n return goToColumn(this.editor, 'previous');\n },\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { ButtonView } from './button-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { AllowedLogoAlignment } from '../logo/logo';\n\nexport const DEFAULT_BUTTON_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_BUTTON_VARIANT: AllowedButtonVariant = 'filled';\nexport const DEFAULT_BUTTON_BORDER_RADIUS: AllowedButtonBorderRadius = 'smooth';\nexport const DEFAULT_BUTTON_BACKGROUND_COLOR = null;\nexport const DEFAULT_BUTTON_TEXT_COLOR = null;\n\nexport const DEFAULT_BUTTON_PADDING_TOP = null;\nexport const DEFAULT_BUTTON_PADDING_RIGHT = null;\nexport const DEFAULT_BUTTON_PADDING_BOTTOM = null;\nexport const DEFAULT_BUTTON_PADDING_LEFT = null;\n\nexport const allowedButtonVariant = ['filled', 'outline'] as const;\nexport type AllowedButtonVariant = (typeof allowedButtonVariant)[number];\n\nexport const allowedButtonBorderRadius = ['sharp', 'smooth', 'round'] as const;\nexport type AllowedButtonBorderRadius =\n (typeof allowedButtonBorderRadius)[number];\n\nexport type ButtonAttributes = {\n text: string;\n isTextVariable: boolean;\n\n url: string;\n isUrlVariable: boolean;\n\n alignment: AllowedLogoAlignment;\n variant: AllowedButtonVariant;\n borderRadius: AllowedButtonBorderRadius;\n buttonColor: string;\n textColor: string;\n\n showIfKey: string;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n button: {\n setButton: () => ReturnType;\n updateButton: (attrs: Partial<ButtonAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ButtonExtension = Node.create({\n name: 'button',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n text: {\n default: 'Button',\n parseHTML: (element) => {\n return element.getAttribute('data-text') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-text': attributes.text,\n };\n },\n },\n isTextVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-text-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isTextVariable) {\n return {};\n }\n\n return {\n 'data-is-text-variable': 'true',\n };\n },\n },\n\n url: {\n default: '',\n parseHTML: (element) => {\n return element.getAttribute('data-url') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-url': attributes.url,\n };\n },\n },\n // Later we will remove this attribute\n // and use the `url` attribute instead when implement\n // the URL variable feature\n isUrlVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-url-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isUrlVariable) {\n return {};\n }\n\n return {\n 'data-is-url-variable': 'true',\n };\n },\n },\n\n alignment: {\n default: DEFAULT_BUTTON_ALIGNMENT,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-alignment') || DEFAULT_BUTTON_ALIGNMENT\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n variant: {\n default: DEFAULT_BUTTON_VARIANT,\n parseHTML: (element) => {\n return element.getAttribute('data-variant') || DEFAULT_BUTTON_VARIANT;\n },\n renderHTML: (attributes) => {\n return {\n 'data-variant': attributes.variant,\n };\n },\n },\n borderRadius: {\n default: DEFAULT_BUTTON_BORDER_RADIUS,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-border-radius') ||\n DEFAULT_BUTTON_BORDER_RADIUS\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-border-radius': attributes.borderRadius,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n\n buttonColor: DEFAULT_BUTTON_BACKGROUND_COLOR,\n textColor: DEFAULT_BUTTON_TEXT_COLOR,\n\n paddingTop: DEFAULT_BUTTON_PADDING_TOP,\n paddingRight: DEFAULT_BUTTON_PADDING_RIGHT,\n paddingBottom: DEFAULT_BUTTON_PADDING_BOTTOM,\n paddingLeft: DEFAULT_BUTTON_PADDING_LEFT,\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n ];\n },\n\n addCommands() {\n return {\n setButton:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [],\n });\n },\n updateButton: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ButtonView, {\n contentDOMElementTag: 'div',\n className: 'mly:relative',\n });\n },\n});\n","import { AlignCenter, AlignLeft, AlignRight } from 'lucide-react';\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { AllowedLogoAlignment, allowedLogoAlignment } from '../nodes/logo/logo';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { cn } from '../utils/classname';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\ntype AlignmentSwitchProps = {\n alignment: AllowedLogoAlignment;\n onAlignmentChange: (alignment: AllowedLogoAlignment) => void;\n};\n\nexport function AlignmentSwitch(props: AlignmentSwitchProps) {\n const { alignment: rawAlignment, onAlignmentChange } = props;\n const alignment = allowedLogoAlignment.includes(\n rawAlignment as AllowedLogoAlignment\n )\n ? rawAlignment\n : 'left';\n\n const alignments = {\n left: {\n icon: AlignLeft,\n tooltip: 'Align Left',\n onClick: () => {\n onAlignmentChange('left');\n },\n },\n center: {\n icon: AlignCenter,\n tooltip: 'Align Center',\n onClick: () => {\n onAlignmentChange('center');\n },\n },\n right: {\n icon: AlignRight,\n tooltip: 'Align Right',\n onClick: () => {\n onAlignmentChange('right');\n },\n },\n };\n\n const activeAlignment = alignments[alignment];\n\n return (\n <Popover>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly:flex mly:size-7 mly:items-center mly:justify-center mly:gap-1 mly:rounded-md mly:px-1.5 mly:text-sm mly:data-[state=open]:bg-soft-gray mly:hover:bg-soft-gray mly:focus-visible:relative mly:focus-visible:z-10 mly:focus-visible:outline-hidden mly:focus-visible:ring-2 mly:focus-visible:ring-gray-400 mly:focus-visible:ring-offset-2'\n )}\n >\n <activeAlignment.icon className=\"mly:h-3 mly:w-3 mly:stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Alignment</TooltipContent>\n </Tooltip>\n <PopoverContent\n className=\"mly:flex mly:w-max mly:gap-0.5 mly:rounded-lg mly:p-0.5!\"\n side=\"top\"\n sideOffset={8}\n align=\"center\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n {Object.entries(alignments).map(([key, value]) => {\n return (\n <BubbleMenuButton\n key={key}\n icon={value.icon}\n tooltip={value.tooltip}\n command={value.onClick}\n isActive={() => key === alignment}\n />\n );\n })}\n </PopoverContent>\n </Popover>\n );\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../utils/classname';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?:\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'\n | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst BaseButton = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : 'button';\n const baseClass =\n 'mly:inline-flex mly:items-center mly:justify-center mly:rounded-md mly:text-sm mly:font-medium mly:ring-offset-white mly:transition-colors mly:focus-visible:outline-hidden mly:focus-visible:ring-2 mly:focus-visible:ring-gray-400 mly:focus-visible:ring-offset-2 mly:focus-visible:relative mly:focus-visible:z-10 mly:disabled:opacity-50 ';\n const variantClasses = {\n default: 'mly:bg-gray-900 mly:text-gray-50 mly:hover:bg-soft-gray',\n destructive: 'mly:bg-red-500 mly:text-gray-50 mly:hover:bg-red-500/90',\n outline:\n 'mly:border mly:border-gray-200 mly:bg-white mly:hover:bg-gray-100 mly:hover:text-gray-900',\n secondary: 'mly:bg-gray-100 mly:text-gray-900 mly:hover:bg-gray-100/80',\n ghost:\n 'mly:hover:bg-soft-gray bg-transparent mly:hover:text-gray-900 mly:data-[state=true]:bg-soft-gray mly:data-[state=true]:text-gray-900',\n link: 'mly:text-gray-900 mly:underline-offset-4 mly:hover:underline',\n };\n const sizeClasses = {\n default: 'mly:h-10 mly:px-4 mly:py-2',\n sm: 'mly:h-9 mly:rounded-md mly:px-3',\n lg: 'mly:h-11 mly:rounded-md mly:px-8',\n icon: 'mly:h-10 mly:w-10',\n };\n\n const classes = cn(\n 'mly-editor',\n baseClass,\n variantClasses[variant],\n sizeClasses[size],\n className\n );\n\n return <Comp className={classes} ref={ref} {...props} />;\n }\n);\n\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '@/editor/utils/classname';\n\n// Explicit type annotations to avoid TS2742 errors\nconst TooltipProvider: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider> & {\n children?: React.ReactNode;\n }\n> = TooltipPrimitive.Provider;\n\nconst Tooltip: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> & {\n children?: React.ReactNode;\n }\n> = TooltipPrimitive.Root;\n\nconst TooltipTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger> & {\n children?: React.ReactNode;\n }\n> = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'mly:z-50 mly:overflow-hidden mly:rounded-md mly:border mly:border-gray-200 mly:bg-white mly:px-2 mly:py-1 mly:text-xs mly:animate-in mly:fade-in-0 mly:zoom-in-95',\n className\n )}\n {...props}\n />\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n>;\n\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { BaseButton } from '@/editor/components/base-button';\nimport { cn } from '@/editor/utils/classname';\nimport { BubbleMenuItem } from './text-menu/text-bubble-menu';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\nexport function BubbleMenuButton(item: BubbleMenuItem) {\n const { tooltip } = item;\n\n const content = (\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n {...(item.command ? { onClick: item.command } : {})}\n data-state={item?.isActive?.()}\n className={cn(\n 'mly:size-7! mly:px-2.5 mly:disabled:cursor-not-allowed',\n item?.className\n )}\n type=\"button\"\n disabled={item.disbabled}\n >\n {item.icon ? (\n <item.icon\n className={cn(\n 'mly:h-3 mly:w-3 mly:shrink-0 mly:stroke-[2.5]',\n item?.iconClassName\n )}\n />\n ) : (\n <span\n className={cn(\n 'mly:text-sm mly:font-medium mly:text-slate-600',\n item?.nameClassName\n )}\n >\n {item.name}\n </span>\n )}\n </BaseButton>\n );\n\n if (tooltip) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n }\n\n return content;\n}\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { LogoView } from './logo-view';\n\nexport const allowedLogoSize = ['sm', 'md', 'lg'] as const;\nexport type AllowedLogoSize = (typeof allowedLogoSize)[number];\n\nexport const allowedLogoAlignment = ['left', 'center', 'right'] as const;\nexport type AllowedLogoAlignment = (typeof allowedLogoAlignment)[number];\n\ninterface LogoOptions {\n src: string;\n alt?: string;\n title?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n}\n\nexport interface LogoAttributes {\n src?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n\n showIfKey: string;\n isSrcVariable?: boolean;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n logo: {\n setLogoImage: (options: LogoOptions) => ReturnType;\n setLogoAttributes: (attributes: Partial<LogoAttributes>) => ReturnType;\n };\n }\n}\n\nconst DEFAULT_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_LOGO_SIZE: AllowedLogoSize = 'sm';\n\nexport const logoSizes: Record<AllowedLogoSize, string> = {\n sm: '40px',\n md: '48px',\n lg: '64px',\n};\n\nexport const LogoExtension = TiptapImage.extend({\n name: 'logo',\n priority: 1000,\n\n addAttributes() {\n return {\n ...this.parent?.(),\n 'maily-component': {\n default: 'logo',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element: Element) =>\n element.getAttribute('data-maily-component'),\n },\n size: {\n default: DEFAULT_LOGO_SIZE,\n parseHTML: (element) =>\n element.getAttribute('data-size') as AllowedLogoSize,\n renderHTML: (attributes) => {\n return {\n 'data-size': attributes.size,\n };\n },\n },\n alignment: {\n default: DEFAULT_ALIGNMENT,\n parseHTML: (element) =>\n element.getAttribute('data-alignment') as AllowedLogoAlignment,\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n };\n },\n addCommands() {\n return {\n setLogoImage:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n setLogoAttributes:\n (attributes) =>\n ({ commands }) => {\n return commands.updateAttributes('logo', attributes);\n },\n };\n },\n parseHTML() {\n return [\n {\n tag: `img[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n addNodeView() {\n return ReactNodeViewRenderer(LogoView, {\n className: 'mly:relative',\n });\n },\n});\n","import { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { useCallback, useEffect } from 'react';\nimport { useState } from 'react';\nimport { LogoAttributes, logoSizes } from './logo';\nimport { ImageStatus, ImageStatusLabel } from '../image/image-view';\nimport { useImageUploadOptions } from '@/editor/extensions/image-upload/image-upload';\nimport { cn } from '@/editor/utils/classname';\n\nexport function LogoView(props: NodeViewProps) {\n const { node, editor, updateAttributes } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n const [isPlaceholderImage, setIsPlaceholderImage] = useState(false);\n const [isDraggingOver, setIsDraggingOver] = useState(false);\n\n const { onImageUpload, allowedMimeTypes = [] } =\n useImageUploadOptions(editor);\n\n let {\n alignment = 'center',\n src: logoSrc,\n isSrcVariable,\n size = 'sm',\n } = (node.attrs || {}) as LogoAttributes;\n\n const hasImageSrc = !!logoSrc;\n const isDroppable =\n !!onImageUpload && editor.isEditable && !isSrcVariable && status === 'idle';\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isDroppable || !e.target.files || e.target.files.length === 0) {\n return;\n }\n\n const file = e.target.files[0];\n await handleImageUpload(file);\n };\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n if (!isDroppable) {\n return;\n }\n\n try {\n setStatus('loading');\n const imageUrl = await onImageUpload(file);\n updateAttributes({ src: imageUrl });\n setIsPlaceholderImage(false);\n setStatus('loaded');\n } catch (error) {\n console.error('Error uploading image:', error);\n setStatus('error');\n }\n },\n [onImageUpload, updateAttributes]\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(true);\n },\n [onImageUpload]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n },\n [onImageUpload]\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n const files = e.dataTransfer?.files;\n if (!files || files?.length === 0) {\n return;\n }\n\n const firstFile = files[0];\n if (!allowedMimeTypes.includes(firstFile.type)) {\n return;\n }\n\n await handleImageUpload(firstFile);\n },\n [handleImageUpload]\n );\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!logoSrc) {\n return;\n }\n\n setStatus('loading');\n const isPlaceHolder =\n editor?.extensionStorage?.imageUpload?.placeholderImages?.has(logoSrc) ??\n false;\n setIsPlaceholderImage(isPlaceHolder);\n const img = new Image();\n img.src = logoSrc;\n img.onload = () => {\n setStatus('loaded');\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [logoSrc]);\n\n const logoSize = logoSizes[size];\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n style={{\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n }}\n className={cn('mly-image-drop-zone', isDraggingOver && 'mly-drag-over')}\n {...(isDroppable\n ? {\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n }\n : {})}\n >\n {!hasImageSrc && status === 'idle' && (\n <ImageStatusLabel\n status=\"idle\"\n minHeight={logoSize}\n isDropZone={isDroppable}\n />\n )}\n\n {!hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={logoSize} />\n )}\n\n {hasImageSrc && isSrcVariable && (\n <ImageStatusLabel status=\"variable\" minHeight={logoSize} />\n )}\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={logoSize} />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" minHeight={logoSize} />\n )}\n\n {isDroppable && (\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"mly:absolute mly:inset-0 mly:opacity-0\"\n multiple={false}\n />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <img\n src={logoSrc}\n alt=\"Logo\"\n style={{\n height: logoSize,\n width: logoSize,\n cursor: 'default',\n marginBottom: 0,\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment] || {}),\n }}\n draggable={editor.isEditable}\n />\n )}\n </NodeViewWrapper>\n );\n}\n","import {\n type CSSProperties,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { type NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Ban, BracesIcon, GrabIcon, ImageOffIcon, Loader2 } from 'lucide-react';\nimport { useImageUploadOptions } from '@/editor/extensions/image-upload/image-upload';\nimport { cn } from '@/editor/utils/classname';\nimport { useEvent } from '@/editor/utils/use-event';\nimport { getAspectRatio, getNewHeight } from '@/editor/utils/aspect-ratio';\n\nconst MIN_WIDTH = 20;\nexport const IMAGE_MAX_WIDTH = 600;\nexport const IMAGE_MAX_HEIGHT = 400;\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport function ImageView(props: NodeViewProps) {\n const { node, updateAttributes, selected, editor } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n const [isPlaceholderImage, setIsPlaceholderImage] = useState(false);\n\n const { onImageUpload, allowedMimeTypes = [] } =\n useImageUploadOptions(editor);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const [resizingStyle, setResizingStyle] = useState<\n Pick<CSSProperties, 'width' | 'height'> | undefined\n >();\n\n const [isDraggingOver, setIsDraggingOver] = useState(false);\n\n const handleMouseDown = useEvent(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const imageParent = document.querySelector(\n '.ProseMirror-selectednode'\n ) as HTMLDivElement;\n\n if (!imgRef.current || !imageParent || !selected) {\n return;\n }\n\n const imageParentWidth = Math.max(\n imageParent.offsetWidth,\n IMAGE_MAX_WIDTH\n );\n\n event.preventDefault();\n const direction = event.currentTarget.dataset.direction || '--';\n const initialXPosition = event.clientX;\n const initialYPosition = event.clientY;\n const currentWidth = imgRef.current.width;\n const currentHeight = imgRef.current.height;\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n const transformX = direction[1] === 'w' ? -1 : 1;\n const transformY = direction[0] === 'n' ? -1 : 1;\n\n const removeListeners = () => {\n window.removeEventListener('mousemove', mouseMoveHandler);\n window.removeEventListener('mouseup', removeListeners);\n const aspectRatio = getAspectRatio(newWidth, newHeight);\n updateAttributes({ width: newWidth, height: newHeight, aspectRatio });\n setResizingStyle(undefined);\n };\n\n const mouseMoveHandler = (event: MouseEvent) => {\n newWidth = Math.max(\n currentWidth + transformX * (event.clientX - initialXPosition),\n MIN_WIDTH\n );\n newHeight = Math.max(\n currentHeight + transformY * (event.clientY - initialYPosition),\n MIN_WIDTH\n );\n\n if (newWidth > imageParentWidth) {\n newWidth = imageParentWidth;\n }\n if (newHeight > IMAGE_MAX_HEIGHT) {\n newHeight = IMAGE_MAX_HEIGHT;\n }\n\n // If aspect ratio is locked, calculate height based on aspect ratio\n if (node.attrs.lockAspectRatio) {\n newHeight = getNewHeight(newWidth, node.attrs.aspectRatio);\n }\n\n setResizingStyle({ width: newWidth, height: newHeight });\n // If mouse is up, remove event listeners\n if (!event.buttons) {\n return removeListeners();\n }\n };\n\n window.addEventListener('mousemove', mouseMoveHandler);\n window.addEventListener('mouseup', removeListeners);\n }\n );\n\n const dragCornerButton = useCallback(\n (direction: string) => {\n if (isPlaceholderImage) {\n return null;\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onMouseDown={handleMouseDown}\n data-direction={direction}\n className=\"mly:bg-rose-500\"\n style={{\n position: 'absolute',\n height: '10px',\n width: '10px',\n ...{ n: { top: 0 }, s: { bottom: 0 } }[direction[0]],\n ...{ w: { left: 0 }, e: { right: 0 } }[direction[1]],\n cursor: `${direction}-resize`,\n }}\n />\n );\n },\n [handleMouseDown, isPlaceholderImage]\n );\n\n let {\n alignment = 'center',\n width,\n height,\n src,\n borderRadius,\n } = node.attrs || {};\n\n const {\n externalLink,\n isExternalLinkVariable,\n isSrcVariable,\n showIfKey,\n aspectRatio: defaultAspectRatio,\n borderRadius: _,\n lockAspectRatio,\n ...attrs\n } = node.attrs || {};\n\n const hasImageSrc = !!attrs.src;\n const isDroppable =\n !!onImageUpload &&\n editor.isEditable &&\n !hasImageSrc &&\n !isSrcVariable &&\n status === 'idle';\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isDroppable || !e.target.files || e.target.files.length === 0) {\n return;\n }\n\n const file = e.target.files[0];\n await handleImageUpload(file);\n };\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n if (!isDroppable) {\n return;\n }\n\n try {\n setStatus('loading');\n const imageUrl = await onImageUpload(file);\n updateAttributes({ src: imageUrl });\n setIsPlaceholderImage(false);\n setStatus('loaded');\n } catch (error) {\n console.error('Error uploading image:', error);\n setStatus('error');\n }\n },\n [onImageUpload, updateAttributes]\n );\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!src || isSrcVariable) {\n return;\n }\n\n setStatus('loading');\n const isPlaceHolder =\n editor?.extensionStorage?.imageUpload?.placeholderImages?.has(src) ??\n false;\n setIsPlaceholderImage(isPlaceHolder);\n const img = new Image();\n img.src = src;\n img.onload = () => {\n setStatus('loaded');\n // for some reason Apple Mail doesn't respect the width and height attributes\n // update the dimensions to ensure that the image is not stretched\n const { naturalWidth, naturalHeight } = img;\n const wrapper = wrapperRef?.current;\n\n if (!wrapper || width !== 'auto' || !naturalWidth) {\n return;\n }\n\n const wrapperWidth = wrapper.offsetWidth;\n const aspectRatio = getAspectRatio(naturalWidth, naturalHeight);\n const calculatedHeight = Math.min(\n getNewHeight(wrapperWidth, aspectRatio),\n naturalHeight\n );\n\n updateAttributes({\n width: Math.min(wrapperWidth, naturalWidth),\n height: Math.min(calculatedHeight, naturalHeight),\n aspectRatio,\n });\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [src]);\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(true);\n },\n [onImageUpload]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n },\n [onImageUpload]\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (!isDroppable) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n const files = e.dataTransfer?.files;\n if (!files || files?.length === 0) {\n return;\n }\n\n const firstFile = files[0];\n if (!allowedMimeTypes.includes(firstFile.type)) {\n return;\n }\n\n await handleImageUpload(firstFile);\n },\n [handleImageUpload]\n );\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n className={cn('mly-image-drop-zone', isDraggingOver && 'mly-drag-over')}\n style={{\n ...(hasImageSrc && status === 'loaded'\n ? {\n width: width ? `${width}px` : undefined,\n height: height ? `${height}px` : undefined,\n ...resizingStyle,\n }\n : {}),\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n maxWidth: '100%',\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment as string] || {}),\n }}\n ref={wrapperRef}\n {...(isDroppable\n ? {\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n }\n : {})}\n >\n {!hasImageSrc && status === 'idle' && (\n <ImageStatusLabel\n status=\"idle\"\n minHeight={height}\n isDropZone={isDroppable}\n />\n )}\n\n {!hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={height} />\n )}\n\n {hasImageSrc && isSrcVariable && (\n <ImageStatusLabel status=\"variable\" minHeight={height} />\n )}\n\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" minHeight={height} />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" minHeight={height} />\n )}\n\n {isDroppable && (\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"mly:absolute mly:inset-0 mly:opacity-0\"\n multiple={false}\n />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <>\n <img\n {...attrs}\n ref={imgRef}\n style={{\n ...resizingStyle,\n cursor: 'default',\n objectFit: 'fill',\n marginBottom: 0,\n borderRadius,\n width: resizingStyle?.width\n ? `${resizingStyle.width}px`\n : width\n ? `${width}px`\n : 'auto',\n height: resizingStyle?.height\n ? `${resizingStyle.height}px`\n : height\n ? `${height}px`\n : 'auto',\n }}\n draggable={editor.isEditable}\n className={cn(\n isPlaceholderImage && 'mly:animate-pulse mly:opacity-40'\n )}\n />\n\n {selected && editor.isEditable && !isPlaceholderImage && (\n <>\n {/* Don't use a simple border as it pushes other content around. */}\n {[\n { left: 0, top: 0, height: '100%', width: '1px' },\n { right: 0, top: 0, height: '100%', width: '1px' },\n { top: 0, left: 0, width: '100%', height: '1px' },\n { bottom: 0, left: 0, width: '100%', height: '1px' },\n ].map((style, i) => (\n <div\n key={i}\n className=\"mly:bg-rose-500\"\n style={{\n position: 'absolute',\n ...style,\n }}\n />\n ))}\n {dragCornerButton('nw')}\n {dragCornerButton('ne')}\n {dragCornerButton('sw')}\n {dragCornerButton('se')}\n </>\n )}\n </>\n )}\n </NodeViewWrapper>\n );\n}\n\ntype ImageStatusLabelProps = {\n status: ImageStatus | 'variable';\n minHeight?: number | string;\n isDropZone?: boolean;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nexport function ImageStatusLabel(props: ImageStatusLabelProps) {\n const { status, minHeight, className, style, isDropZone, ...rest } = props;\n\n return (\n <div\n {...rest}\n className={cn(\n 'mly:flex mly:items-center mly:justify-center mly:gap-2 mly:rounded-lg mly:bg-soft-gray mly:px-4 mly:py-2 mly:text-sm mly:font-medium',\n {\n 'mly:text-gray-500 mly:hover:bg-soft-gray/60': status === 'loading',\n 'mly:text-red-500 mly:hover:bg-soft-gray/60': status === 'error',\n },\n className\n )}\n style={{\n ...(minHeight\n ? {\n minHeight,\n }\n : {}),\n ...style,\n }}\n >\n {status === 'idle' && !isDropZone && (\n <>\n <ImageOffIcon className=\"mly:size-4 mly:stroke-[2.5]\" />\n <span>No image selected</span>\n </>\n )}\n\n {status === 'idle' && isDropZone && (\n <>\n <GrabIcon className=\"mly:size-4 mly:stroke-[2.5]\" />\n <span>Click or Drop image here</span>\n </>\n )}\n\n {status === 'loading' && (\n <>\n <Loader2 className=\"mly:size-4 mly:animate-spin mly:stroke-[2.5]\" />\n <span>Loading image...</span>\n </>\n )}\n {status === 'error' && (\n <>\n <Ban className=\"mly:size-4 mly:stroke-[2.5]\" />\n <span>Error loading image</span>\n </>\n )}\n {status === 'variable' && (\n <>\n <BracesIcon className=\"mly:size-4 mly:stroke-[2.5]\" />\n <span>Variable Image URL</span>\n </>\n )}\n </div>\n );\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react';\n\nexport const useEvent = <T extends (...args: any[]) => any>(handler: T): T => {\n const handlerRef = useRef<T | null>(null);\n\n useLayoutEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n return useCallback((...args: Parameters<T>): ReturnType<T> => {\n if (handlerRef.current === null) {\n throw new Error('Handler is not assigned');\n }\n return handlerRef.current(...args);\n }, []) as T;\n};\n","/**\n * Calculates the aspect ratio from image dimensions\n * @param width - The width of the image\n * @param height - The height of the image\n * @returns The aspect ratio as width/height\n */\nexport function getAspectRatio(width: number, height: number): number {\n return width / height;\n}\n\n/**\n * Calculates new height based on width and aspect ratio\n * @param width - The new width\n * @param aspectRatio - The aspect ratio (width/height)\n * @returns The corresponding height\n */\nexport function getNewHeight(width: number, aspectRatio: number): number {\n if (width <= 0 || aspectRatio <= 0) {\n return 0;\n }\n return width / aspectRatio;\n}\n\n/**\n * Calculates new width based on height and aspect ratio\n * @param height - The new height\n * @param aspectRatio - The aspect ratio (width/height)\n * @returns The corresponding width\n */\nexport function getNewWidth(height: number, aspectRatio: number): number {\n return height * aspectRatio;\n}\n","'use client';\n\nimport { HexColorPicker, HexColorInput } from 'react-colorful';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ReactNode } from 'react';\n\ntype ColorPickerProps = {\n color: string;\n onColorChange: (color: string) => void;\n\n borderColor?: string;\n backgroundColor?: string;\n tooltip?: string;\n className?: string;\n\n children?: ReactNode;\n onClose?: (color: string) => void;\n suggestedColors?: string[];\n};\n\nexport function ColorPicker(props: ColorPickerProps) {\n const {\n color,\n onColorChange,\n borderColor,\n backgroundColor,\n tooltip,\n className,\n\n children,\n onClose,\n\n suggestedColors = [],\n } = props;\n\n const handleColorChange = (color: string) => {\n // HACK: This is a workaround for a bug in tiptap\n // https://github.com/ueberdosis/tiptap/issues/3580\n //\n // ERROR: flushSync was called from inside a lifecycle\n //\n // To fix this, we need to make sure that the onChange\n // callback is run after the current execution context.\n queueMicrotask(() => {\n onColorChange(color);\n });\n };\n\n const popoverButton = (\n <PopoverTrigger asChild>\n {children || (\n <BaseButton\n variant=\"ghost\"\n className=\"mly:h-7 mly:w-7 mly:shrink-0\"\n size=\"sm\"\n type=\"button\"\n >\n <div\n className={cn(\n 'mly:h-4 mly:w-4 mly:shrink-0 mly:rounded mly:border-2 mly:border-gray-700',\n className\n )}\n style={{\n ...(borderColor ? { borderColor } : {}),\n backgroundColor: backgroundColor || 'transparent',\n }}\n />\n </BaseButton>\n )}\n </PopoverTrigger>\n );\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (!open) {\n onClose?.(color);\n }\n }}\n >\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n className=\"mly:w-full mly:rounded-none mly:border-0 mly:bg-transparent! mly:p-0! mly:shadow-none mly:drop-shadow-md\"\n sideOffset={8}\n >\n <div className=\"mly:min-w-[260px] mly:rounded-xl mly:border mly:border-gray-200 mly:bg-white mly:p-4\">\n <HexColorPicker\n color={color}\n onChange={handleColorChange}\n className=\"mly:flex mly:w-full! mly:flex-col mly:gap-4\"\n />\n <HexColorInput\n alpha={true}\n color={color}\n onChange={handleColorChange}\n className=\"mly:mt-4 mly:w-full mly:min-w-0 mly:rounded-lg mly:border mly:border-gray-200 mly:bg-white mly:px-2 mly:py-1.5 mly:text-sm mly:uppercase mly:focus-visible:border-gray-400 mly:focus-visible:outline-hidden\"\n prefixed\n />\n\n {suggestedColors.length > 0 && (\n <div>\n <div className=\"-mly:mx-4 mly:my-4 mly:h-px mly:bg-gray-200\" />\n\n <h2 className=\"mly:text-xs mly:text-gray-500\">Recently used</h2>\n\n <div className=\"mly:mt-2 mly:flex mly:flex-wrap mly:gap-0.5\">\n {suggestedColors.map((suggestedColor) => (\n <BaseButton\n key={suggestedColor}\n variant=\"ghost\"\n size=\"sm\"\n className=\"!mly:size-7 mly:shrink-0\"\n type=\"button\"\n onClick={() => handleColorChange(suggestedColor)}\n >\n <div\n className=\"mly:h-4 mly:w-4 mly:shrink-0 mly:rounded\"\n style={{\n backgroundColor: suggestedColor,\n }}\n />\n </BaseButton>\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import { cn } from '@/editor/utils/classname';\n\ntype Props = {\n type?: 'horizontal' | 'vertical';\n className?: string;\n};\n\nexport function Divider(props: Props) {\n const { type = 'vertical', className } = props;\n\n return (\n <div\n className={cn(\n 'mly:shrink-0 mly:bg-gray-200',\n type === 'vertical' ? 'mly:mx-0.5 mly:w-px' : 'mly:my-0.5 mly:h-px',\n className\n )}\n />\n );\n}\n","import { Link, LinkIcon, LucideIcon } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { useRef, useState } from 'react';\nimport { Tooltip, TooltipTrigger, TooltipContent } from './tooltip';\nimport { DEFAULT_PLACEHOLDER_URL, useMailyContext } from '@/editor/provider';\nimport { InputAutocomplete } from './input-autocomplete';\nimport { processVariables } from '@/editor/utils/variable';\nimport { useMemo } from 'react';\nimport { Editor } from '@tiptap/core';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { DEFAULT_VARIABLE_TRIGGER_CHAR } from '@/editor/nodes/variable/variable';\n\ntype LinkInputPopoverProps = {\n defaultValue?: string;\n isVariable?: boolean;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n\n icon?: LucideIcon;\n tooltip?: string;\n\n editor: Editor;\n};\n\nexport function LinkInputPopover(props: LinkInputPopoverProps) {\n const {\n defaultValue = '',\n onValueChange,\n tooltip,\n icon: Icon = Link,\n editor,\n\n isVariable,\n } = props;\n\n const [isOpen, setIsOpen] = useState(false);\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n\n const { placeholderUrl = DEFAULT_PLACEHOLDER_URL } = useMailyContext();\n const options = useVariableOptions(editor);\n\n const renderVariable = options?.renderVariable;\n const variables = options?.variables;\n const variableTriggerCharacter =\n options?.suggestion?.char ?? DEFAULT_VARIABLE_TRIGGER_CHAR;\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = defaultValue.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, variableTriggerCharacter, defaultValue, editor]);\n\n const popoverButton = (\n <PopoverTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly:h-7! mly:w-7!\"\n data-state={!!defaultValue}\n >\n <Icon className=\"mly:h-3 mly:w-3 mly:shrink-0 mly:stroke-[2.5] mly:text-midnight-gray\" />\n </BaseButton>\n </PopoverTrigger>\n );\n\n return (\n <Popover\n open={isOpen}\n onOpenChange={(open) => {\n setIsOpen(open);\n if (open) {\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }\n }}\n >\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly:w-max mly:rounded-none mly:border-none mly:bg-transparent mly:p-0! mly:shadow-none\"\n sideOffset={8}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const input = linkInputRef.current;\n if (!input) {\n return;\n }\n\n onValueChange?.(input.value);\n setIsOpen(false);\n }}\n >\n <div className=\"mly:isolate mly:flex mly:rounded-lg\">\n {!isEditing && (\n <div className=\"mly:flex mly:h-8 mly:items-center mly:rounded-lg mly:border mly:border-gray-300 mly:bg-white mly:px-0.5\">\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: defaultValue,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n </div>\n )}\n\n {isEditing && (\n <div className=\"mly:relative\">\n <div className=\"mly:absolute mly:inset-y-0 mly:left-1.5 mly:z-10 mly:flex mly:items-center\">\n <LinkIcon className=\"mly:h-3 mly:w-3 mly:stroke-[2.5] mly:text-midnight-gray\" />\n </div>\n\n <InputAutocomplete\n editor={editor}\n value={defaultValue}\n onValueChange={(value) => {\n onValueChange?.(value);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder={placeholderUrl}\n className=\"-mly:ms-px mly:block mly:h-8 mly:w-56 mly:rounded-lg mly:border mly:border-gray-300 mly:px-2 mly:py-1.5 mly:pl-6 mly:pr-6 mly:text-sm mly:shadow-sm mly:outline-hidden mly:placeholder:text-gray-400\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable =\n autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n }\n\n onValueChange?.(value, isVariable);\n setIsOpen(false);\n }}\n />\n </div>\n )}\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n","'use client';\n\nimport { BlockGroupItem } from '@/blocks/types';\nimport { createContext, PropsWithChildren, useContext } from 'react';\nimport { DEFAULT_SLASH_COMMANDS } from './extensions/slash-command/default-slash-commands';\n\nexport const DEFAULT_PLACEHOLDER_URL = 'https://maily.to/';\n\nexport type MailyContextType = {\n placeholderUrl?: string;\n blocks?: BlockGroupItem[];\n};\n\nexport const MailyContext = createContext<MailyContextType>({\n placeholderUrl: DEFAULT_PLACEHOLDER_URL,\n blocks: DEFAULT_SLASH_COMMANDS,\n});\n\ntype MailyProviderProps = PropsWithChildren<MailyContextType>;\n\nexport function MailyProvider(props: MailyProviderProps) {\n const { children, ...defaultValues } = props;\n\n return (\n <MailyContext.Provider value={defaultValues}>\n {children}\n </MailyContext.Provider>\n );\n}\n\nexport function useMailyContext() {\n const values = useContext(MailyContext);\n if (!values) {\n throw new Error('Missing MailyContext.Provider in the component tree');\n }\n\n return values;\n}\n","import { FootprintsIcon, Heading1 } from 'lucide-react';\nimport { button, linkCard } from '@/blocks/button';\nimport { htmlCodeBlock } from '@/blocks/code';\nimport { image, inlineImage, logo } from '@/blocks/image';\nimport { columns, divider, repeat, section, spacer } from '@/blocks/layout';\nimport { bulletList, orderedList } from '@/blocks/list';\nimport { BlockGroupItem } from '@/blocks/types';\nimport {\n blockquote,\n clearLine,\n footer,\n hardBreak,\n heading1,\n heading2,\n heading3,\n text,\n} from '@/blocks/typography';\nimport {\n headerLogoWithCoverImage,\n headerLogoWithTextHorizontal,\n headerLogoWithTextVertical,\n} from '@/blocks/headers';\nimport {\n footerCopyrightText,\n footerCommunityFeedbackCta,\n footerCompanySignature,\n} from '@/blocks/footers';\n\nexport const DEFAULT_SLASH_COMMANDS: BlockGroupItem[] = [\n {\n title: 'Blocks',\n commands: [\n text,\n heading1,\n heading2,\n heading3,\n bulletList,\n orderedList,\n image,\n logo,\n inlineImage,\n columns,\n section,\n repeat,\n divider,\n spacer,\n button,\n linkCard,\n hardBreak,\n blockquote,\n footer,\n clearLine,\n ],\n },\n {\n title: 'Components',\n commands: [\n {\n id: 'headers',\n title: 'Headers',\n description: 'Add pre-designed headers block',\n searchTerms: ['header', 'headers'],\n icon: <Heading1 className=\"mly:h-4 mly:w-4\" />,\n preview: 'https://cdn.usemaily.com/previews/header-preview-xyz.png',\n commands: [\n headerLogoWithTextVertical,\n headerLogoWithTextHorizontal,\n headerLogoWithCoverImage,\n ],\n },\n {\n id: 'footers',\n title: 'Footers',\n description: 'Add pre-designed footers block',\n searchTerms: ['footers'],\n icon: <FootprintsIcon className=\"mly:h-4 mly:w-4\" />,\n commands: [\n footerCopyrightText,\n footerCommunityFeedbackCta,\n footerCompanySignature,\n ],\n },\n htmlCodeBlock,\n ],\n },\n];\n","import type { BlockItem } from './types';\nimport { MousePointer, ArrowUpRightSquare } from 'lucide-react';\n\nexport const button: BlockItem = {\n title: 'Button',\n description: 'Add a call to action button to email.',\n searchTerms: ['link', 'button', 'cta'],\n icon: <MousePointer className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setButton().run();\n },\n};\n\nexport const linkCard: BlockItem = {\n title: 'Link Card',\n description: 'Add a link card to email.',\n searchTerms: ['link', 'button', 'image'],\n icon: <ArrowUpRightSquare className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLinkCard().run();\n },\n render: (editor) => {\n return editor.extensionManager.extensions.findIndex(\n (ext) => ext.name === 'linkCard'\n ) === -1\n ? null\n : true;\n },\n};\n","import { CodeXmlIcon } from 'lucide-react';\nimport { BlockItem } from './types';\n\nexport const htmlCodeBlock: BlockItem = {\n title: 'Custom HTML',\n description: 'Insert a custom HTML block',\n searchTerms: ['html', 'code', 'custom'],\n icon: <CodeXmlIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setHtmlCodeBlock({ language: 'html' })\n .run();\n },\n};\n","import { NodeSelection, Selection, TextSelection } from '@tiptap/pm/state';\nimport type { BlockItem } from './types';\nimport { ImageIcon } from 'lucide-react';\n\nexport const image: BlockItem = {\n title: 'Image',\n description: 'Full width image',\n searchTerms: ['image'],\n icon: <ImageIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setImage({ src: '' }).run();\n },\n};\n\nexport const logo: BlockItem = {\n title: 'Logo',\n description: 'Add your brand logo',\n searchTerms: ['image', 'logo'],\n icon: <ImageIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLogoImage({ src: '' }).run();\n },\n};\n\nexport const inlineImage: BlockItem = {\n title: 'Inline Image',\n description: 'Inline image',\n searchTerms: ['image', 'inline'],\n icon: <ImageIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setInlineImage({\n src: 'https://maily.to/brand/logo.png',\n })\n // @ts-ignore\n .command((props) => {\n const { tr, state, view, editor } = props;\n const { from } = range;\n\n const node = state.doc.nodeAt(from);\n if (!node) {\n return false;\n }\n\n const selection = TextSelection.create(\n tr.doc,\n from,\n from + node.nodeSize\n );\n tr.setSelection(selection);\n return true;\n })\n .run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n ColumnsIcon,\n Repeat2,\n MoveVertical,\n RectangleHorizontal,\n Minus,\n} from 'lucide-react';\n\nexport const columns: BlockItem = {\n title: 'Columns',\n description: 'Add columns to email.',\n searchTerms: ['layout', 'columns'],\n icon: <ColumnsIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setColumns()\n .focus(editor.state.selection.head - 2)\n .run();\n },\n};\n\nexport const section: BlockItem = {\n title: 'Section',\n description: 'Add a section to email.',\n searchTerms: ['layout', 'section'],\n icon: <RectangleHorizontal className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSection().run();\n },\n};\n\nexport const repeat: BlockItem = {\n title: 'Repeat',\n description: 'Loop over an array of items.',\n searchTerms: ['repeat', 'for', 'loop'],\n icon: <Repeat2 className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setRepeat().run();\n },\n};\n\nexport const spacer: BlockItem = {\n title: 'Spacer',\n description: 'Add space between blocks.',\n searchTerms: ['space', 'gap', 'divider'],\n icon: <MoveVertical className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSpacer({ height: 'sm' }).run();\n },\n};\n\nexport const divider: BlockItem = {\n title: 'Divider',\n description: 'Add a horizontal divider.',\n searchTerms: ['divider', 'line'],\n icon: <Minus className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHorizontalRule().run();\n },\n};\n","import type { BlockItem } from './types';\nimport { List, ListOrdered } from 'lucide-react';\n\nexport const bulletList: BlockItem = {\n title: 'Bullet List',\n description: 'Create a simple bullet list.',\n searchTerms: ['unordered', 'point'],\n icon: <List className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n};\n\nexport const orderedList: BlockItem = {\n title: 'Numbered List',\n description: 'Create a list with numbering.',\n searchTerms: ['ordered'],\n icon: <ListOrdered className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n Text,\n Heading1,\n Heading2,\n Heading3,\n DivideIcon,\n TextQuote,\n FootprintsIcon,\n EraserIcon,\n} from 'lucide-react';\n\nexport const text: BlockItem = {\n title: 'Text',\n description: 'Just start typing with plain text.',\n searchTerms: ['p', 'paragraph'],\n icon: <Text className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n};\n\nexport const heading1: BlockItem = {\n title: 'Heading 1',\n description: 'Big heading.',\n searchTerms: ['h1', 'title', 'big', 'large'],\n icon: <Heading1 className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n};\n\nexport const heading2: BlockItem = {\n title: 'Heading 2',\n description: 'Medium heading.',\n searchTerms: ['h2', 'subtitle', 'medium'],\n icon: <Heading2 className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n};\n\nexport const heading3: BlockItem = {\n title: 'Heading 3',\n description: 'Small heading.',\n searchTerms: ['h3', 'subtitle', 'small'],\n icon: <Heading3 className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n};\n\nexport const hardBreak: BlockItem = {\n title: 'Hard Break',\n description: 'Add a break between lines.',\n searchTerms: ['break', 'line'],\n icon: <DivideIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHardBreak().run();\n },\n};\n\nexport const blockquote: BlockItem = {\n title: 'Blockquote',\n description: 'Add blockquote.',\n searchTerms: ['quote', 'blockquote'],\n icon: <TextQuote className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBlockquote().run();\n },\n};\n\nexport const footer: BlockItem = {\n title: 'Footer',\n description: 'Add a footer text to email.',\n searchTerms: ['footer', 'text'],\n icon: <FootprintsIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setFooter().run();\n },\n};\n\nexport const clearLine: BlockItem = {\n title: 'Clear Line',\n description: 'Clear the current line.',\n searchTerms: ['clear', 'line'],\n icon: <EraserIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().selectParentNode().deleteSelection().run();\n },\n};\n","import { SVGProps } from 'react';\n\nexport function LogoWithCoverImageIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.97634 1.4502H9.02405C9.70389 1.4502 10.2476 1.45019 10.687 1.48609C11.1379 1.52293 11.527 1.6003 11.8849 1.78263C12.4588 2.07504 12.9254 2.54164 13.2178 3.11553C13.4001 3.47338 13.4775 3.86253 13.5143 4.31342C13.5502 4.75277 13.5502 5.29652 13.5502 5.97637V8.02403C13.5502 8.70388 13.5502 9.24763 13.5143 9.68698C13.4775 10.1379 13.4001 10.527 13.2178 10.8849C12.9254 11.4588 12.4588 11.9254 11.8849 12.2178C11.527 12.4001 11.1379 12.4775 10.687 12.5143C10.2476 12.5502 9.70387 12.5502 9.02402 12.5502H4.97636C4.29651 12.5502 3.75276 12.5502 3.31341 12.5143C2.86252 12.4775 2.47337 12.4001 2.11552 12.2178C1.54163 11.9254 1.07504 11.4588 0.782626 10.8849C0.600293 10.527 0.522922 10.1379 0.486083 9.68698C0.450187 9.24764 0.45019 8.70389 0.450195 8.02405V5.97635C0.45019 5.29651 0.450187 4.75276 0.486083 4.31342C0.522922 3.86253 0.600293 3.47338 0.782626 3.11553C1.07504 2.54164 1.54163 2.07504 2.11552 1.78263C2.47337 1.6003 2.86252 1.52293 3.31341 1.48609C3.75276 1.45019 4.2965 1.4502 4.97634 1.4502ZM3.40298 2.58243C3.02012 2.61372 2.79184 2.67259 2.61491 2.76274C2.248 2.94969 1.94968 3.248 1.76273 3.61492C1.67258 3.79185 1.61371 4.02013 1.58243 4.40299C1.55062 4.79228 1.55019 5.29106 1.55019 6.0002V8.0002C1.55019 8.70934 1.55062 9.20812 1.58243 9.59741C1.61371 9.98028 1.67258 10.2086 1.76273 10.3855C1.94968 10.7524 2.248 11.0507 2.61491 11.2377C2.79184 11.3278 3.02012 11.3867 3.40298 11.418C3.79227 11.4498 4.29105 11.4502 5.00019 11.4502H9.00019C9.70933 11.4502 10.2081 11.4498 10.5974 11.418C10.9803 11.3867 11.2086 11.3278 11.3855 11.2377C11.7524 11.0507 12.0507 10.7524 12.2377 10.3855C12.3278 10.2086 12.3867 9.98028 12.418 9.59741C12.4498 9.20812 12.4502 8.70934 12.4502 8.0002V6.0002C12.4502 5.29106 12.4498 4.79228 12.418 4.40299C12.3867 4.02013 12.3278 3.79185 12.2377 3.61492C12.0507 3.248 11.7524 2.94969 11.3855 2.76274C11.2086 2.67259 10.9803 2.61372 10.5974 2.58243C10.2081 2.55063 9.70933 2.5502 9.00019 2.5502H5.00019C4.29105 2.5502 3.79227 2.55063 3.40298 2.58243Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.1999 0.450195C4.50366 0.450195 4.7499 0.696438 4.7499 1.00019V2.75019C4.7499 3.05395 4.50366 3.30019 4.1999 3.30019C3.89614 3.30019 3.6499 3.05395 3.6499 2.75019V1.00019C3.6499 0.696438 3.89614 0.450195 4.1999 0.450195Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.8 0.450195C10.1037 0.450195 10.35 0.696438 10.35 1.00019V2.75019C10.35 3.05395 10.1037 3.30019 9.8 3.30019C9.49625 3.30019 9.25 3.05395 9.25 2.75019V1.00019C9.25 0.696438 9.49625 0.450195 9.8 0.450195Z\"\n fill=\"currentColor\"\n />\n <mask id=\"path-4-inside-1_1046_19527\" fill=\"white\">\n <rect x=\"3\" y=\"4\" width=\"8\" height=\"3\" rx=\"0.5\" />\n </mask>\n <rect\n x=\"3\"\n y=\"4\"\n width=\"8\"\n height=\"3\"\n rx=\"0.5\"\n stroke=\"black\"\n strokeWidth=\"2\"\n mask=\"url(#path-4-inside-1_1046_19527)\"\n />\n <rect\n x=\"6.25\"\n y=\"8.25\"\n width=\"4.5\"\n height=\"0.5\"\n rx=\"0.25\"\n stroke=\"black\"\n strokeWidth=\"0.5\"\n />\n <rect x=\"3\" y=\"8\" width=\"2\" height=\"1\" rx=\"0.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function LogoWithTextHorizonIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.97634 1.4502H9.02405C9.70389 1.4502 10.2476 1.45019 10.687 1.48609C11.1379 1.52293 11.527 1.6003 11.8849 1.78263C12.4588 2.07504 12.9254 2.54164 13.2178 3.11553C13.4001 3.47338 13.4775 3.86253 13.5143 4.31342C13.5502 4.75277 13.5502 5.29652 13.5502 5.97637V8.02403C13.5502 8.70388 13.5502 9.24763 13.5143 9.68698C13.4775 10.1379 13.4001 10.527 13.2178 10.8849C12.9254 11.4588 12.4588 11.9254 11.8849 12.2178C11.527 12.4001 11.1379 12.4775 10.687 12.5143C10.2476 12.5502 9.70387 12.5502 9.02402 12.5502H4.97636C4.29651 12.5502 3.75276 12.5502 3.31341 12.5143C2.86252 12.4775 2.47337 12.4001 2.11552 12.2178C1.54163 11.9254 1.07504 11.4588 0.782626 10.8849C0.600293 10.527 0.522922 10.1379 0.486083 9.68698C0.450187 9.24764 0.45019 8.70389 0.450195 8.02405V5.97635C0.45019 5.29651 0.450187 4.75276 0.486083 4.31342C0.522922 3.86253 0.600293 3.47338 0.782626 3.11553C1.07504 2.54164 1.54163 2.07504 2.11552 1.78263C2.47337 1.6003 2.86252 1.52293 3.31341 1.48609C3.75276 1.45019 4.2965 1.4502 4.97634 1.4502ZM3.40298 2.58243C3.02012 2.61372 2.79184 2.67259 2.61491 2.76274C2.248 2.94969 1.94968 3.248 1.76273 3.61492C1.67258 3.79185 1.61371 4.02013 1.58243 4.40299C1.55062 4.79228 1.55019 5.29106 1.55019 6.0002V8.0002C1.55019 8.70934 1.55062 9.20812 1.58243 9.59741C1.61371 9.98028 1.67258 10.2086 1.76273 10.3855C1.94968 10.7524 2.248 11.0507 2.61491 11.2377C2.79184 11.3278 3.02012 11.3867 3.40298 11.418C3.79227 11.4498 4.29105 11.4502 5.00019 11.4502H9.00019C9.70933 11.4502 10.2081 11.4498 10.5974 11.418C10.9803 11.3867 11.2086 11.3278 11.3855 11.2377C11.7524 11.0507 12.0507 10.7524 12.2377 10.3855C12.3278 10.2086 12.3867 9.98028 12.418 9.59741C12.4498 9.20812 12.4502 8.70934 12.4502 8.0002V6.0002C12.4502 5.29106 12.4498 4.79228 12.418 4.40299C12.3867 4.02013 12.3278 3.79185 12.2377 3.61492C12.0507 3.248 11.7524 2.94969 11.3855 2.76274C11.2086 2.67259 10.9803 2.61372 10.5974 2.58243C10.2081 2.55063 9.70933 2.5502 9.00019 2.5502H5.00019C4.29105 2.5502 3.79227 2.55063 3.40298 2.58243Z\"\n fill=\"currentColor\"\n />\n <rect\n x=\"6.25\"\n y=\"6.75\"\n width=\"4.5\"\n height=\"0.5\"\n rx=\"0.25\"\n stroke=\"black\"\n strokeWidth=\"0.5\"\n />\n <rect x=\"3\" y=\"6.5\" width=\"2\" height=\"1\" rx=\"0.5\" fill=\"currentColor\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.1999 0.450195C4.50366 0.450195 4.7499 0.696438 4.7499 1.00019V2.75019C4.7499 3.05395 4.50366 3.30019 4.1999 3.30019C3.89614 3.30019 3.6499 3.05395 3.6499 2.75019V1.00019C3.6499 0.696438 3.89614 0.450195 4.1999 0.450195Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.8 0.450195C10.1037 0.450195 10.35 0.696438 10.35 1.00019V2.75019C10.35 3.05395 10.1037 3.30019 9.8 3.30019C9.49625 3.30019 9.25 3.05395 9.25 2.75019V1.00019C9.25 0.696438 9.49625 0.450195 9.8 0.450195Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function LogoWithTextVerticalIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.97634 1.4502H9.02405C9.70389 1.4502 10.2476 1.45019 10.687 1.48609C11.1379 1.52293 11.527 1.6003 11.8849 1.78263C12.4588 2.07504 12.9254 2.54164 13.2178 3.11553C13.4001 3.47338 13.4775 3.86253 13.5143 4.31342C13.5502 4.75277 13.5502 5.29652 13.5502 5.97637V8.02403C13.5502 8.70388 13.5502 9.24763 13.5143 9.68698C13.4775 10.1379 13.4001 10.527 13.2178 10.8849C12.9254 11.4588 12.4588 11.9254 11.8849 12.2178C11.527 12.4001 11.1379 12.4775 10.687 12.5143C10.2476 12.5502 9.70387 12.5502 9.02402 12.5502H4.97636C4.29651 12.5502 3.75276 12.5502 3.31341 12.5143C2.86252 12.4775 2.47337 12.4001 2.11552 12.2178C1.54163 11.9254 1.07504 11.4588 0.782626 10.8849C0.600293 10.527 0.522922 10.1379 0.486083 9.68698C0.450187 9.24764 0.45019 8.70389 0.450195 8.02405V5.97635C0.45019 5.29651 0.450187 4.75276 0.486083 4.31342C0.522922 3.86253 0.600293 3.47338 0.782626 3.11553C1.07504 2.54164 1.54163 2.07504 2.11552 1.78263C2.47337 1.6003 2.86252 1.52293 3.31341 1.48609C3.75276 1.45019 4.2965 1.4502 4.97634 1.4502ZM3.40298 2.58243C3.02012 2.61372 2.79184 2.67259 2.61491 2.76274C2.248 2.94969 1.94968 3.248 1.76273 3.61492C1.67258 3.79185 1.61371 4.02013 1.58243 4.40299C1.55062 4.79228 1.55019 5.29106 1.55019 6.0002V8.0002C1.55019 8.70934 1.55062 9.20812 1.58243 9.59741C1.61371 9.98028 1.67258 10.2086 1.76273 10.3855C1.94968 10.7524 2.248 11.0507 2.61491 11.2377C2.79184 11.3278 3.02012 11.3867 3.40298 11.418C3.79227 11.4498 4.29105 11.4502 5.00019 11.4502H9.00019C9.70933 11.4502 10.2081 11.4498 10.5974 11.418C10.9803 11.3867 11.2086 11.3278 11.3855 11.2377C11.7524 11.0507 12.0507 10.7524 12.2377 10.3855C12.3278 10.2086 12.3867 9.98028 12.418 9.59741C12.4498 9.20812 12.4502 8.70934 12.4502 8.0002V6.0002C12.4502 5.29106 12.4498 4.79228 12.418 4.40299C12.3867 4.02013 12.3278 3.79185 12.2377 3.61492C12.0507 3.248 11.7524 2.94969 11.3855 2.76274C11.2086 2.67259 10.9803 2.61372 10.5974 2.58243C10.2081 2.55063 9.70933 2.5502 9.00019 2.5502H5.00019C4.29105 2.5502 3.79227 2.55063 3.40298 2.58243Z\"\n fill=\"currentColor\"\n />\n <rect\n x=\"4.25\"\n y=\"8.25\"\n width=\"5.5\"\n height=\"0.5\"\n rx=\"0.25\"\n stroke=\"black\"\n strokeWidth=\"0.5\"\n />\n <rect x=\"6\" y=\"6\" width=\"2\" height=\"1\" rx=\"0.5\" fill=\"currentColor\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.1999 0.450195C4.50366 0.450195 4.7499 0.696438 4.7499 1.00019V2.75019C4.7499 3.05395 4.50366 3.30019 4.1999 3.30019C3.89614 3.30019 3.6499 3.05395 3.6499 2.75019V1.00019C3.6499 0.696438 3.89614 0.450195 4.1999 0.450195Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.8 0.450195C10.1037 0.450195 10.35 0.696438 10.35 1.00019V2.75019C10.35 3.05395 10.1037 3.30019 9.8 3.30019C9.49625 3.30019 9.25 3.05395 9.25 2.75019V1.00019C9.25 0.696438 9.49625 0.450195 9.8 0.450195Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { LogoWithCoverImageIcon } from '@/editor/components/icons/logo-with-cover-image';\nimport { BlockItem } from './types';\nimport { LogoWithTextHorizonIcon } from '@/editor/components/icons/logo-with-text-horizon';\nimport { LogoWithTextVerticalIcon } from '@/editor/components/icons/logo-with-text-vertical';\n\nexport const headerLogoWithTextHorizontal: BlockItem = {\n title: 'Logo with Text (Horizontal)',\n description: 'Logo and a text horizontally',\n searchTerms: ['logo', 'text'],\n icon: <LogoWithTextHorizonIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .deleteRange(range)\n .insertContent({\n type: 'columns',\n attrs: { showIfKey: null, gap: 8 },\n content: [\n {\n type: 'column',\n attrs: {\n columnId: '36de3eda-0677-47c3-a8b7-e071dec9ce30',\n width: 'auto',\n verticalAlign: 'middle',\n },\n content: [\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '32',\n height: '32',\n alignment: 'left',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: '6feb593e-374a-4479-a1c7-872c60c2f4e0',\n width: 'auto',\n verticalAlign: 'bottom',\n },\n content: [\n {\n type: 'heading',\n attrs: {\n textAlign: 'right',\n level: 3,\n showIfKey: null,\n },\n content: [\n {\n type: 'text',\n marks: [{ type: 'bold' }],\n text: 'Weekly Newsletter',\n },\n ],\n },\n ],\n },\n ],\n })\n .run();\n },\n};\n\nexport const headerLogoWithTextVertical: BlockItem = {\n title: 'Logo with Text (Vertical)',\n description: 'Logo and a text vertically',\n searchTerms: ['logo', 'text'],\n icon: <LogoWithTextVerticalIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .deleteRange(range)\n .insertContent([\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '48',\n height: '48',\n alignment: 'center',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n { type: 'spacer', attrs: { height: 8, showIfKey: null } },\n {\n type: 'heading',\n attrs: { textAlign: 'center', level: 2, showIfKey: null },\n content: [{ type: 'text', text: 'Maily' }],\n },\n ])\n .run();\n },\n};\n\nexport const headerLogoWithCoverImage: BlockItem = {\n title: 'Logo with Cover Image',\n description: 'Logo and a cover image',\n searchTerms: ['logo', 'cover', 'image'],\n icon: <LogoWithCoverImageIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n const todayFormatted = new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n editor\n .chain()\n .deleteRange(range)\n .insertContent([\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/og-image.png',\n alt: null,\n title: null,\n width: 600,\n height: 314,\n alignment: 'center',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n {\n type: 'columns',\n attrs: { showIfKey: null, gap: 8 },\n content: [\n {\n type: 'column',\n attrs: {\n columnId: '36de3eda-0677-47c3-a8b7-e071dec9ce30',\n width: 'auto',\n verticalAlign: 'middle',\n },\n content: [\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '48',\n height: '48',\n alignment: 'left',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: '6feb593e-374a-4479-a1c7-872c60c2f4e0',\n width: 'auto',\n verticalAlign: 'middle',\n },\n content: [\n {\n type: 'paragraph',\n attrs: { textAlign: 'right', showIfKey: null },\n content: [\n {\n type: 'text',\n marks: [{ type: 'bold' }],\n text: 'Weekly Newsletter',\n },\n { type: 'hardBreak' },\n {\n type: 'text',\n marks: [\n { type: 'textStyle', attrs: { color: '#929292' } },\n ],\n text: todayFormatted,\n },\n ],\n },\n ],\n },\n ],\n },\n ])\n .run();\n },\n};\n","import {\n CopyrightIcon,\n LayoutTemplateIcon,\n RectangleHorizontalIcon,\n} from 'lucide-react';\nimport { BlockItem } from './types';\n\nexport const footerCopyrightText: BlockItem = {\n title: 'Footer Copyright',\n description: 'Copyright text for the footer.',\n searchTerms: ['footer', 'copyright'],\n icon: <CopyrightIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n const currentYear = new Date().getFullYear();\n\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent({\n type: 'paragraph',\n attrs: { textAlign: 'center', showIfKey: null },\n content: [\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '#AAAAAA' } }],\n text: `Maily © ${currentYear}. All rights reserved.`,\n },\n ],\n })\n .run();\n },\n};\n\nexport const footerCommunityFeedbackCta: BlockItem = {\n title: 'Footer Community Feedback CTA',\n description: 'Community feedback CTA for the footer.',\n searchTerms: ['footer', 'community', 'feedback', 'cta'],\n icon: <RectangleHorizontalIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent([\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '42',\n height: '42',\n alignment: 'left',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n { type: 'spacer', attrs: { height: 16, showIfKey: null } },\n {\n type: 'footer',\n attrs: { textAlign: null, 'maily-component': 'footer' },\n content: [\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '' } }],\n text: 'Enjoyed this month’s update?',\n },\n { type: 'hardBreak' },\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '' } }],\n text: \"And, as always, we'd love your feedback – simply reply to the email or reach out via the Discord community!\",\n },\n ],\n },\n ])\n .run();\n },\n};\n\nexport const footerCompanySignature: BlockItem = {\n title: 'Footer Company Signature',\n description: 'Company signature for the footer.',\n searchTerms: ['footer', 'company', 'signature'],\n icon: <LayoutTemplateIcon className=\"mly:h-4 mly:w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent([\n { type: 'horizontalRule' },\n {\n type: 'image',\n attrs: {\n src: 'https://maily.to/brand/logo.png',\n alt: null,\n title: null,\n width: '48',\n height: '48',\n alignment: 'center',\n externalLink: null,\n isExternalLinkVariable: false,\n isSrcVariable: false,\n showIfKey: null,\n },\n },\n { type: 'spacer', attrs: { height: 16, showIfKey: null } },\n {\n type: 'heading',\n attrs: { textAlign: 'center', level: 3, showIfKey: null },\n content: [{ type: 'text', text: 'Maily' }],\n },\n { type: 'spacer', attrs: { height: 4, showIfKey: null } },\n {\n type: 'footer',\n attrs: { textAlign: 'center', 'maily-component': 'footer' },\n content: [\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '' } }],\n text: '1234 Example Street, Example, DE 19801, United States',\n },\n { type: 'hardBreak' },\n {\n type: 'text',\n marks: [\n {\n type: 'link',\n attrs: {\n href: 'https://maily.to',\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly:no-underline',\n isUrlVariable: false,\n },\n },\n { type: 'textStyle', attrs: { color: '#64748b' } },\n { type: 'underline' },\n ],\n text: 'VISIT COMPANY',\n },\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '#64748b' } }],\n text: ' | ',\n },\n {\n type: 'text',\n marks: [\n {\n type: 'link',\n attrs: {\n href: 'https://maily.to',\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly:no-underline',\n isUrlVariable: false,\n },\n },\n { type: 'textStyle', attrs: { color: '#64748b' } },\n { type: 'underline' },\n ],\n text: 'VISIT OUR BLOG',\n },\n {\n type: 'text',\n marks: [{ type: 'textStyle', attrs: { color: '#64748b' } }],\n text: ' | ',\n },\n {\n type: 'text',\n marks: [\n {\n type: 'link',\n attrs: {\n href: 'https://maily.to',\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly:no-underline',\n isUrlVariable: false,\n },\n },\n { type: 'textStyle', attrs: { color: '#64748b' } },\n { type: 'underline' },\n ],\n text: 'UNSUBSCRIBE',\n },\n ],\n },\n {\n type: 'paragraph',\n attrs: { textAlign: 'center', showIfKey: null },\n content: [\n {\n type: 'inlineImage',\n attrs: {\n height: 20,\n width: 20,\n src: 'https://cdn.usemaily.com/images/icons/linkedin.png',\n isSrcVariable: false,\n alt: null,\n title: null,\n externalLink: 'https://www.linkedin.com/in/arikchakma/',\n isExternalLinkVariable: false,\n },\n },\n { type: 'text', text: ' ' },\n {\n type: 'inlineImage',\n attrs: {\n height: 20,\n width: 20,\n src: 'https://cdn.usemaily.com/images/icons/youtube.png',\n isSrcVariable: false,\n alt: null,\n title: null,\n externalLink: 'https://www.youtube.com/arikchakma',\n isExternalLinkVariable: false,\n },\n },\n { type: 'text', text: ' ' },\n {\n type: 'inlineImage',\n attrs: {\n height: 20,\n width: 20,\n src: 'https://cdn.usemaily.com/images/icons/twitter.png',\n isSrcVariable: false,\n alt: null,\n title: null,\n externalLink: 'https://x.com/imarikchakma',\n isExternalLinkVariable: false,\n },\n },\n ],\n },\n ])\n .run();\n },\n};\n","import type { Editor } from '@tiptap/core';\nimport { type VariableOptions } from '@/editor/nodes/variable/variable';\nimport { useMemo } from 'react';\n\nexport function getNodeOptions<T extends Record<string, unknown>>(\n editor: Editor,\n name: string\n): T {\n const node = editor.extensionManager.extensions.find(\n (extension) => extension.name === name\n );\n\n if (!node) {\n throw new Error(`Node ${name} not found`);\n }\n\n return node.options as T;\n}\n\nexport function getVariableOptions(editor: Editor) {\n return getNodeOptions<VariableOptions>(editor, 'variable');\n}\n\nexport function useVariableOptions(editor: Editor) {\n return useMemo(() => {\n return getVariableOptions(editor);\n }, [editor]);\n}\n","import { useCallback } from 'react';\nimport { useEffect } from 'react';\nimport { RefObject } from 'react';\n\nexport function useOutsideClick(\n ref: RefObject<HTMLElement>,\n callback: () => void\n) {\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n callback();\n }\n },\n [ref, callback]\n );\n\n useEffect(() => {\n document.addEventListener('mousedown', handleClick);\n document.addEventListener('touchstart', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n document.removeEventListener('touchstart', handleClick);\n };\n }, [handleClick]);\n}\n","import { VariableSuggestionsPopoverRef } from '@/editor/nodes/variable/variable-suggestions-popover';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { useOutsideClick } from '@/editor/utils/use-outside-click';\nimport { Editor } from '@tiptap/core';\nimport { CornerDownLeft } from 'lucide-react';\nimport { forwardRef, HTMLAttributes, useRef } from 'react';\n\ntype InputAutocompleteProps = HTMLAttributes<HTMLInputElement> & {\n value: string;\n onValueChange: (value: string) => void;\n\n autoCompleteOptions?: string[];\n onSelectOption?: (option: string) => void;\n\n onOutsideClick?: () => void;\n triggerChar?: string;\n placeholder?: string;\n\n editor: Editor;\n};\n\nexport const InputAutocomplete = forwardRef<\n HTMLInputElement,\n InputAutocompleteProps\n>((props, ref) => {\n const {\n value = '',\n onValueChange,\n className,\n onOutsideClick,\n onSelectOption,\n autoCompleteOptions = [],\n triggerChar = '',\n editor,\n ...inputProps\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<VariableSuggestionsPopoverRef>(null);\n const VariableSuggestionPopoverComponent =\n useVariableOptions(editor)?.variableSuggestionsPopover;\n\n useOutsideClick(containerRef, () => {\n onOutsideClick?.();\n });\n\n const isTriggeringVariable = value.startsWith(triggerChar);\n\n return (\n <div className={cn('mly:relative')} ref={containerRef}>\n <label className=\"mly:relative\">\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n placeholder=\"e.g. items\"\n type=\"text\"\n {...inputProps}\n ref={ref}\n value={value}\n onChange={(e) => {\n onValueChange(e.target.value);\n }}\n className={cn(\n 'mly:h-7 mly:w-40 mly:rounded-md mly:bg-white mly:px-2 mly:pr-6 mly:text-sm mly:text-midnight-gray mly:hover:bg-soft-gray mly:focus:bg-soft-gray mly:focus:outline-hidden',\n className\n )}\n onKeyDown={(e) => {\n if (!popoverRef.current || !isTriggeringVariable) {\n return;\n }\n const { moveUp, moveDown, select } = popoverRef.current;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n moveDown();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n moveUp();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n spellCheck={false}\n />\n <div className=\"mly:absolute mly:inset-y-0 mly:right-1 mly:flex mly:items-center\">\n <CornerDownLeft className=\"mly:h-3 mly:w-3 mly:stroke-[2.5] mly:text-midnight-gray\" />\n </div>\n </label>\n\n {isTriggeringVariable && (\n <div className=\"mly:absolute mly:left-0 mly:top-8\">\n <VariableSuggestionPopoverComponent\n items={autoCompleteOptions.map((option) => {\n return {\n name: option,\n };\n })}\n onSelectItem={(item) => {\n onSelectOption?.(item.name);\n }}\n ref={popoverRef}\n />\n </div>\n )}\n </div>\n );\n});\n\nInputAutocomplete.displayName = 'InputAutocomplete';\n","import type {\n VariableFunctionOptions,\n Variables,\n Variable,\n} from '@/extensions';\n\nexport function processVariables(\n variables: Variables,\n options: VariableFunctionOptions\n): Array<Variable> {\n const { query } = options;\n const queryLower = query.toLowerCase();\n\n let filteredVariables: Array<Variable> = [];\n if (Array.isArray(variables)) {\n filteredVariables = variables.filter((variable) =>\n variable.name.toLowerCase().startsWith(queryLower)\n );\n\n if (\n query.length > 0 &&\n !filteredVariables.some((variable) => variable.name === query)\n ) {\n filteredVariables.push({ name: query, required: true });\n }\n\n return filteredVariables;\n } else if (typeof variables === 'function') {\n return variables(options);\n } else {\n throw new Error(`Invalid variables type. Expected 'Array' or 'Function', but received '${typeof variables}'.\n\nYou can check out the documentation for more information: https://github.com/arikchakma/maily.to/blob/main/packages/core/readme.md`);\n }\n}\n","import { Editor, mergeAttributes, Node } from '@tiptap/core';\nimport { Node as TNode } from '@tiptap/pm/model';\nimport { PluginKey } from '@tiptap/pm/state';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport Suggestion, { SuggestionOptions } from '@tiptap/suggestion';\nimport {\n VariableSuggestionsPopover,\n VariableSuggestionsPopoverType,\n} from './variable-suggestions-popover';\nimport { DefaultRenderVariable, VariableView } from './variable-view';\n\nexport type Variable = {\n name: string;\n // Default is true\n required?: boolean;\n // default is true\n valid?: boolean;\n // should hide default value\n // default is false\n hideDefaultValue?: boolean;\n\n // label is the label of the variable\n // default is the name of the variable\n label?: string;\n};\n\nexport type VariableFunctionOptions = {\n query: string;\n from: 'content-variable' | 'bubble-variable' | 'repeat-variable';\n editor: Editor;\n};\n\nexport type VariablesFunction = (\n opts: VariableFunctionOptions\n) => Array<Variable>;\n\nexport type Variables = Array<Variable> | VariablesFunction;\n\nexport const DEFAULT_VARIABLE_TRIGGER_CHAR = '@';\nexport const DEFAULT_VARIABLES: Variables = [];\nexport const DEFAULT_RENDER_VARIABLE_FUNCTION: RenderVariableFunction =\n DefaultRenderVariable;\nexport const DEFAULT_VARIABLE_SUGGESTION_POPOVER = VariableSuggestionsPopover;\n\nexport type RenderVariableOptions = {\n variable: Variable;\n fallback?: string;\n editor: Editor;\n from: 'content-variable' | 'bubble-variable' | 'button-variable';\n};\n\nexport type RenderVariableFunction = (\n opts: RenderVariableOptions\n) => JSX.Element | null;\n\nexport type VariableOptions = {\n renderLabel: (props: { options: VariableOptions; node: TNode }) => string;\n suggestion: Omit<SuggestionOptions, 'editor'>;\n\n /**\n * Variables is the array of variables that will be used to render the variable pill.\n */\n variables: Variables;\n\n /**\n * Render variable is the function that will be used to render the variable pill.\n * @default DefaultRenderVariable\n */\n renderVariable: RenderVariableFunction;\n\n /**\n * Variable suggestion popover is the component that will be used to render\n * the variable suggestions for the content, bubble menu variables\n * @default VariableSuggestionPopover\n */\n variableSuggestionsPopover: VariableSuggestionsPopoverType;\n\n /**\n * Disable input is the boolean that will be used to disable the input of the variable\n * when the variable is selected.\n * @default false\n */\n disableInput: boolean;\n};\n\nexport type VariableStorage = {\n popover: boolean;\n};\n\nexport const VariablePluginKey = new PluginKey('variable');\n\nexport const VariableExtension = Node.create<VariableOptions, VariableStorage>({\n name: 'variable',\n group: 'inline',\n inline: true,\n selectable: true,\n atom: true,\n\n addStorage() {\n return {\n popover: false,\n };\n },\n\n addOptions() {\n return {\n variables: DEFAULT_VARIABLES,\n variableSuggestionsPopover: DEFAULT_VARIABLE_SUGGESTION_POPOVER,\n renderVariable: DEFAULT_RENDER_VARIABLE_FUNCTION,\n disableInput: false,\n\n renderLabel(props) {\n const { node } = props;\n return `${node.attrs.label ?? node.attrs.id}`;\n },\n\n suggestion: {\n char: '@',\n pluginKey: VariablePluginKey,\n command: ({ editor, range, props }) => {\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: ({ state, range }) => {\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 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 fallback: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-fallback'),\n renderHTML: (attributes) => {\n if (!attributes.fallback) {\n return {};\n }\n\n return {\n 'data-fallback': attributes.fallback,\n };\n },\n },\n\n required: {\n default: true,\n parseHTML: (element) => element.hasAttribute('data-required'),\n renderHTML: (attributes) => {\n return {\n 'data-required': attributes?.required ?? true,\n };\n },\n },\n\n hideDefaultValue: {\n default: false,\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({ 'data-type': this.name }, HTMLAttributes),\n this.options.renderLabel({\n options: this.options,\n node,\n }),\n ];\n },\n\n renderText({ node }) {\n return this.options.renderLabel({\n options: this.options,\n node,\n });\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = 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 isMention = true;\n tr.insertText(\n this.options.suggestion.char || '',\n pos,\n pos + node.nodeSize\n );\n\n return false;\n }\n });\n\n return isMention;\n }),\n };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(VariableView, {\n className: 'mly:relative mly:inline-block',\n as: 'div',\n });\n },\n});\n","import { cn } from '@/editor/utils/classname';\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n Braces,\n CornerDownLeftIcon,\n} from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { Variable } from './variable';\n\nexport type VariableSuggestionsPopoverProps = {\n items: Variable[];\n onSelectItem: (item: Variable) => void;\n};\n\nexport type VariableSuggestionsPopoverRef = {\n moveUp: () => void;\n moveDown: () => void;\n select: () => void;\n};\n\nexport type VariableSuggestionsPopoverType = React.ForwardRefExoticComponent<\n VariableSuggestionsPopoverProps &\n React.RefAttributes<VariableSuggestionsPopoverRef>\n>;\n\nexport const VariableSuggestionsPopover: VariableSuggestionsPopoverType =\n forwardRef((props, ref) => {\n const { items, onSelectItem } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const scrollSelectedIntoView = (index: number) => {\n const container = scrollContainerRef.current;\n const selectedItem = itemRefs.current[index];\n\n if (!container || !selectedItem) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const itemRect = selectedItem.getBoundingClientRect();\n\n const padding = 4;\n if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom + padding;\n } else if (itemRect.top < containerRect.top) {\n container.scrollTop += itemRect.top - containerRect.top - padding;\n }\n };\n\n useEffect(() => {\n setSelectedIndex(0);\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n itemRefs.current = items.map(() => null);\n }, [items]);\n\n useEffect(() => {\n scrollSelectedIntoView(selectedIndex);\n }, [selectedIndex]);\n\n useImperativeHandle(ref, () => ({\n moveUp: () => {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n },\n moveDown: () => {\n setSelectedIndex((selectedIndex + 1) % items.length);\n },\n select: () => {\n const item = items[selectedIndex];\n if (!item) {\n return;\n }\n\n onSelectItem(item);\n },\n }));\n\n return (\n <div className=\"mly:z-50 mly:w-64 mly:rounded-lg mly:border mly:border-gray-200 mly:bg-white mly:shadow-md mly:transition-all\">\n <div className=\"mly:flex mly:items-center mly:justify-between mly:gap-2 mly:border-b mly:border-gray-200 mly:bg-soft-gray/40 mly:px-1 mly:py-1.5 mly:text-gray-500\">\n <span className=\"mly:text-xs mly:uppercase\">Variables</span>\n <VariableIcon>\n <Braces className=\"mly:size-3 mly:stroke-[2.5]\" />\n </VariableIcon>\n </div>\n\n <div\n ref={scrollContainerRef}\n className=\"mly:max-h-52 mly:overflow-y-auto mly:scrollbar-thin mly:scrollbar-track-transparent mly:scrollbar-thumb-gray-200\"\n >\n <div className=\"mly:flex mly:w-fit mly:min-w-full mly:flex-col mly:gap-0.5 mly:p-1\">\n {items?.length ? (\n items?.map((item, index: number) => (\n <button\n key={index}\n ref={(el) => (itemRefs.current[index] = el)}\n onClick={() => onSelectItem(item)}\n className={cn(\n 'mly:flex mly:w-fit mly:min-w-full mly:items-center mly:gap-2 mly:rounded-md mly:px-2 mly:py-1 mly:text-left mly:font-mono mly:text-sm mly:text-gray-900 mly:hover:bg-soft-gray',\n index === selectedIndex\n ? 'mly:bg-soft-gray'\n : 'mly:bg-white'\n )}\n >\n <Braces className=\"mly:size-3 mly:stroke-[2.5] mly:text-rose-600\" />\n {item?.label || item.name}\n </button>\n ))\n ) : (\n <div className=\"mly:flex mly:h-7 mly:w-full mly:items-center mly:gap-2 mly:rounded-md mly:px-2 mly:py-1 mly:text-left mly:font-mono mly:text-[13px] mly:text-gray-900 mly:hover:bg-soft-gray\">\n No result\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mly:flex mly:items-center mly:justify-between mly:gap-2 mly:border-t mly:border-gray-200 mly:px-1 mly:py-1.5 mly:text-gray-500\">\n <div className=\"mly:flex mly:items-center mly:gap-1\">\n <VariableIcon>\n <ArrowDownIcon className=\"mly:size-3 mly:stroke-[2.5]\" />\n </VariableIcon>\n <VariableIcon>\n <ArrowUpIcon className=\"mly:size-3 mly:stroke-[2.5]\" />\n </VariableIcon>\n <span className=\"mly:text-xs mly:text-gray-500\">Navigate</span>\n </div>\n <VariableIcon>\n <CornerDownLeftIcon className=\"mly:size-3 mly:stroke-[2.5]\" />\n </VariableIcon>\n </div>\n </div>\n );\n });\n\ntype VariableIconProps = {\n className?: string;\n children: React.ReactNode;\n};\n\nfunction VariableIcon(props: VariableIconProps) {\n const { className, children } = props;\n\n return (\n <div\n className={cn(\n 'mly:flex mly:size-5 mly:items-center mly:justify-center mly:rounded-md mly:border mly:border-gray-200',\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { getNodeOptions } from '@/editor/utils/node-options';\nimport { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { AlertTriangle, Braces, Pencil } from 'lucide-react';\nimport { useMemo } from 'react';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n VariableOptions,\n type RenderVariableFunction,\n} from './variable';\n\nexport function VariableView(props: NodeViewProps) {\n const { node, updateAttributes, editor } = props;\n const {\n id,\n fallback,\n required,\n hideDefaultValue = false,\n label,\n } = node.attrs;\n\n const renderVariable = useMemo(() => {\n const variableRender =\n getNodeOptions<VariableOptions>(editor, 'variable')?.renderVariable ??\n DEFAULT_RENDER_VARIABLE_FUNCTION;\n\n return variableRender;\n }, [editor]);\n\n return (\n <NodeViewWrapper\n className=\"react-component mly:inline-block mly:leading-none\"\n draggable=\"false\"\n >\n <Popover\n onOpenChange={(open) => {\n editor.storage.variable.popover = open;\n }}\n >\n <PopoverTrigger>\n {renderVariable({\n variable: {\n name: id,\n required: required,\n valid: true,\n label,\n },\n fallback,\n editor,\n from: 'content-variable',\n })}\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n className=\"mly:w-max mly:rounded-lg mly:p-0.5!\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly:flex mly:items-stretch mly:text-midnight-gray\">\n <label className=\"mly:relative\">\n <span className=\"mly:inline-block mly:px-2 mly:text-xs mly:text-midnight-gray\">\n Variable\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={id ?? ''}\n onChange={(e) => {\n updateAttributes({\n id: e.target.value,\n });\n }}\n placeholder=\"ie. name...\"\n className=\"mly:h-7 mly:w-36 mly:rounded-md mly:bg-soft-gray mly:px-2 mly:text-sm mly:text-midnight-gray mly:focus:bg-soft-gray mly:focus:outline-hidden mly:disabled:cursor-not-allowed\"\n />\n </label>\n\n {!hideDefaultValue && (\n <>\n <Divider className=\"mly:mx-1.5\" />\n\n <label className=\"mly:relative\">\n <span className=\"mly:inline-block mly:px-2 mly:pl-1 mly:text-xs mly:text-midnight-gray\">\n Default\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={fallback ?? ''}\n onChange={(e) => {\n updateAttributes({\n fallback: e.target.value,\n });\n }}\n placeholder=\"ie. John Doe...\"\n className=\"mly:h-7 mly:w-32 mly:rounded-md mly:bg-soft-gray mly:px-2 mly:pr-6 mly:text-sm mly:text-midnight-gray mly:focus:bg-soft-gray mly:focus:outline-none\"\n />\n <div className=\"mly:absolute mly:inset-y-0 mly:right-1 mly:flex mly:items-center\">\n <Pencil className=\"mly:h-3 mly:w-3 mly:stroke-[2.5] mly:text-midnight-gray\" />\n </div>\n </label>\n </>\n )}\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\nexport const DefaultRenderVariable: RenderVariableFunction = (props) => {\n const { variable, fallback, from } = props;\n const { name, required, valid, label } = variable;\n const variableLabel = label || name;\n\n if (from === 'button-variable') {\n return (\n <div className=\"mly:inline-grid mly:max-w-xs mly:grid-cols-[12px_1fr] mly:items-center mly:gap-1.5 mly:rounded-md mly:border mly:border-(--button-var-border-color) mly:px-2 mly:py-px mly:font-mono mly:text-xs\">\n <Braces className=\"mly:h-3 mly:w-3 mly:shrink-0 mly:stroke-[2.5]\" />\n <span className=\"mly:min-w-0 mly:truncate mly:text-left\">\n {variableLabel}\n </span>\n </div>\n );\n }\n\n if (from === 'bubble-variable') {\n return (\n <div\n className={cn(\n 'mly:inline-grid mly:h-7 mly:min-w-28 mly:max-w-xs mly:grid-cols-[12px_1fr] mly:items-center mly:gap-1.5 mly:rounded-md mly:border mly:border-gray-200 mly:px-2 mly:font-mono mly:text-sm mly:hover:bg-soft-gray',\n !valid &&\n 'mly:border-rose-400 mly:bg-rose-50 mly:text-rose-600 mly:hover:bg-rose-100'\n )}\n >\n <Braces className=\"mly:h-3 mly:w-3 mly:shrink-0 mly:stroke-[2.5] mly:text-rose-600\" />\n <span className=\"mly:min-w-0 mly:truncate mly:text-left\">\n {variableLabel}\n </span>\n </div>\n );\n }\n\n return (\n <span\n tabIndex={-1}\n className=\"mly:inline-flex mly:items-center mly:gap-(--variable-icon-gap) mly:rounded-full mly:border mly:border-gray-200 mly:px-1.5 mly:py-0.5 mly:leading-none\"\n >\n <Braces className=\"mly:size-[var(--variable-icon-size)] mly:shrink-0 mly:stroke-[2.5] mly:text-rose-600\" />\n {variableLabel}\n {required && !fallback && (\n <AlertTriangle className=\"mly:size-[var(--variable-icon-size)] mly:shrink-0 mly:stroke-[2.5]\" />\n )}\n </span>\n );\n};\n","import { useId } from 'react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ChevronDownIcon, LucideIcon } from 'lucide-react';\nimport { SVGIcon } from '../icons/grid-lines';\n\ntype SelectProps = {\n label: string;\n options: {\n value: string;\n label: string;\n }[];\n\n value: string;\n onValueChange: (value: string) => void;\n\n tooltip?: string;\n className?: string;\n\n icon?: LucideIcon | SVGIcon;\n iconClassName?: string;\n\n placeholder?: string;\n};\n\nexport function Select(props: SelectProps) {\n const {\n label,\n options,\n value,\n onValueChange,\n tooltip,\n className,\n icon: Icon,\n iconClassName,\n placeholder,\n } = props;\n\n const selectId = `mly${useId()}`;\n\n const content = (\n <div className=\"mly:relative\">\n <label htmlFor={selectId} className=\"mly:sr-only\">\n {label}\n </label>\n\n {Icon && (\n <div className=\"mly:pointer-events-none mly:absolute mly:inset-y-0 mly:left-2 mly:z-20 mly:flex mly:items-center\">\n <Icon className={cn('mly:size-3', iconClassName)} />\n </div>\n )}\n\n <select\n id={selectId}\n className={cn(\n 'mly:flex mly:min-h-7 mly:max-w-max mly:appearance-none mly:items-center mly:rounded-md mly:bg-white mly:px-1.5 mly:py-0.5 mly:pr-7 mly:text-sm mly:text-midnight-gray mly:ring-offset-white mly:transition-colors mly:hover:bg-soft-gray mly:focus-visible:relative mly:focus-visible:z-10 mly:focus-visible:outline-hidden mly:focus-visible:ring-2 mly:focus-visible:ring-gray-400 mly:focus-visible:ring-offset-2 mly:active:bg-soft-gray',\n !!Icon && 'mly:pl-7',\n className\n )}\n value={value || ''}\n onChange={(event) => onValueChange(event.target.value)}\n >\n {placeholder && (\n <option value=\"\" disabled hidden>\n {placeholder}\n </option>\n )}\n\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <span className=\"mly:pointer-events-none mly:absolute mly:inset-y-0 mly:right-0 mly:z-10 mly:flex mly:h-full mly:w-7 mly:items-center mly:justify-center mly:text-gray-600 mly:peer-disabled:opacity-50\">\n <ChevronDownIcon\n size={16}\n strokeWidth={2}\n aria-hidden=\"true\"\n role=\"img\"\n />\n </span>\n </div>\n );\n\n if (!tooltip) {\n return content;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n","import { AlignmentSwitch } from '@/editor/components/alignment-switch';\nimport { BaseButton } from '@/editor/components/base-button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { ColorPicker } from '@/editor/components/ui/color-picker';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { LinkInputPopover } from '@/editor/components/ui/link-input-popover';\nimport { Select } from '@/editor/components/ui/select';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { CSSProperties, useMemo } from 'react';\nimport {\n allowedButtonBorderRadius,\n AllowedButtonVariant,\n allowedButtonVariant,\n ButtonAttributes,\n} from './button';\nimport { ButtonLabelInput } from './button-label-input';\n\nexport function ButtonView(props: NodeViewProps) {\n const { node, editor, getPos, updateAttributes } = props;\n const {\n text,\n isTextVariable,\n alignment,\n variant,\n borderRadius: _radius,\n buttonColor,\n textColor,\n url: externalLink,\n isUrlVariable,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n } = node.attrs as ButtonAttributes;\n\n const opts = useVariableOptions(editor);\n const renderVariable = opts?.renderVariable;\n\n const sizes = useMemo(\n () => ({\n small: {\n paddingX: 24,\n paddingY: 6,\n },\n medium: {\n paddingX: 32,\n paddingY: 10,\n },\n large: {\n paddingX: 40,\n paddingY: 14,\n },\n }),\n []\n );\n\n const size = useMemo(() => {\n return Object.entries(sizes).find(\n ([, { paddingX, paddingY }]) =>\n paddingRight === paddingX && paddingTop === paddingY\n )?.[0] as 'small' | 'medium' | 'large';\n }, [paddingRight, paddingTop, sizes]);\n\n return (\n <NodeViewWrapper\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n data-type=\"button\"\n style={{\n textAlign: alignment,\n }}\n >\n <Popover open={props.selected && editor.isEditable}>\n <PopoverTrigger asChild>\n <div>\n <button\n className={cn(\n 'mly:inline-flex mly:items-center mly:justify-center mly:rounded-md mly:text-sm mly:font-medium mly:ring-offset-white mly:transition-colors mly:disabled:pointer-events-none mly:disabled:opacity-50',\n 'mly:font-semibold mly:no-underline',\n {\n 'mly:rounded-full!': _radius === 'round',\n 'mly:rounded-md!': _radius === 'smooth',\n 'mly:rounded-none!': _radius === 'sharp',\n }\n )}\n tabIndex={-1}\n style={\n {\n backgroundColor:\n variant === 'filled'\n ? buttonColor || 'var(--mly-button-background-color)'\n : 'transparent',\n color: textColor || 'var(--mly-button-text-color)',\n\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor:\n buttonColor || 'var(--mly-button-background-color)',\n // decrease the border color opacity to 80%\n // so that it's not too prominent\n '--button-var-border-color': textColor\n ? `${textColor}80`\n : 'color-mix(in srgb, var(--mly-button-text-color) 80%, transparent)',\n\n paddingTop: paddingTop || 'var(--mly-button-padding-top)',\n paddingRight:\n paddingRight || 'var(--mly-button-padding-right)',\n paddingBottom:\n paddingBottom || 'var(--mly-button-padding-bottom)',\n paddingLeft: paddingLeft || 'var(--mly-button-padding-left)',\n } as CSSProperties\n }\n onClick={(e) => {\n e.preventDefault();\n if (!editor.isEditable) {\n return;\n }\n\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n {isTextVariable\n ? renderVariable({\n variable: { name: text, valid: true },\n fallback: text,\n from: 'button-variable',\n editor,\n })\n : text}\n </button>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly:w-max mly:rounded-lg mly:p-0.5!\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly:flex mly:items-stretch mly:text-midnight-gray\">\n <ButtonLabelInput\n value={text}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n text: value,\n isTextVariable: isVariable ?? false,\n });\n }}\n isVariable={isTextVariable}\n editor={editor}\n />\n\n <Divider />\n\n <div className=\"mly:flex mly:gap-x-0.5\">\n <Select\n label=\"Border Radius\"\n value={_radius}\n options={allowedButtonBorderRadius.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n borderRadius: value,\n });\n }}\n tooltip=\"Border Radius\"\n className=\"mly:capitalize\"\n />\n\n <Select\n label=\"Style\"\n value={variant}\n options={allowedButtonVariant.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n variant: value,\n });\n }}\n tooltip=\"Style\"\n className=\"mly:capitalize\"\n />\n\n <Select\n label=\"Size\"\n value={size}\n options={[\n { value: 'small', label: 'Small' },\n { value: 'medium', label: 'Medium' },\n { value: 'large', label: 'Large' },\n ]}\n onValueChange={(value) => {\n const { paddingX, paddingY } =\n sizes[value as 'small' | 'medium' | 'large'];\n\n updateAttributes({\n paddingTop: paddingY,\n paddingRight: paddingX,\n paddingBottom: paddingY,\n paddingLeft: paddingX,\n });\n }}\n tooltip=\"Size\"\n placeholder=\"Size\"\n />\n </div>\n\n <Divider />\n\n <div className=\"mly:flex mly:gap-x-0.5\">\n <AlignmentSwitch\n alignment={alignment}\n onAlignmentChange={(alignment) => {\n updateAttributes({\n alignment,\n });\n }}\n />\n\n <LinkInputPopover\n defaultValue={externalLink || ''}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n url: value,\n isUrlVariable: isVariable ?? false,\n });\n }}\n tooltip=\"Update External Link\"\n editor={editor}\n isVariable={isUrlVariable}\n />\n </div>\n\n <Divider />\n\n <div className=\"mly:flex mly:gap-x-0.5\">\n <BackgroundColorPickerPopup\n variant={variant}\n color={buttonColor || 'transparent'}\n onChange={(color) => {\n updateAttributes({\n buttonColor: color,\n });\n }}\n />\n\n <TextColorPickerPopup\n color={textColor || 'transparent'}\n onChange={(color) => {\n updateAttributes({\n textColor: color,\n });\n }}\n />\n </div>\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\ntype ColorPickerProps = {\n variant?: AllowedButtonVariant;\n color: string;\n onChange: (color: string) => void;\n};\n\nfunction BackgroundColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange, variant } = props;\n\n return (\n <ColorPicker\n color={color}\n onColorChange={onChange}\n tooltip=\"Background Color\"\n >\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly:size-7\"\n >\n <div\n className=\"mly:h-4 mly:w-4 mly:shrink-0 mly:rounded-full mly:shadow\"\n style={{\n backgroundColor: variant === 'filled' ? color : 'transparent',\n borderStyle: 'solid',\n borderWidth: 2,\n borderColor: variant === 'filled' ? 'white' : color,\n }}\n />\n </BaseButton>\n </ColorPicker>\n );\n}\n\nfunction TextColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange } = props;\n\n return (\n <ColorPicker color={color} onColorChange={onChange} tooltip=\"Text Color\">\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly:size-7\"\n >\n <div className=\"mly:flex mly:flex-col mly:items-center mly:justify-center mly:gap-px\">\n <span className=\"mly:font-bolder mly:font-mono mly:text-xs mly:text-midnight-gray\">\n A\n </span>\n <div\n className=\"mly:h-[2px] mly:w-3 mly:shrink-0 mly:rounded-md mly:shadow\"\n style={{ backgroundColor: color }}\n />\n </div>\n </BaseButton>\n </ColorPicker>\n );\n}\n","import { InputAutocomplete } from '@/editor/components/ui/input-autocomplete';\nimport { DEFAULT_VARIABLE_TRIGGER_CHAR } from '@/editor/nodes/variable/variable';\nimport { DEFAULT_PLACEHOLDER_URL, useMailyContext } from '@/editor/provider';\nimport { useVariableOptions } from '@/editor/utils/node-options';\nimport { processVariables } from '@/editor/utils/variable';\nimport { Editor } from '@tiptap/core';\nimport { useMemo, useRef, useState } from 'react';\n\ntype ButtonLabelInputProps = {\n value: string;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n isVariable?: boolean;\n\n editor: Editor;\n};\n\nexport function ButtonLabelInput(props: ButtonLabelInputProps) {\n const { value, onValueChange, isVariable, editor } = props;\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const { placeholderUrl = DEFAULT_PLACEHOLDER_URL } = useMailyContext();\n const otps = useVariableOptions(editor);\n const variables = otps?.variables;\n const variableTriggerCharacter =\n otps?.suggestion?.char ?? DEFAULT_VARIABLE_TRIGGER_CHAR;\n const renderVariable = otps?.renderVariable;\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = value.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, value, editor]);\n\n return (\n <div className=\"mly:isolate mly:flex mly:rounded-lg\">\n {!isEditing && (\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: value,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n\n {isEditing && (\n <InputAutocomplete\n editor={editor}\n value={value}\n onValueChange={(value) => {\n onValueChange?.(value);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder={placeholderUrl}\n className=\"mly:h-7 mly:w-40 mly:rounded-md mly:px-2 mly:pr-6 mly:text-sm mly:text-midnight-gray mly:hover:bg-soft-gray mly:focus:bg-soft-gray mly:focus:outline-hidden\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable = autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n }\n onValueChange?.(value, isVariable);\n }}\n />\n )}\n </div>\n );\n}\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { ImageView } from './image-view';\n\nconst DEFAULT_IMAGE_BORDER_RADIUS = 0;\n\nexport const ImageExtension = TiptapImage.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: 'auto',\n parseHTML: (element) => {\n return (\n element.getAttribute('width') ||\n (element.style?.width || element.style?.inlineSize)?.replace(\n 'px',\n ''\n ) ||\n null\n );\n },\n renderHTML: ({ width }) => ({ width }),\n },\n height: {\n default: 'auto',\n parseHTML: (element) => {\n return (\n element.getAttribute('height') ||\n (element.style?.height || element.style?.blockSize)?.replace(\n 'px',\n ''\n ) ||\n null\n );\n },\n renderHTML: ({ height }) => ({ height }),\n },\n alignment: {\n default: 'center',\n renderHTML: ({ alignment }) => ({ 'data-alignment': alignment }),\n parseHTML: (element) =>\n element.getAttribute('data-alignment') || 'center',\n },\n\n externalLink: {\n default: null,\n renderHTML: ({ externalLink }) => {\n if (!externalLink) {\n return {};\n }\n return {\n 'data-external-link': externalLink,\n };\n },\n parseHTML: (element) => {\n const externalLink = element.getAttribute('data-external-link');\n return externalLink ? { externalLink } : null;\n },\n },\n\n // Later we will remove this attribute\n // and use the `externalLink` attribute instead\n // when implement the URL variable feature\n isExternalLinkVariable: {\n default: false,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-is-external-link-variable') === 'true'\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.isExternalLinkVariable) {\n return {};\n }\n\n return {\n 'data-is-external-link-variable': 'true',\n };\n },\n },\n\n borderRadius: {\n default: DEFAULT_IMAGE_BORDER_RADIUS,\n parseHTML: (element) => {\n return Number(element.getAttribute('data-border-radius'));\n },\n renderHTML: (attributes) => {\n return {\n 'data-border-radius': attributes.borderRadius,\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n\n aspectRatio: {\n default: null,\n parseHTML: (element) => {\n return element.getAttribute('data-aspect-ratio') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes?.aspectRatio) {\n return {};\n }\n\n return {\n 'data-aspect-ratio': attributes?.aspectRatio,\n };\n },\n },\n\n lockAspectRatio: {\n default: true,\n parseHTML: (element) => {\n return element.getAttribute('data-lock-aspect-ratio') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.lockAspectRatio) {\n return {};\n }\n\n return {\n 'data-lock-aspect-ratio': 'true',\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ImageView, {\n className: 'mly:relative',\n });\n },\n});\n","import TiptapLink from '@tiptap/extension-link';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n customLink: {\n setIsUrlVariable: (isUrlVariable: boolean) => ReturnType;\n };\n }\n}\n\nexport const LinkExtension = TiptapLink.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n isUrlVariable: {\n default: false,\n },\n };\n },\n addCommands() {\n return {\n ...this.parent?.(),\n\n setIsUrlVariable:\n (isUrlVariable) =>\n ({ chain }) => {\n return chain().setMark('link', { isUrlVariable }).run();\n },\n };\n },\n});\n","import TiptapHeading from '@tiptap/extension-heading';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\nexport const HeadingExtension = TiptapHeading.extend({\n addAttributes() {\n return {\n ...(this?.parent?.() || {}),\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n});\n","import TiptapParagraph from '@tiptap/extension-paragraph';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\nexport const ParagraphExtension = TiptapParagraph.extend({\n addAttributes() {\n return {\n ...(this?.parent?.() || {}),\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { RepeatView } from './repeat-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\ntype RepeatAttributes = {\n each: string;\n isUpdatingKey: boolean;\n showIfKey: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n repeat: {\n setRepeat: () => ReturnType;\n updateRepeat: (attrs: Partial<RepeatAttributes>) => ReturnType;\n };\n }\n}\n\nexport const RepeatExtension = Node.create({\n name: 'repeat',\n group: 'block',\n content: '(block|columns)+',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n each: {\n default: 'items',\n parseHTML: (element) => {\n return element.getAttribute('each') || '';\n },\n renderHTML: (attributes) => {\n if (!attributes.each) {\n return {};\n }\n\n return {\n each: attributes.each,\n };\n },\n },\n isUpdatingKey: {\n default: false,\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n setRepeat:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateRepeat: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(RepeatView, {\n contentDOMElementTag: 'div',\n className: 'mly:relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper, NodeViewContent } from '@tiptap/react';\nimport { Repeat2 } from 'lucide-react';\n\nexport function RepeatView(props: NodeViewProps) {\n const { editor, getPos } = props;\n\n return (\n <NodeViewWrapper\n data-type=\"repeat\"\n draggable={editor.isEditable}\n data-drag-handle={editor.isEditable}\n className=\"mly:relative\"\n >\n <NodeViewContent className=\"is-editable\" />\n\n <div\n role=\"button\"\n data-repeat-indicator=\"\"\n className=\"mly:absolute mly:inset-y-0 mly:right-0 mly:flex mly:translate-x-full mly:cursor-pointer mly:flex-col mly:items-center mly:gap-1 mly:opacity-60\"\n contentEditable={false}\n onClick={() => {\n editor.commands.setNodeSelection(getPos());\n }}\n >\n <Repeat2 className=\"mly:size-3 mly:stroke-[2.5] mly:text-midnight-gray\" />\n <div className=\"mly:w-[1.5px] mly:grow mly:rounded-full mly:bg-rose-300\" />\n </div>\n </NodeViewWrapper>\n );\n}\n","import Placeholder from '@tiptap/extension-placeholder';\n\nexport const PlaceholderExtension = Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === 'heading') {\n return `Heading ${node.attrs.level}`;\n } else if (node.type.name === 'htmlCodeBlock') {\n return 'Type your HTML code...';\n } else if (\n ['columns', 'column', 'section', 'repeat', 'show', 'blockquote'].includes(\n node.type.name\n )\n ) {\n return '';\n }\n\n return 'Write something or / to see commands';\n },\n includeChildren: true,\n});\n","import { Editor, Extension } from '@tiptap/core';\nimport Suggestion, { SuggestionOptions } from '@tiptap/suggestion';\n\nexport type SlashCommandOptions = {\n suggestion: Omit<SuggestionOptions, 'editor'>;\n};\n\nexport const SlashCommandExtension = Extension.create<SlashCommandOptions>({\n name: 'slash-command',\n addOptions() {\n return {\n suggestion: {\n char: '/',\n command: ({ editor, range, props }) => {\n props.command({ editor, range });\n },\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n});\n","import { BlockGroupItem, BlockItem } from '@/blocks/types';\nimport { cn } from '@/editor/utils/classname';\nimport { Editor, Range } from '@tiptap/core';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport {\n forwardRef,\n Fragment,\n KeyboardEvent,\n RefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport tippy, { GetReferenceClientRect, Instance } from 'tippy.js';\nimport { DEFAULT_SLASH_COMMANDS } from './default-slash-commands';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { SlashCommandItem } from './slash-command-item';\nimport { filterSlashCommands } from './slash-command-search';\n\ntype CommandListProps = {\n items: BlockGroupItem[];\n command: (item: BlockItem) => void;\n editor: Editor;\n range: Range;\n query: string;\n};\n\nconst CommandList = forwardRef<unknown, CommandListProps>((props, ref) => {\n const { items: groups, command, editor, range, query } = props;\n\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0);\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n const [hoveredItemKey, setHoveredItemKey] = useState<string | null>(null);\n\n const prevQuery = useRef('');\n const prevSelectedGroupIndex = useRef(0);\n const prevSelectedCommandIndex = useRef(0);\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const item = groups[groupIndex].commands[commandIndex];\n if (!item) {\n return;\n }\n\n command(item);\n },\n [command]\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n const navigationKeys = [\n 'ArrowUp',\n 'ArrowDown',\n 'Enter',\n 'ArrowLeft',\n 'ArrowRight',\n ];\n if (navigationKeys.includes(event.key)) {\n let newCommandIndex = selectedCommandIndex;\n let newGroupIndex = selectedGroupIndex;\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n\n const group = groups?.[selectedGroupIndex];\n const isInsideSubCommand = group && 'id' in group;\n if (!isInsideSubCommand) {\n return false;\n }\n\n editor\n .chain()\n .focus()\n .insertContentAt(range, `/${prevQuery.current}`)\n .run();\n setTimeout(() => {\n setSelectedGroupIndex(prevSelectedGroupIndex.current);\n setSelectedCommandIndex(prevSelectedCommandIndex.current);\n }, 0);\n return true;\n case 'ArrowRight':\n event.preventDefault();\n\n const command =\n groups?.[selectedGroupIndex]?.commands?.[selectedCommandIndex];\n const isSelectingSubCommand = command && 'commands' in command;\n if (!isSelectingSubCommand) {\n return false;\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex);\n prevQuery.current = query;\n prevSelectedGroupIndex.current = selectedGroupIndex;\n prevSelectedCommandIndex.current = selectedCommandIndex;\n return true;\n case 'Enter':\n if (!groups.length) {\n return false;\n }\n selectItem(selectedGroupIndex, selectedCommandIndex);\n\n prevQuery.current = query;\n prevSelectedGroupIndex.current = selectedGroupIndex;\n prevSelectedCommandIndex.current = selectedCommandIndex;\n return true;\n case 'ArrowUp':\n if (!groups.length) {\n return false;\n }\n newCommandIndex = selectedCommandIndex - 1;\n newGroupIndex = selectedGroupIndex;\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1;\n newCommandIndex = groups[newGroupIndex]?.commands.length - 1 || 0;\n }\n if (newGroupIndex < 0) {\n newGroupIndex = groups.length - 1;\n newCommandIndex = groups[newGroupIndex]?.commands.length - 1 || 0;\n }\n setSelectedGroupIndex(newGroupIndex);\n setSelectedCommandIndex(newCommandIndex);\n return true;\n case 'ArrowDown':\n if (!groups.length) {\n return false;\n }\n const commands = groups[selectedGroupIndex].commands;\n newCommandIndex = selectedCommandIndex + 1;\n newGroupIndex = selectedGroupIndex;\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0;\n newGroupIndex = selectedGroupIndex + 1;\n }\n if (groups.length - 1 < newGroupIndex) {\n newGroupIndex = 0;\n }\n setSelectedGroupIndex(newGroupIndex);\n setSelectedCommandIndex(newCommandIndex);\n return true;\n default:\n return false;\n }\n }\n },\n }));\n\n const commandListContainer = useRef<HTMLDivElement>(null);\n const activeCommandRef = useRef<HTMLButtonElement | null>(null);\n\n useLayoutEffect(() => {\n const container = commandListContainer?.current;\n const activeCommandContainer = activeCommandRef?.current;\n if (!container || !activeCommandContainer) {\n return;\n }\n\n const { offsetTop, offsetHeight } = activeCommandContainer;\n container.style.transition = 'none';\n container.scrollTop = offsetTop - offsetHeight;\n }, [\n selectedGroupIndex,\n selectedCommandIndex,\n commandListContainer,\n activeCommandRef,\n ]);\n\n useEffect(() => {\n setSelectedGroupIndex(0);\n setSelectedCommandIndex(0);\n }, [groups]);\n\n useEffect(() => {\n return () => {\n prevQuery.current = '';\n prevSelectedGroupIndex.current = 0;\n prevSelectedCommandIndex.current = 0;\n };\n }, []);\n\n if (!groups || groups.length === 0) {\n return null;\n }\n\n return (\n <TooltipProvider>\n <div className=\"mly:z-50 mly:w-72 mly:overflow-hidden mly:rounded-md mly:border mly:border-gray-200 mly:bg-white mly:shadow-md mly:transition-all\">\n <div\n id=\"slash-command\"\n ref={commandListContainer}\n className=\"mly:no-scrollbar mly:h-auto mly:max-h-[330px] mly:overflow-y-auto\"\n >\n {groups.map((group, groupIndex) => (\n <Fragment key={groupIndex}>\n <span\n className={cn(\n 'mly:block mly:border-b mly:border-gray-200 mly:bg-soft-gray mly:p-2 mly:text-xs mly:uppercase mly:text-gray-400',\n groupIndex > 0 ? 'mly:border-t' : ''\n )}\n >\n {group.title}\n </span>\n <div className=\"mly:space-y-0.5 mly:p-1\">\n {group.commands.map((item, commandIndex) => {\n const itemKey = `${groupIndex}-${commandIndex}`;\n return (\n <SlashCommandItem\n key={itemKey}\n item={item}\n groupIndex={groupIndex}\n commandIndex={commandIndex}\n selectedGroupIndex={selectedGroupIndex}\n selectedCommandIndex={selectedCommandIndex}\n selectItem={() => selectItem(groupIndex, commandIndex)}\n editor={editor}\n activeCommandRef={activeCommandRef}\n hoveredItemKey={hoveredItemKey}\n onHover={(isHovered) =>\n setHoveredItemKey(isHovered ? itemKey : null)\n }\n />\n );\n })}\n </div>\n </Fragment>\n ))}\n </div>\n <div className=\"mly:border-t mly:border-gray-200 mly:px-1 mly:py-3 mly:pl-4\">\n <div className=\"mly:flex mly:items-center\">\n <p className=\"mly:text-center mly:text-xs mly:text-gray-400\">\n <kbd className=\"mly:rounded mly:border mly:border-gray-200 mly:p-1 mly:px-2 mly:font-medium\">\n ↑\n </kbd>\n <kbd className=\"mly:ml-1 mly:rounded mly:border mly:border-gray-200 mly:p-1 mly:px-2 mly:font-medium\">\n ↓\n </kbd>{' '}\n to navigate\n </p>\n <span aria-hidden=\"true\" className=\"mly:select-none mly:px-1\">\n ·\n </span>\n <p className=\"mly:text-center mly:text-xs mly:text-gray-400\">\n <kbd className=\"mly:rounded mly:border mly:border-gray-200 mly:p-1 mly:px-1.5 mly:font-medium\">\n Enter\n </kbd>{' '}\n to select\n </p>\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n});\n\nexport function getSlashCommandSuggestions(\n groups: BlockGroupItem[] = DEFAULT_SLASH_COMMANDS\n): Omit<SuggestionOptions, 'editor'> {\n return {\n items: ({ query, editor }) => {\n return filterSlashCommands({ query, editor, groups });\n },\n allow: ({ editor }) => {\n const isInsideHTMLCodeBlock = editor.isActive('htmlCodeBlock');\n if (isInsideHTMLCodeBlock) {\n return false;\n }\n\n return true;\n },\n render: () => {\n let component: ReactRenderer<any>;\n let popup: Instance<any>[] | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(CommandList, {\n props,\n editor: props.editor,\n });\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'top-start',\n });\n },\n onUpdate: (props) => {\n const currentPopup = popup?.[0];\n if (!currentPopup || currentPopup?.state?.isDestroyed) {\n return;\n }\n\n component?.updateProps(props);\n currentPopup.setProps({\n getReferenceClientRect: props.clientRect,\n });\n },\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n const currentPopup = popup?.[0];\n if (!currentPopup?.state?.isDestroyed) {\n currentPopup?.destroy();\n }\n\n component?.destroy();\n return true;\n }\n\n return component?.ref?.onKeyDown(props);\n },\n onExit: () => {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n const currentPopup = popup?.[0];\n if (!currentPopup.state.isDestroyed) {\n currentPopup.destroy();\n }\n\n component?.destroy();\n },\n };\n },\n };\n}\n","import type { Editor } from '@tiptap/core';\nimport { BlockItem } from '@/blocks';\nimport { ChevronRightIcon } from 'lucide-react';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@/editor/components/ui/tooltip';\nimport { useCallback, useState, useRef, useEffect, RefObject } from 'react';\nimport { cn } from '@/editor/utils/classname';\n\ntype SlashCommandItemProps = {\n item: BlockItem;\n groupIndex: number;\n commandIndex: number;\n selectedGroupIndex: number;\n selectedCommandIndex: number;\n editor: Editor;\n activeCommandRef: RefObject<HTMLButtonElement> | null;\n selectItem: (groupIndex: number, commandIndex: number) => void;\n hoveredItemKey: string | null;\n onHover: (isHovered: boolean) => void;\n};\n\nexport function SlashCommandItem(props: SlashCommandItemProps) {\n const {\n item,\n groupIndex,\n commandIndex,\n selectedGroupIndex,\n selectedCommandIndex,\n editor,\n activeCommandRef,\n selectItem,\n hoveredItemKey,\n onHover,\n } = props;\n\n const [open, setOpen] = useState(false);\n const isActive =\n groupIndex === selectedGroupIndex && commandIndex === selectedCommandIndex;\n\n const itemKey = `${groupIndex}-${commandIndex}`;\n const isHovered = hoveredItemKey === itemKey;\n\n const isSubCommand = item && 'commands' in item;\n\n // show tooltip only if this item is hovered OR (active/keyboard selected AND no other item is hovered)\n const shouldOpenTooltip =\n !!item?.preview && (isHovered || (isActive && !hoveredItemKey));\n\n const hasRenderFunction = typeof item.render === 'function';\n const renderFunctionValue = hasRenderFunction ? item.render?.(editor) : null;\n\n let value = (\n <>\n <div className=\"mly:flex mly:h-6 mly:w-6 mly:shrink-0 mly:items-center mly:justify-center\">\n {item.icon}\n </div>\n <div className=\"mly:grow\">\n <p className=\"mly:font-medium\">{item.title}</p>\n <p className=\"mly:text-xs mly:text-gray-400\">{item.description}</p>\n </div>\n\n {isSubCommand && (\n <span className=\"mly:block mly:px-1 mly:text-gray-400\">\n <ChevronRightIcon className=\"mly:size-3.5 mly:stroke-[2.5]\" />\n </span>\n )}\n </>\n );\n\n if (renderFunctionValue !== null && renderFunctionValue !== true) {\n value = renderFunctionValue!;\n }\n\n const openTimerRef = useRef<number>(0);\n const handleDelayedOpen = useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n const delay = 200;\n openTimerRef.current = window.setTimeout(() => {\n setOpen(true);\n openTimerRef.current = 0;\n }, delay);\n }, [setOpen]);\n\n useEffect(() => {\n if (shouldOpenTooltip) {\n handleDelayedOpen();\n } else {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }\n }, [shouldOpenTooltip]);\n\n useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n\n return (\n <Tooltip open={open} key={`${groupIndex}-${commandIndex}`}>\n <TooltipTrigger asChild>\n <button\n className={cn(\n 'mly:flex mly:w-full mly:items-center mly:gap-2 mly:rounded-md mly:px-2 mly:py-1 mly:text-left mly:text-sm mly:text-gray-900 mly:hover:bg-gray-100 mly:hover:text-gray-900',\n isActive\n ? 'mly:bg-gray-100 mly:text-gray-900'\n : 'mly:bg-transparent'\n )}\n onClick={() => selectItem(groupIndex, commandIndex)}\n onMouseEnter={() => onHover(true)}\n onMouseLeave={() => onHover(false)}\n type=\"button\"\n ref={isActive ? activeCommandRef : null}\n >\n {value}\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"right\"\n sideOffset={10}\n className=\"mly:w-52 mly:rounded-lg mly:border-none mly:p-1 mly:shadow\"\n >\n {typeof item.preview === 'function' ? (\n item?.preview(editor)\n ) : (\n <>\n <figure className=\"mly:relative mly:aspect-[2.5] mly:w-full mly:overflow-hidden mly:rounded-md mly:border mly:border-gray-200\">\n <img\n src={item?.preview}\n alt={item?.title}\n className=\"mly:absolute mly:inset-0 mly:h-full mly:w-full mly:object-cover\"\n />\n </figure>\n <p className=\"mly:mt-2 mly:px-0.5 mly:text-gray-500\">\n {item.description}\n </p>\n </>\n )}\n </TooltipContent>\n </Tooltip>\n );\n}\n","import { BlockGroupItem, BlockItem } from '@/blocks';\nimport { Editor } from '@tiptap/core';\n\ntype SlashCommandFilterOptions = {\n readonly groups: BlockGroupItem[];\n query: string;\n editor: Editor;\n};\n\nexport function filterSlashCommands(options: SlashCommandFilterOptions) {\n const { groups, query, editor } = options;\n const newGroups = [...groups];\n let searchQuery = query?.toLowerCase();\n\n const subCommandMatch = searchQuery.match(/^([^.]+)\\./);\n\n // so if we are inside a subcommand we need to\n // filter the commands based on the remaining search\n if (subCommandMatch) {\n const [match, subCommandId] = subCommandMatch;\n const subCommandGroup = findSubCommandGroup(groups, subCommandId);\n\n if (subCommandGroup) {\n // headers.something -> headers. -> something (remainingSearch)\n const remainingSearch = searchQuery.slice(match.length);\n const filteredCommands = subCommandGroup.commands.filter(\n (item) => !remainingSearch || isCommandMatch(item, remainingSearch)\n );\n\n return filteredCommands.length\n ? [\n {\n ...subCommandGroup,\n commands: filteredCommands,\n },\n ]\n : [];\n }\n }\n\n const filteredGroups = newGroups\n .map((group) => {\n return {\n ...group,\n commands: group.commands.flatMap((item) =>\n processCommand({ item, search: searchQuery, editor })\n ),\n };\n })\n .filter((group) => group.commands.length > 0);\n\n return filteredGroups;\n}\n\ntype SubCommandGroup = BlockItem & {\n id: string;\n commands: BlockItem[];\n};\n\nfunction findSubCommandGroup(\n groups: BlockGroupItem[],\n subCommandId: string\n): SubCommandGroup | undefined {\n return groups\n .flatMap((group) => group.commands)\n .find(\n (item) =>\n 'commands' in item &&\n item.id?.toLowerCase() === subCommandId.toLowerCase()\n ) as SubCommandGroup | undefined;\n}\n\nfunction containsText(text: string | undefined, search: string): boolean {\n if (!text) {\n return false;\n }\n\n return text.toLowerCase().includes(search.toLowerCase());\n}\n\nfunction isCommandMatch(item: BlockItem, search: string): boolean {\n return (\n containsText(item.title, search) ||\n containsText(item.description, search) ||\n (item.searchTerms?.some((term) => containsText(term, search)) ?? false)\n );\n}\n\nfunction isSubCommand(item: BlockItem): item is SubCommandGroup {\n return 'commands' in item && Array.isArray(item.commands) && !!item.id;\n}\n\ntype ProcessCommandOptions = {\n item: BlockItem;\n search: string;\n editor: Editor;\n};\n\nfunction processCommand(options: ProcessCommandOptions): BlockItem[] {\n const { item, search, editor } = options;\n\n const show = item?.render?.(editor);\n if (show === null) {\n return [];\n }\n\n const isSearching = search.length > 0;\n if (isSubCommand(item)) {\n // if we are not searching, we want to return a navigable command\n // that will navigate to the group so that we can navigate into it\n // using the arrow keys / enter key\n // @ts-expect-error\n const navigableCommand: BlockItem = {\n ...item,\n command: (options) => {\n const { editor, range } = options;\n editor.chain().focus().insertContentAt(range, `/${item.id}.`).run();\n },\n };\n\n // first check if the item matches the search\n const matched = isCommandMatch(navigableCommand, search);\n if (matched) {\n return [navigableCommand];\n }\n\n // so the main command does not match the search\n // we need to check if any of the commands match the search\n // if they do, we return the commands instead of the main command\n const hasMatchingCommands =\n navigableCommand?.commands?.some((command) =>\n isCommandMatch(command, search)\n ) ?? false;\n\n if (!hasMatchingCommands) {\n return [];\n }\n\n return navigableCommand?.commands ?? [];\n }\n\n return !isSearching || isCommandMatch(item, search) ? [item] : [];\n}\n","import {\n getVariableOptions,\n useVariableOptions,\n} from '@/editor/utils/node-options';\nimport { processVariables } from '@/editor/utils/variable';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport { forwardRef, useImperativeHandle, useRef } from 'react';\nimport tippy, { GetReferenceClientRect } from 'tippy.js';\nimport {\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n Variable as VariableType,\n} from './variable';\nimport { VariableSuggestionsPopoverRef } from './variable-suggestions-popover';\n\nexport type VariableListProps = {\n command: (params: {\n id: string;\n required: boolean;\n hideDefaultValue: boolean;\n label?: string;\n }) => void;\n items: VariableType[];\n} & SuggestionOptions;\n\nexport const VariableList = forwardRef((props: VariableListProps, ref) => {\n const { items = [], editor } = props;\n\n const popoverRef = useRef<VariableSuggestionsPopoverRef>(null);\n const VariableSuggestionPopoverComponent =\n useVariableOptions(editor)?.variableSuggestionsPopover;\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!popoverRef.current) {\n return false;\n }\n\n const { moveUp, moveDown, select } = popoverRef.current || {};\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveUp();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveDown();\n return true;\n }\n\n if (event.key === 'Enter') {\n select();\n return true;\n }\n\n return false;\n },\n }));\n\n return (\n <VariableSuggestionPopoverComponent\n items={items}\n onSelectItem={(value) => {\n props.command({\n id: value.name,\n required: value.required ?? true,\n hideDefaultValue: value?.hideDefaultValue ?? false,\n label: value?.label,\n });\n }}\n ref={popoverRef}\n />\n );\n});\n\nVariableList.displayName = 'VariableList';\n\nexport function getVariableSuggestions(\n char: string = DEFAULT_VARIABLE_TRIGGER_CHAR\n): Omit<SuggestionOptions, 'editor'> {\n return {\n char,\n items: ({ query, editor }) => {\n const variables = getVariableOptions(editor)?.variables;\n\n return processVariables(variables, {\n query,\n editor,\n from: 'content-variable',\n });\n },\n\n render: () => {\n let component: ReactRenderer<any>;\n let popup: InstanceType<any> | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(VariableList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\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 as GetReferenceClientRect,\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup?.[0].hide();\n return true;\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n popup?.[0].destroy();\n component.destroy();\n },\n };\n },\n };\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';\nimport { TextSelection } from '@tiptap/pm/state';\nimport {\n NodeViewContent,\n NodeViewProps,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n} from '@tiptap/react';\nimport html from 'highlight.js/lib/languages/xml';\nimport { createLowlight, common } from 'lowlight';\nimport { HTMLCodeBlockView } from './html-view';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '@/extensions';\n\nconst lowlight = createLowlight(common);\nlowlight.register('html', html);\n\nexport type HtmlCodeBlockAttributes = {\n activeTab: string;\n showIfKey: string;\n language: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n htmlCodeBlock: {\n /**\n * Set a code block\n * @param attributes Code block attributes\n * @example editor.commands.setCodeBlock({ language: 'javascript' })\n */\n setHtmlCodeBlock: (attributes?: { language: string }) => ReturnType;\n /**\n * Toggle a code block\n * @param attributes Code block attributes\n * @example editor.commands.toggleCodeBlock({ language: 'javascript' })\n */\n toggleHtmlCodeBlock: (attributes?: { language: string }) => ReturnType;\n updateHtmlCodeBlock: (\n attrs: Partial<HtmlCodeBlockAttributes>\n ) => ReturnType;\n };\n }\n}\n\nexport const HTMLCodeBlockExtension = CodeBlockLowlight.extend({\n name: 'htmlCodeBlock',\n content: '(text|variable)*',\n\n addAttributes() {\n return {\n ...this.parent?.(),\n activeTab: 'code',\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(HTMLCodeBlockView, {\n className: 'mly:relative',\n attrs: ({ node }) => ({\n 'data-active-tab': node?.attrs?.activeTab || 'code',\n }),\n });\n },\n\n addCommands() {\n return {\n setHtmlCodeBlock:\n (attributes) =>\n ({ commands }) => {\n return commands.setNode(this.name, attributes);\n },\n toggleHtmlCodeBlock:\n (attributes) =>\n ({ commands }) => {\n return commands.toggleNode(this.name, 'paragraph', attributes);\n },\n updateHtmlCodeBlock: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addKeyboardShortcuts() {\n return {\n ...this.parent?.(),\n 'Mod-a': ({ editor }) => {\n const { selection } = editor.state;\n const $pos = selection.$anchor;\n\n // resolve the position to the code block node\n // and check if the node is a code block\n const node = $pos.node($pos.depth);\n if (node.type.name !== this.name) {\n return false;\n }\n\n // find the depth of the code block node\n // to get the correct start and end position\n // usually when we are inside a code block\n // the depth is the same as the code block node\n let depth = $pos.depth;\n for (let d = depth; d > 0; d--) {\n if ($pos.node(d).type.name === this.name) {\n depth = d;\n break;\n }\n }\n\n // find the start and end position of the code block\n // and set the selection to the code block\n const start = $pos.before(depth) + 1; // +1 to move inside the code block\n const end = $pos.after(depth) - 1; // -1 to stay inside the code block\n\n const from = editor.state.doc.resolve(start);\n const to = editor.state.doc.resolve(end);\n if (from && to) {\n const transaction = editor.state.tr.setSelection(\n TextSelection.between(from, to)\n );\n editor.view.dispatch(transaction);\n return true;\n }\n\n return false;\n },\n };\n },\n}).configure({\n lowlight,\n});\n","import { cn } from '@/editor/utils/classname';\nimport { NodeViewProps } from '@tiptap/core';\nimport { NodeViewContent, NodeViewWrapper } from '@tiptap/react';\nimport { useMemo } from 'react';\nimport { HtmlCodeBlockAttributes } from './html';\n\nexport function HTMLCodeBlockView(props: NodeViewProps) {\n const { node, updateAttributes } = props;\n\n let { language, activeTab = 'code' } = node.attrs as HtmlCodeBlockAttributes;\n activeTab ||= 'code';\n\n const languageClass = language ? `language-${language}` : '';\n\n const html = useMemo(() => {\n const text = node.content.content.reduce((acc, cur) => {\n if (cur.type.name === 'text') {\n return acc + cur.text;\n } else if (cur.type.name === 'variable') {\n const { id: variable, fallback } = cur?.attrs || {};\n const formattedVariable = fallback\n ? `{{${variable},fallback=${fallback}}}`\n : `{{${variable}}}`;\n return acc + formattedVariable;\n }\n\n return acc;\n }, '');\n\n const htmlParser = new DOMParser();\n const htmlDoc = htmlParser.parseFromString(text, 'text/html');\n const style = htmlDoc.querySelectorAll('style');\n const body = htmlDoc.body;\n const combinedStyle = Array.from(style)\n .map((s) => s.innerHTML)\n .join('\\n');\n\n return `<style>${combinedStyle}</style>${body.innerHTML}`;\n }, [activeTab]);\n\n const isEmpty = html === '';\n\n return (\n <NodeViewWrapper\n draggable={false}\n data-drag-handle={false}\n data-type=\"htmlCodeBlock\"\n >\n {activeTab === 'code' && (\n <pre className=\"mly:my-0 mly:rounded-lg mly:border mly:border-gray-200 mly:bg-white mly:p-2 mly:text-black\">\n <NodeViewContent\n as=\"code\"\n className={cn('is-editable', languageClass)}\n />\n </pre>\n )}\n\n {activeTab === 'preview' && (\n <div\n className={cn(\n 'mly:not-prose mly:rounded-lg mly:border mly:border-gray-200 mly:p-2',\n isEmpty && 'mly:min-h-[42px]'\n )}\n ref={(node) => {\n if (!node || node?.shadowRoot) {\n return;\n }\n const shadow = node.attachShadow({ mode: 'open' });\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`\n * { font-family: 'Inter', sans-serif; }\n blockquote, h1, h2, h3, img, li, ol, p, ul {\n margin-top: 0;\n margin-bottom: 0;\n }\n `);\n shadow.adoptedStyleSheets = [sheet];\n const container = document.createElement('div');\n container.innerHTML = html;\n shadow.appendChild(container);\n }}\n contentEditable={false}\n onClick={() => {\n if (!isEmpty) {\n return;\n }\n\n updateAttributes({\n activeTab: 'code',\n });\n }}\n />\n )}\n </NodeViewWrapper>\n );\n}\n"],"mappings":"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","names":["TiptapColor","TipTapHorizontalRule","pos","import_core","import_core","import_extension_paragraph","import_extension_heading","import_core","HTMLAttributes","import_core","import_core","HTMLAttributes","HTMLAttributes","import_core","import_react","import_react","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","classGroups","Map","processClassesRecursively","classGroup","forEach","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","Object","entries","key","path","currentClassPartObject","pathPart","has","set","func","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","value","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","MODIFIER_SEPARATOR_LENGTH","createParseClassName","prefix","experimentalParseClassName","parseClassName","modifiers","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","baseClassName","stripImportantModifier","hasImportantModifier","maybePostfixModifierPosition","fullPrefix","parseClassNameOriginal","startsWith","isExternal","endsWith","createSortModifiers","orderSensitiveModifiers","fromEntries","map","modifier","sortModifiers","sortedModifiers","unsortedModifiers","isPositionSensitive","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","Number","isNaN","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isLabelFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","testLabel","testValue","shouldMatchNoLabel","label","getDefaultConfig","themeColor","fromTheme","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","isArbitraryVariable","isArbitraryValue","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","isFraction","scaleGridTemplateColsRows","isInteger","scaleGridColRowStartAndEnd","span","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleColor","scaleBgPosition","isArbitraryVariablePosition","isArbitraryPosition","position","scaleBgRepeat","repeat","scaleBgSize","isArbitraryVariableSize","isArbitrarySize","size","scaleGradientStopPosition","isPercent","isArbitraryVariableLength","isArbitraryLength","scaleRadius","scaleBorderWidth","isNumber","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","cacheSize","theme","animate","aspect","blur","isTshirtSize","breakpoint","color","isAny","container","ease","font","isAnyNonArbitrary","leading","perspective","radius","shadow","spacing","text","tracking","classGroups","columns","box","display","sr","float","clear","isolation","object","overflow","overscroll","inset","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","row","gap","justify","content","items","baseline","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","isArbitraryNumber","isArbitraryVariableFamilyName","list","placeholder","decoration","indent","align","whitespace","break","wrap","hyphens","bg","linear","to","radial","conic","isArbitraryVariableImage","isArbitraryImage","from","via","rounded","border","divide","outline","isArbitraryVariableShadow","isArbitraryShadow","ring","opacity","mask","closest","farthest","filter","brightness","contrast","grayscale","invert","saturate","sepia","table","caption","transition","duration","delay","backface","rotate","scale","skew","transform","origin","translate","accent","appearance","caret","scheme","cursor","resize","scroll","snap","touch","select","fill","stroke","conflictingClassGroups","conflictingClassGroupModifiers","orderSensitiveModifiers","mergeConfigs","baseConfig","prefix","experimentalParseClassName","extend","override","overrideProperty","overrideConfigProperties","mergeConfigProperties","mergeArrayProperties","baseObject","overrideKey","overrideValue","undefined","overrideObject","key","mergeObject","mergeValue","concat","extendTailwindMerge","configExtension","createConfig","createTailwindMerge","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","image","HTMLAttributes","import_state","import_uuid","import_core","import_core","uuidv4","HTMLAttributes","import_core","import_uuid","uuidv4","HTMLAttributes","import_core","import_react","import_lucide_react","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react","import_react","import_jsx_runtime","updateAttributes","event","_a","import_jsx_runtime","updateAttributes","TiptapImage","import_jsx_runtime","import_jsx_runtime","color","import_jsx_runtime","import_lucide_react","import_react","import_react","import_lucide_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_state","import_lucide_react","import_jsx_runtime","editor","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_core","import_state","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","updateAttributes","HTMLAttributes","Suggestion","import_jsx_runtime","_a","isVariable","import_react","import_lucide_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","_a","value","isVariable","import_jsx_runtime","updateAttributes","text","alignment","HTMLAttributes","import_extension_image","import_react","TiptapImage","_a","TiptapLink","TiptapHeading","TiptapParagraph","import_core","import_react","import_react","import_lucide_react","import_jsx_runtime","HTMLAttributes","Document","StarterKit","Underline","TextStyle","ListItem","TextAlign","Paragraph","Heading","Focus","Dropcursor","Placeholder","import_core","import_suggestion","Suggestion","import_react","import_lucide_react","import_react","import_jsx_runtime","isSubCommand","text","options","editor","import_jsx_runtime","command","tippy","import_react","import_tippy","import_jsx_runtime","_a","tippy","import_state","import_react","import_react","import_jsx_runtime","updateAttributes","html","text","node","html","CodeBlockLowlight"]}