@maildeno/editor 0.1.4 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/CHANGELOG.md +258 -0
  2. package/README.md +397 -381
  3. package/dist/RowPreviewChildren-DT0y0lKC.js +4 -0
  4. package/dist/RowPreviewChildren-OsbF7_vu.js +4 -0
  5. package/dist/RowPreviewLegacyComponent-BV4b5bHQ.js +487 -0
  6. package/dist/RowPreviewLegacyComponent-C08MGJVT.js +487 -0
  7. package/dist/RowPreviewRow-ByxeBYV8.js +112 -0
  8. package/dist/RowPreviewRow-N-hh5l_H.js +112 -0
  9. package/dist/adapters/errors.d.ts +59 -0
  10. package/dist/adapters/index.d.ts +31 -0
  11. package/dist/adapters/types.d.ts +68 -0
  12. package/dist/brand.d.ts +15 -0
  13. package/dist/components/DesktopOnlyNotice.vue.d.ts +20 -0
  14. package/dist/components/features/emailBuilder/EmailEditor.vue.d.ts +182 -0
  15. package/dist/components/features/emailBuilder/assistant/AssistantPanel.vue.d.ts +37 -0
  16. package/dist/components/features/emailBuilder/blocks/AnchorBlock.vue.d.ts +3 -0
  17. package/dist/components/features/emailBuilder/blocks/ButtonBlock.vue.d.ts +3 -0
  18. package/dist/components/features/emailBuilder/blocks/DividerBlock.vue.d.ts +3 -0
  19. package/dist/components/features/emailBuilder/blocks/HeadingBlock.vue.d.ts +3 -0
  20. package/dist/components/features/emailBuilder/blocks/ImageBlock.vue.d.ts +3 -0
  21. package/dist/components/features/emailBuilder/blocks/ListBlock.vue.d.ts +3 -0
  22. package/dist/components/features/emailBuilder/blocks/MenuBlock.vue.d.ts +3 -0
  23. package/dist/components/features/emailBuilder/blocks/ParagraphBlock.vue.d.ts +3 -0
  24. package/dist/components/features/emailBuilder/blocks/SocialsBlock.vue.d.ts +3 -0
  25. package/dist/components/features/emailBuilder/blocks/SpacerBlock.vue.d.ts +3 -0
  26. package/dist/components/features/emailBuilder/blocks/VideoBlock.vue.d.ts +3 -0
  27. package/dist/components/features/emailBuilder/canvas/Canvas.vue.d.ts +3 -0
  28. package/dist/components/features/emailBuilder/canvas/CanvasColumn.vue.d.ts +49 -0
  29. package/dist/components/features/emailBuilder/canvas/CanvasComponent.vue.d.ts +56 -0
  30. package/dist/components/features/emailBuilder/canvas/CanvasElement.vue.d.ts +21 -0
  31. package/dist/components/features/emailBuilder/canvas/CanvasRow.vue.d.ts +49 -0
  32. package/dist/components/features/emailBuilder/canvas/CanvasRowSpacer.vue.d.ts +40 -0
  33. package/dist/components/features/emailBuilder/health/HealthIndicator.vue.d.ts +3 -0
  34. package/dist/components/features/emailBuilder/layout/Header.vue.d.ts +54 -0
  35. package/dist/components/features/emailBuilder/layout/SendEmail.vue.d.ts +21 -0
  36. package/dist/components/features/emailBuilder/layout/SidebarLeft.vue.d.ts +3 -0
  37. package/dist/components/features/emailBuilder/layout/SidebarRight.vue.d.ts +3 -0
  38. package/dist/components/features/emailBuilder/panels/AnchorPanel.vue.d.ts +3 -0
  39. package/dist/components/features/emailBuilder/panels/ButtonPanel.vue.d.ts +3 -0
  40. package/dist/components/features/emailBuilder/panels/DividerPanel.vue.d.ts +3 -0
  41. package/dist/components/features/emailBuilder/panels/HeadingPanel.vue.d.ts +3 -0
  42. package/dist/components/features/emailBuilder/panels/ImagePanel.vue.d.ts +3 -0
  43. package/dist/components/features/emailBuilder/panels/ListPanel.vue.d.ts +3 -0
  44. package/dist/components/features/emailBuilder/panels/MenuPanel.vue.d.ts +3 -0
  45. package/dist/components/features/emailBuilder/panels/ParagraphPanel.vue.d.ts +3 -0
  46. package/dist/components/features/emailBuilder/panels/RowColumnPanel.vue.d.ts +13 -0
  47. package/dist/components/features/emailBuilder/panels/RowPanel.vue.d.ts +13 -0
  48. package/dist/components/features/emailBuilder/panels/RowSpacerPanel.vue.d.ts +13 -0
  49. package/dist/components/features/emailBuilder/panels/SocialsPanel.vue.d.ts +3 -0
  50. package/dist/components/features/emailBuilder/panels/SpacerPanel.vue.d.ts +3 -0
  51. package/dist/components/features/emailBuilder/panels/VideoPanel.vue.d.ts +3 -0
  52. package/dist/components/features/emailBuilder/panels/shared/DeviceTabs.vue.d.ts +19 -0
  53. package/dist/components/features/emailBuilder/panels/shared/LinkFieldMergeTags.vue.d.ts +31 -0
  54. package/dist/components/features/emailBuilder/panels/shared/OverrideBadge.vue.d.ts +9 -0
  55. package/dist/components/features/emailBuilder/panels/shared/PreviewBadge.vue.d.ts +11 -0
  56. package/dist/components/features/emailBuilder/panels/shared/TextFieldMergeTags.vue.d.ts +25 -0
  57. package/dist/components/features/emailBuilder/panels/ui/BoxStylingSection.vue.d.ts +7 -0
  58. package/dist/components/features/emailBuilder/panels/ui/PropertyAlignment.vue.d.ts +30 -0
  59. package/dist/components/features/emailBuilder/panels/ui/PropertyColor.vue.d.ts +75 -0
  60. package/dist/components/features/emailBuilder/panels/ui/PropertyGradientColor.vue.d.ts +27 -0
  61. package/dist/components/features/emailBuilder/panels/ui/PropertyNumberSlider.vue.d.ts +74 -0
  62. package/dist/components/features/emailBuilder/panels/ui/PropertySection.vue.d.ts +17 -0
  63. package/dist/components/features/emailBuilder/panels/ui/PropertySelect.vue.d.ts +74 -0
  64. package/dist/components/features/emailBuilder/panels/ui/PropertyTextStyle.vue.d.ts +52 -0
  65. package/dist/components/features/emailBuilder/panels/ui/PropertyTextStylePanel.vue.d.ts +72 -0
  66. package/dist/components/features/emailBuilder/panels/ui/PropertyToggle.vue.d.ts +45 -0
  67. package/dist/components/features/emailBuilder/panels/ui/PropertyVisibility.vue.d.ts +32 -0
  68. package/dist/components/features/emailBuilder/panels/ui/SpacingControl.vue.d.ts +19 -0
  69. package/dist/components/features/emailBuilder/panels/ui/color-picker/AlphaSlider.vue.d.ts +28 -0
  70. package/dist/components/features/emailBuilder/panels/ui/color-picker/ColorPickerPanel.vue.d.ts +31 -0
  71. package/dist/components/features/emailBuilder/panels/ui/color-picker/HueSlider.vue.d.ts +19 -0
  72. package/dist/components/features/emailBuilder/panels/ui/color-picker/RecentColors.vue.d.ts +20 -0
  73. package/dist/components/features/emailBuilder/panels/ui/color-picker/SVPanel.vue.d.ts +39 -0
  74. package/dist/components/features/emailBuilder/panels/ui/visibility-rule/Rule.vue.d.ts +28 -0
  75. package/dist/components/features/emailBuilder/preview/PreviewScreen.vue.d.ts +7 -0
  76. package/dist/components/features/emailBuilder/preview/ui/PreviewCanvas.vue.d.ts +10 -0
  77. package/dist/components/features/emailBuilder/preview/ui/PreviewCapabilityBadges.vue.d.ts +12 -0
  78. package/dist/components/features/emailBuilder/preview/ui/PreviewClientCard.vue.d.ts +20 -0
  79. package/dist/components/features/emailBuilder/preview/ui/PreviewClientList.vue.d.ts +21 -0
  80. package/dist/components/features/emailBuilder/preview/ui/PreviewClientPicker.vue.d.ts +16 -0
  81. package/dist/components/features/emailBuilder/preview/ui/PreviewComponent.vue.d.ts +10 -0
  82. package/dist/components/features/emailBuilder/preview/ui/PreviewDetailView.vue.d.ts +41 -0
  83. package/dist/components/features/emailBuilder/preview/ui/PreviewRendered.vue.d.ts +8 -0
  84. package/dist/components/features/emailBuilder/product/RowPreview.vue.d.ts +8 -0
  85. package/dist/components/features/emailBuilder/product/RowPreviewChildren.vue.d.ts +14 -0
  86. package/dist/components/features/emailBuilder/product/RowPreviewLegacyComponent.vue.d.ts +14 -0
  87. package/dist/components/features/emailBuilder/product/RowPreviewRow.vue.d.ts +9 -0
  88. package/dist/components/features/emailBuilder/product/SavedRowsPanel.vue.d.ts +3 -0
  89. package/dist/components/features/emailBuilder/product/SavedTemplatesPanel.vue.d.ts +13 -0
  90. package/dist/components/features/emailBuilder/product/VersionHistoryPanel.vue.d.ts +14 -0
  91. package/dist/components/features/emailBuilder/sidebar/SidebarBlockButton.vue.d.ts +35 -0
  92. package/dist/components/features/emailBuilder/tabs/GeneralTab.vue.d.ts +3 -0
  93. package/dist/components/features/emailBuilder/tabs/LayoutTab.vue.d.ts +3 -0
  94. package/dist/components/features/emailBuilder/tabs/content/ContentTab.vue.d.ts +3 -0
  95. package/dist/components/features/emailBuilder/tabs/content/LayersPanel.vue.d.ts +7 -0
  96. package/dist/components/features/emailBuilder/tabs/general/MergeTagsTab.vue.d.ts +3 -0
  97. package/dist/components/features/emailBuilder/tabs/general/StylesTab.vue.d.ts +3 -0
  98. package/dist/components/features/emailBuilder/tabs/general/VisibilityTab.vue.d.ts +3 -0
  99. package/dist/components/features/emailBuilder/tabs/general/VisibilityWrapESPTab.vue.d.ts +3 -0
  100. package/dist/components/features/emailBuilder/tabs/general/merge-tags/LinkTagTab.vue.d.ts +3 -0
  101. package/dist/components/features/emailBuilder/tabs/general/merge-tags/MergeTagTab.vue.d.ts +3 -0
  102. package/dist/components/features/emailBuilder/ui/LinkInputDialog.vue.d.ts +17 -0
  103. package/dist/components/features/emailBuilder/ui/canvas/CanvasRowDropZone.vue.d.ts +12 -0
  104. package/dist/components/features/emailBuilder/ui/canvas/DropZone.vue.d.ts +10 -0
  105. package/dist/components/features/emailBuilder/ui/canvas/Loader.vue.d.ts +19 -0
  106. package/dist/components/features/emailBuilder/ui/layers-panel/ComponentIcon.vue.d.ts +7 -0
  107. package/dist/components/features/emailBuilder/ui/layers-panel/LayerColumnChildren.vue.d.ts +42 -0
  108. package/dist/components/features/emailBuilder/ui/layers-panel/LayerDropLine.vue.d.ts +8 -0
  109. package/dist/components/features/emailBuilder/ui/renderers/AnchorRenderer.vue.d.ts +10 -0
  110. package/dist/components/features/emailBuilder/ui/renderers/DividerRenderer.vue.d.ts +10 -0
  111. package/dist/components/features/emailBuilder/ui/renderers/HeadingRenderer.vue.d.ts +10 -0
  112. package/dist/components/features/emailBuilder/ui/renderers/ImageRenderer.vue.d.ts +10 -0
  113. package/dist/components/features/emailBuilder/ui/renderers/ListRenderer.vue.d.ts +10 -0
  114. package/dist/components/features/emailBuilder/ui/renderers/MenuRenderer.vue.d.ts +10 -0
  115. package/dist/components/features/emailBuilder/ui/renderers/ParagraphRenderer.vue.d.ts +10 -0
  116. package/dist/components/features/emailBuilder/ui/renderers/SocialsRenderer.vue.d.ts +10 -0
  117. package/dist/components/features/emailBuilder/ui/renderers/SpacerRenderer.vue.d.ts +10 -0
  118. package/dist/components/features/emailBuilder/ui/renderers/VideoRenderer.vue.d.ts +10 -0
  119. package/dist/components/features/emailBuilder/ui/rich-text-editor/RichTextEditor.vue.d.ts +12 -0
  120. package/dist/components/features/emailBuilder/ui/rich-text-editor/pickers/MergeTagPicker.vue.d.ts +18 -0
  121. package/dist/components/features/emailBuilder/ui/rich-text-editor/pickers/RichTextColorPicker.vue.d.ts +15 -0
  122. package/dist/components/features/emailBuilder/ui/visibility/SupportBadge.vue.d.ts +10 -0
  123. package/dist/components/features/emailBuilder/ui/visibility/VisibilityPopover.vue.d.ts +45 -0
  124. package/dist/components/ui/ConfirmDialog.vue.d.ts +3 -0
  125. package/dist/components/ui/Icon.vue.d.ts +33 -0
  126. package/dist/components/ui/InfoDialog.vue.d.ts +12 -0
  127. package/dist/components/ui/Loading.vue.d.ts +6 -0
  128. package/dist/components/ui/ShadowSafeToast.vue.d.ts +3 -0
  129. package/dist/components/ui/primitives/Button.vue.d.ts +23 -0
  130. package/dist/components/ui/primitives/DatePicker.vue.d.ts +16 -0
  131. package/dist/components/ui/primitives/Dialog.vue.d.ts +34 -0
  132. package/dist/components/ui/primitives/InputText.vue.d.ts +29 -0
  133. package/dist/components/ui/primitives/Message.vue.d.ts +20 -0
  134. package/dist/components/ui/primitives/Select.vue.d.ts +22 -0
  135. package/dist/composables/emailBuilder/components/useSystemRows.d.ts +22 -0
  136. package/dist/composables/emailBuilder/core/ui/useLayerHoverScroll.d.ts +10 -10
  137. package/dist/composables/emailBuilder/core/useEmailBuilder.d.ts +18 -0
  138. package/dist/composables/emailBuilder/export/logic/espLogicWrapper.d.ts +4 -4
  139. package/dist/composables/emailBuilder/export/targets/templateSnapshot.d.ts +24 -0
  140. package/dist/composables/emailBuilder/persistence/useEmailBuilderPersistence.d.ts +1 -1
  141. package/dist/composables/system/useColorScheme.d.ts +16 -0
  142. package/dist/editor.css +1061 -676
  143. package/dist/element-C2ZH0Z_i.js +86561 -0
  144. package/dist/element-scoped-styles.css +1061 -676
  145. package/dist/element.d.ts +1 -1
  146. package/dist/element.js +5 -2
  147. package/dist/estree-DBJlF9un.js +4876 -0
  148. package/dist/html-3PMDtB0V.js +3123 -0
  149. package/dist/index-DhFg3uKs.js +75864 -0
  150. package/dist/index.d.ts +4 -2
  151. package/dist/index.js +16 -67053
  152. package/dist/init.d.ts +95 -2
  153. package/dist/init.js +166 -122
  154. package/dist/standalone-DKWMQftY.js +2391 -0
  155. package/dist/theme.d.ts +68 -17
  156. package/dist/types/assistant.d.ts +56 -0
  157. package/dist/typescript-l6-4tT8s.js +13240 -0
  158. package/package.json +6 -3
  159. package/dist/RowPreviewLegacyComponent-CXsY4P-R.js +0 -439
  160. package/dist/RowPreviewLegacyComponent-yjHSkZLz.js +0 -439
  161. package/dist/RowPreviewRow-CeowK6Q_.js +0 -107
  162. package/dist/RowPreviewRow-D-wmhbhZ.js +0 -107
  163. package/dist/composables/emailBuilder/transform/pipeline/optimizeAI.d.ts +0 -125
  164. package/dist/element-CWjNN0lY.js +0 -67099
  165. package/dist/estree-B67dfAo1.js +0 -7989
  166. package/dist/html-DGrfikay.js +0 -7353
  167. package/dist/standalone-Bd2oQFm3.js +0 -3639
  168. package/dist/typescript-C_Ru9PRN.js +0 -23184
  169. package/dist/vue.runtime.esm-bundler-CfYyFhW6.js +0 -9097
