@daisychainapp/maily-to-core 0.1.2 → 0.2.8

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.
@@ -0,0 +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":"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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","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"]}