@react-email/editor 0.0.0-experimental.21 → 0.0.0-experimental.24

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.
Files changed (45) hide show
  1. package/dist/columns-CUxUEHje.mjs +497 -0
  2. package/dist/columns-CUxUEHje.mjs.map +1 -0
  3. package/dist/columns-ZSaLdkg9.cjs +630 -0
  4. package/dist/core/index.cjs +8 -0
  5. package/dist/core/index.d.cts +2 -0
  6. package/dist/core/index.d.mts +2 -0
  7. package/dist/core/index.mjs +4 -0
  8. package/dist/core-BjmRceVw.mjs +1999 -0
  9. package/dist/core-BjmRceVw.mjs.map +1 -0
  10. package/dist/core-iuG1UrYN.cjs +2250 -0
  11. package/dist/extensions/index.cjs +46 -0
  12. package/dist/extensions/index.d.cts +389 -0
  13. package/dist/extensions/index.d.cts.map +1 -0
  14. package/dist/extensions/index.d.mts +389 -0
  15. package/dist/extensions/index.d.mts.map +1 -0
  16. package/dist/extensions/index.mjs +4 -0
  17. package/dist/index-CfslA7KT.d.cts +130 -0
  18. package/dist/index-CfslA7KT.d.cts.map +1 -0
  19. package/dist/index-hbHRR7oB.d.mts +130 -0
  20. package/dist/index-hbHRR7oB.d.mts.map +1 -0
  21. package/dist/set-text-alignment-Bx3bPteH.cjs +24 -0
  22. package/dist/set-text-alignment-DZvgnbvz.mjs +19 -0
  23. package/dist/set-text-alignment-DZvgnbvz.mjs.map +1 -0
  24. package/dist/ui/index.cjs +1646 -0
  25. package/dist/ui/index.d.cts +668 -0
  26. package/dist/ui/index.d.cts.map +1 -0
  27. package/dist/ui/index.d.mts +668 -0
  28. package/dist/ui/index.d.mts.map +1 -0
  29. package/dist/ui/index.mjs +1584 -0
  30. package/dist/ui/index.mjs.map +1 -0
  31. package/dist/ui/themes/default.css +20 -1
  32. package/dist/utils/index.cjs +3 -0
  33. package/dist/utils/index.d.cts +7 -0
  34. package/dist/utils/index.d.cts.map +1 -0
  35. package/dist/utils/index.d.mts +7 -0
  36. package/dist/utils/index.d.mts.map +1 -0
  37. package/dist/utils/index.mjs +3 -0
  38. package/package.json +41 -13
  39. package/dist/index.cjs +0 -4205
  40. package/dist/index.d.cts +0 -1164
  41. package/dist/index.d.cts.map +0 -1
  42. package/dist/index.d.mts +0 -1164
  43. package/dist/index.d.mts.map +0 -1
  44. package/dist/index.mjs +0 -4047
  45. package/dist/index.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-BjmRceVw.mjs","names":["Body","Button","ReactEmailButton","CodeBlock","ReactEmailCodeBlock","Node","Heading","TipTapHeading","EmailHeading","Link","ReactEmailLink","tr","Node","Section","ReactEmailSection","Node","useEditor","useTipTapEditor","editor"],"sources":["../src/core/is-document-visually-empty.ts","../src/core/serializer/default-base-template.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/compose-react-email.tsx","../src/extensions/alignment-attribute.tsx","../src/utils/get-text-alignment.ts","../src/extensions/blockquote.tsx","../src/extensions/body.tsx","../src/extensions/bold.tsx","../src/extensions/bullet-list.tsx","../src/extensions/button.tsx","../src/extensions/class-attribute.tsx","../src/extensions/code.tsx","../src/utils/prism-utils.ts","../src/extensions/prism-plugin.ts","../src/extensions/code-block.tsx","../src/extensions/div.tsx","../src/extensions/divider.tsx","../src/extensions/global-content.ts","../src/extensions/hard-break.tsx","../src/extensions/heading.tsx","../src/extensions/italic.tsx","../src/extensions/preserved-style.tsx","../src/extensions/link.tsx","../src/extensions/list-item.tsx","../src/extensions/max-nesting.ts","../src/extensions/ordered-list.tsx","../src/extensions/paragraph.tsx","../src/extensions/placeholder.ts","../src/extensions/preview-text.ts","../src/extensions/section.tsx","../src/extensions/strike.tsx","../src/extensions/style-attribute.tsx","../src/extensions/sup.tsx","../src/extensions/table.tsx","../src/extensions/underline.tsx","../src/extensions/uppercase.tsx","../src/extensions/index.ts","../src/core/create-drop-handler.ts","../src/utils/paste-sanitizer.ts","../src/core/create-paste-handler.ts","../src/core/use-editor.ts"],"sourcesContent":["import type { Node } from '@tiptap/pm/model';\n\nexport function isDocumentVisuallyEmpty(doc: Node): boolean {\n let nonGlobalNodeCount = 0;\n let firstNonGlobalNode: {\n type: { name: string };\n textContent: string;\n childCount: number;\n } | null = null;\n\n for (let index = 0; index < doc.childCount; index += 1) {\n const node = doc.child(index);\n\n if (node.type.name === 'globalContent') {\n continue;\n }\n\n nonGlobalNodeCount += 1;\n\n if (firstNonGlobalNode === null) {\n firstNonGlobalNode = {\n type: node.type,\n textContent: node.textContent,\n childCount: node.content.childCount,\n };\n }\n }\n\n if (nonGlobalNodeCount === 0) {\n return true;\n }\n\n if (nonGlobalNodeCount !== 1) {\n return false;\n }\n\n return (\n firstNonGlobalNode?.type.name === 'paragraph' &&\n firstNonGlobalNode.textContent.trim().length === 0 &&\n firstNonGlobalNode.childCount === 0\n );\n}\n","import { Body, Head, Html, Preview, Section } from '@react-email/components';\nimport type * as React from 'react';\n\ntype BaseTemplateProps = {\n children: React.ReactNode;\n previewText: string | null;\n};\n\nexport function DefaultBaseTemplate({\n children,\n previewText,\n}: BaseTemplateProps) {\n return (\n <Html>\n <Head>\n <meta content=\"width=device-width\" name=\"viewport\" />\n <meta content=\"IE=edge\" httpEquiv=\"X-UA-Compatible\" />\n <meta name=\"x-apple-disable-message-reformatting\" />\n <meta\n content=\"telephone=no,address=no,email=no,date=no,url=no\"\n name=\"format-detection\"\n />\n </Head>\n {previewText && previewText !== '' && <Preview>{previewText}</Preview>}\n\n <Body>\n <Section width=\"100%\" align=\"center\">\n <Section\n style={{\n width: '100%',\n }}\n >\n {children}\n </Section>\n </Section>\n </Body>\n </Html>\n );\n}\n","import {\n type Editor,\n type JSONContent,\n Mark,\n type MarkConfig,\n type MarkType,\n} from '@tiptap/core';\n\nexport type SerializedMark = NonNullable<JSONContent['marks']>[number];\n\nexport type RendererComponent = (props: {\n mark: SerializedMark;\n node: JSONContent;\n style: React.CSSProperties;\n children?: React.ReactNode;\n}) => React.ReactNode;\n\nexport interface EmailMarkConfig<Options, Storage>\n extends MarkConfig<Options, Storage> {\n renderToReactEmail: RendererComponent;\n}\n\ntype ConfigParameter<Options, Storage> = Partial<\n Omit<EmailMarkConfig<Options, Storage>, 'renderToReactEmail'>\n> &\n Pick<EmailMarkConfig<Options, Storage>, 'renderToReactEmail'> &\n ThisType<{\n name: string;\n options: Options;\n storage: Storage;\n editor: Editor;\n type: MarkType;\n parent: (...args: any[]) => any;\n }>;\n\nexport class EmailMark<\n Options = Record<string, never>,\n Storage = Record<string, never>,\n> extends Mark<Options, Storage> {\n declare config: EmailMarkConfig<Options, Storage>;\n\n // biome-ignore lint/complexity/noUselessConstructor: This is only meant to change the types for config, hence why we keep it\n constructor(config: ConfigParameter<Options, Storage>) {\n super(config);\n }\n\n /**\n * Create a new Mark instance\n * @param config - Mark configuration object or a function that returns a configuration object\n */\n static create<O = Record<string, never>, S = Record<string, never>>(\n config: ConfigParameter<O, S> | (() => ConfigParameter<O, S>),\n ) {\n const resolvedConfig = typeof config === 'function' ? config() : config;\n return new EmailMark<O, S>(resolvedConfig);\n }\n\n static from<O, S>(\n mark: Mark<O, S>,\n renderToReactEmail: RendererComponent,\n ): EmailMark<O, S> {\n const customMark = EmailMark.create({} as ConfigParameter<O, S>);\n // This only makes a shallow copy, so if there's nested objects here mutating things will be dangerous\n Object.assign(customMark, { ...mark });\n customMark.config = { ...mark.config, renderToReactEmail };\n return customMark;\n }\n\n // Subclass return types for configure/extend; safe at runtime. TipTap's Mark typings cause TS2416 when returning EmailMark.\n // @ts-expect-error - EmailMark is a valid Mark subclass; base typings don't support subclass return types\n configure(options?: Partial<Options>) {\n return super.configure(options) as EmailMark<Options, Storage>;\n }\n\n // @ts-expect-error - same as configure: extend returns EmailMark for chaining; base typings are incompatible\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig extends MarkConfig<\n ExtendedOptions,\n ExtendedStorage\n > = EmailMarkConfig<ExtendedOptions, ExtendedStorage>,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string;\n options: ExtendedOptions;\n storage: ExtendedStorage;\n editor: Editor;\n type: MarkType;\n }>),\n ): EmailMark<ExtendedOptions, ExtendedStorage> {\n const resolvedConfig =\n typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig;\n return super.extend(resolvedConfig) as EmailMark<\n ExtendedOptions,\n ExtendedStorage\n >;\n }\n}\n","import { pretty, render, toPlainText } from '@react-email/components';\nimport type { Editor, JSONContent } from '@tiptap/core';\nimport { inlineCssToJs } from '../../utils/styles';\nimport { DefaultBaseTemplate } from './default-base-template';\nimport {\n EmailMark,\n type RendererComponent as EmailMarkRenderer,\n type SerializedMark,\n} from './email-mark';\nimport { EmailNode } from './email-node';\nimport type { SerializerPlugin } from './serializer-plugin';\n\nconst MARK_ORDER: Record<string, number> = {\n preservedStyle: 0,\n italic: 1,\n strike: 2,\n underline: 3,\n link: 4,\n bold: 5,\n code: 6,\n};\n\nconst NODES_WITH_INCREMENTED_CHILD_DEPTH = new Set([\n 'bulletList',\n 'orderedList',\n]);\n\nfunction getOrderedMarks(marks: SerializedMark[] | undefined) {\n if (!marks) {\n return [];\n }\n\n return [...marks].sort(\n (a, b) =>\n (MARK_ORDER[a.type] ?? Number.MAX_SAFE_INTEGER) -\n (MARK_ORDER[b.type] ?? Number.MAX_SAFE_INTEGER),\n );\n}\n\ninterface ComposeReactEmailResult {\n html: string;\n text: string;\n}\n\nexport const composeReactEmail = async ({\n editor,\n preview,\n}: {\n editor: Editor;\n preview: string | null;\n}): Promise<ComposeReactEmailResult> => {\n const data = editor.getJSON();\n const extensions = editor.extensionManager.extensions;\n\n const serializerPlugin = extensions\n .map(\n (ext) =>\n (ext as { options?: { serializerPlugin?: SerializerPlugin } }).options\n ?.serializerPlugin,\n )\n .filter((p) => Boolean(p))\n .at(-1);\n\n const emailNodeComponentRegistry = Object.fromEntries(\n extensions\n .filter((ext): ext is EmailNode => ext instanceof EmailNode)\n .map((extension) => [\n extension.name,\n extension.config.renderToReactEmail,\n ]),\n );\n\n const emailMarkComponentRegistry = Object.fromEntries(\n extensions\n .filter((ext): ext is EmailMark => ext instanceof EmailMark)\n .map((extension) => [\n extension.name,\n extension.config.renderToReactEmail,\n ]),\n ) as Record<string, EmailMarkRenderer>;\n\n function renderMark(\n mark: SerializedMark,\n node: JSONContent,\n children: React.ReactNode,\n depth: number,\n ) {\n const markStyle =\n serializerPlugin?.getNodeStyles(\n {\n type: mark.type,\n attrs: mark.attrs ?? {},\n },\n depth,\n editor,\n ) ?? {};\n\n const markRenderer = emailMarkComponentRegistry[mark.type];\n if (markRenderer) {\n return markRenderer({\n mark,\n node,\n style: markStyle,\n children,\n });\n }\n\n return children;\n }\n\n function parseContent(content: JSONContent[] | undefined, depth = 0) {\n if (!content) {\n return;\n }\n\n return content.map((node: JSONContent, index: number) => {\n const style = serializerPlugin?.getNodeStyles(node, depth, editor) ?? {};\n\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n\n if (node.type && emailNodeComponentRegistry[node.type]) {\n const Component = emailNodeComponentRegistry[node.type];\n const childDepth = NODES_WITH_INCREMENTED_CHILD_DEPTH.has(node.type)\n ? depth + 1\n : depth;\n\n return (\n <Component\n key={index}\n node={\n node.type === 'table' && inlineStyles.width && !node.attrs?.width\n ? {\n ...node,\n attrs: { ...node.attrs, width: inlineStyles.width },\n }\n : node\n }\n style={style}\n >\n {parseContent(node.content, childDepth)}\n </Component>\n );\n }\n\n switch (node.type) {\n case 'text': {\n let wrappedText: React.ReactNode = node.text;\n\n const textMarks = getOrderedMarks(node.marks);\n textMarks.forEach((mark: SerializedMark) => {\n wrappedText = renderMark(mark, node, wrappedText, depth);\n });\n\n const textAttributes = node.marks?.find(\n (mark: SerializedMark) => mark.type === 'textStyle',\n )?.attrs;\n\n return (\n <span key={index} style={{ ...textAttributes, ...style }}>\n {wrappedText}\n </span>\n );\n }\n\n default:\n return null;\n }\n });\n }\n\n const BaseTemplate = serializerPlugin?.BaseTemplate ?? DefaultBaseTemplate;\n\n const parsedContent = parseContent(data.content);\n const unformattedHtml = await render(\n <BaseTemplate previewText={preview} editor={editor}>\n {parsedContent}\n </BaseTemplate>,\n );\n\n const [prettyHtml, text] = await Promise.all([\n pretty(unformattedHtml),\n toPlainText(unformattedHtml),\n ]);\n\n return { html: prettyHtml, text };\n};\n","import { Extension } from '@tiptap/core';\n\nexport interface AlignmentOptions {\n types: string[];\n alignments: string[];\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n alignment: {\n /**\n * Set the text align attribute\n */\n setAlignment: (alignment: string) => ReturnType;\n };\n }\n}\n\nexport const AlignmentAttribute = Extension.create<AlignmentOptions>({\n name: 'alignmentAttribute',\n\n addOptions() {\n return {\n types: [],\n alignments: ['left', 'center', 'right', 'justify'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n alignment: {\n parseHTML: (element) => {\n const explicitAlign =\n element.getAttribute('align') ||\n element.getAttribute('alignment') ||\n element.style.textAlign;\n if (\n explicitAlign &&\n this.options.alignments.includes(explicitAlign)\n ) {\n return explicitAlign;\n }\n\n // Return null to let natural inheritance work\n return null;\n },\n renderHTML: (attributes) => {\n if (attributes.alignment === 'left') {\n return {};\n }\n\n return { alignment: attributes.alignment };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setAlignment:\n (alignment) =>\n ({ commands }) => {\n if (!this.options.alignments.includes(alignment)) {\n return false;\n }\n\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { alignment }),\n );\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n // Get the current node's alignment\n const { from } = this.editor.state.selection;\n const node = this.editor.state.doc.nodeAt(from);\n const currentAlignment = node?.attrs?.alignment;\n\n if (currentAlignment) {\n requestAnimationFrame(() => {\n // Preserve the current alignment when creating new nodes\n this.editor.commands.setAlignment(currentAlignment);\n });\n }\n\n return false;\n },\n 'Mod-Shift-l': () => this.editor.commands.setAlignment('left'),\n 'Mod-Shift-e': () => this.editor.commands.setAlignment('center'),\n 'Mod-Shift-r': () => this.editor.commands.setAlignment('right'),\n 'Mod-Shift-j': () => this.editor.commands.setAlignment('justify'),\n };\n },\n});\n","export function getTextAlignment(alignment: string | undefined) {\n switch (alignment) {\n case 'left':\n return { textAlign: 'left' } as const;\n case 'center':\n return { textAlign: 'center' } as const;\n case 'right':\n return { textAlign: 'right' } as const;\n default:\n return {};\n }\n}\n","import type { BlockquoteOptions } from '@tiptap/extension-blockquote';\nimport BlockquoteBase from '@tiptap/extension-blockquote';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { getTextAlignment } from '../utils/get-text-alignment';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const Blockquote: EmailNode<BlockquoteOptions, any> = EmailNode.from(\n BlockquoteBase,\n ({ children, node, style }) => (\n <blockquote\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineCssToJs(node.attrs?.style),\n ...getTextAlignment(node.attrs?.align || node.attrs?.alignment),\n }}\n >\n {children}\n </blockquote>\n ),\n);\n","import { mergeAttributes } from '@tiptap/core';\nimport { EmailNode } from '../core/serializer/email-node';\nimport {\n COMMON_HTML_ATTRIBUTES,\n createStandardAttributes,\n LAYOUT_ATTRIBUTES,\n} from '../utils/attribute-helpers';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport interface BodyOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Body = EmailNode.create<BodyOptions>({\n name: 'body',\n\n group: 'block',\n\n content: 'block+',\n\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...COMMON_HTML_ATTRIBUTES,\n ...LAYOUT_ATTRIBUTES,\n ]),\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'body',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n // Preserve all attributes\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n 0,\n ];\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n return (\n <div\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineStyles,\n }}\n >\n {children}\n </div>\n );\n },\n});\n","import type { BoldOptions as TipTapBoldOptions } from '@tiptap/extension-bold';\nimport BoldBase from '@tiptap/extension-bold';\nimport { EmailMark } from '../core/serializer/email-mark';\n\nexport type BoldOptions = TipTapBoldOptions;\n\nconst BoldWithoutFontWeightInference = BoldBase.extend({\n parseHTML() {\n return [\n {\n tag: 'strong',\n },\n {\n tag: 'b',\n getAttrs: (node) =>\n (node as HTMLElement).style.fontWeight !== 'normal' && null,\n },\n {\n style: 'font-weight=400',\n clearMark: (mark) => mark.type.name === this.name,\n },\n ];\n },\n});\n\nexport const Bold: EmailMark<TipTapBoldOptions, any> = EmailMark.from(\n BoldWithoutFontWeightInference,\n ({ children, style }) => <strong style={style}>{children}</strong>,\n);\n","import type { BulletListOptions } from '@tiptap/extension-bullet-list';\nimport BulletListBase from '@tiptap/extension-bullet-list';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const BulletList: EmailNode<BulletListOptions, any> = EmailNode.from(\n BulletListBase,\n ({ children, node, style }) => (\n <ul\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineCssToJs(node.attrs?.style),\n }}\n >\n {children}\n </ul>\n ),\n);\n","import {\n Column,\n Button as ReactEmailButton,\n Row,\n} from '@react-email/components';\nimport { mergeAttributes } from '@tiptap/core';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport interface EditorButtonOptions {\n HTMLAttributes: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n button: {\n setButton: () => ReturnType;\n updateButton: (attributes: Record<string, unknown>) => ReturnType;\n };\n }\n}\n\nexport const Button = EmailNode.create<EditorButtonOptions>({\n name: 'button',\n group: 'block',\n content: 'inline*',\n defining: true,\n draggable: true,\n marks: 'bold',\n\n addAttributes() {\n return {\n class: {\n default: 'button',\n },\n href: {\n default: '#',\n },\n alignment: {\n default: 'left',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'a[data-id=\"react-email-button\"]',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n // Preserve all attributes\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({\n class: `align-${HTMLAttributes?.alignment}`,\n }),\n [\n 'a',\n mergeAttributes({\n class: `node-button ${HTMLAttributes?.class}`,\n style: HTMLAttributes?.style,\n 'data-id': 'react-email-button',\n 'data-href': HTMLAttributes?.href,\n }),\n 0,\n ],\n ];\n },\n\n addCommands() {\n return {\n updateButton:\n (attributes) =>\n ({ commands }) => {\n return commands.updateAttributes('button', attributes);\n },\n\n setButton:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: 'button',\n content: [\n {\n type: 'text',\n text: 'Button',\n },\n ],\n });\n },\n };\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n return (\n <Row>\n <Column align={node.attrs?.align || node.attrs?.alignment}>\n <ReactEmailButton\n className={node.attrs?.class || undefined}\n href={node.attrs?.href}\n style={{\n ...style,\n ...inlineStyles,\n }}\n >\n {children}\n </ReactEmailButton>\n </Column>\n </Row>\n );\n },\n});\n","import { Extension } from '@tiptap/core';\n\nexport interface ClassAttributeOptions {\n types: string[];\n class: string[];\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n class: {\n /**\n * Set the class attribute\n */\n setClass: (classList: string) => ReturnType;\n /**\n * Unset the class attribute\n */\n unsetClass: () => ReturnType;\n };\n }\n}\n\nexport const ClassAttribute = Extension.create<ClassAttributeOptions>({\n name: 'classAttribute',\n\n addOptions() {\n return {\n types: [],\n class: [],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n class: {\n default: '',\n parseHTML: (element) => element.className || '',\n renderHTML: (attributes) => {\n return attributes.class ? { class: attributes.class } : {};\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n unsetClass:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, 'class'),\n );\n },\n setClass:\n (classList: string) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { class: classList }),\n );\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: ({ editor }) => {\n requestAnimationFrame(() => {\n editor.commands.resetAttributes('paragraph', 'class');\n });\n\n return false;\n },\n };\n },\n});\n","import type { CodeOptions } from '@tiptap/extension-code';\nimport CodeBase from '@tiptap/extension-code';\nimport { EmailMark } from '../core/serializer/email-mark';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const Code: EmailMark<CodeOptions, any> = EmailMark.from(\n CodeBase,\n ({ children, node, style }) => (\n <code style={{ ...style, ...inlineCssToJs(node.attrs?.style) }}>\n {children}\n </code>\n ),\n);\n","const publicURL = '/styles/prism';\n\nexport function loadPrismTheme(theme: string) {\n // Create new link element for the new theme\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = `${publicURL}/prism-${theme}.css`;\n link.setAttribute('data-prism-theme', ''); // Mark this link as the Prism theme\n\n // Append the new link element to the head\n document.head.appendChild(link);\n}\n\nexport function removePrismTheme() {\n const existingTheme = document.querySelectorAll(\n 'link[rel=\"stylesheet\"][data-prism-theme]',\n );\n if (existingTheme.length > 0) {\n existingTheme.forEach((cssLinkTag) => {\n cssLinkTag.remove();\n });\n }\n}\n\nexport function hasPrismThemeLoaded(theme: string) {\n const existingTheme = document.querySelector(\n `link[rel=\"stylesheet\"][data-prism-theme][href=\"${publicURL}/prism-${theme}.css\"]`,\n );\n return !!existingTheme;\n}\n","import { findChildren } from '@tiptap/core';\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport type { EditorView } from '@tiptap/pm/view';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\nimport { fromHtml } from 'hast-util-from-html';\nimport Prism from 'prismjs';\nimport {\n hasPrismThemeLoaded,\n loadPrismTheme,\n removePrismTheme,\n} from '../utils/prism-utils';\n\nconst PRISM_LANGUAGE_LOADED_META = 'prismLanguageLoaded';\n\ninterface RefractorNode {\n properties?: { className: string[] };\n children?: RefractorNode[];\n value?: string;\n}\n\nfunction parseNodes(\n nodes: RefractorNode[],\n className: string[] = [],\n): { text: string; classes: string[] }[] {\n return nodes.flatMap((node) => {\n const classes = [\n ...className,\n ...(node.properties ? node.properties.className : []),\n ];\n\n if (node.children) {\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.value ?? '',\n classes,\n };\n });\n}\n\nfunction getHighlightNodes(html: string) {\n return fromHtml(html, { fragment: true }).children;\n}\n\nfunction registeredLang(aliasOrLanguage: string) {\n const allSupportLang = Object.keys(Prism.languages).filter(\n (id) => typeof Prism.languages[id] === 'object',\n );\n return Boolean(allSupportLang.find((x) => x === aliasOrLanguage));\n}\n\nfunction getDecorations({\n doc,\n name,\n defaultLanguage,\n defaultTheme,\n loadingLanguages,\n onLanguageLoaded,\n}: {\n doc: ProsemirrorNode;\n name: string;\n defaultLanguage: string | null | undefined;\n defaultTheme: string | null | undefined;\n loadingLanguages: Set<string>;\n onLanguageLoaded: (language: string) => void;\n}) {\n const decorations: Decoration[] = [];\n\n findChildren(doc, (node) => node.type.name === name).forEach((block) => {\n let from = block.pos + 1;\n const language = block.node.attrs.language || defaultLanguage;\n const theme = block.node.attrs.theme || defaultTheme;\n let html = '';\n\n try {\n if (!registeredLang(language) && !loadingLanguages.has(language)) {\n loadingLanguages.add(language);\n import(`prismjs/components/prism-${language}`)\n .then(() => {\n loadingLanguages.delete(language);\n onLanguageLoaded(language);\n })\n .catch(() => {\n loadingLanguages.delete(language);\n });\n }\n\n if (!hasPrismThemeLoaded(theme)) {\n loadPrismTheme(theme);\n }\n\n html = Prism.highlight(\n block.node.textContent,\n Prism.languages[language],\n language,\n );\n } catch {\n html = Prism.highlight(\n block.node.textContent,\n Prism.languages.javascript,\n 'js',\n );\n }\n\n const nodes = getHighlightNodes(html);\n\n parseNodes(nodes as RefractorNode[]).forEach((node) => {\n const to = from + node.text.length;\n\n if (node.classes.length) {\n const decoration = Decoration.inline(from, to, {\n class: node.classes.join(' '),\n });\n\n decorations.push(decoration);\n }\n\n from = to;\n });\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport function PrismPlugin({\n name,\n defaultLanguage,\n defaultTheme,\n}: {\n name: string;\n defaultLanguage: string;\n defaultTheme: string;\n}) {\n if (!defaultLanguage) {\n throw Error('You must specify the defaultLanguage parameter');\n }\n\n const loadingLanguages = new Set<string>();\n let pluginView: EditorView | null = null;\n\n const onLanguageLoaded = (language: string) => {\n if (pluginView) {\n pluginView.dispatch(\n pluginView.state.tr.setMeta(PRISM_LANGUAGE_LOADED_META, language),\n );\n }\n };\n\n const prismjsPlugin: Plugin<DecorationSet> = new Plugin({\n key: new PluginKey('prism'),\n\n view(view) {\n pluginView = view;\n return {\n destroy() {\n pluginView = null;\n },\n };\n },\n\n state: {\n init: (_, { doc }) => {\n return getDecorations({\n doc,\n name,\n defaultLanguage,\n defaultTheme,\n loadingLanguages,\n onLanguageLoaded,\n });\n },\n apply: (transaction, decorationSet, oldState, newState) => {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n const oldNodes = findChildren(\n oldState.doc,\n (node) => node.type.name === name,\n );\n const newNodes = findChildren(\n newState.doc,\n (node) => node.type.name === name,\n );\n\n if (\n transaction.getMeta(PRISM_LANGUAGE_LOADED_META) ||\n (transaction.docChanged &&\n // Apply decorations if:\n // selection includes named node,\n ([oldNodeName, newNodeName].includes(name) ||\n // OR transaction adds/removes named node,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n transaction.steps.some((step) => {\n const rangeStep = step as unknown as {\n from?: number;\n to?: number;\n };\n return (\n rangeStep.from !== undefined &&\n rangeStep.to !== undefined &&\n oldNodes.some((node) => {\n return (\n node.pos >= rangeStep.from! &&\n node.pos + node.node.nodeSize <= rangeStep.to!\n );\n })\n );\n })))\n ) {\n return getDecorations({\n doc: transaction.doc,\n name,\n defaultLanguage,\n defaultTheme,\n loadingLanguages,\n onLanguageLoaded,\n });\n }\n\n return decorationSet.map(transaction.mapping, transaction.doc);\n },\n },\n\n props: {\n decorations(state) {\n return prismjsPlugin.getState(state);\n },\n },\n\n destroy() {\n pluginView = null;\n removePrismTheme();\n },\n });\n\n return prismjsPlugin;\n}\n","import * as ReactEmailComponents from '@react-email/components';\nimport {\n type PrismLanguage,\n CodeBlock as ReactEmailCodeBlock,\n} from '@react-email/components';\nimport { mergeAttributes } from '@tiptap/core';\nimport type { CodeBlockOptions } from '@tiptap/extension-code-block';\nimport CodeBlock from '@tiptap/extension-code-block';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { PrismPlugin } from './prism-plugin';\n\nexport interface CodeBlockPrismOptions extends CodeBlockOptions {\n defaultLanguage: string;\n defaultTheme: string;\n}\n\nexport const CodeBlockPrism = EmailNode.from(\n CodeBlock.extend<CodeBlockPrismOptions>({\n addOptions(): CodeBlockPrismOptions {\n return {\n languageClassPrefix: 'language-',\n exitOnTripleEnter: false,\n exitOnArrowDown: false,\n enableTabIndentation: true,\n tabSize: 2,\n defaultLanguage: 'javascript',\n defaultTheme: 'default',\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n language: {\n default: this.options.defaultLanguage,\n parseHTML: (element: HTMLElement | null) => {\n if (!element) {\n return null;\n }\n const { languageClassPrefix } = this.options;\n if (!languageClassPrefix) {\n return null;\n }\n const classNames = [\n ...(element.firstElementChild?.classList || []),\n ];\n const languages = classNames\n .filter((className) =>\n className.startsWith(languageClassPrefix || ''),\n )\n .map((className) => className.replace(languageClassPrefix, ''));\n const language = languages[0];\n\n if (!language) {\n return null;\n }\n\n return language;\n },\n rendered: false,\n },\n theme: {\n default: this.options.defaultTheme,\n rendered: false,\n },\n };\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'pre',\n mergeAttributes(\n this.options.HTMLAttributes,\n HTMLAttributes,\n {\n class: node.attrs.language\n ? `${this.options.languageClassPrefix}${node.attrs.language}`\n : null,\n },\n { 'data-theme': node.attrs.theme },\n ),\n [\n 'code',\n {\n class: node.attrs.language\n ? `${this.options.languageClassPrefix}${node.attrs.language} node-codeTag`\n : 'node-codeTag',\n },\n 0,\n ],\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n ...this.parent?.(),\n 'Mod-a': ({ editor }) => {\n const { state } = editor;\n const { selection } = state;\n const { $from } = selection;\n\n for (let depth = $from.depth; depth >= 1; depth--) {\n if ($from.node(depth).type.name === this.name) {\n const blockStart = $from.start(depth);\n const blockEnd = $from.end(depth);\n\n const alreadyFullySelected =\n selection.from === blockStart && selection.to === blockEnd;\n if (alreadyFullySelected) {\n return false;\n }\n\n const tr = state.tr.setSelection(\n TextSelection.create(state.doc, blockStart, blockEnd),\n );\n editor.view.dispatch(tr);\n return true;\n }\n }\n\n return false;\n },\n };\n },\n\n addProseMirrorPlugins() {\n return [\n ...(this.parent?.() || []),\n PrismPlugin({\n name: this.name,\n defaultLanguage: this.options.defaultLanguage,\n defaultTheme: this.options.defaultTheme,\n }),\n ];\n },\n }),\n ({ node, style }) => {\n const language = node.attrs?.language\n ? `${node.attrs.language}`\n : 'javascript';\n\n // @ts-expect-error -- @react-email/components does not export theme objects by name; dynamic access needed for user-selected themes\n const userTheme = ReactEmailComponents[node.attrs?.theme];\n\n // Without theme, render a gray code block\n const theme = userTheme\n ? {\n ...userTheme,\n base: {\n ...userTheme.base,\n borderRadius: '0.125rem',\n padding: '0.75rem 1rem',\n },\n }\n : {\n base: {\n color: '#1e293b',\n background: '#f1f5f9',\n lineHeight: '1.5',\n fontFamily:\n '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n padding: '0.75rem 1rem',\n borderRadius: '0.125rem',\n },\n };\n\n return (\n <ReactEmailCodeBlock\n code={node.content?.[0]?.text ?? ''}\n language={language as PrismLanguage}\n theme={theme}\n style={{\n width: 'auto',\n ...style,\n }}\n />\n );\n },\n);\n","import { mergeAttributes } from '@tiptap/core';\nimport { EmailNode } from '../core/serializer/email-node';\nimport {\n COMMON_HTML_ATTRIBUTES,\n createStandardAttributes,\n LAYOUT_ATTRIBUTES,\n} from '../utils/attribute-helpers';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport interface DivOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Div = EmailNode.create<DivOptions>({\n name: 'div',\n\n group: 'block',\n\n content: 'block+',\n\n defining: true,\n isolating: true,\n\n parseHTML() {\n return [\n {\n tag: 'div:not([data-type])',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n // Preserve all attributes\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n 0,\n ];\n },\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...COMMON_HTML_ATTRIBUTES,\n ...LAYOUT_ATTRIBUTES,\n ]),\n };\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n return (\n <div\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineStyles,\n }}\n >\n {children}\n </div>\n );\n },\n});\n","import { Hr } from '@react-email/components';\nimport { InputRule } from '@tiptap/core';\nimport type { HorizontalRuleOptions } from '@tiptap/extension-horizontal-rule';\nimport HorizontalRule from '@tiptap/extension-horizontal-rule';\n\nexport type DividerOptions = HorizontalRuleOptions;\n\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport { EmailNode } from '../core';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const Divider: EmailNode<HorizontalRuleOptions, any> = EmailNode.from(\n HorizontalRule.extend({\n addAttributes() {\n return {\n class: {\n default: 'divider',\n },\n };\n },\n // patch to fix horizontal rule bug: https://github.com/ueberdosis/tiptap/pull/3859#issuecomment-1536799740\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 addNodeView() {\n return ReactNodeViewRenderer((props) => {\n const node = props.node;\n const { class: className, ...rest } = node.attrs;\n\n const attrs = {\n ...rest,\n className: 'node-hr',\n style: inlineCssToJs(node.attrs.style),\n };\n\n return (\n <NodeViewWrapper>\n <Hr {...attrs} />\n </NodeViewWrapper>\n );\n });\n },\n }),\n ({ node, style }) => {\n return (\n <Hr\n className={node.attrs?.class || undefined}\n style={{ ...style, ...inlineCssToJs(node.attrs?.style) }}\n />\n );\n },\n);\n","import { type Editor, mergeAttributes, Node } from '@tiptap/core';\n\nconst GLOBAL_CONTENT_NODE_TYPE = 'globalContent' as const;\n\nexport interface GlobalContentOptions {\n key: string;\n data: Record<string, unknown>;\n}\n\ndeclare module '@tiptap/core' {\n interface GlobalContent<ReturnType> {\n setGlobalContent: (key: string, value: unknown) => ReturnType;\n }\n\n interface Commands<ReturnType> {\n globalContent: GlobalContent<ReturnType>;\n }\n}\n\nlet cachedGlobalPosition: number | null = null;\n\nfunction findGlobalContentPositions(doc: Editor['state']['doc']) {\n const positions: number[] = [];\n\n doc.descendants((node, position) => {\n if (node.type.name === GLOBAL_CONTENT_NODE_TYPE) {\n positions.push(position);\n }\n });\n\n return positions;\n}\n\nfunction getCachedGlobalContentPosition(doc: Editor['state']['doc']) {\n if (cachedGlobalPosition != null) {\n try {\n if (\n doc.nodeAt(cachedGlobalPosition)?.type.name === GLOBAL_CONTENT_NODE_TYPE\n ) {\n return cachedGlobalPosition;\n }\n } catch {\n cachedGlobalPosition = null;\n }\n }\n\n const positions = findGlobalContentPositions(doc);\n cachedGlobalPosition = positions[0] ?? null;\n return cachedGlobalPosition;\n}\n\nexport function getGlobalContent(key: string, editor: Editor): unknown | null {\n const position = getCachedGlobalContentPosition(editor.state.doc);\n if (cachedGlobalPosition == null) {\n return null;\n }\n return editor.state.doc.nodeAt(position)?.attrs.data[key] ?? null;\n}\n\nexport const GlobalContent = Node.create<GlobalContentOptions>({\n name: GLOBAL_CONTENT_NODE_TYPE,\n\n addOptions() {\n return {\n key: GLOBAL_CONTENT_NODE_TYPE,\n data: {},\n };\n },\n\n group: 'block',\n\n selectable: false,\n draggable: false,\n atom: true,\n\n addAttributes() {\n return {\n data: {\n default: this.options.data,\n },\n };\n },\n\n parseHTML() {\n return [{ tag: `div[data-type=\"${this.name}\"]` }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n // The node needs to have a width and height, so then\n // internal TipTap extension can find the first node position\n // and calculate the correct position of the document container\n style: 'width: 100%; height: 1px; visibility: hidden;',\n }),\n ];\n },\n\n addCommands() {\n return {\n setGlobalContent:\n (key: string, value: unknown) =>\n ({ tr, dispatch }) => {\n const ensureGlobalPosition = () => {\n const positions = findGlobalContentPositions(tr.doc);\n\n for (let i = positions.length - 1; i > 0; i--) {\n tr.delete(positions[i], positions[i] + 1);\n }\n\n const pos = positions[0] ?? -1;\n if (pos >= 0) {\n cachedGlobalPosition = pos;\n } else {\n cachedGlobalPosition = 0;\n tr.insert(0, this.type.create());\n }\n };\n\n if (dispatch) {\n ensureGlobalPosition();\n\n if (cachedGlobalPosition == null) {\n return false;\n }\n tr.setNodeAttribute(cachedGlobalPosition, 'data', {\n ...tr.doc.nodeAt(cachedGlobalPosition)?.attrs.data,\n [key]: value,\n });\n }\n\n return true;\n },\n };\n },\n});\n","import type { HardBreakOptions } from '@tiptap/extension-hard-break';\nimport HardBreakBase from '@tiptap/extension-hard-break';\nimport { EmailNode } from '../core/serializer/email-node';\n\nexport const HardBreak: EmailNode<HardBreakOptions, any> = EmailNode.from(\n HardBreakBase,\n () => <br />,\n);\n","import { Heading as EmailHeading } from '@react-email/components';\nimport type { HeadingOptions as TipTapHeadingOptions } from '@tiptap/extension-heading';\nimport { Heading as TipTapHeading } from '@tiptap/extension-heading';\n\nexport type HeadingOptions = TipTapHeadingOptions;\n\nimport {\n NodeViewContent,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n} from '@tiptap/react';\nimport { EmailNode } from '../core';\nimport { getTextAlignment } from '../utils/get-text-alignment';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const Heading: EmailNode<TipTapHeadingOptions, any> = EmailNode.from(\n TipTapHeading.extend({\n addNodeView() {\n return ReactNodeViewRenderer(({ node }) => {\n const level = (node.attrs.level as number) ?? 1;\n const { class: className, ...rest } = node.attrs;\n\n const attrs = {\n ...rest,\n className: `node-h${level} ${className}`,\n style: inlineCssToJs(node.attrs.style),\n };\n\n return (\n <NodeViewWrapper>\n <EmailHeading as={`h${level}` as 'h1' | 'h2' | 'h3'} {...attrs}>\n <NodeViewContent />\n </EmailHeading>\n </NodeViewWrapper>\n );\n });\n },\n }),\n ({ children, node, style }) => {\n const level = node.attrs?.level ?? 1;\n return (\n <EmailHeading\n as={`h${level}` as 'h1' | 'h2' | 'h3'}\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineCssToJs(node.attrs?.style),\n ...getTextAlignment(node.attrs?.align ?? node.attrs?.alignment),\n }}\n >\n {children}\n </EmailHeading>\n );\n },\n);\n","import type { ItalicOptions } from '@tiptap/extension-italic';\nimport ItalicBase from '@tiptap/extension-italic';\nimport { EmailMark } from '../core/serializer/email-mark';\n\nexport const Italic: EmailMark<ItalicOptions, any> = EmailMark.from(\n ItalicBase,\n ({ children, style }) => <em style={style}>{children}</em>,\n);\n","import { mergeAttributes } from '@tiptap/core';\nimport { EmailMark } from '../core/serializer/email-mark';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const PreservedStyle = EmailMark.create({\n name: 'preservedStyle',\n\n addAttributes() {\n return {\n style: {\n default: null,\n parseHTML: (element) => element.getAttribute('style'),\n renderHTML: (attributes) => {\n if (!attributes.style) {\n return {};\n }\n return { style: attributes.style };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[style]',\n getAttrs: (element) => {\n if (typeof element === 'string') {\n return false;\n }\n const style = element.getAttribute('style');\n if (style && hasPreservableStyles(style)) {\n return { style };\n }\n return false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(HTMLAttributes), 0];\n },\n\n renderToReactEmail({ children, mark }) {\n const preservedStyles = mark.attrs?.style\n ? inlineCssToJs(mark.attrs.style)\n : undefined;\n\n return <span style={preservedStyles}>{children}</span>;\n },\n});\n\nconst LINK_INDICATOR_STYLES = [\n 'color',\n 'text-decoration',\n 'text-decoration-line',\n 'text-decoration-color',\n 'text-decoration-style',\n];\n\nfunction parseStyleString(styleString: string): CSSStyleDeclaration {\n const temp = document.createElement('div');\n temp.style.cssText = styleString;\n return temp.style;\n}\n\nfunction hasBackground(style: CSSStyleDeclaration): boolean {\n const bgColor = style.backgroundColor;\n const bg = style.background;\n\n if (bgColor && bgColor !== 'transparent' && bgColor !== 'rgba(0, 0, 0, 0)') {\n return true;\n }\n\n if (\n bg &&\n bg !== 'transparent' &&\n bg !== 'none' &&\n bg !== 'rgba(0, 0, 0, 0)'\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction hasPreservableStyles(styleString: string): boolean {\n return processStylesForUnlink(styleString) !== null;\n}\n\n/**\n * Processes styles when unlinking:\n * - Has background (button-like): preserve all styles\n * - No background: strip link-indicator styles (color, text-decoration), keep the rest\n */\nexport function processStylesForUnlink(\n styleString: string | null | undefined,\n): string | null {\n if (!styleString) {\n return null;\n }\n\n const style = parseStyleString(styleString);\n\n if (hasBackground(style)) {\n return styleString;\n }\n\n const filtered: string[] = [];\n\n for (let i = 0; i < style.length; i++) {\n const prop = style[i];\n\n if (LINK_INDICATOR_STYLES.includes(prop)) {\n continue;\n }\n\n const value = style.getPropertyValue(prop);\n if (value) {\n filtered.push(`${prop}: ${value}`);\n }\n }\n\n return filtered.length > 0 ? filtered.join('; ') : null;\n}\n","import { Link as ReactEmailLink } from '@react-email/components';\nimport type { LinkOptions as TipTapLinkOptions } from '@tiptap/extension-link';\nimport TiptapLink from '@tiptap/extension-link';\n\nexport type LinkOptions = TipTapLinkOptions;\n\nimport { editorEventBus } from '../core';\nimport { EmailMark } from '../core/serializer/email-mark';\nimport { inlineCssToJs } from '../utils/styles';\nimport { processStylesForUnlink } from './preserved-style';\n\nexport const Link: EmailMark<TipTapLinkOptions, any> = EmailMark.from(\n TiptapLink,\n ({ children, mark, style }) => {\n const linkMarkStyle = mark.attrs?.style\n ? inlineCssToJs(mark.attrs.style)\n : {};\n\n return (\n <ReactEmailLink\n href={mark.attrs?.href ?? undefined}\n rel={mark.attrs?.rel ?? undefined}\n style={{\n ...style,\n ...linkMarkStyle,\n }}\n target={mark.attrs?.target ?? undefined}\n {...(mark.attrs?.['ses:no-track']\n ? { 'ses:no-track': mark.attrs['ses:no-track'] }\n : {})}\n >\n {children}\n </ReactEmailLink>\n );\n },\n).extend({\n parseHTML() {\n return [\n {\n tag: 'a[target]:not([data-id=\"react-email-button\"])',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n // Preserve all attributes\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n {\n tag: 'a[href]:not([data-id=\"react-email-button\"])',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n // Preserve all attributes\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n\n 'ses:no-track': {\n default: null,\n parseHTML: (element) => element.getAttribute('ses:no-track'),\n },\n };\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n\n unsetLink:\n () =>\n ({ state, chain }) => {\n const { from } = state.selection;\n const linkMark = state.doc\n .resolve(from)\n .marks()\n .find((m) => m.type.name === 'link');\n const linkStyle = linkMark?.attrs?.style ?? null;\n\n const preservedStyle = processStylesForUnlink(linkStyle);\n\n const shouldRemoveUnderline = preservedStyle !== linkStyle;\n\n if (preservedStyle) {\n const cmd = chain()\n .extendMarkRange('link')\n .unsetMark('link')\n .setMark('preservedStyle', { style: preservedStyle });\n\n return shouldRemoveUnderline\n ? cmd.unsetMark('underline').run()\n : cmd.run();\n }\n\n return chain()\n .extendMarkRange('link')\n .unsetMark('link')\n .unsetMark('underline')\n .run();\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-k': () => {\n editorEventBus.dispatch('bubble-menu:add-link', undefined);\n // unselect\n return this.editor.chain().focus().toggleLink({ href: '' }).run();\n },\n };\n },\n});\n","import type { ListItemOptions } from '@tiptap/extension-list-item';\nimport ListItemBase from '@tiptap/extension-list-item';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { getTextAlignment } from '../utils/get-text-alignment';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const ListItem: EmailNode<ListItemOptions, any> = EmailNode.from(\n ListItemBase,\n ({ children, node, style }) => (\n <li\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineCssToJs(node.attrs?.style),\n ...getTextAlignment(node.attrs?.align || node.attrs?.alignment),\n }}\n >\n {children}\n </li>\n ),\n);\n","import { Extension } from '@tiptap/core';\nimport type { NodeRange } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport interface MaxNestingOptions {\n maxDepth: number;\n nodeTypes?: string[];\n}\n\nexport const MaxNesting = Extension.create<MaxNestingOptions>({\n name: 'maxNesting',\n\n addOptions() {\n return {\n maxDepth: 3,\n nodeTypes: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const { maxDepth, nodeTypes } = this.options;\n\n if (typeof maxDepth !== 'number' || maxDepth < 1) {\n throw new Error('maxDepth must be a positive number');\n }\n\n return [\n new Plugin({\n key: new PluginKey('maxNesting'),\n\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) {\n return null;\n }\n\n // Collect all ranges that need to be lifted\n const rangesToLift: { range: NodeRange; target: number }[] = [];\n\n newState.doc.descendants((node, pos) => {\n let depth = 0;\n let currentPos = pos;\n let currentNode = node;\n\n while (currentNode && depth <= maxDepth) {\n if (!nodeTypes || nodeTypes.includes(currentNode.type.name)) {\n depth++;\n }\n\n const $pos = newState.doc.resolve(currentPos);\n if ($pos.depth === 0) {\n break;\n }\n\n currentPos = $pos.before($pos.depth);\n currentNode = newState.doc.nodeAt(currentPos)!;\n }\n\n if (depth > maxDepth) {\n const $pos = newState.doc.resolve(pos);\n if ($pos.depth > 0) {\n const range = $pos.blockRange();\n if (\n range &&\n 'canReplace' in newState.schema.nodes.doc &&\n typeof newState.schema.nodes.doc.canReplace === 'function' &&\n newState.schema.nodes.doc.canReplace(\n range.start - 1,\n range.end + 1,\n newState.doc.slice(range.start, range.end).content,\n )\n ) {\n rangesToLift.push({ range, target: range.start - 1 });\n }\n }\n }\n });\n\n if (rangesToLift.length === 0) {\n return null;\n }\n\n // Process ranges in reverse order (end to start) to maintain position validity\n const tr = newState.tr;\n for (let i = rangesToLift.length - 1; i >= 0; i--) {\n const { range, target } = rangesToLift[i];\n tr.lift(range, target);\n }\n\n return tr;\n },\n\n filterTransaction(tr) {\n if (!tr.docChanged) {\n return true;\n }\n\n let wouldCreateDeepNesting = false;\n const newDoc = tr.doc;\n\n newDoc.descendants((node, pos) => {\n if (wouldCreateDeepNesting) {\n return false;\n }\n\n let depth = 0;\n let currentPos = pos;\n let currentNode = node;\n\n while (currentNode && depth <= maxDepth) {\n if (!nodeTypes || nodeTypes.includes(currentNode.type.name)) {\n depth++;\n }\n\n const $pos = newDoc.resolve(currentPos);\n if ($pos.depth === 0) {\n break;\n }\n\n currentPos = $pos.before($pos.depth);\n currentNode = newDoc.nodeAt(currentPos)!;\n }\n\n if (depth > maxDepth) {\n wouldCreateDeepNesting = true;\n return false;\n }\n });\n\n return !wouldCreateDeepNesting;\n },\n }),\n ];\n },\n});\n","import type { OrderedListOptions } from '@tiptap/extension-ordered-list';\nimport OrderedListBase from '@tiptap/extension-ordered-list';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const OrderedList: EmailNode<OrderedListOptions, any> = EmailNode.from(\n OrderedListBase,\n ({ children, node, style }) => (\n <ol\n className={node.attrs?.class || undefined}\n start={node.attrs?.start}\n style={{\n ...style,\n ...inlineCssToJs(node.attrs?.style),\n }}\n >\n {children}\n </ol>\n ),\n);\n","import type { ParagraphOptions } from '@tiptap/extension-paragraph';\nimport ParagraphBase from '@tiptap/extension-paragraph';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { getTextAlignment } from '../utils/get-text-alignment';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const Paragraph: EmailNode<ParagraphOptions, any> = EmailNode.from(\n ParagraphBase,\n ({ children, node, style }) => {\n const isEmpty = !node.content || node.content.length === 0;\n\n return (\n <p\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineCssToJs(node.attrs?.style),\n ...getTextAlignment(node.attrs?.align || node.attrs?.alignment),\n }}\n >\n {isEmpty ? (\n /* Add <br/> inside empty paragraph to make sure what users sees in the preview is the space that will be render in the email */\n <br />\n ) : (\n children\n )}\n </p>\n );\n },\n);\n","import type { Extension } from '@tiptap/core';\nimport type { PlaceholderOptions as TipTapPlaceholderOptions } from '@tiptap/extension-placeholder';\nimport TipTapPlaceholder from '@tiptap/extension-placeholder';\nimport type { Node } from '@tiptap/pm/model';\n\nexport interface PlaceholderOptions {\n placeholder?: string | ((props: { node: Node }) => string);\n includeChildren?: boolean;\n}\n\nexport const Placeholder: Extension<TipTapPlaceholderOptions, any> =\n TipTapPlaceholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === 'heading') {\n return `Heading ${node.attrs.level}`;\n }\n return \"Press '/' for commands\";\n },\n includeChildren: true,\n });\n","import { Node } from '@tiptap/core';\n\nexport interface PreviewTextOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const PreviewText = Node.create<PreviewTextOptions>({\n name: 'previewText',\n\n group: 'block',\n\n selectable: false,\n draggable: false,\n atom: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n addStorage() {\n return {\n previewText: null,\n };\n },\n\n renderHTML() {\n return ['div', { style: 'display: none' }];\n },\n\n parseHTML() {\n return [\n // react-email parsing\n {\n tag: 'div[data-skip-in-text=\"true\"]',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n\n // Extract and store preview text directly\n let directText = '';\n for (const child of element.childNodes) {\n if (child.nodeType === 3) {\n // TEXT_NODE = 3\n // Anything other than text will be pruned\n // This is particularly useful for react email,\n // because we have a nested div full of white spaces that will just be ignored\n directText += child.textContent || '';\n }\n }\n const cleanText = directText.trim();\n\n if (cleanText) {\n this.storage.previewText = cleanText;\n }\n\n return false; // Don't create a node\n },\n },\n // preheader class parsing\n {\n tag: 'span.preheader',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const preheaderText = element.textContent?.trim();\n\n if (preheaderText) {\n this.storage.previewText = preheaderText;\n }\n\n return false; // Don't create a node, just extract to storage\n },\n },\n ];\n },\n});\n","import { Section as ReactEmailSection } from '@react-email/components';\nimport { mergeAttributes } from '@tiptap/core';\nimport type * as React from 'react';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { getTextAlignment } from '../utils/get-text-alignment';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport interface SectionOptions {\n HTMLAttributes: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n section: {\n insertSection: () => ReturnType;\n };\n }\n}\n\nexport const Section = EmailNode.create<SectionOptions>({\n name: 'section',\n group: 'block',\n content: 'block+',\n isolating: true,\n defining: true,\n\n parseHTML() {\n return [{ tag: 'section[data-type=\"section\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'section',\n mergeAttributes(\n { 'data-type': 'section', class: 'node-section' },\n HTMLAttributes,\n ),\n 0,\n ];\n },\n\n addCommands() {\n return {\n insertSection:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n content: [\n {\n type: 'paragraph',\n content: [],\n },\n ],\n });\n },\n };\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n const textAlign = node.attrs?.align || node.attrs?.alignment;\n\n return (\n <ReactEmailSection\n className={node.attrs?.class || undefined}\n align={textAlign}\n style={\n {\n ...style,\n ...inlineStyles,\n ...getTextAlignment(textAlign),\n } as React.CSSProperties\n }\n >\n {children}\n </ReactEmailSection>\n );\n },\n});\n","import type { StrikeOptions } from '@tiptap/extension-strike';\nimport StrikeBase from '@tiptap/extension-strike';\nimport { EmailMark } from '../core/serializer/email-mark';\n\nexport const Strike: EmailMark<StrikeOptions, any> = EmailMark.from(\n StrikeBase,\n ({ children, style }) => <s style={style}>{children}</s>,\n);\n","import { Extension } from '@tiptap/core';\n\nexport interface StyleAttributeOptions {\n types: string[];\n style: string[];\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n textAlign: {\n /**\n * Set the style attribute\n */\n setStyle: (style: string) => ReturnType;\n /**\n * Unset the style attribute\n */\n unsetStyle: () => ReturnType;\n };\n }\n}\n\nexport const StyleAttribute = Extension.create<StyleAttributeOptions>({\n name: 'styleAttribute',\n priority: 101,\n\n addOptions() {\n return {\n types: [],\n style: [],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n style: {\n default: '',\n parseHTML: (element) => element.getAttribute('style') || '',\n renderHTML: (attributes) => {\n return { style: attributes.style ?? '' };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n unsetStyle:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, 'style'),\n );\n },\n setStyle:\n (style: string) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { style }),\n );\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: ({ editor }) => {\n // Check if any suggestion plugin is active by looking for decorations\n // that indicate an active suggestion/autocomplete\n const { state } = editor.view;\n const { selection } = state;\n const { $from } = selection;\n\n // Check if we're in a position where suggestion might be active\n // by looking at the text before cursor for trigger characters\n const textBefore = $from.nodeBefore?.text || '';\n const hasTrigger =\n textBefore.includes('{{') || textBefore.includes('{{{');\n\n // If we have trigger characters, assume suggestion might be handling this\n // Don't reset styles\n if (hasTrigger) {\n return false;\n }\n\n // Otherwise, reset paragraph styles on Enter\n requestAnimationFrame(() => {\n editor.commands.resetAttributes('paragraph', 'style');\n });\n return false;\n },\n };\n },\n});\n","import type { SuperscriptExtensionOptions as TipTapSuperscriptOptions } from '@tiptap/extension-superscript';\nimport SuperscriptBase from '@tiptap/extension-superscript';\nimport { EmailMark } from '../core/serializer/email-mark';\n\nexport type SupOptions = TipTapSuperscriptOptions;\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n sup: {\n /**\n * Set a superscript mark\n */\n setSup: () => ReturnType;\n /**\n * Toggle a superscript mark\n */\n toggleSup: () => ReturnType;\n /**\n * Unset a superscript mark\n */\n unsetSup: () => ReturnType;\n };\n }\n}\n\nconst SupBase = SuperscriptBase.extend({\n name: 'sup',\n\n addCommands() {\n return {\n ...this.parent?.(),\n setSup:\n () =>\n ({ commands }) => {\n return commands.setMark(this.name);\n },\n toggleSup:\n () =>\n ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n unsetSup:\n () =>\n ({ commands }) => {\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n\nexport const Sup: EmailMark<TipTapSuperscriptOptions, any> = EmailMark.from(\n SupBase,\n ({ children, style }) => <sup style={style}>{children}</sup>,\n);\n","import { Column, Section } from '@react-email/components';\nimport type { ParentConfig } from '@tiptap/core';\nimport { mergeAttributes, Node } from '@tiptap/core';\nimport { EmailNode } from '../core/serializer/email-node';\nimport {\n COMMON_HTML_ATTRIBUTES,\n createStandardAttributes,\n LAYOUT_ATTRIBUTES,\n TABLE_ATTRIBUTES,\n TABLE_CELL_ATTRIBUTES,\n TABLE_HEADER_ATTRIBUTES,\n} from '../utils/attribute-helpers';\nimport { inlineCssToJs, resolveConflictingStyles } from '../utils/styles';\n\ndeclare module '@tiptap/core' {\n interface NodeConfig<Options, Storage> {\n /**\n * A string or function to determine the role of the table.\n * @default 'table'\n * @example () => 'table'\n */\n tableRole?:\n | string\n | ((this: {\n name: string;\n options: Options;\n storage: Storage;\n parent: ParentConfig<NodeConfig<Options>>['tableRole'];\n }) => string);\n }\n}\n\nexport interface TableOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Table = EmailNode.create<TableOptions>({\n name: 'table',\n\n group: 'block',\n\n content: 'tableRow+',\n\n isolating: true,\n\n tableRole: 'table',\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...TABLE_ATTRIBUTES,\n ...LAYOUT_ATTRIBUTES,\n ...COMMON_HTML_ATTRIBUTES,\n ]),\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'table',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes);\n\n return ['table', attrs, ['tbody', {}, 0]];\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n const alignment = node.attrs?.align || node.attrs?.alignment;\n const width = node.attrs?.width;\n\n const centeringStyles: Record<string, string> =\n alignment === 'center' ? { marginLeft: 'auto', marginRight: 'auto' } : {};\n\n return (\n <Section\n className={node.attrs?.class || undefined}\n align={alignment}\n style={resolveConflictingStyles(style, {\n ...inlineStyles,\n ...centeringStyles,\n })}\n {...(width !== undefined ? { width } : {})}\n >\n {children}\n </Section>\n );\n },\n});\n\nexport interface TableRowOptions extends Record<string, unknown> {\n HTMLAttributes?: Record<string, unknown>;\n}\n\nexport const TableRow = EmailNode.create<TableRowOptions>({\n name: 'tableRow',\n\n group: 'tableRow',\n\n content: '(tableCell | tableHeader)+',\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...TABLE_CELL_ATTRIBUTES,\n ...LAYOUT_ATTRIBUTES,\n ...COMMON_HTML_ATTRIBUTES,\n ]),\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'tr',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['tr', HTMLAttributes, 0];\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n return (\n <tr\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineStyles,\n }}\n >\n {children}\n </tr>\n );\n },\n});\n\nexport interface TableCellOptions extends Record<string, unknown> {\n HTMLAttributes?: Record<string, unknown>;\n}\n\nexport const TableCell = EmailNode.create<TableCellOptions>({\n name: 'tableCell',\n\n group: 'tableCell',\n\n content: 'block+',\n\n isolating: true,\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...TABLE_CELL_ATTRIBUTES,\n ...LAYOUT_ATTRIBUTES,\n ...COMMON_HTML_ATTRIBUTES,\n ]),\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'td',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['td', HTMLAttributes, 0];\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n return (\n <Column\n className={node.attrs?.class || undefined}\n align={node.attrs?.align || node.attrs?.alignment}\n style={{\n ...style,\n ...inlineStyles,\n }}\n >\n {children}\n </Column>\n );\n },\n});\n\nexport const TableHeader = Node.create({\n name: 'tableHeader',\n\n group: 'tableCell',\n\n content: 'block+',\n\n isolating: true,\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...TABLE_HEADER_ATTRIBUTES,\n ...TABLE_CELL_ATTRIBUTES,\n ...LAYOUT_ATTRIBUTES,\n ...COMMON_HTML_ATTRIBUTES,\n ]),\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'th',\n getAttrs: (node) => {\n if (typeof node === 'string') {\n return false;\n }\n const element = node as HTMLElement;\n const attrs: Record<string, string> = {};\n\n Array.from(element.attributes).forEach((attr) => {\n attrs[attr.name] = attr.value;\n });\n\n return attrs;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['th', HTMLAttributes, 0];\n },\n});\n","import type { UnderlineOptions as TipTapUnderlineOptions } from '@tiptap/extension-underline';\nimport UnderlineBase from '@tiptap/extension-underline';\nimport { EmailMark } from '../core/serializer/email-mark';\n\nexport type UnderlineOptions = TipTapUnderlineOptions;\n\nexport const Underline: EmailMark<TipTapUnderlineOptions, any> = EmailMark.from(\n UnderlineBase,\n ({ children, style }) => <u style={style}>{children}</u>,\n);\n","import { mergeAttributes } from '@tiptap/core';\nimport { EmailMark } from '../core/serializer/email-mark';\n\nexport interface UppercaseOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n uppercase: {\n setUppercase: () => ReturnType;\n toggleUppercase: () => ReturnType;\n unsetUppercase: () => ReturnType;\n };\n }\n}\n\nexport const Uppercase = EmailMark.create<UppercaseOptions>({\n name: 'uppercase',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span',\n getAttrs: (node) => {\n const el = node as HTMLElement;\n if (el.style.textTransform === 'uppercase') {\n return {};\n }\n return false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'span',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n style: 'text-transform: uppercase',\n }),\n 0,\n ];\n },\n\n renderToReactEmail({ children, style }) {\n return (\n <span\n style={{\n ...style,\n textTransform: 'uppercase',\n }}\n >\n {children}\n </span>\n );\n },\n\n addCommands() {\n return {\n setUppercase:\n () =>\n ({ commands }) => {\n return commands.setMark(this.name);\n },\n toggleUppercase:\n () =>\n ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n unsetUppercase:\n () =>\n ({ commands }) => {\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n","import { type AnyExtension, Extension } from '@tiptap/core';\nimport type { BlockquoteOptions } from '@tiptap/extension-blockquote';\nimport type { BulletListOptions } from '@tiptap/extension-bullet-list';\nimport type { CodeOptions } from '@tiptap/extension-code';\nimport type { HardBreakOptions } from '@tiptap/extension-hard-break';\nimport type { ItalicOptions } from '@tiptap/extension-italic';\nimport type { ListItemOptions } from '@tiptap/extension-list-item';\nimport type { OrderedListOptions } from '@tiptap/extension-ordered-list';\nimport type { ParagraphOptions } from '@tiptap/extension-paragraph';\nimport type { StrikeOptions } from '@tiptap/extension-strike';\nimport TipTapStarterKit, {\n type StarterKitOptions as TipTapStarterKitOptions,\n} from '@tiptap/starter-kit';\nimport type { AlignmentOptions } from './alignment-attribute';\nimport { AlignmentAttribute } from './alignment-attribute';\nimport { Blockquote } from './blockquote';\nimport type { BodyOptions } from './body';\nimport { Body } from './body';\nimport type { BoldOptions } from './bold';\nimport { Bold } from './bold';\nimport { BulletList } from './bullet-list';\nimport type { EditorButtonOptions } from './button';\nimport { Button } from './button';\nimport type { ClassAttributeOptions } from './class-attribute';\nimport { ClassAttribute } from './class-attribute';\nimport { Code } from './code';\nimport type { CodeBlockPrismOptions } from './code-block';\nimport { CodeBlockPrism } from './code-block';\nimport {\n ColumnsColumn,\n FourColumns,\n ThreeColumns,\n TwoColumns,\n} from './columns';\nimport type { DivOptions } from './div';\nimport { Div } from './div';\nimport type { DividerOptions } from './divider';\nimport { Divider } from './divider';\nimport type { GlobalContentOptions } from './global-content';\nimport { GlobalContent } from './global-content';\nimport { HardBreak } from './hard-break';\nimport type { HeadingOptions } from './heading';\nimport { Heading } from './heading';\nimport { Italic } from './italic';\nimport type { LinkOptions } from './link';\nimport { Link } from './link';\nimport { ListItem } from './list-item';\nimport type { MaxNestingOptions } from './max-nesting';\nimport { MaxNesting } from './max-nesting';\nimport { OrderedList } from './ordered-list';\nimport { Paragraph } from './paragraph';\nimport type { PlaceholderOptions } from './placeholder';\nimport { Placeholder } from './placeholder';\nimport { PreservedStyle } from './preserved-style';\nimport type { PreviewTextOptions } from './preview-text';\nimport { PreviewText } from './preview-text';\nimport type { SectionOptions } from './section';\nimport { Section } from './section';\nimport { Strike } from './strike';\nimport type { StyleAttributeOptions } from './style-attribute';\nimport { StyleAttribute } from './style-attribute';\nimport type { SupOptions } from './sup';\nimport { Sup } from './sup';\nimport type { TableCellOptions, TableOptions, TableRowOptions } from './table';\nimport { Table, TableCell, TableHeader, TableRow } from './table';\nimport type { UnderlineOptions } from './underline';\nimport { Underline } from './underline';\nimport type { UppercaseOptions } from './uppercase';\nimport { Uppercase } from './uppercase';\n\nexport * from './alignment-attribute';\nexport * from './blockquote';\nexport * from './body';\nexport * from './bold';\nexport * from './bullet-list';\nexport * from './button';\nexport * from './class-attribute';\nexport * from './code';\nexport * from './code-block';\nexport * from './columns';\nexport * from './div';\nexport * from './divider';\nexport * from './global-content';\nexport * from './hard-break';\nexport * from './heading';\nexport * from './italic';\nexport * from './link';\nexport * from './list-item';\nexport * from './max-nesting';\nexport * from './ordered-list';\nexport * from './paragraph';\nexport * from './placeholder';\nexport * from './preserved-style';\nexport * from './preview-text';\nexport * from './section';\nexport * from './strike';\nexport * from './style-attribute';\nexport * from './sup';\nexport * from './table';\nexport * from './underline';\nexport * from './uppercase';\n\nconst starterKitExtensions: Record<string, AnyExtension> = {\n CodeBlockPrism,\n Code,\n TwoColumns,\n ThreeColumns,\n FourColumns,\n ColumnsColumn,\n Paragraph,\n BulletList,\n OrderedList,\n Blockquote,\n ListItem,\n HardBreak,\n Italic,\n Placeholder,\n PreviewText,\n Bold,\n Strike,\n Heading,\n Divider,\n Link,\n Sup,\n Underline,\n Uppercase,\n PreservedStyle,\n Table,\n TableRow,\n TableCell,\n TableHeader,\n Body,\n Div,\n Button,\n Section,\n GlobalContent,\n AlignmentAttribute,\n StyleAttribute,\n ClassAttribute,\n MaxNesting,\n};\n\nexport type StarterKitOptions = {\n CodeBlockPrism: Partial<CodeBlockPrismOptions> | false;\n Code: Partial<CodeOptions> | false;\n TwoColumns: Partial<Record<string, never>> | false;\n ThreeColumns: Partial<Record<string, never>> | false;\n FourColumns: Partial<Record<string, never>> | false;\n ColumnsColumn: Partial<Record<string, never>> | false;\n Paragraph: Partial<ParagraphOptions> | false;\n BulletList: Partial<BulletListOptions> | false;\n OrderedList: Partial<OrderedListOptions> | false;\n Blockquote: Partial<BlockquoteOptions> | false;\n ListItem: Partial<ListItemOptions> | false;\n HardBreak: Partial<HardBreakOptions> | false;\n Italic: Partial<ItalicOptions> | false;\n Placeholder: Partial<PlaceholderOptions> | false;\n PreviewText: Partial<PreviewTextOptions> | false;\n Bold: Partial<BoldOptions> | false;\n Strike: Partial<StrikeOptions> | false;\n Heading: Partial<HeadingOptions> | false;\n Divider: Partial<DividerOptions> | false;\n Link: Partial<LinkOptions> | false;\n Sup: Partial<SupOptions> | false;\n Underline: Partial<UnderlineOptions> | false;\n Uppercase: Partial<UppercaseOptions> | false;\n PreservedStyle: Partial<Record<string, never>> | false;\n Table: Partial<TableOptions> | false;\n TableRow: Partial<TableRowOptions> | false;\n TableCell: Partial<TableCellOptions> | false;\n TableHeader: Partial<Record<string, any>> | false;\n Body: Partial<BodyOptions> | false;\n Div: Partial<DivOptions> | false;\n Button: Partial<EditorButtonOptions> | false;\n Section: Partial<SectionOptions> | false;\n GlobalContent: Partial<GlobalContentOptions> | false;\n AlignmentAttribute: Partial<AlignmentOptions> | false;\n StyleAttribute: Partial<StyleAttributeOptions> | false;\n ClassAttribute: Partial<ClassAttributeOptions> | false;\n MaxNesting: Partial<MaxNestingOptions> | false;\n TiptapStarterKit: Partial<TipTapStarterKitOptions> | false;\n};\n\nexport const StarterKit = Extension.create<StarterKitOptions>({\n name: 'reactEmailStarterKit',\n\n addOptions() {\n return {\n TiptapStarterKit: {},\n CodeBlockPrism: {\n defaultLanguage: 'javascript',\n HTMLAttributes: {\n class: 'prism node-codeBlock',\n },\n },\n Code: {\n HTMLAttributes: {\n class: 'node-inlineCode',\n spellcheck: 'false',\n },\n },\n TwoColumns: {},\n ThreeColumns: {},\n FourColumns: {},\n ColumnsColumn: {},\n Paragraph: {\n HTMLAttributes: {\n class: 'node-paragraph',\n },\n },\n BulletList: {\n HTMLAttributes: {\n class: 'node-bulletList',\n },\n },\n OrderedList: {\n HTMLAttributes: {\n class: 'node-orderedList',\n },\n },\n Blockquote: {\n HTMLAttributes: {\n class: 'node-blockquote',\n },\n },\n ListItem: {},\n HardBreak: {},\n Italic: {},\n Placeholder: {},\n PreviewText: {},\n Bold: {},\n Strike: {},\n Heading: {},\n Divider: {},\n Link: {},\n Sup: {},\n Underline: {},\n Uppercase: {},\n PreservedStyle: {},\n Table: {},\n TableRow: {},\n TableCell: {},\n TableHeader: {},\n Body: {},\n Div: {},\n Button: {},\n Section: {},\n GlobalContent: {},\n AlignmentAttribute: {\n types: [\n 'heading',\n 'paragraph',\n 'image',\n 'blockquote',\n 'codeBlock',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'button',\n 'youtube',\n 'twitter',\n 'table',\n 'tableRow',\n 'tableCell',\n 'tableHeader',\n 'columnsColumn',\n ],\n },\n StyleAttribute: {\n types: [\n 'heading',\n 'paragraph',\n 'image',\n 'blockquote',\n 'codeBlock',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'button',\n 'youtube',\n 'twitter',\n 'horizontalRule',\n 'footer',\n 'section',\n 'div',\n 'body',\n 'table',\n 'tableRow',\n 'tableCell',\n 'tableHeader',\n 'columnsColumn',\n 'link',\n ],\n },\n ClassAttribute: {\n types: [\n 'heading',\n 'paragraph',\n 'image',\n 'blockquote',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'button',\n 'youtube',\n 'twitter',\n 'horizontalRule',\n 'footer',\n 'section',\n 'div',\n 'body',\n 'table',\n 'tableRow',\n 'tableCell',\n 'tableHeader',\n 'columnsColumn',\n 'link',\n ],\n },\n MaxNesting: {\n maxDepth: 50,\n nodeTypes: ['section', 'bulletList', 'orderedList'],\n },\n };\n },\n\n addExtensions() {\n const extensions: AnyExtension[] = [];\n\n if (this.options.TiptapStarterKit !== false) {\n extensions.push(\n TipTapStarterKit.configure({\n // Collaboration extensions handle history separately.\n undoRedo: false,\n heading: false,\n link: false,\n underline: false,\n trailingNode: false,\n bold: false,\n italic: false,\n strike: false,\n code: false,\n paragraph: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n blockquote: false,\n hardBreak: false,\n gapcursor: false,\n codeBlock: false,\n horizontalRule: false,\n dropcursor: {\n color: '#61a8f8',\n class: 'rounded-full animate-[fade-in_300ms_ease-in-out] !z-40',\n width: 4,\n },\n ...this.options.TiptapStarterKit,\n }),\n );\n }\n\n for (const [name, extension] of Object.entries(starterKitExtensions)) {\n const key = name as keyof StarterKitOptions;\n const extensionOptions = this.options[key];\n if (extensionOptions !== false) {\n extensions.push(\n (extension as AnyExtension).configure(extensionOptions),\n );\n }\n }\n\n return extensions;\n },\n});\n","import type { EditorView } from '@tiptap/pm/view';\nimport type { PasteHandler, UploadImageHandler } from './create-paste-handler';\n\nexport function createDropHandler({\n onPaste,\n onUploadImage,\n}: {\n onPaste?: PasteHandler;\n onUploadImage?: UploadImageHandler;\n}) {\n return (\n view: EditorView,\n event: DragEvent,\n _slice: unknown,\n moved: boolean,\n ): boolean => {\n if (\n !moved &&\n event.dataTransfer &&\n event.dataTransfer.files &&\n event.dataTransfer.files[0]\n ) {\n event.preventDefault();\n const file = event.dataTransfer.files[0];\n\n if (onPaste?.(file, view)) {\n return true;\n }\n\n if (file.type.includes('image/') && onUploadImage) {\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n\n // here we deduct 1 from the pos or else the image will create an extra node\n void onUploadImage(file, view, (coordinates?.pos || 0) - 1);\n\n return true;\n }\n }\n return false;\n };\n}\n","/**\n * Sanitizes pasted HTML.\n * - From editor (has node-* classes): pass through as-is\n * - From external: strip all styles/classes, keep only semantic HTML\n */\n\n/**\n * Detects content from the Resend editor by checking for node-* class names.\n */\nconst EDITOR_CLASS_PATTERN = /class=\"[^\"]*node-/;\n\n/**\n * Attributes to preserve on specific elements for EXTERNAL content.\n * Only functional attributes - NO style or class.\n */\nconst PRESERVED_ATTRIBUTES: Record<string, string[]> = {\n a: ['href', 'target', 'rel'],\n img: ['src', 'alt', 'width', 'height'],\n td: ['colspan', 'rowspan'],\n th: ['colspan', 'rowspan', 'scope'],\n table: ['border', 'cellpadding', 'cellspacing'],\n '*': ['id'],\n};\n\nfunction isFromEditor(html: string): boolean {\n return EDITOR_CLASS_PATTERN.test(html);\n}\n\nexport function sanitizePastedHtml(html: string): string {\n if (isFromEditor(html)) {\n return html;\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n sanitizeNode(doc.body);\n\n return doc.body.innerHTML;\n}\n\nfunction sanitizeNode(node: Node): void {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n sanitizeElement(el);\n }\n\n for (const child of Array.from(node.childNodes)) {\n sanitizeNode(child);\n }\n}\n\nfunction sanitizeElement(el: HTMLElement): void {\n const tagName = el.tagName.toLowerCase();\n\n const allowedForTag = PRESERVED_ATTRIBUTES[tagName] || [];\n const allowedGlobal = PRESERVED_ATTRIBUTES['*'] || [];\n const allowed = new Set([...allowedForTag, ...allowedGlobal]);\n\n const attributesToRemove: string[] = [];\n\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('data-')) {\n attributesToRemove.push(attr.name);\n continue;\n }\n\n if (!allowed.has(attr.name)) {\n attributesToRemove.push(attr.name);\n }\n }\n\n for (const attr of attributesToRemove) {\n el.removeAttribute(attr);\n }\n}\n","import type { Extensions } from '@tiptap/core';\nimport { generateJSON } from '@tiptap/html';\nimport type { Slice } from '@tiptap/pm/model';\nimport type { EditorView } from '@tiptap/pm/view';\nimport { sanitizePastedHtml } from '../utils/paste-sanitizer';\n\nexport type PasteHandler = (\n payload: string | File,\n view: EditorView,\n) => boolean;\n\nexport type UploadImageHandler = (\n file: File,\n view: EditorView,\n pos: number,\n preserveAttributes?: {\n width?: string;\n height?: string;\n alignment?: string;\n href?: string;\n },\n) => void | Promise<void>;\n\nexport function createPasteHandler({\n onPaste,\n onUploadImage,\n extensions,\n}: {\n onPaste?: PasteHandler;\n onUploadImage?: UploadImageHandler;\n extensions: Extensions;\n}) {\n return (view: EditorView, event: ClipboardEvent, slice: Slice): boolean => {\n const text = event.clipboardData?.getData('text/plain');\n\n if (text && onPaste?.(text, view)) {\n event.preventDefault();\n\n return true;\n }\n\n if (event.clipboardData?.files?.[0]) {\n const file = event.clipboardData.files[0];\n if (onPaste?.(file, view)) {\n event.preventDefault();\n\n return true;\n }\n\n if (file.type.includes('image/') && onUploadImage) {\n const pos = view.state.selection.from;\n void onUploadImage(file, view, pos);\n\n return true;\n }\n }\n\n /**\n * If the coming content has a single child, we can assume\n * it's a plain text and doesn't need to be parsed and\n * be introduced in a new line\n */\n if (slice.content.childCount === 1) {\n return false;\n }\n\n if (event.clipboardData?.getData?.('text/html')) {\n event.preventDefault();\n const html = event.clipboardData.getData('text/html');\n\n // Strip visual styles, keep semantic formatting (bold, italic, links, etc.)\n const sanitizedHtml = sanitizePastedHtml(html);\n\n const jsonContent = generateJSON(sanitizedHtml, extensions);\n const node = view.state.schema.nodeFromJSON(jsonContent);\n\n // Insert the parsed content into the editor at the current selection\n const transaction = view.state.tr.replaceSelectionWith(node, false);\n view.dispatch(transaction);\n\n return true;\n }\n return false;\n };\n}\n","import type { Content, Editor as EditorClass, Extensions } from '@tiptap/core';\nimport { UndoRedo } from '@tiptap/extensions';\nimport {\n type UseEditorOptions,\n useEditorState,\n useEditor as useTipTapEditor,\n} from '@tiptap/react';\nimport * as React from 'react';\nimport { StarterKit } from '../extensions';\nimport { createDropHandler } from './create-drop-handler';\nimport {\n createPasteHandler,\n type PasteHandler,\n type UploadImageHandler,\n} from './create-paste-handler';\nimport { isDocumentVisuallyEmpty } from './is-document-visually-empty';\n\nconst COLLABORATION_EXTENSION_NAMES = new Set([\n 'liveblocksExtension',\n 'collaboration',\n]);\n\nfunction hasCollaborationExtension(exts: Extensions): boolean {\n return exts.some((ext) => COLLABORATION_EXTENSION_NAMES.has(ext.name));\n}\n\ntype Merge<A, B> = A & Omit<B, keyof A>;\n\nexport function useEditor({\n content,\n extensions = [],\n onUpdate,\n onPaste,\n onUploadImage,\n onReady,\n editable = true,\n ...rest\n}: Merge<\n {\n content: Content;\n extensions?: Extensions;\n onUpdate?: (\n editor: EditorClass,\n transaction: { getMeta: (key: string) => unknown },\n ) => void;\n onPaste?: PasteHandler;\n onUploadImage?: UploadImageHandler;\n onReady?: (editor: EditorClass | null) => void;\n editable?: boolean;\n },\n UseEditorOptions\n>) {\n const [contentError, setContentError] = React.useState<Error | null>(null);\n\n const isCollaborative = hasCollaborationExtension(extensions);\n\n const effectiveExtensions: Extensions = React.useMemo(\n () => [\n StarterKit,\n // Collaboration extensions handle their own undo/redo history,\n // so we only add TipTap's History extension for non-collaborative editors.\n ...(isCollaborative ? [] : [UndoRedo]),\n ...extensions,\n ],\n [extensions, isCollaborative],\n );\n\n const editor = useTipTapEditor({\n content: isCollaborative ? undefined : content,\n extensions: effectiveExtensions,\n editable,\n immediatelyRender: false,\n enableContentCheck: true,\n onContentError({ editor, error, disableCollaboration }) {\n disableCollaboration();\n setContentError(error);\n console.error(error);\n editor.setEditable(false);\n },\n onCreate({ editor }) {\n onReady?.(editor);\n },\n onUpdate({ editor, transaction }) {\n onUpdate?.(editor, transaction);\n },\n editorProps: {\n handleDOMEvents: {\n // Keep link behavior interception for view mode only.\n click: (view, event) => {\n if (!view.editable) {\n const target = event.target as HTMLElement;\n const link = target.closest('a');\n if (link) {\n event.preventDefault();\n return true;\n }\n }\n return false;\n },\n },\n handlePaste: createPasteHandler({\n onPaste,\n onUploadImage,\n extensions: effectiveExtensions,\n }),\n handleDrop: createDropHandler({\n onPaste,\n onUploadImage,\n }),\n },\n ...rest,\n });\n\n const isEditorEmpty = useEditorState({\n editor,\n selector: (context) => {\n if (!context.editor) {\n return true;\n }\n\n return isDocumentVisuallyEmpty(context.editor.state.doc);\n },\n });\n\n return {\n editor,\n isEditorEmpty: isEditorEmpty ?? true,\n extensions: effectiveExtensions,\n contentError,\n isCollaborative,\n };\n}\n"],"mappings":"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AM,uBAAqD;CACzD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AA2CD,MAAa,aAAa,UAAU,OAA0B;CAC5D,MAAM;CAEN,aAAa;AACX,SAAO;GACL,kBAAkB,EAAE;GACpB,gBAAgB;IACd,iBAAiB;IACjB,gBAAgB,EACd,OAAO,wBACR;IACF;GACD,MAAM,EACJ,gBAAgB;IACd,OAAO;IACP,YAAY;IACb,EACF;GACD,YAAY,EAAE;GACd,cAAc,EAAE;GAChB,aAAa,EAAE;GACf,eAAe,EAAE;GACjB,WAAW,EACT,gBAAgB,EACd,OAAO,kBACR,EACF;GACD,YAAY,EACV,gBAAgB,EACd,OAAO,mBACR,EACF;GACD,aAAa,EACX,gBAAgB,EACd,OAAO,oBACR,EACF;GACD,YAAY,EACV,gBAAgB,EACd,OAAO,mBACR,EACF;GACD,UAAU,EAAE;GACZ,WAAW,EAAE;GACb,QAAQ,EAAE;GACV,aAAa,EAAE;GACf,aAAa,EAAE;GACf,MAAM,EAAE;GACR,QAAQ,EAAE;GACV,SAAS,EAAE;GACX,SAAS,EAAE;GACX,MAAM,EAAE;GACR,KAAK,EAAE;GACP,WAAW,EAAE;GACb,WAAW,EAAE;GACb,gBAAgB,EAAE;GAClB,OAAO,EAAE;GACT,UAAU,EAAE;GACZ,WAAW,EAAE;GACb,aAAa,EAAE;GACf,MAAM,EAAE;GACR,KAAK,EAAE;GACP,QAAQ,EAAE;GACV,SAAS,EAAE;GACX,eAAe,EAAE;GACjB,oBAAoB,EAClB,OAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD,EACF;GACD,gBAAgB,EACd,OAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD,EACF;GACD,gBAAgB,EACd,OAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD,EACF;GACD,YAAY;IACV,UAAU;IACV,WAAW;KAAC;KAAW;KAAc;KAAc;IACpD;GACF;;CAGH,gBAAgB;EACd,MAAM,aAA6B,EAAE;AAErC,MAAI,KAAK,QAAQ,qBAAqB,MACpC,YAAW,KACT,iBAAiB,UAAU;GAEzB,UAAU;GACV,SAAS;GACT,MAAM;GACN,WAAW;GACX,cAAc;GACd,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,WAAW;GACX,YAAY;GACZ,aAAa;GACb,UAAU;GACV,YAAY;GACZ,WAAW;GACX,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,YAAY;IACV,OAAO;IACP,OAAO;IACP,OAAO;IACR;GACD,GAAG,KAAK,QAAQ;GACjB,CAAC,CACH;AAGH,OAAK,MAAM,CAAC,MAAM,cAAc,OAAO,QAAQ,qBAAqB,EAAE;GACpE,MAAM,MAAM;GACZ,MAAM,mBAAmB,KAAK,QAAQ;AACtC,OAAI,qBAAqB,MACvB,YAAW,KACR,UAA2B,UAAU,iBAAiB,CACxD;;AAIL,SAAO;;CAEV,CAAC;;;;AClXF,SAAgB,kBAAkB,EAChC,SACA,iBAIC;AACD,SACE,MACA,OACA,QACA,UACY;AACZ,MACE,CAAC,SACD,MAAM,gBACN,MAAM,aAAa,SACnB,MAAM,aAAa,MAAM,IACzB;AACA,SAAM,gBAAgB;GACtB,MAAM,OAAO,MAAM,aAAa,MAAM;AAEtC,OAAI,UAAU,MAAM,KAAK,CACvB,QAAO;AAGT,OAAI,KAAK,KAAK,SAAS,SAAS,IAAI,eAAe;AAOjD,IAAK,cAAc,MAAM,OANL,KAAK,YAAY;KACnC,MAAM,MAAM;KACZ,KAAK,MAAM;KACZ,CAAC,EAG2C,OAAO,KAAK,EAAE;AAE3D,WAAO;;;AAGX,SAAO;;;;;;;;;;;;;;AChCX,MAAM,uBAAuB;;;;;AAM7B,MAAM,uBAAiD;CACrD,GAAG;EAAC;EAAQ;EAAU;EAAM;CAC5B,KAAK;EAAC;EAAO;EAAO;EAAS;EAAS;CACtC,IAAI,CAAC,WAAW,UAAU;CAC1B,IAAI;EAAC;EAAW;EAAW;EAAQ;CACnC,OAAO;EAAC;EAAU;EAAe;EAAc;CAC/C,KAAK,CAAC,KAAK;CACZ;AAED,SAAS,aAAa,MAAuB;AAC3C,QAAO,qBAAqB,KAAK,KAAK;;AAGxC,SAAgB,mBAAmB,MAAsB;AACvD,KAAI,aAAa,KAAK,CACpB,QAAO;CAIT,MAAM,MADS,IAAI,WAAW,CACX,gBAAgB,MAAM,YAAY;AAErD,cAAa,IAAI,KAAK;AAEtB,QAAO,IAAI,KAAK;;AAGlB,SAAS,aAAa,MAAkB;AACtC,KAAI,KAAK,aAAa,KAAK,aAEzB,iBADW,KACQ;AAGrB,MAAK,MAAM,SAAS,MAAM,KAAK,KAAK,WAAW,CAC7C,cAAa,MAAM;;AAIvB,SAAS,gBAAgB,IAAuB;CAG9C,MAAM,gBAAgB,qBAFN,GAAG,QAAQ,aAAa,KAEe,EAAE;CACzD,MAAM,gBAAgB,qBAAqB,QAAQ,EAAE;CACrD,MAAM,UAAU,IAAI,IAAI,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC;CAE7D,MAAM,qBAA+B,EAAE;AAEvC,MAAK,MAAM,QAAQ,MAAM,KAAK,GAAG,WAAW,EAAE;AAC5C,MAAI,KAAK,KAAK,WAAW,QAAQ,EAAE;AACjC,sBAAmB,KAAK,KAAK,KAAK;AAClC;;AAGF,MAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,CACzB,oBAAmB,KAAK,KAAK,KAAK;;AAItC,MAAK,MAAM,QAAQ,mBACjB,IAAG,gBAAgB,KAAK;;;;;AClD5B,SAAgB,mBAAmB,EACjC,SACA,eACA,cAKC;AACD,SAAQ,MAAkB,OAAuB,UAA0B;EACzE,MAAM,OAAO,MAAM,eAAe,QAAQ,aAAa;AAEvD,MAAI,QAAQ,UAAU,MAAM,KAAK,EAAE;AACjC,SAAM,gBAAgB;AAEtB,UAAO;;AAGT,MAAI,MAAM,eAAe,QAAQ,IAAI;GACnC,MAAM,OAAO,MAAM,cAAc,MAAM;AACvC,OAAI,UAAU,MAAM,KAAK,EAAE;AACzB,UAAM,gBAAgB;AAEtB,WAAO;;AAGT,OAAI,KAAK,KAAK,SAAS,SAAS,IAAI,eAAe;IACjD,MAAM,MAAM,KAAK,MAAM,UAAU;AACjC,IAAK,cAAc,MAAM,MAAM,IAAI;AAEnC,WAAO;;;;;;;;AASX,MAAI,MAAM,QAAQ,eAAe,EAC/B,QAAO;AAGT,MAAI,MAAM,eAAe,UAAU,YAAY,EAAE;AAC/C,SAAM,gBAAgB;GAMtB,MAAM,cAAc,aAFE,mBAHT,MAAM,cAAc,QAAQ,YAAY,CAGP,EAEE,WAAW;GAC3D,MAAM,OAAO,KAAK,MAAM,OAAO,aAAa,YAAY;GAGxD,MAAM,cAAc,KAAK,MAAM,GAAG,qBAAqB,MAAM,MAAM;AACnE,QAAK,SAAS,YAAY;AAE1B,UAAO;;AAET,SAAO;;;;;;ACjEX,MAAM,gCAAgC,IAAI,IAAI,CAC5C,uBACA,gBACD,CAAC;AAEF,SAAS,0BAA0B,MAA2B;AAC5D,QAAO,KAAK,MAAM,QAAQ,8BAA8B,IAAI,IAAI,KAAK,CAAC;;AAKxE,SAAgBC,YAAU,EACxB,SACA,aAAa,EAAE,EACf,UACA,SACA,eACA,SACA,WAAW,MACX,GAAG,QAeF;CACD,MAAM,CAAC,cAAc,mBAAmB,MAAM,SAAuB,KAAK;CAE1E,MAAM,kBAAkB,0BAA0B,WAAW;CAE7D,MAAM,sBAAkC,MAAM,cACtC;EACJ;EAGA,GAAI,kBAAkB,EAAE,GAAG,CAAC,SAAS;EACrC,GAAG;EACJ,EACD,CAAC,YAAY,gBAAgB,CAC9B;CAED,MAAM,SAASC,UAAgB;EAC7B,SAAS,kBAAkB,SAAY;EACvC,YAAY;EACZ;EACA,mBAAmB;EACnB,oBAAoB;EACpB,eAAe,EAAE,kBAAQ,OAAO,wBAAwB;AACtD,yBAAsB;AACtB,mBAAgB,MAAM;AACtB,WAAQ,MAAM,MAAM;AACpB,YAAO,YAAY,MAAM;;EAE3B,SAAS,EAAE,oBAAU;AACnB,aAAUC,SAAO;;EAEnB,SAAS,EAAE,kBAAQ,eAAe;AAChC,cAAWA,UAAQ,YAAY;;EAEjC,aAAa;GACX,iBAAiB,EAEf,QAAQ,MAAM,UAAU;AACtB,QAAI,CAAC,KAAK,UAGR;SAFe,MAAM,OACD,QAAQ,IAAI,EACtB;AACR,YAAM,gBAAgB;AACtB,aAAO;;;AAGX,WAAO;MAEV;GACD,aAAa,mBAAmB;IAC9B;IACA;IACA,YAAY;IACb,CAAC;GACF,YAAY,kBAAkB;IAC5B;IACA;IACD,CAAC;GACH;EACD,GAAG;EACJ,CAAC;AAaF,QAAO;EACL;EACA,eAboB,eAAe;GACnC;GACA,WAAW,YAAY;AACrB,QAAI,CAAC,QAAQ,OACX,QAAO;AAGT,WAAO,wBAAwB,QAAQ,OAAO,MAAM,IAAI;;GAE3D,CAAC,IAIgC;EAChC,YAAY;EACZ;EACA;EACD"}