package/dist/init.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { PartialStorageAdapter } from './adapters/types';
2
+ import { AssistantMount } from './types/assistant';
2
3
  import { ThemeOptions } from './theme';
3
4
  /**
4
5
  * The ergonomic, no-Vue-knowledge entry point. element.ts already provides
@@ -22,6 +23,67 @@ export interface InitOptions {
22
23
  subject: string;
23
24
  html: string;
24
25
  }) => Promise<void> | void;
26
+ /**
27
+ * Name shown in the desktop-only notice's "Powered by" line. Omit for the
28
+ * package default; pass an empty string to drop the line entirely.
29
+ *
30
+ * Unlike storageAdapter/theme/onSendTestEmail this is a plain string, so
31
+ * the custom element accepts it as a `brand-name` attribute too —
32
+ * `<maildeno-editor brand-name="Acme">` works without any JavaScript.
33
+ * init() still sets it as a property below, for consistency with the
34
+ * other options rather than out of necessity.
35
+ */
36
+ brandName?: string;
37
+ /**
38
+ * Replaces the saved-templates panel and its header button with version
39
+ * history. Requires an adapter implementing the version methods — see
40
+ * EditorStorageAdapter; the built-in localStorage adapter implements all
41
+ * of them, so this works with no backend.
42
+ *
43
+ * A boolean, so the custom element accepts it as a `versions` attribute
44
+ * too — attribute presence is truthy, matching how HTML booleans work.
45
+ */
46
+ versions?: boolean;
47
+ /**
48
+ * Called after a successful save. Its presence is what reveals the Save
49
+ * button — omit it for a read-only or guest editor and the button, the
50
+ * save-status indicator and the autosave timer all disappear.
51
+ *
52
+ * The "save" event still fires alongside, so handle.on("save", …) keeps
53
+ * working; this option exists because a listener attached after mount
54
+ * can't retroactively decide whether the button should have rendered.
55
+ */
56
+ onSave?: (payload: {
57
+ templateId: string | null;
58
+ }) => void;
59
+ /**
60
+ * Fills the editor's assistant drawer with your own UI.
61
+ *
62
+ * The editor supplies the drawer, its trigger button, open/close state,
63
+ * escape handling and shadow-DOM-safe positioning; `mount` receives the
64
+ * drawer's body element plus a small canvas API (getJson/setJson/
65
+ * getSelection/setSelection/onChange) and renders whatever it likes into
66
+ * it — React root, plain DOM, anything.
67
+ *
68
+ * Called on first open rather than at startup, and `unmount` on close, so
69
+ * a drawer the user never opens costs nothing.
70
+ *
71
+ * ```ts
72
+ * init({
73
+ * container: "#editor",
74
+ * assistant: {
75
+ * mount(el, editor) {
76
+ * el.innerHTML = "<button>Rewrite</button>";
77
+ * el.querySelector("button").onclick = async () => {
78
+ * const next = await myApi.rewrite(editor.getJson());
79
+ * editor.setJson(next);
80
+ * };
81
+ * },
82
+ * },
83
+ * });
84
+ * ```
85
+ */
86
+ assistant?: AssistantMount;
25
87
  /**
26
88
  * Render inside a shadow root (default) or directly in the page.
27
89
  *
@@ -46,6 +108,14 @@ export interface EditorHandle {
46
108
  /** Vue's defineCustomElement dispatches emits as real DOM CustomEvents
47
109
  * on the host element, with the emit payload in event.detail — this is
48
110
  * just addEventListener with that unwrapping done for you. */
