@react-email/editor 1.4.8 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_email_node = require("../email-node-BhbXb22u.cjs");
3
- const require_core = require("../core-Dte9KXcz.cjs");
3
+ const require_core = require("../core-Cu3Pq71K.cjs");
4
4
  const require_event_bus = require("../event-bus-C0haBiDw.cjs");
5
5
  exports.EmailMark = require_core.EmailMark;
6
6
  exports.EmailNode = require_email_node.EmailNode;
@@ -1,2 +1,2 @@
1
- import { _ as EditorEventName, a as PlaceholderItem, b as editorEventBus, c as NodeRendererComponent, d as MarkRendererComponent, f as SerializedMark, g as EditorEventMap, h as EditorEventHandler, i as EventSubscription, l as EmailMark, m as isDocumentVisuallyEmpty, n as DispatchOptions, o as EmailNode, p as composeReactEmail, r as EventHandler, s as EmailNodeConfig, t as CustomPlaceholder, u as EmailMarkConfig, v as EditorEventSubscription, x as useEditorEvent, y as NodeClickedEvent } from "../index-CHAPu71g.cjs";
1
+ import { _ as EditorEventName, a as PlaceholderItem, b as editorEventBus, c as NodeRendererComponent, d as MarkRendererComponent, f as SerializedMark, g as EditorEventMap, h as EditorEventHandler, i as EventSubscription, l as EmailMark, m as isDocumentVisuallyEmpty, n as DispatchOptions, o as EmailNode, p as composeReactEmail, r as EventHandler, s as EmailNodeConfig, t as CustomPlaceholder, u as EmailMarkConfig, v as EditorEventSubscription, x as useEditorEvent, y as NodeClickedEvent } from "../index-CdKeqkGs.cjs";
2
2
  export { CustomPlaceholder, DispatchOptions, EditorEventHandler, EditorEventMap, EditorEventName, EditorEventSubscription, EmailMark, EmailMarkConfig, EmailNode, EmailNodeConfig, EventHandler, EventSubscription, MarkRendererComponent, NodeClickedEvent, NodeRendererComponent, PlaceholderItem, SerializedMark, composeReactEmail, editorEventBus, isDocumentVisuallyEmpty, useEditorEvent };
@@ -1,2 +1,2 @@
1
- import { _ as EditorEventName, a as PlaceholderItem, b as editorEventBus, c as NodeRendererComponent, d as MarkRendererComponent, f as SerializedMark, g as EditorEventMap, h as EditorEventHandler, i as EventSubscription, l as EmailMark, m as isDocumentVisuallyEmpty, n as DispatchOptions, o as EmailNode, p as composeReactEmail, r as EventHandler, s as EmailNodeConfig, t as CustomPlaceholder, u as EmailMarkConfig, v as EditorEventSubscription, x as useEditorEvent, y as NodeClickedEvent } from "../index-CacF9qQa.mjs";
1
+ import { _ as EditorEventName, a as PlaceholderItem, b as editorEventBus, c as NodeRendererComponent, d as MarkRendererComponent, f as SerializedMark, g as EditorEventMap, h as EditorEventHandler, i as EventSubscription, l as EmailMark, m as isDocumentVisuallyEmpty, n as DispatchOptions, o as EmailNode, p as composeReactEmail, r as EventHandler, s as EmailNodeConfig, t as CustomPlaceholder, u as EmailMarkConfig, v as EditorEventSubscription, x as useEditorEvent, y as NodeClickedEvent } from "../index-BqIKSg0-.mjs";
2
2
  export { CustomPlaceholder, DispatchOptions, EditorEventHandler, EditorEventMap, EditorEventName, EditorEventSubscription, EmailMark, EmailMarkConfig, EmailNode, EmailNodeConfig, EventHandler, EventSubscription, MarkRendererComponent, NodeClickedEvent, NodeRendererComponent, PlaceholderItem, SerializedMark, composeReactEmail, editorEventBus, isDocumentVisuallyEmpty, useEditorEvent };
@@ -1,4 +1,4 @@
1
1
  import { t as EmailNode } from "../email-node-B-_g4X-S.mjs";
2
- import { n as composeReactEmail, r as EmailMark, t as isDocumentVisuallyEmpty } from "../core-CbSTyrV4.mjs";
2
+ import { n as composeReactEmail, r as EmailMark, t as isDocumentVisuallyEmpty } from "../core-C7MFC-X7.mjs";
3
3
  import { n as useEditorEvent, t as editorEventBus } from "../event-bus-CqrIUE24.mjs";
4
4
  export { EmailMark, EmailNode, composeReactEmail, editorEventBus, isDocumentVisuallyEmpty, useEditorEvent };
@@ -118,7 +118,8 @@ const composeReactEmail = async ({ editor, preview }) => {
118
118
  const [prettyHtml, text] = await Promise.all([pretty(unformattedHtml), toPlainText(unformattedHtml)]);
119
119
  return {
120
120
  html: prettyHtml,
121
- text
121
+ text,
122
+ unformattedHtml
122
123
  };
123
124
  };
124
125
  //#endregion
