{"version":3,"file":"extensions-w71aFrgc.mjs","names":["Body","Button","ReactEmailButton","CodeBlock","ReactEmailCodeBlock","Container","ReactEmailContainer","Heading","TipTapHeading","EmailHeading","Link","ReactEmailLink","Section","ReactEmailSection","Text","BaseText"],"sources":["../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/extensions/prism-plugin.ts","../src/extensions/code-block.tsx","../src/utils/is-collaboration.ts","../src/extensions/container.tsx","../src/extensions/div.tsx","../src/extensions/divider.tsx","../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/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/text.tsx","../src/extensions/trailing-node.tsx","../src/extensions/underline.tsx","../src/extensions/uppercase.tsx","../src/extensions/index.ts"],"sourcesContent":["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 { mergeAttributes } from '@tiptap/core';\nimport { Column, Button as ReactEmailButton, Row } from 'react-email';\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 CodeBase from '@tiptap/extension-code';\nimport { EmailMark } from '../core/serializer/email-mark';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport const Code = EmailMark.from(CodeBase, ({ children, node, style }) => (\n  <code style={{ ...style, ...inlineCssToJs(node.attrs?.style) }}>\n    {children}\n  </code>\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(/* @vite-ignore */ `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 { 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 * as ReactEmailComponents from 'react-email';\nimport {\n  type PrismLanguage,\n  CodeBlock as ReactEmailCodeBlock,\n} from 'react-email';\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 does not export theme objects by name; dynamic access needed for user-selected themes\n    // biome-ignore lint/performance/noDynamicNamespaceImportAccess: 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 type { Extensions } from '@tiptap/core';\n\nconst COLLABORATION_EXTENSION_NAMES = new Set([\n  'liveblocksExtension',\n  'collaboration',\n]);\n\nexport function hasCollaborationExtension(exts: Extensions): boolean {\n  return exts.some((ext) => COLLABORATION_EXTENSION_NAMES.has(ext.name));\n}\n","import { mergeAttributes } from '@tiptap/core';\nimport type { Node as PmNode } from '@tiptap/pm/model';\nimport { type EditorState, Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Container as ReactEmailContainer } from 'react-email';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { hasCollaborationExtension } from '../utils/is-collaboration';\nimport { inlineCssToJs } from '../utils/styles';\n\nfunction hasContainerNode(doc: PmNode): boolean {\n  let found = false;\n  doc.forEach((node) => {\n    if (node.type.name === 'container') {\n      found = true;\n    }\n  });\n  return found;\n}\n\nfunction wrapInContainer(state: EditorState) {\n  const { doc } = state;\n  const containerType = state.schema.nodes.container;\n\n  const contentNodes: PmNode[] = [];\n  const globalContentNodes: PmNode[] = [];\n\n  doc.forEach((node) => {\n    if (node.type.name === 'globalContent') {\n      globalContentNodes.push(node);\n    } else {\n      contentNodes.push(node);\n    }\n  });\n\n  const containerContent =\n    contentNodes.length > 0\n      ? contentNodes\n      : [state.schema.nodes.paragraph.create()];\n\n  const containerNode = containerType.create(null, containerContent);\n\n  const newDocContent = [...globalContentNodes, containerNode];\n\n  const tr = state.tr;\n  tr.replaceWith(0, doc.content.size, newDocContent);\n  tr.setMeta('addToHistory', false);\n\n  return tr;\n}\n\nexport interface ContainerOptions {\n  HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Container = EmailNode.create<ContainerOptions>({\n  name: 'container',\n\n  group: 'block',\n\n  content: 'block+',\n\n  defining: true,\n  isolating: true,\n  selectable: false,\n  draggable: false,\n\n  addOptions() {\n    return {\n      HTMLAttributes: {},\n    };\n  },\n\n  parseHTML() {\n    return [\n      { tag: 'div[data-type=\"container\"]' },\n      {\n        tag: 'table[role=\"presentation\"]',\n        priority: 60,\n        getAttrs: (node) => {\n          if (typeof node === 'string') {\n            return false;\n          }\n          const table = node as HTMLElement;\n          if (!table.style.maxWidth) {\n            return false;\n          }\n          const td = table.querySelector(\n            ':scope > tbody > tr:only-child > td:only-child',\n          );\n          if (!td) {\n            return false;\n          }\n          return null;\n        },\n        contentElement: (node) =>\n          node.querySelector(':scope > tbody > tr > td') as HTMLElement,\n      },\n    ];\n  },\n\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'div',\n      mergeAttributes(\n        { 'data-type': 'container', class: 'node-container' },\n        this.options.HTMLAttributes,\n        HTMLAttributes,\n      ),\n      0,\n    ];\n  },\n\n  addProseMirrorPlugins() {\n    const isCollaborative = hasCollaborationExtension(\n      this.editor.extensionManager.extensions,\n    );\n    return [\n      new Plugin({\n        key: new PluginKey('containerEnforcer'),\n        view: isCollaborative\n          ? undefined\n          : (editorView) => {\n              if (!hasContainerNode(editorView.state.doc)) {\n                const tr = wrapInContainer(editorView.state);\n                editorView.dispatch(tr);\n              }\n              return {};\n            },\n        appendTransaction(_transactions, oldState, newState) {\n          if (hasContainerNode(newState.doc)) {\n            return null;\n          }\n\n          // This is meant to deal with the weird behavior from Liveblocks's\n          // extension. It repeatedly creates transactions that do basically no\n          // changes before the actual content of the room arrives. And, if we\n          // don't do this, this plugin wraps the initial document from TipTap\n          // (an empty paragraph) with a container, and this is then kept in\n          // the TipTap, effectively duplicating containers every time someone\n          // opens the editor.\n          //\n          // This check is, at the end of the day, a heuristic and therefore it\n          // might fail. It's just not the best solution, the best solution\n          // would be for us to either not receive any content update until the\n          // contents are actually being set, or to be able to distinguish\n          // between \"fake\" transactions and \"real\" transactions in the\n          // Liveblocks extension. But, for now, this is what we have.\n          //\n          // One such case where this fails is if the email's contents are\n          // literally the default contents from TipTap, meaning an empty\n          // paragraph, it won't wrap, and we have a test for this that's being\n          // skipped in container.spec.tsx\n          if (newState.doc.eq(oldState.doc)) {\n            return null;\n          }\n\n          return wrapInContainer(newState);\n        },\n      }),\n    ];\n  },\n\n  renderToReactEmail({ children, node, style }) {\n    const inlineStyles = inlineCssToJs(node.attrs?.style);\n\n    return (\n      <ReactEmailContainer\n        className={node.attrs?.class || undefined}\n        align={\n          ((style as Record<string, unknown>).align as\n            | 'left'\n            | 'center'\n            | 'right') || 'center'\n        }\n        style={{\n          ...style,\n          ...inlineStyles,\n          width: '100%',\n          maxWidth: style?.width ?? style?.maxWidth,\n        }}\n      >\n        {children}\n      </ReactEmailContainer>\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 { InputRule } from '@tiptap/core';\nimport type { HorizontalRuleOptions } from '@tiptap/extension-horizontal-rule';\nimport HorizontalRule from '@tiptap/extension-horizontal-rule';\nimport { NodeSelection, Plugin } from '@tiptap/pm/state';\nimport { ReplaceStep } from '@tiptap/pm/transform';\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport { Hr } from 'react-email';\nimport { EmailNode } from '../core';\nimport { inlineCssToJs } from '../utils/styles';\n\nexport type DividerOptions = HorizontalRuleOptions;\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    addProseMirrorPlugins() {\n      return [\n        new Plugin({\n          filterTransaction(tr, state) {\n            const { selection } = state;\n            const isDividerNodeSelection =\n              selection instanceof NodeSelection &&\n              selection.node.type.name === 'horizontalRule';\n\n            if (!isDividerNodeSelection || !tr.docChanged) return true;\n\n            const isTypingOverDivider = tr.steps.some(\n              (step) =>\n                step instanceof ReplaceStep && step.slice.content.size > 0,\n            );\n\n            return !isTypingOverDivider;\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 { 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 type { HeadingOptions as TipTapHeadingOptions } from '@tiptap/extension-heading';\nimport { Heading as TipTapHeading } from '@tiptap/extension-heading';\nimport { Heading as EmailHeading } from 'react-email';\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 type { Editor } from '@tiptap/core';\nimport { mergeAttributes } from '@tiptap/core';\nimport type { LinkOptions as TipTapLinkOptions } from '@tiptap/extension-link';\nimport TiptapLink from '@tiptap/extension-link';\nimport { Link as ReactEmailLink } from 'react-email';\n\nexport type LinkOptions = TipTapLinkOptions;\n\nimport { editorEventBus } from '../core';\nimport { EmailMark } from '../core/serializer/email-mark';\nimport {\n  getEmailTheming,\n  getMergedCssJs,\n  getResolvedNodeStyles,\n} from '../plugins/email-theming/extension';\nimport { inlineCssToJs, jsToInlineCss } from '../utils/styles';\nimport { processStylesForUnlink } from './preserved-style';\n\nfunction resolveThemedLinkStyle(editor: Editor): string {\n  const theming = getEmailTheming(editor);\n  const resolved = getResolvedNodeStyles(\n    { type: 'link', attrs: {} },\n    0,\n    getMergedCssJs(theming.theme, theming.styles),\n  );\n  return jsToInlineCss(resolved).replace(/;$/, '');\n}\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  renderHTML({ HTMLAttributes }) {\n    const userStyle = ((HTMLAttributes.style as string | undefined) ?? '')\n      .trim()\n      .replace(/;$/, '');\n    const themed = this.editor ? resolveThemedLinkStyle(this.editor) : '';\n    const mergedStyle = [themed, userStyle].filter(Boolean).join('; ');\n    return [\n      'a',\n      mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n        style: mergedStyle || null,\n      }),\n      0,\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 { 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 { mergeAttributes } from '@tiptap/core';\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport type * as React from 'react';\nimport { Section as ReactEmailSection } from 'react-email';\nimport { EmailNode } from '../core/serializer/email-node';\nimport { getTextAlignment } from '../utils/get-text-alignment';\nimport { inlineCssToJs } from '../utils/styles';\n\nfunction isSectionEmpty(node: ProseMirrorNode): boolean {\n  return node.textContent === '' && node.content.size <= node.childCount * 2;\n}\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  addKeyboardShortcuts() {\n    return {\n      Backspace: ({ editor }) => {\n        const { state } = editor;\n        const { selection } = state;\n        const { empty, $from } = selection;\n\n        if (!empty) return false;\n\n        // Case 1: Cursor is inside an empty section at the start position\n        for (let depth = $from.depth; depth >= 1; depth--) {\n          if ($from.node(depth).type.name !== 'section') continue;\n\n          if ($from.parentOffset !== 0) return false;\n          let atStart = true;\n          for (let d = depth; d < $from.depth; d++) {\n            if ($from.index(d) !== 0) {\n              atStart = false;\n              break;\n            }\n          }\n          if (!atStart) return false;\n\n          const sectionNode = $from.node(depth);\n          if (!isSectionEmpty(sectionNode)) return false;\n\n          const tr = state.tr;\n          const from = $from.before(depth);\n          const to = $from.after(depth);\n          const parent = $from.node(depth - 1);\n\n          if (parent.childCount === 1) {\n            tr.replaceWith(from, to, state.schema.nodes.paragraph.create());\n          } else {\n            tr.delete(from, to);\n          }\n\n          editor.view.dispatch(tr);\n          return true;\n        }\n\n        // Case 2: Cursor is right after an empty section (previous sibling)\n        for (let depth = $from.depth; depth >= 1; depth--) {\n          if ($from.pos !== $from.start(depth)) break;\n\n          const indexInParent = $from.index(depth - 1);\n          if (indexInParent === 0) continue;\n\n          const parent = $from.node(depth - 1);\n          const prevNode = parent.child(indexInParent - 1);\n\n          if (prevNode.type.name === 'section' && isSectionEmpty(prevNode)) {\n            const deleteFrom = $from.before(depth) - prevNode.nodeSize;\n            const deleteTo = $from.before(depth);\n            editor.view.dispatch(state.tr.delete(deleteFrom, deleteTo));\n            return true;\n          }\n\n          break;\n        }\n\n        return false;\n      },\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 type { ParentConfig } from '@tiptap/core';\nimport { mergeAttributes, Node } from '@tiptap/core';\nimport { Column } from 'react-email';\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      <table\n        align={alignment}\n        width={width}\n        border={0}\n        cellPadding=\"0\"\n        cellSpacing=\"0\"\n        role=\"presentation\"\n        className={node.attrs?.class || undefined}\n        style={resolveConflictingStyles(style, {\n          ...inlineStyles,\n          ...centeringStyles,\n        })}\n      >\n        <tbody>{children}</tbody>\n      </table>\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 { Text as BaseText } from '@tiptap/extension-text';\nimport { EmailNode } from '../core';\n\nexport const Text = EmailNode.from(BaseText, ({ children }) => {\n  return <>{children}</>;\n});\n","// Most of this code was copied over from https://github.com/ueberdosis/tiptap which is MIT licensed and allows for this.\n\nimport { Extension } from '@tiptap/core';\nimport type { Node, NodeType } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport const skipTrailingNodeMeta = 'skipTrailingNode';\n\nfunction nodeEqualsType({\n  types,\n  node,\n}: {\n  types: NodeType | NodeType[];\n  node: Node | null | undefined;\n}) {\n  return (\n    (node && Array.isArray(types) && types.includes(node.type)) ||\n    node?.type === types\n  );\n}\n\n/**\n * Extension based on:\n * - https://github.com/ueberdosis/tiptap/blob/v1/packages/tiptap-extensions/src/extensions/TrailingNode.js\n * - https://github.com/remirror/remirror/blob/e0f1bec4a1e8073ce8f5500d62193e52321155b9/packages/prosemirror-trailing-node/src/trailing-node-plugin.ts\n */\n\nexport interface TrailingNodeOptions {\n  /**\n   * The node type that should be inserted at the end of the document.\n   * @note the node will always be added to the `notAfter` lists to\n   * prevent an infinite loop.\n   * @default undefined\n   */\n  node?: string;\n  /**\n   * The node type(s) that the trailing node should be appended to.\n   * Accepts a single node name or an array of node names.\n   * @default 'doc'\n   */\n  appendTo?: string | string[];\n  /**\n   * The node types after which the trailing node should not be inserted.\n   * @default ['paragraph']\n   */\n  notAfter?: string | string[];\n}\n\n/**\n * This extension allows you to add an extra node at the end of a node.\n *\n * Differently from TipTap's native one, it allows you to pick which node to append the trailing node to.\n * @see https://www.tiptap.dev/api/extensions/trailing-node\n *\n * We could contribute this to TipTap's core extensions and I think we should at some once we get some time.\n */\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n  name: 'trailingNode',\n\n  addOptions() {\n    return {\n      node: undefined,\n      appendTo: 'doc',\n      notAfter: [],\n    };\n  },\n\n  addProseMirrorPlugins() {\n    const plugin = new PluginKey(this.name);\n    const defaultNode =\n      this.options.node ||\n      this.editor.schema.topNodeType.contentMatch.defaultType?.name ||\n      'paragraph';\n\n    const notAfter = Array.isArray(this.options.notAfter)\n      ? this.options.notAfter\n      : [this.options.notAfter].filter(Boolean);\n\n    const disabledNodes = Object.entries(this.editor.schema.nodes)\n      .map(([, value]) => value)\n      .filter((node) => notAfter.concat(defaultNode).includes(node.name));\n\n    const appendToNames = Array.isArray(this.options.appendTo)\n      ? this.options.appendTo\n      : [this.options.appendTo || 'doc'];\n\n    const appendToTypes = appendToNames\n      .map((name) => this.editor.schema.nodes[name])\n      .filter(Boolean);\n\n    const getInsertPositions = (doc: Node): number[] => {\n      const positions: number[] = [];\n\n      if (appendToTypes.includes(doc.type)) {\n        if (!nodeEqualsType({ node: doc.lastChild, types: disabledNodes })) {\n          positions.push(doc.content.size);\n        }\n      }\n\n      doc.descendants((node, pos) => {\n        if (!appendToTypes.includes(node.type)) return;\n        if (!nodeEqualsType({ node: node.lastChild, types: disabledNodes })) {\n          positions.push(pos + node.nodeSize - 1);\n        }\n      });\n\n      return positions;\n    };\n\n    return [\n      new Plugin({\n        key: plugin,\n        appendTransaction: (transactions, __, state) => {\n          const { doc, tr, schema } = state;\n          const shouldInsert = plugin.getState(state);\n          const type = schema.nodes[defaultNode];\n\n          if (\n            transactions.some((transaction) =>\n              transaction.getMeta(skipTrailingNodeMeta),\n            )\n          ) {\n            return;\n          }\n\n          if (!shouldInsert) {\n            return;\n          }\n\n          const positions = getInsertPositions(doc);\n\n          for (const pos of positions.sort((a, b) => b - a)) {\n            tr.insert(pos, type.create());\n          }\n\n          return positions.length > 0 ? tr : undefined;\n        },\n        state: {\n          init: (_, state) => {\n            return getInsertPositions(state.doc).length > 0;\n          },\n          apply: (tr, value) => {\n            if (!tr.docChanged) {\n              return value;\n            }\n\n            // Ignore transactions from UniqueID extension to prevent infinite loops\n            // when UniqueID adds IDs to newly inserted trailing nodes\n            if (tr.getMeta('__uniqueIDTransaction')) {\n              return value;\n            }\n\n            return getInsertPositions(tr.doc).length > 0;\n          },\n        },\n      }),\n    ];\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 { UndoRedo, type UndoRedoOptions } from '@tiptap/extensions';\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 { ContainerOptions } from './container';\nimport { Container } from './container';\nimport type { DivOptions } from './div';\nimport { Div } from './div';\nimport type { DividerOptions } from './divider';\nimport { Divider } from './divider';\nimport { FocusScopes, type FocusScopesOptions } from './focus-scopes';\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 { 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 { Text } from './text';\nimport { TrailingNode, type TrailingNodeOptions } from './trailing-node';\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 './container';\nexport * from './div';\nexport * from './divider';\nexport * from './focus-scopes';\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 './preserved-style';\nexport * from './preview-text';\nexport * from './section';\nexport * from './strike';\nexport * from './style-attribute';\nexport * from './sup';\nexport * from './table';\nexport * from './text';\nexport * from './trailing-node';\nexport * from './underline';\nexport * from './uppercase';\n\nconst starterKitExtensions: Record<string, AnyExtension> = {\n  CodeBlockPrism,\n  Code,\n  TwoColumns,\n  ThreeColumns,\n  FourColumns,\n  Container,\n  ColumnsColumn,\n  Paragraph,\n  BulletList,\n  OrderedList,\n  Blockquote,\n  ListItem,\n  HardBreak,\n  Italic,\n  PreviewText,\n  TrailingNode,\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  Text,\n  AlignmentAttribute,\n  StyleAttribute,\n  ClassAttribute,\n  MaxNesting,\n  UndoRedo,\n  FocusScopes,\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  TrailingNode: Partial<TrailingNodeOptions> | false;\n  Blockquote: Partial<BlockquoteOptions> | false;\n  ListItem: Partial<ListItemOptions> | false;\n  HardBreak: Partial<HardBreakOptions> | false;\n  Italic: Partial<ItalicOptions> | 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  Container: Partial<ContainerOptions> | false;\n  Div: Partial<DivOptions> | false;\n  Text: Record<string, never> | 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  UndoRedo: Partial<UndoRedoOptions> | false;\n  FocusScopes: Partial<FocusScopesOptions> | 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      TrailingNode: {\n        node: 'paragraph',\n        appendTo: ['container', 'section', 'columnsColumn'],\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-list node-bulletList',\n        },\n      },\n      OrderedList: {\n        HTMLAttributes: {\n          class: 'node-list node-orderedList',\n        },\n      },\n      Blockquote: {\n        HTMLAttributes: {\n          class: 'node-blockquote',\n        },\n      },\n      ListItem: {\n        HTMLAttributes: {\n          class: 'node-listItem',\n        },\n      },\n      HardBreak: {},\n      Italic: {},\n      PreviewText: {},\n      Bold: {},\n      Strike: {},\n      Heading: {},\n      Divider: {},\n      Link: { openOnClick: false, HTMLAttributes: { class: 'node-link' } },\n      Sup: {},\n      Underline: {},\n      Uppercase: {},\n      PreservedStyle: {},\n      Table: {},\n      TableRow: {},\n      TableCell: {},\n      TableHeader: {},\n      Body: {},\n      Container: {},\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      Text: {},\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      UndoRedo: {},\n      FocusScopes: {},\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          text: 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"],"mappings":"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AA+CD,MAAa,aAAa,UAAU,OAA0B;CAC5D,MAAM;CAEN,aAAa;AACX,SAAO;GACL,kBAAkB,EAAE;GACpB,gBAAgB;IACd,iBAAiB;IACjB,gBAAgB,EACd,OAAO,wBACR;IACF;GACD,cAAc;IACZ,MAAM;IACN,UAAU;KAAC;KAAa;KAAW;KAAgB;IACpD;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,6BACR,EACF;GACD,aAAa,EACX,gBAAgB,EACd,OAAO,8BACR,EACF;GACD,YAAY,EACV,gBAAgB,EACd,OAAO,mBACR,EACF;GACD,UAAU,EACR,gBAAgB,EACd,OAAO,iBACR,EACF;GACD,WAAW,EAAE;GACb,QAAQ,EAAE;GACV,aAAa,EAAE;GACf,MAAM,EAAE;GACR,QAAQ,EAAE;GACV,SAAS,EAAE;GACX,SAAS,EAAE;GACX,MAAM;IAAE,aAAa;IAAO,gBAAgB,EAAE,OAAO,aAAa;IAAE;GACpE,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,WAAW,EAAE;GACb,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,MAAM,EAAE;GACR,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;GACD,UAAU,EAAE;GACZ,aAAa,EAAE;GAChB;;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,MAAM;GACN,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"}