111
+ /**
112
+ * Additional listeners for the save event.
113
+ *
114
+ * Only ever fires when `onSave` was passed to init(): without it the editor
115
+ * has no Save button and never saves, so there is no event to hear. If you
116
+ * only want to observe saves, pass a no-op `onSave` to enable saving and do
117
+ * the work here.
118
+ */
49
119
  on(event: "save", handler: (payload: {
50
120
  templateId: string | null;
51
121
  }) => void): void;
@@ -69,14 +139,37 @@ export interface EditorHandle {
69
139
  getMjml(mode?: "prune" | "wrap"): string | null;
70
140
  getReactEmail(mode?: "prune" | "wrap"): string | null;
71
141
  getJson(): Record<string, unknown> | null;
142
+ /** The write side of getJson(). Accepts what getJson() returns, so
143
+ * setJson(getJson()) round-trips, plus the { canvas, content: { rows } }
144
+ * shape version APIs typically hand back.
145
+ *
146
+ * history defaults to "undoable" — one Ctrl+Z-able step, right for
147
+ * anything the user triggered. Pass "reset" when swapping which document
148
+ * is open, where undoing back into the previous document would be wrong. */
149
+ setJson(data: unknown, opts?: {
150
+ history?: "undoable" | "reset";
151
+ }): void;
152
+ /** The selected node, or null. `type` is the block type, so a host can
153
+ * branch on it without resolving the id against the tree itself. */
154
+ getSelection(): {
155
+ id: string;
156
+ type: string | null;
157
+ } | null;
158
+ /** Selects by id, or clears with null. Returns false if no node has that
159
+ * id. Does not touch history — selection is view state. */
160
+ setSelection(id: string | null): boolean;
161
+ /** Fires after each committed change. Returns an unsubscribe function.
162
+ * Keyed to history commits rather than raw mutations, so typing inside a
163
+ * text block produces one call, not one per keystroke. */
164
+ onChange(cb: () => void): () => void;
72
165
  /** Removes the element from the DOM. Vue's custom element wrapper
73
166
  * handles unmounting the internal app and cleaning up watchers/effects
74
167
  * as part of its own disconnectedCallback — not reimplemented here. */
75
168
  destroy(): void;
76
169
  }