@@ -148,4 +149,4 @@ function isEmptyParagraph(node) {
148
149
  //#endregion
149
150
  export { composeReactEmail as n, EmailMark as r, isDocumentVisuallyEmpty as t };
150
151
 
151
- //# sourceMappingURL=core-CbSTyrV4.mjs.map
152
+ //# sourceMappingURL=core-C7MFC-X7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-C7MFC-X7.mjs","names":[],"sources":["../src/core/serializer/default-base-template.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/compose-react-email.tsx","../src/core/is-document-visually-empty.ts"],"sourcesContent":["import type * as React from 'react';\nimport { Body, Head, Html, Preview } from 'react-email';\n\ntype BaseTemplateProps = {\n children: React.ReactNode;\n previewText?: string;\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>{children}</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 MarkRendererComponent = (props: {\n mark: SerializedMark;\n node: JSONContent;\n style: React.CSSProperties;\n children?: React.ReactNode;\n\n extension: EmailMark<any, any>;\n}) => React.ReactNode;\n\nexport interface EmailMarkConfig<Options, Storage>\n extends MarkConfig<Options, Storage> {\n renderToReactEmail: MarkRendererComponent;\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: MarkRendererComponent,\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 type { Editor, JSONContent } from '@tiptap/core';\nimport type { MarkType, Schema } from '@tiptap/pm/model';\nimport { pretty, render, toPlainText } from 'react-email';\nimport { inlineCssToJs } from '../../utils/styles';\nimport { DefaultBaseTemplate } from './default-base-template';\nimport { EmailMark } from './email-mark';\nimport { EmailNode } from './email-node';\nimport type { SerializerPlugin } from './serializer-plugin';\n\nconst NODES_WITH_INCREMENTED_CHILD_DEPTH = new Set([\n 'bulletList',\n 'orderedList',\n]);\n\n/**\n * ProseMirror assigns each mark type a numeric `rank` at schema compile time; the public\n * `MarkType` typings omit it, but it exists at runtime (see prosemirror-model `MarkType.compile`).\n */\ntype MarkTypeWithRank = MarkType & { rank: number };\n\nfunction getMarkRank(schema: Schema, markName: string): number {\n const markType = schema.marks[markName] as MarkTypeWithRank | undefined;\n return markType?.rank ?? Number.MAX_SAFE_INTEGER;\n}\n\n/** Sort marks by schema rank (Tiptap extension priority → ProseMirror order). */\nfunction sortMarksBySchema(\n marks: NonNullable<JSONContent['marks']>,\n schema: Schema,\n): NonNullable<JSONContent['marks']> {\n return [...marks].sort(\n (a, b) => getMarkRank(schema, b.type) - getMarkRank(schema, a.type),\n );\n}\n\ninterface ComposeReactEmailResult {\n /** Prettier-formatted HTML, suitable for displaying in a source-code view. */\n html: string;\n /** Plain-text version of the email body. */\n text: string;\n /**\n * Unformatted HTML as produced by `render()` before `pretty()` runs.\n * Use this when persisting or sending the email — Prettier indentation\n * can inflate the byte size by 5–10× on deeply-nested table layouts\n * (e.g. exports from Stripo, Mailchimp), and adds nothing for clients\n * that parse HTML to render it.\n */\n unformattedHtml: string;\n}\n\nexport const composeReactEmail = async ({\n editor,\n preview,\n}: {\n editor: Editor;\n preview?: string;\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 typeToExtensionMap = Object.fromEntries(\n extensions.map((extension) => [extension.name, extension]),\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) {\n return null;\n }\n\n const emailNode = typeToExtensionMap[node.type];\n if (!emailNode || !(emailNode instanceof EmailNode)) {\n return null;\n }\n\n const NodeComponent = emailNode.config.renderToReactEmail;\n const childDepth = NODES_WITH_INCREMENTED_CHILD_DEPTH.has(node.type)\n ? depth + 1\n : depth;\n\n let renderedNode: React.ReactNode = node.text ? (\n node.text\n ) : (\n <NodeComponent\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 extension={emailNode}\n >\n {parseContent(node.content, childDepth)}\n </NodeComponent>\n );\n if (node.marks) {\n for (const mark of sortMarksBySchema(node.marks, editor.schema)) {\n const emailMark = typeToExtensionMap[mark.type];\n if (emailMark instanceof EmailMark) {\n const MarkComponent = emailMark.config.renderToReactEmail;\n const markStyle =\n serializerPlugin?.getNodeStyles(\n {\n type: mark.type,\n attrs: mark.attrs ?? {},\n },\n depth,\n editor,\n ) ?? {};\n renderedNode = (\n <MarkComponent\n mark={mark}\n node={node}\n style={markStyle}\n extension={emailMark}\n >\n {renderedNode}\n </MarkComponent>\n );\n }\n }\n }\n\n return renderedNode;\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, unformattedHtml };\n};\n","import type { Node } from '@tiptap/pm/model';\n\nexport function isDocumentVisuallyEmpty(doc: Node): boolean {\n let nonGlobalNodeCount = 0;\n let firstNonGlobalNode: Node | 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 = node;\n }\n }\n\n if (nonGlobalNodeCount === 0) {\n return true;\n }\n\n if (nonGlobalNodeCount !== 1) {\n return false;\n }\n\n if (firstNonGlobalNode!.type.name === 'container') {\n return hasOnlyEmptyParagraph(firstNonGlobalNode!);\n }\n\n return isEmptyParagraph(firstNonGlobalNode!);\n}\n\nfunction hasOnlyEmptyParagraph(node: Node): boolean {\n if (node.childCount === 0) {\n return true;\n }\n\n if (node.childCount !== 1) {\n return false;\n }\n\n return isEmptyParagraph(node.child(0));\n}\n\nfunction isEmptyParagraph(node: Node): boolean {\n return node.type.name === 'paragraph' && node.content.size === 0;\n}\n"],"mappings":"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"}
@@ -119,7 +119,8 @@ const composeReactEmail = async ({ editor, preview }) => {
119
119
  const [prettyHtml, text] = await Promise.all([(0, react_email.pretty)(unformattedHtml), (0, react_email.toPlainText)(unformattedHtml)]);
120
120
  return {
121
121
  html: prettyHtml,
122
- text
122
+ text,
123
+ unformattedHtml
123
124
  };
124
125
  };
125
126
  //#endregion
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_focus_scopes = require("../focus-scopes-Ncj54H_M.cjs");
3
- const require_extensions = require("../extensions-D7HNpgRI.cjs");
3
+ const require_extensions = require("../extensions-CAUMQtR2.cjs");
4
4
  const require_extension = require("../extension-CFWnRox4.cjs");
5
5
  exports.AlignmentAttribute = require_extensions.AlignmentAttribute;
6
6
  exports.Blockquote = require_extensions.Blockquote;
@@ -1,4 +1,4 @@
1
- import { l as EmailMark, o as EmailNode } from "../index-CHAPu71g.cjs";
1
+ import { l as EmailMark, o as EmailNode } from "../index-CdKeqkGs.cjs";
2
2
  import { a as createFocusScopesStorage, i as createFocusScopePlugin, n as FocusScopesOptions, o as focusScopePluginKey, r as FocusScopesStorage, t as FocusScopes } from "../focus-scopes-BLTX2pJU.cjs";
3
3
  import { Node } from "@tiptap/pm/model";
4
4
  import { Editor, Extension, Node as Node$1, ParentConfig } from "@tiptap/core";
@@ -1,4 +1,4 @@
1
- import { l as EmailMark, o as EmailNode } from "../index-CacF9qQa.mjs";
1
+ import { l as EmailMark, o as EmailNode } from "../index-BqIKSg0-.mjs";
2
2
  import { a as createFocusScopesStorage, i as createFocusScopePlugin, n as FocusScopesOptions, o as focusScopePluginKey, r as FocusScopesStorage, t as FocusScopes } from "../focus-scopes-CKTuaMk3.mjs";
3
3
  import { Editor, Extension, Node, ParentConfig } from "@tiptap/core";
4
4
  import { UndoRedoOptions } from "@tiptap/extensions";
@@ -1,4 +1,4 @@
1
- import { A as Code, C as Italic, D as Div, E as Divider, F as Body, I as Blockquote, L as AlignmentAttribute, M as Button, N as BulletList, O as Container, P as Bold, S as processStylesForUnlink, T as HardBreak, _ as OrderedList, a as skipTrailingNodeMeta, b as Link, c as TableCell, d as Sup, f as StyleAttribute, g as Paragraph, h as PreviewText, i as TrailingNode, j as ClassAttribute, k as CodeBlockPrism, l as TableHeader, m as Section, n as Uppercase, o as Text, p as Strike, r as Underline, s as Table, t as StarterKit, u as TableRow, v as MaxNesting, w as Heading, x as PreservedStyle, y as ListItem } from "../extensions-AK4Wyqog.mjs";
1
+ import { A as Code, C as Italic, D as Div, E as Divider, F as Body, I as Blockquote, L as AlignmentAttribute, M as Button, N as BulletList, O as Container, P as Bold, S as processStylesForUnlink, T as HardBreak, _ as OrderedList, a as skipTrailingNodeMeta, b as Link, c as TableCell, d as Sup, f as StyleAttribute, g as Paragraph, h as PreviewText, i as TrailingNode, j as ClassAttribute, k as CodeBlockPrism, l as TableHeader, m as Section, n as Uppercase, o as Text, p as Strike, r as Underline, s as Table, t as StarterKit, u as TableRow, v as MaxNesting, w as Heading, x as PreservedStyle, y as ListItem } from "../extensions-Bv5gFQWm.mjs";
2
2
  import { a as COLUMN_PARENT_TYPES, c as MAX_COLUMNS_DEPTH, d as getColumnsDepth, i as focusScopePluginKey, l as ThreeColumns, n as createFocusScopePlugin, o as ColumnsColumn, r as createFocusScopesStorage, s as FourColumns, t as FocusScopes, u as TwoColumns } from "../focus-scopes-DOsiXV7b.mjs";
3
3
  import { E as getGlobalContent, T as GlobalContent } from "../extension-Bd-BJ-bV.mjs";
4
4
  export { AlignmentAttribute, Blockquote, Body, Bold, BulletList, Button, COLUMN_PARENT_TYPES, ClassAttribute, Code, CodeBlockPrism, ColumnsColumn, Container, Div, Divider, FocusScopes, FourColumns, GlobalContent, HardBreak, Heading, Italic, Link, ListItem, MAX_COLUMNS_DEPTH, MaxNesting, OrderedList, Paragraph, PreservedStyle, PreviewText, Section, StarterKit, Strike, StyleAttribute, Sup, Table, TableCell, TableHeader, TableRow, Text, ThreeColumns, TrailingNode, TwoColumns, Underline, Uppercase, createFocusScopePlugin, createFocusScopesStorage, focusScopePluginKey, getColumnsDepth, getGlobalContent, processStylesForUnlink, skipTrailingNodeMeta };
@@ -1,5 +1,5 @@
1
1
  import { a as jsToInlineCss, i as inlineCssToJs, o as resolveConflictingStyles, t as EmailNode } from "./email-node-B-_g4X-S.mjs";
2
- import { r as EmailMark } from "./core-CbSTyrV4.mjs";
2
+ import { r as EmailMark } from "./core-C7MFC-X7.mjs";
3
3
  import { _ as TABLE_ATTRIBUTES, b as createStandardAttributes, f as hasPrismThemeLoaded, g as LAYOUT_ATTRIBUTES, h as COMMON_HTML_ATTRIBUTES, l as ThreeColumns, m as removePrismTheme, o as ColumnsColumn, p as loadPrismTheme, s as FourColumns, t as FocusScopes, u as TwoColumns, v as TABLE_CELL_ATTRIBUTES, y as TABLE_HEADER_ATTRIBUTES } from "./focus-scopes-DOsiXV7b.mjs";
4
4
  import { t as editorEventBus } from "./event-bus-CqrIUE24.mjs";
5
5
  import { T as GlobalContent, a as getResolvedNodeStyles, i as getMergedCssJs, r as getEmailTheming } from "./extension-Bd-BJ-bV.mjs";
@@ -1767,4 +1767,4 @@ const StarterKit = Extension.create({
1767
1767
  //#endregion
1768
1768
  export { Code as A, Italic as C, Div as D, Divider as E, Body$1 as F, Blockquote as I, AlignmentAttribute as L, Button$1 as M, BulletList as N, Container$1 as O, Bold as P, processStylesForUnlink as S, HardBreak as T, OrderedList as _, skipTrailingNodeMeta as a, Link$1 as b, TableCell as c, Sup as d, StyleAttribute as f, Paragraph as g, PreviewText as h, TrailingNode as i, ClassAttribute as j, CodeBlockPrism as k, TableHeader as l, Section$1 as m, Uppercase as n, Text$1 as o, Strike as p, Underline as r, Table as s, StarterKit as t, TableRow as u, MaxNesting as v, Heading$2 as w, PreservedStyle as x, ListItem as y };
1769
1769
 
1770
- //# sourceMappingURL=extensions-AK4Wyqog.mjs.map
1770
+ //# sourceMappingURL=extensions-Bv5gFQWm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions-AK4Wyqog.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"}
1
+ {"version":3,"file":"extensions-Bv5gFQWm.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"}
@@ -1,6 +1,6 @@
1
1
  const require_focus_scopes = require("./focus-scopes-Ncj54H_M.cjs");
2
2
  const require_email_node = require("./email-node-BhbXb22u.cjs");
3
- const require_core = require("./core-Dte9KXcz.cjs");
3
+ const require_core = require("./core-Cu3Pq71K.cjs");
4
4
  const require_event_bus = require("./event-bus-C0haBiDw.cjs");
5
5
  const require_extension = require("./extension-CFWnRox4.cjs");
6
6
  let _tiptap_react = require("@tiptap/react");
@@ -50,8 +50,18 @@ declare function isDocumentVisuallyEmpty(doc: Node$1): boolean;
50
50
  //#endregion
51
51
  //#region src/core/serializer/compose-react-email.d.ts
52
52
  interface ComposeReactEmailResult {
53
+ /** Prettier-formatted HTML, suitable for displaying in a source-code view. */
53
54
  html: string;
55
+ /** Plain-text version of the email body. */
54
56
  text: string;
57
+ /**
58
+ * Unformatted HTML as produced by `render()` before `pretty()` runs.
59
+ * Use this when persisting or sending the email — Prettier indentation
60
+ * can inflate the byte size by 5–10× on deeply-nested table layouts
61
+ * (e.g. exports from Stripo, Mailchimp), and adds nothing for clients
62
+ * that parse HTML to render it.
63
+ */
64
+ unformattedHtml: string;
55
65
  }
56
66
  declare const composeReactEmail: ({
57
67
  editor,
@@ -190,4 +200,4 @@ interface DispatchOptions {
190
200
  }
191
201
  //#endregion
192
202
  export { EditorEventName as _, PlaceholderItem as a, editorEventBus as b, NodeRendererComponent as c, MarkRendererComponent as d, SerializedMark as f, EditorEventMap as g, EditorEventHandler as h, EventSubscription as i, EmailMark as l, isDocumentVisuallyEmpty as m, DispatchOptions as n, EmailNode as o, composeReactEmail as p, EventHandler as r, EmailNodeConfig as s, CustomPlaceholder as t, EmailMarkConfig as u, EditorEventSubscription as v, useEditorEvent as x, NodeClickedEvent$1 as y };
193
- //# sourceMappingURL=index-CacF9qQa.d.mts.map
203
+ //# sourceMappingURL=index-BqIKSg0-.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BqIKSg0-.d.mts","names":[],"sources":["../src/core/event-bus.ts","../src/core/is-document-visually-empty.ts","../src/core/serializer/compose-react-email.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/email-node.ts","../src/core/types.ts"],"mappings":"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"}
@@ -50,8 +50,18 @@ declare function isDocumentVisuallyEmpty(doc: Node): boolean;
50
50
  //#endregion
51
51
  //#region src/core/serializer/compose-react-email.d.ts
52
52
  interface ComposeReactEmailResult {
53
+ /** Prettier-formatted HTML, suitable for displaying in a source-code view. */
53
54
  html: string;
55
+ /** Plain-text version of the email body. */
54
56
  text: string;
57
+ /**
58
+ * Unformatted HTML as produced by `render()` before `pretty()` runs.
59
+ * Use this when persisting or sending the email — Prettier indentation
60
+ * can inflate the byte size by 5–10× on deeply-nested table layouts
61
+ * (e.g. exports from Stripo, Mailchimp), and adds nothing for clients
62
+ * that parse HTML to render it.
63
+ */
64
+ unformattedHtml: string;
55
65
  }
56
66
  declare const composeReactEmail: ({
57
67
  editor,
@@ -190,4 +200,4 @@ interface DispatchOptions {
190
200
  }
191
201
  //#endregion
192
202
  export { EditorEventName as _, PlaceholderItem as a, editorEventBus as b, NodeRendererComponent as c, MarkRendererComponent as d, SerializedMark as f, EditorEventMap as g, EditorEventHandler as h, EventSubscription as i, EmailMark as l, isDocumentVisuallyEmpty as m, DispatchOptions as n, EmailNode as o, composeReactEmail as p, EventHandler as r, EmailNodeConfig as s, CustomPlaceholder as t, EmailMarkConfig as u, EditorEventSubscription as v, useEditorEvent as x, NodeClickedEvent$1 as y };
193
- //# sourceMappingURL=index-CHAPu71g.d.cts.map
203
+ //# sourceMappingURL=index-CdKeqkGs.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CdKeqkGs.d.cts","names":[],"sources":["../src/core/event-bus.ts","../src/core/is-document-visually-empty.ts","../src/core/serializer/compose-react-email.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/email-node.ts","../src/core/types.ts"],"mappings":";;;;;;;AAiBA;;;;;;;;;UAAiB,cAAA;EACf,sBAAA;EACA,cAAA,EAAgB,kBAAA;AAAA;AAAA,KAGN,kBAAA;EACV,QAAA;EACA,SAAA,EAAW,KAAA;EACX,OAAA;IAAW,GAAA;IAAa,MAAA;EAAA;AAAA;AAAA,KAGd,eAAA,SAAwB,cAAA;AAAA,KAExB,kBAAA,WAA6B,eAAA,KACvC,OAAA,EAAS,cAAA,CAAe,CAAA,aACd,OAAA;AAAA,UAEK,uBAAA;EACf,WAAA;AAAA;AAAA,cAGI,cAAA;EAAA,QACI,eAAA;EAIR,QAAA,WAAmB,eAAA,CAAA,CACjB,SAAA,EAAW,CAAA,EACX,OAAA,EAAS,cAAA,CAAe,CAAA,GACxB,OAAA;IAAY,MAAA,GAAS,WAAA;EAAA;EAYvB,EAAA,WAAa,eAAA,CAAA,CACX,SAAA,EAAW,CAAA,EACX,OAAA,EAAS,kBAAA,CAAmB,CAAA,GAC5B,OAAA,GAAU,uBAAA;IAA4B,MAAA,GAAS,WAAA;EAAA,IAC9C,uBAAA;AAAA;AAAA,cAgCQ,cAAA,EAAc,cAAA;AAAA,iBAEX,cAAA,WAAyB,eAAA,CAAA,CACvC,SAAA,EAAW,CAAA,EACX,OAAA,EAAS,kBAAA,CAAmB,CAAA,GAC5B,OAAA,GAAU,uBAAA;EAA4B,MAAA,GAAS,WAAA;AAAA;;;iBCjGjC,uBAAA,CAAwB,GAAA,EAAK,IAAA;;;UCiCnC,uBAAA;;EAER,IAAA;EFpBe;EEsBf,IAAA;;;;;;;;EAQA,eAAA;AAAA;AAAA,cAGW,iBAAA;EAA2B,MAAA;EAAA;AAAA;EAItC,MAAA,EAAQ,MAAA;EACR,OAAA;AAAA,MACE,OAAA,CAAQ,uBAAA;;;KChDA,cAAA,GAAiB,WAAA,CAAY,WAAA;AAAA,KAE7B,qBAAA,IAAyB,KAAA;EACnC,IAAA,EAAM,cAAA;EACN,IAAA,EAAM,WAAA;EACN,KAAA,EAAO,KAAA,CAAM,aAAA;EACb,QAAA,GAAW,KAAA,CAAM,SAAA;EAEjB,SAAA,EAAW,SAAA;AAAA,MACP,KAAA,CAAM,SAAA;AAAA,UAEK,eAAA,2BACP,UAAA,CAAW,OAAA,EAAS,OAAA;EAC5B,kBAAA,EAAoB,qBAAA;AAAA;AAAA,KAGjB,iBAAA,qBAAoC,OAAA,CACvC,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,OAAA,4BAE9B,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,OAAA,2BAC9B,QAAA;EACE,IAAA;EACA,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,OAAA;EACT,MAAA,EAAQ,MAAA;EACR,IAAA,EAAM,QAAA;EACN,MAAA,MAAY,IAAA;AAAA;AAAA,cAGH,SAAA,WACD,MAAA,2BACA,MAAA,yBACF,IAAA,CAAK,OAAA,EAAS,OAAA;EACd,MAAA,EAAQ,eAAA,CAAgB,OAAA,EAAS,OAAA;cAG7B,MAAA,EAAQ,iBAAA,CAAgB,OAAA,EAAS,OAAA;EHnBf;;AAGhC;;EAHgC,OG2BvB,MAAA,KAAW,MAAA,qBAA2B,MAAA,gBAAA,CAC3C,MAAA,EAAQ,iBAAA,CAAgB,CAAA,EAAG,CAAA,WAAY,iBAAA,CAAgB,CAAA,EAAG,CAAA,KAAG,SAAA,CAAA,CAAA,EAAA,CAAA;EAAA,OAMxD,IAAA,MAAA,CACL,IAAA,EAAM,IAAA,CAAK,CAAA,EAAG,CAAA,GACd,kBAAA,EAAoB,qBAAA,GACnB,SAAA,CAAU,CAAA,EAAG,CAAA;EAUhB,SAAA,CAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,IACS,SAAA,CAAU,OAAA,EAAS,OAAA;EAIxD,MAAA,mBACoB,OAAA,oBACA,OAAA,yBACK,UAAA,CACrB,eAAA,EACA,eAAA,IACE,eAAA,CAAgB,eAAA,EAAiB,eAAA,EAAA,CAErC,cAAA,UACW,OAAA,CAAQ,cAAA,MACd,OAAA,CAAQ,cAAA,IACP,QAAA;IACE,IAAA;IACA,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;IACT,MAAA,EAAQ,MAAA;IACR,IAAA,EAAM,QAAA;EAAA,MAEb,SAAA,CAAU,eAAA,EAAiB,eAAA;AAAA;;;KCvFpB,qBAAA,IAAyB,KAAA;EACnC,IAAA,EAAM,WAAA;EACN,KAAA,EAAO,KAAA,CAAM,aAAA;EACb,QAAA,GAAW,KAAA,CAAM,SAAA;EAEjB,SAAA,EAAW,SAAA;AAAA,MACP,KAAA,CAAM,SAAA;AAAA,UAEK,eAAA,2BACP,UAAA,CAAW,OAAA,EAAS,OAAA;EAC5B,kBAAA,EAAoB,qBAAA;AAAA;AAAA,KAGjB,eAAA,qBAAoC,OAAA,CACvC,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,OAAA,4BAE9B,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,OAAA,2BAC9B,QAAA;EACE,IAAA;EACA,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,OAAA;EACT,MAAA,EAAQ,MAAA;EACR,IAAA,EAAM,QAAA;EACN,MAAA,MAAY,IAAA;AAAA;AAAA,cAGH,SAAA,WACD,MAAA,2BACA,MAAA,yBACF,MAAA,CAAK,OAAA,EAAS,OAAA;EACd,MAAA,EAAQ,eAAA,CAAgB,OAAA,EAAS,OAAA;cAG7B,MAAA,EAAQ,eAAA,CAAgB,OAAA,EAAS,OAAA;EJhBlC;;;;EAAA,OIwBJ,MAAA,KAAW,MAAA,qBAA2B,MAAA,gBAAA,CAC3C,MAAA,EAAQ,eAAA,CAAgB,CAAA,EAAG,CAAA,WAAY,eAAA,CAAgB,CAAA,EAAG,CAAA,KAAG,SAAA,CAAA,CAAA,EAAA,CAAA;EAAA,OAOxD,IAAA,MAAA,CACL,IAAA,EAAM,MAAA,CAAK,CAAA,EAAG,CAAA,GACd,kBAAA,EAAoB,qBAAA,GACnB,SAAA,CAAU,CAAA,EAAG,CAAA;EAUhB,SAAA,CAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,IACS,SAAA,CAAU,OAAA,EAAS,OAAA;EAIxD,MAAA,mBACoB,OAAA,oBACA,OAAA,yBACK,UAAA,CACrB,eAAA,EACA,eAAA,IACE,eAAA,CAAgB,eAAA,EAAiB,eAAA,EAAA,CAErC,cAAA,UACW,OAAA,CAAQ,cAAA,MACd,OAAA,CAAQ,cAAA,IACP,QAAA;IACE,IAAA;IACA,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;IACT,MAAA,EAAQ,MAAA;IACR,IAAA,EAAM,QAAA;EAAA,MAEb,SAAA,CAAU,eAAA,EAAiB,eAAA;AAAA;;;;;;;UClFf,eAAA;ELQC;EKNhB,EAAA;ELMgC;EKJhC,UAAA;ELO0B;EKL1B,cAAA;ELOgB;EKLhB,aAAA;ELKA;EKHA,QAAA;ELIA;EKFA,IAAA;ELEwB;EKAxB,mBAAA;AAAA;ALGF;;;AAAA,KKGY,iBAAA;EACV,EAAA;EACA,GAAA;EACA,IAAA;EACA,cAAA;AAAA;AAAA;EAAA,UAIiB,cAAA;IACf,cAAA,EAAgB,gBAAA;EAAA;AAAA;;;;KAOR,YAAA,WAAuB,eAAA,KACjC,OAAA,EAAS,cAAA,CAAe,CAAA,aACd,OAAA;;;;UAKK,iBAAA;EACf,WAAA;AAAA;;;;UAMe,eAAA;EACf,MAAA,GAAS,WAAA;AAAA"}
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("./focus-scopes-Ncj54H_M.cjs");
3
- const require_core = require("./core-Dte9KXcz.cjs");
4
- const require_extensions = require("./extensions-D7HNpgRI.cjs");
3
+ const require_core = require("./core-Cu3Pq71K.cjs");
4
+ const require_extensions = require("./extensions-CAUMQtR2.cjs");
5
5
  const require_extension = require("./extension-CFWnRox4.cjs");
6
6
  const require_extension$1 = require("./extension-bVrEjbFA.cjs");
7
7
  const require_root = require("./root-DMPtBdQA.cjs");
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { n as composeReactEmail } from "./core-CbSTyrV4.mjs";
2
- import { t as StarterKit } from "./extensions-AK4Wyqog.mjs";
1
+ import { n as composeReactEmail } from "./core-C7MFC-X7.mjs";
2
+ import { t as StarterKit } from "./extensions-Bv5gFQWm.mjs";
3
3
  import { t as EmailTheming } from "./extension-Bd-BJ-bV.mjs";
4
4
  import { t as createImageExtension } from "./extension-CDrL5i44.mjs";
5
5
  import { t as SlashCommandRoot, x as BubbleMenu } from "./root-_Hz1yayd.mjs";
@@ -1,4 +1,4 @@
1
- import { o as EmailNode } from "../index-CHAPu71g.cjs";
1
+ import { o as EmailNode } from "../index-CdKeqkGs.cjs";
2
2
  import { a as KnownThemeComponents, c as PanelSectionId, d as ThemeComponentStyles, f as ThemeConfig, i as KnownCssProperties, l as ResetTheme, n as EditorTheme, o as PanelGroup, p as ThemeableComponent, r as EditorThemeInput, s as PanelInputProperty, t as CssJs, u as SupportedCssProperties } from "../types-DUTo2zJ5.cjs";
3
3
  import { n as SlashCommandItem } from "../types-ALwc36ll.cjs";
4
4
  import { Editor, Extension, JSONContent } from "@tiptap/core";
@@ -1,4 +1,4 @@
1
- import { o as EmailNode } from "../index-CacF9qQa.mjs";
1
+ import { o as EmailNode } from "../index-BqIKSg0-.mjs";
2
2
  import { a as KnownThemeComponents, c as PanelSectionId, d as ThemeComponentStyles, f as ThemeConfig, i as KnownCssProperties, l as ResetTheme, n as EditorTheme, o as PanelGroup, p as ThemeableComponent, r as EditorThemeInput, s as PanelInputProperty, t as CssJs, u as SupportedCssProperties } from "../types-8PZgYQuK.mjs";
3
3
  import { n as SlashCommandItem } from "../types-BG5XsXt9.mjs";
4
4
  import * as React$2 from "react";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-email/editor",
3
- "version": "1.4.8",
3
+ "version": "1.5.1",
4
4
  "description": "A rich text editor for editing and building email templates",
5
5
  "sideEffects": [
6
6
  "**/*.css"
@@ -126,7 +126,7 @@
126
126
  "@tiptap/suggestion": "^3.17.1",
127
127
  "hast-util-from-html": "^2.0.3",
128
128
  "prismjs": "^1.30.0",
129
- "react-email": "6.3.3"
129
+ "react-email": "6.4.0"
130
130
  },
131
131
  "devDependencies": {
132
132
  "@testing-library/react": "16.3.2",
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-CbSTyrV4.mjs","names":[],"sources":["../src/core/serializer/default-base-template.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/compose-react-email.tsx","../src/core/is-document-visually-empty.ts"],"sourcesContent":["import type * as React from 'react';\nimport { Body, Head, Html, Preview } from 'react-email';\n\ntype BaseTemplateProps = {\n children: React.ReactNode;\n previewText?: string;\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>{children}</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 MarkRendererComponent = (props: {\n mark: SerializedMark;\n node: JSONContent;\n style: React.CSSProperties;\n children?: React.ReactNode;\n\n extension: EmailMark<any, any>;\n}) => React.ReactNode;\n\nexport interface EmailMarkConfig<Options, Storage>\n extends MarkConfig<Options, Storage> {\n renderToReactEmail: MarkRendererComponent;\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: MarkRendererComponent,\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 type { Editor, JSONContent } from '@tiptap/core';\nimport type { MarkType, Schema } from '@tiptap/pm/model';\nimport { pretty, render, toPlainText } from 'react-email';\nimport { inlineCssToJs } from '../../utils/styles';\nimport { DefaultBaseTemplate } from './default-base-template';\nimport { EmailMark } from './email-mark';\nimport { EmailNode } from './email-node';\nimport type { SerializerPlugin } from './serializer-plugin';\n\nconst NODES_WITH_INCREMENTED_CHILD_DEPTH = new Set([\n 'bulletList',\n 'orderedList',\n]);\n\n/**\n * ProseMirror assigns each mark type a numeric `rank` at schema compile time; the public\n * `MarkType` typings omit it, but it exists at runtime (see prosemirror-model `MarkType.compile`).\n */\ntype MarkTypeWithRank = MarkType & { rank: number };\n\nfunction getMarkRank(schema: Schema, markName: string): number {\n const markType = schema.marks[markName] as MarkTypeWithRank | undefined;\n return markType?.rank ?? Number.MAX_SAFE_INTEGER;\n}\n\n/** Sort marks by schema rank (Tiptap extension priority → ProseMirror order). */\nfunction sortMarksBySchema(\n marks: NonNullable<JSONContent['marks']>,\n schema: Schema,\n): NonNullable<JSONContent['marks']> {\n return [...marks].sort(\n (a, b) => getMarkRank(schema, b.type) - getMarkRank(schema, a.type),\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;\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 typeToExtensionMap = Object.fromEntries(\n extensions.map((extension) => [extension.name, extension]),\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) {\n return null;\n }\n\n const emailNode = typeToExtensionMap[node.type];\n if (!emailNode || !(emailNode instanceof EmailNode)) {\n return null;\n }\n\n const NodeComponent = emailNode.config.renderToReactEmail;\n const childDepth = NODES_WITH_INCREMENTED_CHILD_DEPTH.has(node.type)\n ? depth + 1\n : depth;\n\n let renderedNode: React.ReactNode = node.text ? (\n node.text\n ) : (\n <NodeComponent\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 extension={emailNode}\n >\n {parseContent(node.content, childDepth)}\n </NodeComponent>\n );\n if (node.marks) {\n for (const mark of sortMarksBySchema(node.marks, editor.schema)) {\n const emailMark = typeToExtensionMap[mark.type];\n if (emailMark instanceof EmailMark) {\n const MarkComponent = emailMark.config.renderToReactEmail;\n const markStyle =\n serializerPlugin?.getNodeStyles(\n {\n type: mark.type,\n attrs: mark.attrs ?? {},\n },\n depth,\n editor,\n ) ?? {};\n renderedNode = (\n <MarkComponent\n mark={mark}\n node={node}\n style={markStyle}\n extension={emailMark}\n >\n {renderedNode}\n </MarkComponent>\n );\n }\n }\n }\n\n return renderedNode;\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 type { Node } from '@tiptap/pm/model';\n\nexport function isDocumentVisuallyEmpty(doc: Node): boolean {\n let nonGlobalNodeCount = 0;\n let firstNonGlobalNode: Node | 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 = node;\n }\n }\n\n if (nonGlobalNodeCount === 0) {\n return true;\n }\n\n if (nonGlobalNodeCount !== 1) {\n return false;\n }\n\n if (firstNonGlobalNode!.type.name === 'container') {\n return hasOnlyEmptyParagraph(firstNonGlobalNode!);\n }\n\n return isEmptyParagraph(firstNonGlobalNode!);\n}\n\nfunction hasOnlyEmptyParagraph(node: Node): boolean {\n if (node.childCount === 0) {\n return true;\n }\n\n if (node.childCount !== 1) {\n return false;\n }\n\n return isEmptyParagraph(node.child(0));\n}\n\nfunction isEmptyParagraph(node: Node): boolean {\n return node.type.name === 'paragraph' && node.content.size === 0;\n}\n"],"mappings":";;;;;AAQA,SAAgB,oBAAoB,EAClC,UACA,eACoB;AACpB,QACE,qBAAC,MAAD,EAAA,UAAA;EACE,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,QAAD;IAAM,SAAQ;IAAqB,MAAK;IAAa,CAAA;GACrD,oBAAC,QAAD;IAAM,SAAQ;IAAU,WAAU;IAAoB,CAAA;GACtD,oBAAC,QAAD,EAAM,MAAK,wCAAyC,CAAA;GACpD,oBAAC,QAAD;IACE,SAAQ;IACR,MAAK;IACL,CAAA;GACG,EAAA,CAAA;EACN,eAAe,gBAAgB,MAAM,oBAAC,SAAD,EAAA,UAAU,aAAsB,CAAA;EAEtE,oBAAC,MAAD,EAAO,UAAgB,CAAA;EAClB,EAAA,CAAA;;;;ACWX,IAAa,YAAb,MAAa,kBAGH,KAAuB;CAI/B,YAAY,QAA2C;AACrD,QAAM,OAAO;;;;;;CAOf,OAAO,OACL,QACA;AAEA,SAAO,IAAI,UADY,OAAO,WAAW,aAAa,QAAQ,GAAG,OACvB;;CAG5C,OAAO,KACL,MACA,oBACiB;EACjB,MAAM,aAAa,UAAU,OAAO,EAAE,CAA0B;AAEhE,SAAO,OAAO,YAAY,EAAE,GAAG,MAAM,CAAC;AACtC,aAAW,SAAS;GAAE,GAAG,KAAK;GAAQ;GAAoB;AAC1D,SAAO;;CAKT,UAAU,SAA4B;AACpC,SAAO,MAAM,UAAU,QAAQ;;CAIjC,OAQE,gBAU6C;EAC7C,MAAM,iBACJ,OAAO,mBAAmB,aAAa,gBAAgB,GAAG;AAC5D,SAAO,MAAM,OAAO,eAAe;;;;;ACzFvC,MAAM,qCAAqC,IAAI,IAAI,CACjD,cACA,cACD,CAAC;AAQF,SAAS,YAAY,QAAgB,UAA0B;AAE7D,QADiB,OAAO,MAAM,WACb,QAAQ,OAAO;;;AAIlC,SAAS,kBACP,OACA,QACmC;AACnC,QAAO,CAAC,GAAG,MAAM,CAAC,MACf,GAAG,MAAM,YAAY,QAAQ,EAAE,KAAK,GAAG,YAAY,QAAQ,EAAE,KAAK,CACpE;;AAQH,MAAa,oBAAoB,OAAO,EACtC,QACA,cAIsC;CACtC,MAAM,OAAO,OAAO,SAAS;CAC7B,MAAM,aAAa,OAAO,iBAAiB;CAE3C,MAAM,mBAAmB,WACtB,KACE,QACE,IAA8D,SAC3D,iBACP,CACA,QAAQ,MAAM,QAAQ,EAAE,CAAC,CACzB,GAAG,GAAG;CAET,MAAM,qBAAqB,OAAO,YAChC,WAAW,KAAK,cAAc,CAAC,UAAU,MAAM,UAAU,CAAC,CAC3D;CAED,SAAS,aAAa,SAAoC,QAAQ,GAAG;AACnE,MAAI,CAAC,QACH;AAGF,SAAO,QAAQ,KAAK,MAAmB,UAAkB;GACvD,MAAM,QAAQ,kBAAkB,cAAc,MAAM,OAAO,OAAO,IAAI,EAAE;GAExE,MAAM,eAAe,cAAc,KAAK,OAAO,MAAM;AAErD,OAAI,CAAC,KAAK,KACR,QAAO;GAGT,MAAM,YAAY,mBAAmB,KAAK;AAC1C,OAAI,CAAC,aAAa,EAAE,qBAAqB,WACvC,QAAO;GAGT,MAAM,gBAAgB,UAAU,OAAO;GACvC,MAAM,aAAa,mCAAmC,IAAI,KAAK,KAAK,GAChE,QAAQ,IACR;GAEJ,IAAI,eAAgC,KAAK,OACvC,KAAK,OAEL,oBAAC,eAAD;IAEE,MACE,KAAK,SAAS,WAAW,aAAa,SAAS,CAAC,KAAK,OAAO,QACxD;KACE,GAAG;KACH,OAAO;MAAE,GAAG,KAAK;MAAO,OAAO,aAAa;MAAO;KACpD,GACD;IAEC;IACP,WAAW;cAEV,aAAa,KAAK,SAAS,WAAW;IACzB,EAbT,MAaS;AAElB,OAAI,KAAK,MACP,MAAK,MAAM,QAAQ,kBAAkB,KAAK,OAAO,OAAO,OAAO,EAAE;IAC/D,MAAM,YAAY,mBAAmB,KAAK;AAC1C,QAAI,qBAAqB,WAAW;KAClC,MAAM,gBAAgB,UAAU,OAAO;AAUvC,oBACE,oBAAC,eAAD;MACQ;MACA;MACN,OAZF,kBAAkB,cAChB;OACE,MAAM,KAAK;OACX,OAAO,KAAK,SAAS,EAAE;OACxB,EACD,OACA,OACD,IAAI,EAAE;MAML,WAAW;gBAEV;MACa,CAAA;;;AAMxB,UAAO;IACP;;CAMJ,MAAM,kBAAkB,MAAM,OAC5B,oBAJmB,kBAAkB,gBAAgB,qBAIrD;EAAc,aAAa;EAAiB;YAFxB,aAAa,KAAK,QAAQ;EAI/B,CAAA,CAChB;CAED,MAAM,CAAC,YAAY,QAAQ,MAAM,QAAQ,IAAI,CAC3C,OAAO,gBAAgB,EACvB,YAAY,gBAAgB,CAC7B,CAAC;AAEF,QAAO;EAAE,MAAM;EAAY;EAAM;;;;ACtJnC,SAAgB,wBAAwB,KAAoB;CAC1D,IAAI,qBAAqB;CACzB,IAAI,qBAAkC;AAEtC,MAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,YAAY,SAAS,GAAG;EACtD,MAAM,OAAO,IAAI,MAAM,MAAM;AAE7B,MAAI,KAAK,KAAK,SAAS,gBACrB;AAGF,wBAAsB;AAEtB,MAAI,uBAAuB,KACzB,sBAAqB;;AAIzB,KAAI,uBAAuB,EACzB,QAAO;AAGT,KAAI,uBAAuB,EACzB,QAAO;AAGT,KAAI,mBAAoB,KAAK,SAAS,YACpC,QAAO,sBAAsB,mBAAoB;AAGnD,QAAO,iBAAiB,mBAAoB;;AAG9C,SAAS,sBAAsB,MAAqB;AAClD,KAAI,KAAK,eAAe,EACtB,QAAO;AAGT,KAAI,KAAK,eAAe,EACtB,QAAO;AAGT,QAAO,iBAAiB,KAAK,MAAM,EAAE,CAAC;;AAGxC,SAAS,iBAAiB,MAAqB;AAC7C,QAAO,KAAK,KAAK,SAAS,eAAe,KAAK,QAAQ,SAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CHAPu71g.d.cts","names":[],"sources":["../src/core/event-bus.ts","../src/core/is-document-visually-empty.ts","../src/core/serializer/compose-react-email.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/email-node.ts","../src/core/types.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CacF9qQa.d.mts","names":[],"sources":["../src/core/event-bus.ts","../src/core/is-document-visually-empty.ts","../src/core/serializer/compose-react-email.tsx","../src/core/serializer/email-mark.ts","../src/core/serializer/email-node.ts","../src/core/types.ts"],"mappings":"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"}