77
170
  export declare function init(options: InitOptions): Promise<EditorHandle>;
78
- export { registerBlock, getBlock, getAllBlocks, } from './blocks/registry';
79
- export { registerESPSyntax, getRegisteredCustomESPs, } from './esp/registry';
171
+ export { registerBlock, getBlock, getAllBlocks } from './blocks/registry';
172
+ export { registerESPSyntax, getRegisteredCustomESPs } from './esp/registry';
80
173
  export { registerMergeTags, getRegisteredMergeTagIds, } from './merge-tags/registry';
81
174
  export { setEditorTheme, palette } from './theme';
82
175
  export { createLocalStorageAdapter } from './adapters/localStorageAdapter';
package/dist/init.js CHANGED
@@ -1,130 +1,174 @@
1
- import { D as h, at as ref, i as createApp, rt as reactive } from "./vue.runtime.esm-bundler-CfYyFhW6.js";
2
- import { a as setEditorTheme, c as createLocalStorageAdapter, d as getRegisteredMergeTagIds, f as registerMergeTags, h as registerBlock, i as palette, l as getRegisteredCustomESPs, m as getBlock, n as registerMaildenoEditorElement, p as getAllBlocks, r as EmailEditor_default, s as buildShadowStyles, u as registerESPSyntax } from "./element-CWjNN0lY.js";
3
- //#region src/lightDom.ts
4
- var stylesInjected = false;
5
- /**
6
- * The shadow path hands these strings to defineCustomElement, which turns
7
- * them into <style> tags inside the shadow root. Here they go to
8
- * document.head instead — same content, different destination. Guarded so
9
- * multiple editors on one page inject once.
10
- */
1
+ import { r as reactive, c as createApp, b as buildShadowStyles, h, _ as _sfc_main, a as ref, d as registerMaildenoEditorElement } from "./element-C2ZH0Z_i.js";
2
+ import { e, g, f, i, j, p, k, l, m, s } from "./element-C2ZH0Z_i.js";
3
+ let stylesInjected = false;
11
4
  function injectStylesIntoHead() {
12
- if (stylesInjected || typeof document === "undefined") return;
13
- stylesInjected = true;
14
- for (const css of buildShadowStyles()) {
15
- if (!css) continue;
16
- const style = document.createElement("style");
17
- style.setAttribute("data-maildeno-light-dom", "");
18
- style.textContent = css;
19
- document.head.appendChild(style);
20
- }
5
+ if (stylesInjected || typeof document === "undefined") return;
6
+ stylesInjected = true;
7
+ for (const css of buildShadowStyles()) {
8
+ if (!css) continue;
9
+ const style = document.createElement("style");
10
+ style.setAttribute("data-maildeno-light-dom", "");
11
+ style.textContent = css;
12
+ document.head.appendChild(style);
13
+ }
21
14
  }
22
15
  function mountLightDom(container, initialProps) {
23
- injectStylesIntoHead();
24
- const props = reactive({ ...initialProps });
25
- const saveHandlers = /* @__PURE__ */ new Set();
26
- const editorRef = ref(null);
27
- const mountEl = document.createElement("div");
28
- mountEl.style.height = "100%";
29
- container.appendChild(mountEl);
30
- const app = createApp({ setup() {
31
- return () => h(EmailEditor_default, {
32
- ...props,
33
- ref: editorRef,
34
- onSave: (payload) => saveHandlers.forEach((fn) => fn(payload))
35
- });
36
- } });
37
- app.mount(mountEl);
38
- return {
39
- element: mountEl,
40
- exposed: () => editorRef.value ?? null,
41
- setProp: (key, value) => {
42
- props[key] = value;
43
- },
44
- addSaveHandler: (fn) => saveHandlers.add(fn),
45
- removeSaveHandler: (fn) => saveHandlers.delete(fn),
46
- destroy: () => {
47
- app.unmount();
48
- mountEl.remove();
49
- }
50
- };
16
+ injectStylesIntoHead();
17
+ const props = reactive({ ...initialProps });
18
+ const saveHandlers = /* @__PURE__ */ new Set();
19
+ const editorRef = ref(null);
20
+ const mountEl = document.createElement("div");
21
+ mountEl.style.height = "100%";
22
+ container.appendChild(mountEl);
23
+ const app = createApp({
24
+ setup() {
25
+ return () => h(_sfc_main, {
26
+ ...props,
27
+ ref: editorRef,
28
+ onSave: (payload) => saveHandlers.forEach((fn) => fn(payload))
29
+ });
30
+ }
31
+ });
32
+ app.mount(mountEl);
33
+ return {
34
+ element: mountEl,
35
+ exposed: () => editorRef.value ?? null,
36
+ setProp: (key, value) => {
37
+ props[key] = value;
38
+ },
39
+ addSaveHandler: (fn) => saveHandlers.add(fn),
40
+ removeSaveHandler: (fn) => saveHandlers.delete(fn),
41
+ destroy: () => {
42
+ app.unmount();
43
+ mountEl.remove();
44
+ }
45
+ };
51
46
  }
52
- //#endregion
53
- //#region src/init.ts
54
47
  function toDomEventName(event) {
55
- return event;
48
+ return event;
56
49
  }
57
50
  async function init(options) {
58
- const container = typeof options.container === "string" ? document.querySelector(options.container) : options.container;
59
- if (!container) throw new Error(`[maildeno-editor] init() couldn't find a container${typeof options.container === "string" ? ` matching "${options.container}"` : ""}.`);
60
- if (options.shadowDom === false) {
61
- const mount = mountLightDom(container, {
62
- templateId: options.templateId,
63
- storageAdapter: options.storageAdapter,
64
- theme: options.theme,
65
- capabilities: options.capabilities,
66
- onSendTestEmail: options.onSendTestEmail
67
- });
68
- await new Promise((resolve) => setTimeout(resolve, 0));
69
- const call = (name, ...args) => {
70
- const fn = mount.exposed()?.[name];
71
- return typeof fn === "function" ? fn(...args) : null;
72
- };
73
- return {
74
- element: mount.element,
75
- on: (_event, handler) => mount.addSaveHandler(handler),
76
- off: (_event, handler) => mount.removeSaveHandler(handler),
77
- setTheme: (theme) => mount.setProp("theme", theme),
78
- getHtml: (mode = "prune") => call("getHtml", mode),
79
- getMjml: (mode = "prune") => call("getMjml", mode),
80
- getReactEmail: (mode = "prune") => call("getReactEmail", mode),
81
- getJson: () => call("getJson"),
82
- destroy: () => mount.destroy()
83
- };
84
- }
85
- registerMaildenoEditorElement();
86
- const el = document.createElement("maildeno-editor");
87
- if (options.templateId !== void 0) el.templateId = options.templateId;
88
- if (options.storageAdapter) el.storageAdapter = options.storageAdapter;
89
- if (options.theme) el.theme = options.theme;
90
- if (options.capabilities) el.capabilities = options.capabilities;
91
- if (options.onSendTestEmail) el.onSendTestEmail = options.onSendTestEmail;
92
- container.appendChild(el);
93
- await new Promise((resolve) => setTimeout(resolve, 0));
94
- const listenerWrappers = /* @__PURE__ */ new WeakMap();
95
- return {
96
- element: el,
97
- on(event, handler) {
98
- const wrapped = ((e) => handler(Array.isArray(e.detail) ? e.detail[0] : e.detail));
99
- listenerWrappers.set(handler, wrapped);
100
- el.addEventListener(toDomEventName(event), wrapped);
101
- },
102
- off(event, handler) {
103
- const wrapped = listenerWrappers.get(handler);
104
- if (wrapped) {
105
- el.removeEventListener(toDomEventName(event), wrapped);
106
- listenerWrappers.delete(handler);
107
- }
108
- },
109
- setTheme(theme) {
110
- el.theme = theme;
111
- },
112
- getHtml(mode = "prune") {
113
- return el.getHtml ? el.getHtml(mode) : null;
114
- },
115
- getMjml(mode = "prune") {
116
- return el.getMjml ? el.getMjml(mode) : null;
117
- },
118
- getReactEmail(mode = "prune") {
119
- return el.getReactEmail ? el.getReactEmail(mode) : null;
120
- },
121
- getJson() {
122
- return el.getJson ? el.getJson() : null;
123
- },
124
- destroy() {
125
- el.remove();
126
- }
127
- };
51
+ const container = typeof options.container === "string" ? document.querySelector(options.container) : options.container;
52
+ if (!container) {
53
+ throw new Error(
54
+ `[maildeno-editor] init() couldn't find a container${typeof options.container === "string" ? ` matching "${options.container}"` : ""}.`
55
+ );
56
+ }
57
+ if (options.shadowDom === false) {
58
+ const mount = mountLightDom(container, {
59
+ templateId: options.templateId,
60
+ storageAdapter: options.storageAdapter,
61
+ theme: options.theme,
62
+ capabilities: options.capabilities,
63
+ onSendTestEmail: options.onSendTestEmail,
64
+ brandName: options.brandName,
65
+ versions: options.versions,
66
+ saveHandler: options.onSave,
67
+ assistant: options.assistant
68
+ });
69
+ await new Promise((resolve) => setTimeout(resolve, 0));
70
+ const call = (name, ...args) => {
71
+ var _a;
72
+ const fn = (_a = mount.exposed()) == null ? void 0 : _a[name];
73
+ return typeof fn === "function" ? fn(...args) : null;
74
+ };
75
+ return {
76
+ element: mount.element,
77
+ on: (_event, handler) => mount.addSaveHandler(handler),
78
+ off: (_event, handler) => mount.removeSaveHandler(handler),
79
+ setTheme: (theme) => mount.setProp("theme", theme),
80
+ getHtml: (mode = "prune") => call("getHtml", mode),
81
+ getMjml: (mode = "prune") => call("getMjml", mode),
82
+ getReactEmail: (mode = "prune") => call("getReactEmail", mode),
83
+ getJson: () => call("getJson"),
84
+ setJson: (data, opts) => {
85
+ call("setJson", data, opts);
86
+ },
87
+ getSelection: () => call("getSelection"),
88
+ setSelection: (id) => call("setSelection", id) ?? false,
89
+ // Falls back to a no-op unsubscribe rather than null so callers can
90
+ // always call the result — a host storing it and invoking it during
91
+ // teardown shouldn't have to null-check a cleanup function.
92
+ onChange: (cb) => call("onChange", cb) ?? (() => {
93
+ }),
94
+ destroy: () => mount.destroy()
95
+ };
96
+ }
97
+ registerMaildenoEditorElement();
98
+ const el = document.createElement("maildeno-editor");
99
+ if (options.templateId !== void 0) el.templateId = options.templateId;
100
+ if (options.storageAdapter) el.storageAdapter = options.storageAdapter;
101
+ if (options.theme) el.theme = options.theme;
102
+ if (options.capabilities) el.capabilities = options.capabilities;
103
+ if (options.onSendTestEmail) el.onSendTestEmail = options.onSendTestEmail;
104
+ if (options.brandName !== void 0) el.brandName = options.brandName;
105
+ if (options.versions !== void 0) el.versions = options.versions;
106
+ if (options.assistant) el.assistant = options.assistant;
107
+ if (options.onSave) el.saveHandler = options.onSave;
108
+ container.appendChild(el);
109
+ await new Promise((resolve) => setTimeout(resolve, 0));
110
+ const listenerWrappers = /* @__PURE__ */ new WeakMap();
111
+ const handle = {
112
+ element: el,
113
+ on(event, handler) {
114
+ const wrapped = ((e2) => handler(
115
+ Array.isArray(e2.detail) ? e2.detail[0] : e2.detail
116
+ ));
117
+ listenerWrappers.set(handler, wrapped);
118
+ el.addEventListener(toDomEventName(event), wrapped);
119
+ },
120
+ off(event, handler) {
121
+ const wrapped = listenerWrappers.get(handler);
122
+ if (wrapped) {
123
+ el.removeEventListener(toDomEventName(event), wrapped);
124
+ listenerWrappers.delete(handler);
125
+ }
126
+ },
127
+ setTheme(theme) {
128
+ el.theme = theme;
129
+ },
130
+ getHtml(mode = "prune") {
131
+ return el.getHtml ? el.getHtml(mode) : null;
132
+ },
133
+ getMjml(mode = "prune") {
134
+ return el.getMjml ? el.getMjml(mode) : null;
135
+ },
136
+ getReactEmail(mode = "prune") {
137
+ return el.getReactEmail ? el.getReactEmail(mode) : null;
138
+ },
139
+ getJson() {
140
+ return el.getJson ? el.getJson() : null;
141
+ },
142
+ setJson(data, opts) {
143
+ var _a;
144
+ (_a = el.setJson) == null ? void 0 : _a.call(el, data, opts);
145
+ },
146
+ getSelection() {
147
+ return el.getSelection ? el.getSelection() : null;
148
+ },
149
+ setSelection(id) {
150
+ return el.setSelection ? el.setSelection(id) : false;
151
+ },
152
+ onChange(cb) {
153
+ return el.onChange ? el.onChange(cb) : () => {
154
+ };
155
+ },
156
+ destroy() {
157
+ el.remove();
158
+ }
159
+ };
160
+ return handle;
128
161
  }
129
- //#endregion
130
- export { createLocalStorageAdapter, getAllBlocks, getBlock, getRegisteredCustomESPs, getRegisteredMergeTagIds, init, palette, registerBlock, registerESPSyntax, registerMergeTags, setEditorTheme };
162
+ export {
163
+ e as createLocalStorageAdapter,
164
+ g as getAllBlocks,
165
+ f as getBlock,
166
+ i as getRegisteredCustomESPs,
167
+ j as getRegisteredMergeTagIds,
168
+ init,
169
+ p as palette,
170
+ k as registerBlock,
171
+ l as registerESPSyntax,
172
+ m as registerMergeTags,
173
+ s as setEditorTheme
174
+ };