@boxcc/maildeno-editor 0.4.13 → 0.4.15

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 (26) hide show
  1. package/README.md +1 -0
  2. package/dist/{HealthIndicator-4Iw6N-g_.js → HealthIndicator-COWguEXj.js} +2 -2
  3. package/dist/{HealthIndicator-ZohgzF2_.js → HealthIndicator-D1dFZy5o.js} +1 -1
  4. package/dist/{PreviewCanvas-DzpLghCo.js → PreviewCanvas-CB0u47NT.js} +3 -3
  5. package/dist/{PreviewCanvas-QN4C68KA.js → PreviewCanvas-CutgVbs-.js} +3 -3
  6. package/dist/{RichTextEditor-Cz1-_ZtA.js → RichTextEditor-BMp0pgrh.js} +3 -3
  7. package/dist/{RichTextEditor-CmM4XRFC.js → RichTextEditor-MVYp_e_O.js} +2 -2
  8. package/dist/RowPreviewChildren-BANvlvrM.js +4 -0
  9. package/dist/RowPreviewChildren-DNVfH3gU.js +4 -0
  10. package/dist/{RowPreviewRow-Dx4ExtSN.js → RowPreviewRow-Cu6EURjr.js} +1 -1
  11. package/dist/{RowPreviewRow-DPaSbxmB.js → RowPreviewRow-YJGhJ67T.js} +1 -1
  12. package/dist/{SavedRowsPanel-DqSHB6Jk.js → SavedRowsPanel-CCXBKQYw.js} +37 -37
  13. package/dist/{SavedRowsPanel-DyXjSOEt.js → SavedRowsPanel-Cl1aZdnL.js} +33 -33
  14. package/dist/components/features/emailBuilder/EmailEditor.vue.d.ts +1 -0
  15. package/dist/{element-B3gq8Xvd.js → element-CxahtLpG.js} +4689 -4649
  16. package/dist/element.js +1 -1
  17. package/dist/index.js +3843 -3803
  18. package/dist/init.d.ts +2 -0
  19. package/dist/init.js +31 -25
  20. package/dist/{useEmailBuilder-BR4wfai1.js → useEmailBuilder-CBsHIs93.js} +1483 -1473
  21. package/dist/useEmailBuilder-D-hDPH_x.js +4934 -0
  22. package/dist/{useToast-DD11IxqP.js → useToast-DAu-9glv.js} +7 -7
  23. package/package.json +1 -1
  24. package/dist/RowPreviewChildren-BYaMZID3.js +0 -4
  25. package/dist/RowPreviewChildren-_A9gPQCs.js +0 -4
  26. package/dist/useEmailBuilder-B19p-2yp.js +0 -4924
@@ -0,0 +1,4934 @@
1
+ import { c as pe, o as Rt, r as X, s as de, t as re } from "./borderRadius-CkSa1lQ9.js";
2
+ import { computed as Ce, inject as Oe, nextTick as $e, onUnmounted as pr, provide as Ie, ref as L, shallowRef as mr, watch as vn, watchEffect as fr } from "vue";
3
+ var at = (e) => e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "") || "untitled_template";
4
+ function bn(e) {
5
+ if (!e || typeof e != "object") throw new Error("Unrecognized template file format");
6
+ if (e.template_id && e.template_name && e.canvas && e.rows && e.schema_version) {
7
+ if (e.schema_version !== "1.0") {
8
+ const [t] = String(e.schema_version).split(".").map(Number), [r] = "1.0".split(".").map(Number);
9
+ if (t > r) throw new Error(`Template schema version ${e.schema_version} is newer than supported version 1.0`);
10
+ e.schema_version = "1.0";
11
+ }
12
+ return e;
13
+ }
14
+ if (e.meta && e.canvas && e.content?.rows) {
15
+ const t = e.meta.name || "Untitled Template";
16
+ return {
17
+ template_id: at(t),
18
+ template_name: t,
19
+ canvas: e.canvas,
20
+ rows: e.content.rows,
21
+ schema_version: "1.0"
22
+ };
23
+ }
24
+ if (e.canvas && e.content?.rows) return {
25
+ template_id: at("Untitled Template"),
26
+ template_name: "Untitled Template",
27
+ canvas: e.canvas,
28
+ rows: e.content.rows,
29
+ schema_version: "1.0"
30
+ };
31
+ if (!e.meta && e.canvasStyles && e.rows) {
32
+ const t = "Untitled Template";
33
+ return {
34
+ template_id: at(t),
35
+ template_name: t,
36
+ canvas: e.canvasStyles,
37
+ rows: e.rows,
38
+ schema_version: "1.0"
39
+ };
40
+ }
41
+ throw new Error("Unrecognized template file format");
42
+ }
43
+ var Y = () => crypto.randomUUID().replace(/-/g, "").slice(0, 16), ye = "maildeno:product-rows", Pe = "maildeno:template:", wt = "maildeno:versions:", tn = 20;
44
+ function $n(e) {
45
+ const t = JSON.parse(JSON.stringify(e));
46
+ return t.id = Y(), t.type === "row" && Array.isArray(t.columns) && (t.columns = t.columns.map((r) => {
47
+ const n = r.children ?? r.components ?? [], o = {
48
+ ...r,
49
+ id: Y(),
50
+ children: n.map((i) => $n(i))
51
+ };
52
+ return delete o.components, o;
53
+ })), t;
54
+ }
55
+ function fe(e) {
56
+ try {
57
+ const t = localStorage.getItem(e);
58
+ return t ? JSON.parse(t) : null;
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+ function De(e, t) {
64
+ localStorage.setItem(e, JSON.stringify(t));
65
+ }
66
+ function yn() {
67
+ async function e(s) {
68
+ return s ? fe(Pe + s) : null;
69
+ }
70
+ async function t(s, y) {
71
+ const C = y || Y();
72
+ try {
73
+ const _ = fe(Pe + C);
74
+ _ && h(C, _);
75
+ } catch (_) {
76
+ console.warn("[maildeno-editor] couldn't record a template version:", _);
77
+ }
78
+ return De(Pe + C, {
79
+ ...s,
80
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
81
+ }), { templateId: C };
82
+ }
83
+ async function r() {
84
+ const s = [];
85
+ for (let y = 0; y < localStorage.length; y++) {
86
+ const C = localStorage.key(y);
87
+ if (!C?.startsWith(Pe)) continue;
88
+ const _ = fe(C);
89
+ s.push({
90
+ templateId: C.slice(18),
91
+ name: _?.name,
92
+ updatedAt: _?.updatedAt
93
+ });
94
+ }
95
+ return s.sort((y, C) => (C.updatedAt ?? "").localeCompare(y.updatedAt ?? ""));
96
+ }
97
+ async function n(s) {
98
+ localStorage.removeItem(Pe + s), localStorage.removeItem(wt + s);
99
+ }
100
+ function o(s) {
101
+ return fe(wt + s) ?? [];
102
+ }
103
+ function i(s, y) {
104
+ De(wt + s, y);
105
+ }
106
+ async function a(s) {
107
+ return o(s).map(({ snapshot: y, ...C }) => C);
108
+ }
109
+ async function l(s, y) {
110
+ return o(s).find((C) => C.versionId === y)?.snapshot ?? null;
111
+ }
112
+ async function c(s, y) {
113
+ i(s, o(s).filter((C) => C.versionId !== y));
114
+ }
115
+ async function m(s) {
116
+ i(s, o(s).filter((y) => y.kept));
117
+ }
118
+ async function b(s, y, C) {
119
+ i(s, o(s).map((_) => _.versionId === y ? {
120
+ ..._,
121
+ kept: C
122
+ } : _));
123
+ }
124
+ function h(s, y) {
125
+ const C = o(s);
126
+ C.unshift({
127
+ versionId: Y(),
128
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
129
+ kept: !1,
130
+ snapshot: y
131
+ });
132
+ const _ = C.filter((f) => !f.kept);
133
+ if (_.length > tn) {
134
+ const f = new Set(_.slice(tn).map((p) => p.versionId));
135
+ i(s, C.filter((p) => !f.has(p.versionId)));
136
+ return;
137
+ }
138
+ i(s, C);
139
+ }
140
+ async function R() {
141
+ return fe(ye) ?? [];
142
+ }
143
+ async function E() {
144
+ return [];
145
+ }
146
+ async function x(s, y) {
147
+ const C = fe(ye) ?? [], _ = {
148
+ id: Y(),
149
+ name: y.trim() || `Row ${C.length + 1}`,
150
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
151
+ row: JSON.parse(JSON.stringify(s))
152
+ };
153
+ return De(ye, [_, ...C]), _;
154
+ }
155
+ async function N(s) {
156
+ const y = fe(ye) ?? [];
157
+ De(ye, y.filter((C) => C.id !== s));
158
+ }
159
+ async function j(s, y) {
160
+ const C = fe(ye) ?? [];
161
+ De(ye, C.map((_) => _.id === s ? {
162
+ ..._,
163
+ name: y.trim() || _.name
164
+ } : _));
165
+ }
166
+ function u(s) {
167
+ const y = (fe(ye) ?? []).find((C) => C.id === s);
168
+ return y ? $n(y.row) : null;
169
+ }
170
+ async function d(s) {
171
+ return new Promise((y, C) => {
172
+ const _ = new FileReader();
173
+ _.onload = () => y(_.result), _.onerror = () => C(_.error), _.readAsDataURL(s);
174
+ });
175
+ }
176
+ return {
177
+ loadTemplate: e,
178
+ saveTemplate: t,
179
+ listTemplates: r,
180
+ deleteTemplate: n,
181
+ listTemplateVersions: a,
182
+ getTemplateVersion: l,
183
+ deleteTemplateVersion: c,
184
+ deleteAllTemplateVersions: m,
185
+ setTemplateVersionKept: b,
186
+ listSavedRows: R,
187
+ listSystemSavedRows: E,
188
+ saveSavedRow: x,
189
+ deleteSavedRow: N,
190
+ renameSavedRow: j,
191
+ cloneSavedRowForCanvas: u,
192
+ uploadImage: d
193
+ };
194
+ }
195
+ var Sn = /* @__PURE__ */ Symbol("maildeno-editor:storage-adapter");
196
+ function gr(e) {
197
+ const t = yn();
198
+ if (!e) return t;
199
+ const r = { ...t };
200
+ for (const [n, o] of Object.entries(e)) typeof o == "function" && (r[n] = o);
201
+ return r;
202
+ }
203
+ var kn = /* @__PURE__ */ Symbol("maildeno-editor:can-save");
204
+ function hr() {
205
+ return Oe(kn, Ce(() => !0));
206
+ }
207
+ function Yo(e) {
208
+ Ie(kn, e);
209
+ }
210
+ var wn = /* @__PURE__ */ Symbol("maildeno-editor:has-template-library");
211
+ function Xo() {
212
+ return Oe(wn, !0);
213
+ }
214
+ function Qo(e) {
215
+ const t = gr(e);
216
+ return Ie(Sn, t), Ie(wn, !e || typeof e.listTemplates == "function"), t;
217
+ }
218
+ var vr = () => {
219
+ const e = Oe(Sn);
220
+ return e || (console.warn("[maildeno-editor] useStorageAdapter() couldn't find a provided adapter — falling back to the default localStorage adapter. If you passed a custom storageAdapter, it wasn't picked up; please report this."), yn());
221
+ }, xn = /* @__PURE__ */ Symbol("maildeno-editor:saved-row-capabilities");
222
+ function Zo(e) {
223
+ Ie(xn, e);
224
+ }
225
+ function ea() {
226
+ return Oe(xn, Ce(() => ({})));
227
+ }
228
+ var ut = mr(null), Et = L(!1);
229
+ function jt() {
230
+ Et.value = !1, setTimeout(() => {
231
+ Et.value || (ut.value = null);
232
+ }, 200);
233
+ }
234
+ function ta() {
235
+ const e = ut.value;
236
+ jt(), e?.accept?.();
237
+ }
238
+ function na() {
239
+ const e = ut.value;
240
+ jt(), e?.reject?.();
241
+ }
242
+ function br() {
243
+ return {
244
+ require(e) {
245
+ ut.value = e, Et.value = !0;
246
+ },
247
+ close: jt
248
+ };
249
+ }
250
+ var _e = () => ({
251
+ enabled: !1,
252
+ match: "all",
253
+ rules: []
254
+ }), Mt = () => ({
255
+ desktopHide: !1,
256
+ mobileHide: !1
257
+ }), ie = () => ({
258
+ visibility: _e(),
259
+ ...Mt()
260
+ }), $r = Object.freeze({
261
+ enabled: !1,
262
+ match: "all",
263
+ rules: []
264
+ }), yr = Object.freeze({
265
+ desktopHide: !1,
266
+ mobileHide: !1
267
+ }), ra = Object.freeze({
268
+ visibility: $r,
269
+ ...yr
270
+ }), xt = (e) => ({
271
+ useGradient: !1,
272
+ solid: e,
273
+ gradient: {
274
+ type: "linear",
275
+ direction: "to right",
276
+ colors: [{
277
+ color: e,
278
+ position: 0
279
+ }, {
280
+ color: "#00ff88",
281
+ position: 100
282
+ }]
283
+ }
284
+ }), Ye = () => ({
285
+ useGradient: !1,
286
+ solid: "transparent",
287
+ gradient: {
288
+ type: "linear",
289
+ direction: "to right",
290
+ colors: [{
291
+ color: "#ffffff",
292
+ position: 0
293
+ }, {
294
+ color: "#eeeeee",
295
+ position: 100
296
+ }]
297
+ }
298
+ }), zt = () => ({ defaultProps: {
299
+ paragraph: {
300
+ content: "Enter your paragraph text here",
301
+ fontSize: 16,
302
+ lineHeight: 1.5,
303
+ color: "#111111",
304
+ fontWeight: "normal",
305
+ fontFamily: "Arial",
306
+ fontStyle: "normal",
307
+ letterSpacing: 0,
308
+ backgroundColor: "transparent",
309
+ backgroundGradient: Ye(),
310
+ margin: {
311
+ top: 0,
312
+ right: 0,
313
+ bottom: 0,
314
+ left: 0
315
+ },
316
+ padding: {
317
+ top: 0,
318
+ right: 0,
319
+ bottom: 0,
320
+ left: 0
321
+ },
322
+ textTransform: "none",
323
+ textDecoration: "none",
324
+ align: "left",
325
+ mobile: {
326
+ fontSize: null,
327
+ lineHeight: null,
328
+ color: null,
329
+ fontWeight: null,
330
+ fontFamily: null,
331
+ fontStyle: null,
332
+ letterSpacing: null,
333
+ backgroundColor: null,
334
+ backgroundGradient: null,
335
+ textTransform: null,
336
+ textDecoration: null,
337
+ align: null,
338
+ margin: null,
339
+ padding: null
340
+ },
341
+ ...ie()
342
+ },
343
+ heading: {
344
+ content: "Heading Text",
345
+ level: "h2",
346
+ fontSize: 32,
347
+ lineHeight: 1.2,
348
+ color: "#111111",
349
+ fontWeight: "bold",
350
+ fontFamily: "Arial",
351
+ letterSpacing: 0,
352
+ backgroundColor: "transparent",
353
+ backgroundGradient: Ye(),
354
+ margin: {
355
+ top: 0,
356
+ right: 0,
357
+ bottom: 0,
358
+ left: 0
359
+ },
360
+ padding: {
361
+ top: 0,
362
+ right: 0,
363
+ bottom: 0,
364
+ left: 0
365
+ },
366
+ textTransform: "none",
367
+ textDecoration: "none",
368
+ align: "left",
369
+ mobile: {
370
+ fontSize: null,
371
+ lineHeight: null,
372
+ color: null,
373
+ fontWeight: null,
374
+ fontFamily: null,
375
+ letterSpacing: null,
376
+ backgroundColor: null,
377
+ backgroundGradient: null,
378
+ textTransform: null,
379
+ textDecoration: null,
380
+ align: null,
381
+ margin: null,
382
+ padding: null
383
+ },
384
+ ...ie()
385
+ },
386
+ image: {
387
+ src: "https://email-builder-nor-dev.s3.amazonaws.com/images/2026/08/20/5bffeaf2.jpeg",
388
+ alt: "Image",
389
+ width: 100,
390
+ height: "auto",
391
+ align: "center",
392
+ link: "https://example.com",
393
+ enabled: !1,
394
+ margin: {
395
+ top: 0,
396
+ right: 0,
397
+ bottom: 0,
398
+ left: 0
399
+ },
400
+ padding: {
401
+ top: 0,
402
+ right: 0,
403
+ bottom: 0,
404
+ left: 0
405
+ },
406
+ borderRadius: 0,
407
+ border: {
408
+ width: 0,
409
+ color: "transparent",
410
+ style: "solid"
411
+ },
412
+ mobile: {
413
+ width: null,
414
+ height: null,
415
+ align: null,
416
+ margin: null,
417
+ padding: null,
418
+ borderRadius: null,
419
+ border: null
420
+ },
421
+ ...ie()
422
+ },
423
+ video: {
424
+ fallbackLink: "https://example.com",
425
+ src: "",
426
+ coverImage: "",
427
+ alt: "Watch video",
428
+ width: 100,
429
+ height: "auto",
430
+ align: "center",
431
+ margin: {
432
+ top: 0,
433
+ right: 0,
434
+ bottom: 0,
435
+ left: 0
436
+ },
437
+ padding: {
438
+ top: 0,
439
+ right: 0,
440
+ bottom: 0,
441
+ left: 0
442
+ },
443
+ borderRadius: 0,
444
+ border: {
445
+ width: 0,
446
+ color: "transparent",
447
+ style: "solid"
448
+ },
449
+ mobile: {
450
+ width: null,
451
+ height: null,
452
+ align: null,
453
+ margin: null,
454
+ padding: null,
455
+ borderRadius: null,
456
+ border: null
457
+ },
458
+ ...ie()
459
+ },
460
+ list: {
461
+ content: "<ul><li>List item 1</li><li>List item 2</li><li>List item 3</li></ul>",
462
+ fontSize: 16,
463
+ lineHeight: 1.5,
464
+ fontFamily: "Arial",
465
+ letterSpacing: 0,
466
+ color: "#111111",
467
+ backgroundColor: "transparent",
468
+ backgroundGradient: Ye(),
469
+ margin: {
470
+ top: 0,
471
+ right: 0,
472
+ bottom: 0,
473
+ left: 0
474
+ },
475
+ padding: {
476
+ top: 0,
477
+ right: 0,
478
+ bottom: 0,
479
+ left: 20
480
+ },
481
+ itemSpacing: 8,
482
+ mobile: {
483
+ fontSize: null,
484
+ lineHeight: null,
485
+ fontFamily: null,
486
+ letterSpacing: null,
487
+ color: null,
488
+ backgroundColor: null,
489
+ backgroundGradient: null,
490
+ margin: null,
491
+ padding: null,
492
+ itemSpacing: null
493
+ },
494
+ ...ie()
495
+ },
496
+ button: {
497
+ text: "Click Me",
498
+ link: "https://example.com",
499
+ width: "auto",
500
+ height: "auto",
501
+ backgroundColor: "#007bff",
502
+ backgroundGradient: xt("#007bff"),
503
+ color: "#fafafa",
504
+ fontSize: 16,
505
+ fontWeight: "medium",
506
+ fontFamily: "Arial",
507
+ letterSpacing: 0,
508
+ margin: {
509
+ top: 0,
510
+ right: 0,
511
+ bottom: 0,
512
+ left: 0
513
+ },
514
+ padding: {
515
+ top: 12,
516
+ right: 24,
517
+ bottom: 12,
518
+ left: 24
519
+ },
520
+ borderRadius: 4,
521
+ border: {
522
+ width: 0,
523
+ color: "transparent",
524
+ style: "solid"
525
+ },
526
+ align: "center",
527
+ icon: "",
528
+ iconAlt: "",
529
+ iconPosition: "before",
530
+ iconSize: 20,
531
+ iconGap: 8,
532
+ mobile: {
533
+ width: null,
534
+ height: null,
535
+ fontSize: null,
536
+ fontWeight: null,
537
+ fontFamily: null,
538
+ letterSpacing: null,
539
+ backgroundColor: null,
540
+ backgroundGradient: null,
541
+ color: null,
542
+ padding: null,
543
+ margin: null,
544
+ borderRadius: null,
545
+ border: null,
546
+ align: null
547
+ },
548
+ ...ie()
549
+ },
550
+ anchor: {
551
+ text: "Click here",
552
+ link: "https://example.com",
553
+ color: "#007bff",
554
+ fontSize: 16,
555
+ fontWeight: "normal",
556
+ fontFamily: "Arial",
557
+ letterSpacing: 0,
558
+ textDecoration: "underline",
559
+ margin: {
560
+ top: 0,
561
+ right: 0,
562
+ bottom: 0,
563
+ left: 0
564
+ },
565
+ padding: {
566
+ top: 0,
567
+ right: 0,
568
+ bottom: 0,
569
+ left: 0
570
+ },
571
+ align: "left",
572
+ mobile: {
573
+ fontSize: null,
574
+ fontWeight: null,
575
+ fontFamily: null,
576
+ letterSpacing: null,
577
+ color: null,
578
+ textDecoration: null,
579
+ margin: null,
580
+ padding: null,
581
+ align: null
582
+ },
583
+ ...ie()
584
+ },
585
+ divider: {
586
+ backgroundColor: "#cccccc",
587
+ backgroundGradient: xt("#cccccc"),
588
+ height: 1,
589
+ width: 100,
590
+ margin: {
591
+ top: 20,
592
+ right: 0,
593
+ bottom: 20,
594
+ left: 0
595
+ },
596
+ padding: {
597
+ top: 5,
598
+ right: 0,
599
+ bottom: 5,
600
+ left: 0
601
+ },
602
+ align: "center",
603
+ mobile: {
604
+ backgroundColor: null,
605
+ backgroundGradient: null,
606
+ height: null,
607
+ width: null,
608
+ margin: null,
609
+ padding: null,
610
+ align: null
611
+ },
612
+ ...ie()
613
+ },
614
+ spacer: {
615
+ height: 20,
616
+ backgroundColor: "transparent",
617
+ backgroundGradient: xt("transparent"),
618
+ mobile: {
619
+ height: null,
620
+ backgroundColor: null,
621
+ backgroundGradient: null
622
+ },
623
+ ...ie()
624
+ },
625
+ menu: {
626
+ items: [
627
+ {
628
+ label: "Home",
629
+ link: "https://example.com",
630
+ enabled: !0
631
+ },
632
+ {
633
+ label: "About",
634
+ link: "https://example.com",
635
+ enabled: !0
636
+ },
637
+ {
638
+ label: "Contact",
639
+ link: "https://example.com",
640
+ enabled: !0
641
+ }
642
+ ],
643
+ fontSize: 16,
644
+ lineHeight: 1.5,
645
+ fontWeight: "normal",
646
+ fontFamily: "Arial",
647
+ fontStyle: "normal",
648
+ letterSpacing: 0,
649
+ color: "#111111",
650
+ textTransform: "none",
651
+ textDecoration: "none",
652
+ backgroundColor: "transparent",
653
+ backgroundGradient: Ye(),
654
+ spacing: 16,
655
+ align: "center",
656
+ margin: {
657
+ top: 0,
658
+ right: 0,
659
+ bottom: 0,
660
+ left: 0
661
+ },
662
+ padding: {
663
+ top: 0,
664
+ right: 0,
665
+ bottom: 0,
666
+ left: 0
667
+ },
668
+ mobileStack: !1,
669
+ mobile: {
670
+ fontSize: null,
671
+ lineHeight: null,
672
+ fontWeight: null,
673
+ fontFamily: null,
674
+ fontStyle: null,
675
+ letterSpacing: null,
676
+ color: null,
677
+ textTransform: null,
678
+ textDecoration: null,
679
+ backgroundColor: null,
680
+ backgroundGradient: null,
681
+ spacing: null,
682
+ align: null,
683
+ margin: null,
684
+ padding: null
685
+ },
686
+ ...ie()
687
+ },
688
+ socials: {
689
+ platforms: [
690
+ {
691
+ name: "Youtube",
692
+ link: "",
693
+ enabled: !0,
694
+ icon: "https://email-builder-nor-dev.s3.amazonaws.com/images/2026/08/20/187d70ab.png"
695
+ },
696
+ {
697
+ name: "Linkedin",
698
+ link: "",
699
+ enabled: !0,
700
+ icon: "https://email-builder-nor-dev.s3.amazonaws.com/images/2026/08/20/23e45ac0.png"
701
+ },
702
+ {
703
+ name: "Instagram",
704
+ link: "",
705
+ enabled: !0,
706
+ icon: "https://email-builder-nor-dev.s3.amazonaws.com/images/2026/08/20/4e9832e6.png"
707
+ }
708
+ ],
709
+ iconSize: 28,
710
+ spacing: 10,
711
+ align: "center",
712
+ margin: {
713
+ top: 0,
714
+ right: 0,
715
+ bottom: 0,
716
+ left: 0
717
+ },
718
+ padding: {
719
+ top: 0,
720
+ right: 0,
721
+ bottom: 0,
722
+ left: 0
723
+ },
724
+ mobile: {
725
+ iconSize: null,
726
+ spacing: null,
727
+ align: null,
728
+ margin: null,
729
+ padding: null
730
+ },
731
+ ...ie()
732
+ }
733
+ } }), oa = (e) => e.trim().toLowerCase().replace(/\s+/g, "_").replace(/[^a-z0-9_]/g, ""), aa = (e) => e.split("_").map((t) => t.charAt(0).toUpperCase() + t.slice(1)).join(" "), Cn = () => `row_${Y().slice(0, 4)}`, Fe = (e) => ({
734
+ useGradient: !1,
735
+ solid: e,
736
+ gradient: {
737
+ type: "linear",
738
+ direction: "to right",
739
+ colors: [{
740
+ color: "#ffffff",
741
+ position: 0
742
+ }, {
743
+ color: "#eeeeee",
744
+ position: 100
745
+ }]
746
+ }
747
+ }), he = (e) => e.children ?? e.components ?? [], He = (e) => (e.children || (e.children = e.components ?? []), e.children), Lt = (e) => {
748
+ const t = JSON.parse(JSON.stringify(e));
749
+ return t.id = Y(), t.type === "row" && Array.isArray(t.columns) && (t.columns = t.columns.map((r) => {
750
+ const n = r.children ?? r.components ?? [], o = {
751
+ ...r,
752
+ id: Y(),
753
+ children: n.map((i) => Lt(i))
754
+ };
755
+ return delete o.components, o;
756
+ })), t;
757
+ }, Xe = (e, t) => {
758
+ const r = Lt(e);
759
+ if (r.type === "row-spacer") return r;
760
+ const n = e.name ?? Cn(), o = new Set(t.map((l) => l.name));
761
+ let i = `${n}_copy`, a = 2;
762
+ for (; o.has(i); )
763
+ i = `${n}_copy_${a}`, a++;
764
+ return r.name = i, r;
765
+ }, Sr = (e) => Lt(e), ve = (e, t) => {
766
+ for (let r = 0; r < e.length; r++) {
767
+ const n = e[r];
768
+ if (n.id === t) return {
769
+ parentChildren: e,
770
+ index: r,
771
+ element: n
772
+ };
773
+ if (n.type === "row") for (const o of n.columns ?? []) {
774
+ const i = ve(o.children ?? o.components ?? [], t);
775
+ if (i) return i;
776
+ }
777
+ }
778
+ return null;
779
+ }, xe = (e, t) => {
780
+ for (const r of e) {
781
+ if (r.id === t) return r;
782
+ if (r.type === "row" && r.columns) for (const n of r.columns) {
783
+ const o = he(n);
784
+ for (const i of o) {
785
+ if (i.id === t && i.type === "row") return i;
786
+ if (i.type === "row" && i.columns) {
787
+ const a = xe([i], t);
788
+ if (a) return a;
789
+ }
790
+ }
791
+ }
792
+ }
793
+ return null;
794
+ }, ae = /* @__PURE__ */ new Map(), nn = (e) => {
795
+ ae.clear();
796
+ const t = (r) => {
797
+ for (const n of r)
798
+ if (n?.id && (ae.set(n.id, n), n.type === "row" && Array.isArray(n.columns)))
799
+ for (const o of n.columns)
800
+ o?.id && ae.set(o.id, o), t(o.children ?? o.components ?? []);
801
+ };
802
+ t(e);
803
+ }, le = (e) => {
804
+ if (e?.id && (ae.set(e.id, e), e.type === "row" && Array.isArray(e.columns)))
805
+ for (const t of e.columns) {
806
+ t?.id && ae.set(t.id, t);
807
+ const r = t.children ?? t.components ?? [];
808
+ for (const n of r) le(n);
809
+ }
810
+ }, it = (e) => {
811
+ if (e?.id && (ae.delete(e.id), e.type === "row" && Array.isArray(e.columns)))
812
+ for (const t of e.columns) {
813
+ t?.id && ae.delete(t.id);
814
+ const r = t.children ?? t.components ?? [];
815
+ for (const n of r) it(n);
816
+ }
817
+ }, kr = (e, t, r, n, o = n) => {
818
+ ae.size === 0 && Array.isArray(e.value) && e.value.length && nn(e.value);
819
+ const i = (f, p = !1) => {
820
+ let g;
821
+ if (Array.isArray(f)) {
822
+ if (f.reduce((S, T) => S + T, 0) !== 100) {
823
+ console.warn("Column widths must sum to 100%");
824
+ return;
825
+ }
826
+ g = f;
827
+ } else {
828
+ const S = Math.floor(100 / f);
829
+ g = Array(f).fill(S), g[0] += 100 - g.reduce((T, k) => T + k, 0);
830
+ }
831
+ const w = Cn(), $ = {
832
+ id: `${Y()}`,
833
+ type: "row",
834
+ name: w,
835
+ columns: g.map((S, T) => ({
836
+ id: `${Y()}-${T}`,
837
+ width: S,
838
+ children: [],
839
+ backgroundColor: "transparent",
840
+ backgroundGradient: Fe("transparent"),
841
+ backgroundImage: "",
842
+ backgroundSize: "cover",
843
+ backgroundPosition: "center center",
844
+ backgroundRepeat: "no-repeat",
845
+ padding: {
846
+ top: 10,
847
+ right: 10,
848
+ bottom: 10,
849
+ left: 10
850
+ },
851
+ border: {
852
+ width: 0,
853
+ style: "solid",
854
+ color: "#000000",
855
+ radius: 0
856
+ },
857
+ verticalAlign: "top"
858
+ })),
859
+ backgroundColor: "#ffffff",
860
+ backgroundGradient: Fe("#ffffff"),
861
+ backgroundImage: "",
862
+ backgroundSize: "cover",
863
+ backgroundPosition: "center center",
864
+ backgroundRepeat: "no-repeat",
865
+ padding: {
866
+ top: 0,
867
+ right: 0,
868
+ bottom: 0,
869
+ left: 0
870
+ },
871
+ border: {
872
+ width: 0,
873
+ style: "solid",
874
+ color: "#000000",
875
+ radius: 0
876
+ },
877
+ minHeight: 0,
878
+ gap: 12,
879
+ mobileStack: !0,
880
+ visibility: _e()
881
+ };
882
+ e.value.push($);
883
+ const v = e.value[e.value.length - 1];
884
+ le(v), p || n("add-row");
885
+ }, a = (f, p, g, w) => {
886
+ const $ = xe(e.value, f);
887
+ if (!$?.columns) return;
888
+ const v = $.columns.find((B) => B.id === p);
889
+ if (!v) return;
890
+ let S;
891
+ if (Array.isArray(g)) {
892
+ if (g.reduce((B, D) => B + D, 0) !== 100) {
893
+ console.warn("[addNestedRow] Widths must sum to 100%");
894
+ return;
895
+ }
896
+ S = g;
897
+ } else {
898
+ const B = Math.floor(100 / g);
899
+ S = Array(g).fill(B), S[0] += 100 - S.reduce((D, I) => D + I, 0);
900
+ }
901
+ const T = {
902
+ id: `${Y()}`,
903
+ type: "row",
904
+ name: `nested_row_${Y().slice(0, 4)}`,
905
+ columns: S.map((B, D) => ({
906
+ id: `${Y()}-${D}`,
907
+ width: B,
908
+ children: [],
909
+ backgroundColor: "transparent",
910
+ backgroundGradient: Fe("transparent"),
911
+ backgroundImage: "",
912
+ backgroundSize: "cover",
913
+ backgroundPosition: "center center",
914
+ backgroundRepeat: "no-repeat",
915
+ padding: {
916
+ top: 0,
917
+ right: 0,
918
+ bottom: 0,
919
+ left: 0
920
+ },
921
+ border: {
922
+ width: 0,
923
+ style: "solid",
924
+ color: "#000000",
925
+ radius: 0
926
+ },
927
+ verticalAlign: "top"
928
+ })),
929
+ backgroundColor: "transparent",
930
+ backgroundGradient: Fe("transparent"),
931
+ backgroundImage: "",
932
+ backgroundSize: "cover",
933
+ backgroundPosition: "center center",
934
+ backgroundRepeat: "no-repeat",
935
+ padding: {
936
+ top: 0,
937
+ right: 0,
938
+ bottom: 0,
939
+ left: 0
940
+ },
941
+ border: {
942
+ width: 0,
943
+ style: "solid",
944
+ color: "#000000",
945
+ radius: 0
946
+ },
947
+ minHeight: 0,
948
+ gap: 0,
949
+ mobileStack: !0,
950
+ visibility: _e()
951
+ }, k = He(v), M = w !== void 0 && w >= 0 && w <= k.length ? w : k.length;
952
+ k.splice(M, 0, T);
953
+ const O = k[M];
954
+ le(O), n("add-nested-row");
955
+ }, l = (f) => {
956
+ if (f == null) return null;
957
+ const p = String(f), g = ae.get(p);
958
+ if (g && (g.type === "row" || g.type === "row-spacer")) return g;
959
+ const w = xe(e.value, f);
960
+ return w && ae.set(p, w), w;
961
+ }, c = (f) => {
962
+ const p = e.value.findIndex((g) => g.id === f);
963
+ if (p !== -1) {
964
+ const [g] = e.value.splice(p, 1);
965
+ it(g), n("delete-row");
966
+ return;
967
+ }
968
+ for (const g of e.value)
969
+ if (g.columns)
970
+ for (const w of g.columns) {
971
+ const $ = he(w), v = ve($, f);
972
+ if (v) {
973
+ const [S] = v.parentChildren.splice(v.index, 1);
974
+ it(S), n("delete-row");
975
+ return;
976
+ }
977
+ }
978
+ }, m = (f, p) => {
979
+ const g = e.value.findIndex(($) => $.id === f);
980
+ if (g !== -1) {
981
+ const $ = p === "up" ? g - 1 : g + 1;
982
+ if ($ < 0 || $ >= e.value.length) return;
983
+ const [v] = e.value.splice(g, 1);
984
+ e.value.splice($, 0, v), n("move-row");
985
+ return;
986
+ }
987
+ const w = ($) => {
988
+ const v = $.findIndex((S) => S.id === f);
989
+ if (v !== -1) {
990
+ const S = p === "up" ? v - 1 : v + 1;
991
+ if (S < 0 || S >= $.length) return !0;
992
+ const [T] = $.splice(v, 1);
993
+ return $.splice(S, 0, T), n("move-row"), !0;
994
+ }
995
+ for (const S of $) if (S.type === "row" && S.columns) {
996
+ for (const T of S.columns) if (w(T.children ?? T.components ?? [])) return !0;
997
+ }
998
+ return !1;
999
+ };
1000
+ for (const $ of e.value)
1001
+ if ($.columns) {
1002
+ for (const v of $.columns) if (w(v.children ?? v.components ?? [])) return;
1003
+ }
1004
+ }, b = (f, p, g, w) => {
1005
+ let $ = null;
1006
+ const v = e.value.findIndex((S) => S.id === f);
1007
+ if (v !== -1 && ($ = e.value.splice(v, 1)[0]), !$) {
1008
+ const S = (T) => {
1009
+ const k = T.findIndex((M) => M.id === f);
1010
+ if (k !== -1)
1011
+ return $ = T.splice(k, 1)[0], !0;
1012
+ for (const M of T) if (M.type === "row" && M.columns) {
1013
+ for (const O of M.columns) if (S(O.children ?? O.components ?? [])) return !0;
1014
+ }
1015
+ return !1;
1016
+ };
1017
+ for (const T of e.value)
1018
+ if (T.columns) {
1019
+ for (const k of T.columns) if (S(k.children ?? k.components ?? [])) break;
1020
+ if ($) break;
1021
+ }
1022
+ }
1023
+ if ($) {
1024
+ if (g === null) {
1025
+ const S = Math.min(w, e.value.length);
1026
+ e.value.splice(S, 0, $);
1027
+ } else {
1028
+ const S = xe(e.value, p);
1029
+ if (!S?.columns) {
1030
+ e.value.push($);
1031
+ return;
1032
+ }
1033
+ const T = S.columns.find((O) => O.id === g);
1034
+ if (!T) {
1035
+ e.value.push($);
1036
+ return;
1037
+ }
1038
+ const k = He(T), M = Math.min(w, k.length);
1039
+ k.splice(M, 0, $);
1040
+ }
1041
+ n("move-nested-row");
1042
+ }
1043
+ }, h = (f, p, g = !1) => {
1044
+ if (f === p) return;
1045
+ const w = e.value[f];
1046
+ e.value.splice(f, 1), e.value.splice(p, 0, w), g || n("reorder-rows");
1047
+ }, R = (f = !1) => {
1048
+ const p = `spacer_${Y().slice(0, 4)}`, g = {
1049
+ id: `${Y()}`,
1050
+ type: "row-spacer",
1051
+ name: p,
1052
+ height: 20,
1053
+ backgroundColor: "transparent",
1054
+ backgroundGradient: Fe("transparent"),
1055
+ visibility: _e()
1056
+ };
1057
+ e.value.push(g);
1058
+ const w = e.value[e.value.length - 1];
1059
+ le(w), f || n("add-row-spacer");
1060
+ }, E = (f) => {
1061
+ const p = e.value.findIndex((g) => g.id === f);
1062
+ if (p !== -1) {
1063
+ const g = Xe(e.value[p], e.value);
1064
+ e.value.splice(p + 1, 0, g);
1065
+ const w = e.value[p + 1];
1066
+ le(w), n("duplicate-row");
1067
+ return;
1068
+ }
1069
+ for (const g of e.value)
1070
+ if (g.columns)
1071
+ for (const w of g.columns) {
1072
+ const $ = he(w), v = ve($, f);
1073
+ if (v) {
1074
+ const S = Xe(v.element, v.parentChildren);
1075
+ v.parentChildren.splice(v.index + 1, 0, S);
1076
+ const T = v.parentChildren[v.index + 1];
1077
+ le(T), n("duplicate-row");
1078
+ return;
1079
+ }
1080
+ }
1081
+ }, x = (f) => {
1082
+ const p = e.value.findIndex((g) => g.id === f);
1083
+ if (p !== -1) {
1084
+ const g = Xe(e.value[p], e.value);
1085
+ e.value.splice(p + 1, 0, g);
1086
+ const w = e.value[p + 1];
1087
+ le(w), n("duplicate-row-spacer");
1088
+ return;
1089
+ }
1090
+ for (const g of e.value)
1091
+ if (g.columns)
1092
+ for (const w of g.columns) {
1093
+ const $ = he(w), v = ve($, f);
1094
+ if (v) {
1095
+ const S = Xe(v.element, v.parentChildren);
1096
+ v.parentChildren.splice(v.index + 1, 0, S);
1097
+ const T = v.parentChildren[v.index + 1];
1098
+ le(T), n("duplicate-row-spacer");
1099
+ return;
1100
+ }
1101
+ }
1102
+ }, N = (f, p, g) => {
1103
+ const w = xe(e.value, f);
1104
+ if (!w) return;
1105
+ const $ = w.columns.find((k) => k.id === p);
1106
+ if (!$) return;
1107
+ const v = {
1108
+ id: `${Y()}`,
1109
+ type: "component",
1110
+ componentType: g,
1111
+ props: JSON.parse(JSON.stringify(r[g]))
1112
+ }, S = He($);
1113
+ S.push(v);
1114
+ const T = S[S.length - 1];
1115
+ le(T), t.value = T.id, n("add-component");
1116
+ }, j = (f, p, g, w) => {
1117
+ const $ = xe(e.value, f);
1118
+ if (!$) return;
1119
+ const v = $.columns.find((M) => M.id === p);
1120
+ if (!v) return;
1121
+ const S = {
1122
+ id: `${Y()}`,
1123
+ type: "component",
1124
+ componentType: g,
1125
+ props: JSON.parse(JSON.stringify(r[g]))
1126
+ }, T = He(v);
1127
+ T.splice(w, 0, S);
1128
+ const k = T[w];
1129
+ le(k), t.value = k.id, n("add-component");
1130
+ }, u = (f) => {
1131
+ for (const p of e.value)
1132
+ if (p.columns)
1133
+ for (const g of p.columns) {
1134
+ const w = he(g), $ = ve(w, f);
1135
+ if ($) {
1136
+ const [v] = $.parentChildren.splice($.index, 1);
1137
+ it(v), t.value === f && (t.value = null), n("delete-component");
1138
+ return;
1139
+ }
1140
+ }
1141
+ }, d = (f, p) => {
1142
+ for (const g of e.value)
1143
+ if (g.columns)
1144
+ for (const w of g.columns) {
1145
+ const $ = he(w), v = ve($, f);
1146
+ if (v) {
1147
+ const { parentChildren: S, index: T } = v, k = p === "up" ? T - 1 : T + 1;
1148
+ if (k >= 0 && k < S.length) {
1149
+ const [M] = S.splice(T, 1);
1150
+ S.splice(k, 0, M), n("move-component");
1151
+ }
1152
+ return;
1153
+ }
1154
+ }
1155
+ }, s = (f, p, g, w) => {
1156
+ let $ = null;
1157
+ for (const T of e.value)
1158
+ if (T.columns) {
1159
+ for (const k of T.columns) {
1160
+ const M = he(k), O = ve(M, f);
1161
+ if (O) {
1162
+ $ = O.element, O.parentChildren.splice(O.index, 1);
1163
+ break;
1164
+ }
1165
+ }
1166
+ if ($) break;
1167
+ }
1168
+ if (!$) return;
1169
+ const v = xe(e.value, p);
1170
+ if (!v || !v.columns) return;
1171
+ const S = v.columns.find((T) => T.id === g);
1172
+ S && (He(S).splice(w, 0, $), n("move-component"));
1173
+ }, y = (f) => {
1174
+ if (f == null) return null;
1175
+ const p = String(f), g = ae.get(p);
1176
+ if (g && g.type === "component") return g;
1177
+ for (const w of e.value)
1178
+ if (w.columns)
1179
+ for (const $ of w.columns) {
1180
+ const v = he($), S = ve(v, f);
1181
+ if (S && S.element.type === "component")
1182
+ return ae.set(p, S.element), S.element;
1183
+ }
1184
+ return null;
1185
+ };
1186
+ return {
1187
+ addRow: i,
1188
+ addNestedRow: a,
1189
+ findRow: l,
1190
+ deleteRow: c,
1191
+ moveRow: m,
1192
+ moveNestedRow: b,
1193
+ reorderRows: h,
1194
+ addSpacer: R,
1195
+ duplicateRow: E,
1196
+ duplicateRowSpacer: x,
1197
+ addComponent: N,
1198
+ addComponentAtIndex: j,
1199
+ deleteComponent: u,
1200
+ moveComponent: d,
1201
+ moveComponentBetweenColumns: s,
1202
+ findComponent: y,
1203
+ updateComponent: (f, p) => {
1204
+ const g = y(f);
1205
+ g && (Object.assign(g.props, p), o("update-component"));
1206
+ },
1207
+ duplicateComponent: (f) => {
1208
+ for (const p of e.value)
1209
+ if (p.columns)
1210
+ for (const g of p.columns) {
1211
+ const w = he(g), $ = ve(w, f);
1212
+ if ($) {
1213
+ const v = Sr($.element);
1214
+ $.parentChildren.splice($.index + 1, 0, v);
1215
+ const S = $.parentChildren[$.index + 1];
1216
+ le(S), t.value = S.id, n("duplicate-component");
1217
+ return;
1218
+ }
1219
+ }
1220
+ },
1221
+ rebuildIdRegistry: () => nn(e.value)
1222
+ };
1223
+ }, ne = null, wr = 600, Ct = (e) => JSON.parse(JSON.stringify(e)), xr = () => {
1224
+ const t = L([]), r = L(-1), n = L(0), o = Ce(() => r.value > 0), i = Ce(() => r.value < t.value.length - 1), a = Ce(() => `${r.value + 1} / ${t.value.length}`), l = (R, E = "change", x = !1) => {
1225
+ const N = () => {
1226
+ ne = null, r.value < t.value.length - 1 && (t.value = t.value.slice(0, r.value + 1)), t.value.push({
1227
+ state: Ct(R),
1228
+ action: E,
1229
+ timestamp: Date.now()
1230
+ }), r.value++, t.value.length > 100 && (t.value.shift(), r.value--), n.value++;
1231
+ };
1232
+ x ? (ne && (clearTimeout(ne), ne = null), N()) : (ne && clearTimeout(ne), ne = setTimeout(N, wr));
1233
+ }, c = () => o.value ? (ne && (clearTimeout(ne), ne = null), r.value--, n.value++, Ct(t.value[r.value].state)) : null, m = () => i.value ? (ne && (clearTimeout(ne), ne = null), r.value++, n.value++, Ct(t.value[r.value].state)) : null, b = () => {
1234
+ t.value = [], r.value = -1, n.value++;
1235
+ };
1236
+ return {
1237
+ canUndo: o,
1238
+ canRedo: i,
1239
+ historyStatus: a,
1240
+ saveState: l,
1241
+ undo: c,
1242
+ redo: m,
1243
+ clearHistory: b,
1244
+ initHistory: (R) => {
1245
+ b(), l(R, "initial");
1246
+ },
1247
+ version: n
1248
+ };
1249
+ }, Cr = () => {
1250
+ const { saveState: e, undo: t, redo: r, canUndo: n, canRedo: o, historyStatus: i, initHistory: a, version: l } = xr();
1251
+ return {
1252
+ getCurrentState: (x, N) => ({
1253
+ rows: x.value,
1254
+ canvasStyles: N.value
1255
+ }),
1256
+ restoreState: (x, N, j, u, d, s) => {
1257
+ if (!x) return;
1258
+ N.value = x.rows, j.value = x.canvasStyles;
1259
+ const y = /* @__PURE__ */ new Set(), C = (_) => {
1260
+ for (const f of _)
1261
+ if (f?.id && (y.add(String(f.id)), f.type === "row" && Array.isArray(f.columns)))
1262
+ for (const p of f.columns)
1263
+ p?.id && y.add(String(p.id)), C(p.children ?? p.components ?? []);
1264
+ };
1265
+ if (C(x.rows), u.value && !y.has(String(u.value)) && (u.value = null), d.value && !y.has(String(d.value)) && (d.value = null), s.value) {
1266
+ const { rowId: _, columnId: f } = s.value;
1267
+ (!y.has(String(_)) || !y.has(String(f))) && (s.value = null);
1268
+ }
1269
+ },
1270
+ saveToHistory: (x, N = "change", j = !1) => {
1271
+ e(x(), N, j);
1272
+ },
1273
+ undo: (x) => {
1274
+ const N = t();
1275
+ return N ? (x(N), N) : null;
1276
+ },
1277
+ redo: (x) => {
1278
+ const N = r();
1279
+ return N ? (x(N), N) : null;
1280
+ },
1281
+ canUndo: n,
1282
+ canRedo: o,
1283
+ historyStatus: i,
1284
+ initialize: (x) => {
1285
+ a(x);
1286
+ },
1287
+ version: l
1288
+ };
1289
+ }, _r = (e) => e == null, Pt = (e) => {
1290
+ if (!e || typeof e != "object") return !0;
1291
+ const t = e;
1292
+ return Array.isArray(t.rules) && t.rules.length > 0 ? !1 : t.enabled === !1 && t.match === "all" && t.rules.length === 0;
1293
+ }, _n = (e) => {
1294
+ if (!e || typeof e != "object") return !0;
1295
+ const t = e;
1296
+ return !t.sides && t.width === 0 && t.style === "solid" && t.color === "#000000" && (t.radius === void 0 || t.radius === 0);
1297
+ }, qe = (e) => !e || typeof e != "object" ? !0 : e.useGradient === !1, rn = (e) => e === !1, Tr = (e) => {
1298
+ if (!e || typeof e != "object") return !0;
1299
+ const t = e;
1300
+ return t.top === 0 && t.right === 0 && t.bottom === 0 && t.left === 0;
1301
+ }, dt = (e) => {
1302
+ if (!e || typeof e != "object") return !0;
1303
+ const t = e;
1304
+ return t.top === 0 && t.right === 0 && t.bottom === 0 && t.left === 0;
1305
+ }, Ar = (e) => e === 0, Rr = (e) => e == null || e === "", Er = (e) => {
1306
+ if (!Array.isArray(e)) return;
1307
+ const t = e.filter((r) => !(r.enabled === !0 && r.link === ""));
1308
+ if (t.length !== 0)
1309
+ return t;
1310
+ }, Mr = (e) => {
1311
+ const t = {};
1312
+ for (const [r, n] of Object.entries(e))
1313
+ _r(n) || r === "backgroundGradient" && qe(n) || (t[r] = n);
1314
+ return Object.keys(t).length > 0 ? t : void 0;
1315
+ }, Ir = (e) => {
1316
+ const t = { ...e.props };
1317
+ if (e.props.mobile && typeof e.props.mobile == "object") {
1318
+ const r = Mr(e.props.mobile);
1319
+ r ? t.mobile = r : delete t.mobile;
1320
+ }
1321
+ if (Pt(e.props.visibility) && delete t.visibility, rn(e.props.desktopHide) && delete t.desktopHide, rn(e.props.mobileHide) && delete t.mobileHide, Tr(e.props.margin) && delete t.margin, dt(e.props.padding) && delete t.padding, qe(e.props.backgroundGradient) && delete t.backgroundGradient, Ar(e.props.letterSpacing) && delete t.letterSpacing, e.props.backgroundImage || (delete t.backgroundImage, delete t.backgroundSize, delete t.backgroundPosition, delete t.backgroundRepeat), "icon" in e.props && Rr(e.props.icon) && (delete t.icon, delete t.iconAlt, delete t.iconPosition, delete t.iconSize, delete t.iconGap), "platforms" in e.props) {
1322
+ const r = Er(e.props.platforms);
1323
+ r === void 0 ? delete t.platforms : t.platforms = r;
1324
+ }
1325
+ return {
1326
+ id: e.id,
1327
+ type: e.type,
1328
+ ...e.componentType !== void 0 && { componentType: e.componentType },
1329
+ props: t
1330
+ };
1331
+ }, Nr = (e) => e.type === "component" ? Ir(e) : Tn(e), Br = (e) => {
1332
+ const { id: t, width: r, children: n, components: o, ...i } = e, a = { ...i };
1333
+ _n(e.border) && delete a.border, qe(e.backgroundGradient) && delete a.backgroundGradient, dt(e.padding) && delete a.padding, e.backgroundImage || (delete a.backgroundImage, delete a.backgroundSize, delete a.backgroundPosition, delete a.backgroundRepeat);
1334
+ const l = (n ?? o ?? []).map(Nr);
1335
+ return {
1336
+ id: t,
1337
+ width: r,
1338
+ ...a,
1339
+ children: l
1340
+ };
1341
+ }, Or = (e) => {
1342
+ const { id: t, type: r, ...n } = e, o = { ...n };
1343
+ Pt(e.visibility) && delete o.visibility, qe(e.backgroundGradient) && delete o.backgroundGradient;
1344
+ const { height: i, ...a } = o;
1345
+ return {
1346
+ id: t,
1347
+ type: r,
1348
+ height: i,
1349
+ ...a
1350
+ };
1351
+ }, Tn = (e) => {
1352
+ if (e.type === "row-spacer") return Or(e);
1353
+ const { id: t, type: r, name: n, columns: o, ...i } = e, a = { ...i };
1354
+ return Pt(e.visibility) && delete a.visibility, _n(e.border) && delete a.border, qe(e.backgroundGradient) && delete a.backgroundGradient, dt(e.padding) && delete a.padding, e.backgroundImage || (delete a.backgroundImage, delete a.backgroundSize, delete a.backgroundPosition, delete a.backgroundRepeat), e.minHeight === 0 && delete a.minHeight, {
1355
+ id: t,
1356
+ type: r,
1357
+ ...n !== void 0 && { name: n },
1358
+ ...a,
1359
+ columns: o?.map(Br)
1360
+ };
1361
+ }, An = (e) => {
1362
+ const t = { ...e };
1363
+ return e.bodyBackgroundImage || (delete t.bodyBackgroundImage, delete t.bodyBackgroundSize, delete t.bodyBackgroundPosition, delete t.bodyBackgroundRepeat), dt(e.padding) && delete t.padding, t;
1364
+ }, Rn = (e) => e.map(Tn), jr = {
1365
+ backgroundColor: "#ffffff",
1366
+ backgroundGradient: {
1367
+ useGradient: !1,
1368
+ solid: "#ffffff",
1369
+ gradient: {
1370
+ type: "linear",
1371
+ direction: "to right",
1372
+ colors: [{
1373
+ color: "#ffffff",
1374
+ position: 0
1375
+ }, {
1376
+ color: "#eeeeee",
1377
+ position: 100
1378
+ }]
1379
+ }
1380
+ },
1381
+ backgroundImage: "",
1382
+ backgroundSize: "cover",
1383
+ backgroundPosition: "center center",
1384
+ backgroundRepeat: "no-repeat",
1385
+ padding: {
1386
+ top: 0,
1387
+ right: 0,
1388
+ bottom: 0,
1389
+ left: 0
1390
+ },
1391
+ border: {
1392
+ width: 0,
1393
+ style: "solid",
1394
+ color: "#000000",
1395
+ radius: 0
1396
+ },
1397
+ minHeight: 0,
1398
+ gap: 12,
1399
+ mobileStack: !0,
1400
+ visibility: _e()
1401
+ }, zr = {
1402
+ backgroundColor: "transparent",
1403
+ backgroundGradient: {
1404
+ useGradient: !1,
1405
+ solid: "transparent",
1406
+ gradient: {
1407
+ type: "linear",
1408
+ direction: "to right",
1409
+ colors: [{
1410
+ color: "#ffffff",
1411
+ position: 0
1412
+ }, {
1413
+ color: "#eeeeee",
1414
+ position: 100
1415
+ }]
1416
+ }
1417
+ },
1418
+ visibility: _e()
1419
+ }, Lr = {
1420
+ backgroundColor: "transparent",
1421
+ backgroundGradient: {
1422
+ useGradient: !1,
1423
+ solid: "transparent",
1424
+ gradient: {
1425
+ type: "linear",
1426
+ direction: "to right",
1427
+ colors: [{
1428
+ color: "#ffffff",
1429
+ position: 0
1430
+ }, {
1431
+ color: "#eeeeee",
1432
+ position: 100
1433
+ }]
1434
+ }
1435
+ },
1436
+ backgroundImage: "",
1437
+ backgroundSize: "cover",
1438
+ backgroundPosition: "center center",
1439
+ backgroundRepeat: "no-repeat",
1440
+ padding: {
1441
+ top: 0,
1442
+ right: 0,
1443
+ bottom: 0,
1444
+ left: 0
1445
+ },
1446
+ border: {
1447
+ width: 0,
1448
+ style: "solid",
1449
+ color: "#000000",
1450
+ radius: 0
1451
+ },
1452
+ verticalAlign: "top"
1453
+ }, Pr = {
1454
+ language: "en-US",
1455
+ preheaderText: "View this email in your browser",
1456
+ bodyBackgroundColor: "#f9fafb",
1457
+ bodyBackgroundImage: "",
1458
+ bodyBackgroundSize: "cover",
1459
+ bodyBackgroundPosition: "center center",
1460
+ bodyBackgroundRepeat: "no-repeat",
1461
+ backgroundColor: "#ffffff",
1462
+ width: 600,
1463
+ padding: {
1464
+ top: 0,
1465
+ right: 0,
1466
+ bottom: 0,
1467
+ left: 0
1468
+ },
1469
+ mobileBreakpoint: 600
1470
+ }, Dr = (e) => JSON.parse(JSON.stringify(e)), je = (e, t) => {
1471
+ const r = Dr(e);
1472
+ for (const n of Object.keys(t)) {
1473
+ const o = t[n], i = e[n];
1474
+ o != null && (typeof o == "object" && !Array.isArray(o) && typeof i == "object" && i !== null && !Array.isArray(i) ? r[n] = je(i, o) : r[n] = o);
1475
+ }
1476
+ return r;
1477
+ }, on = (e) => {
1478
+ const { defaultProps: t } = zt(), r = e.componentType ?? e.type, n = t[r];
1479
+ if (!n)
1480
+ return console.warn(`[Hydrator] Unknown component type "${r}" — skipping hydration.`), e;
1481
+ const o = je(n, e.props);
1482
+ if (n.mobile && typeof n.mobile == "object" && (o.mobile = {
1483
+ ...n.mobile,
1484
+ ...o.mobile ?? {}
1485
+ }, o.mobile && !o.mobile.backgroundGradient && (o.mobile.backgroundGradient = n.mobile.backgroundGradient)), o.visibility = o.visibility ?? _e(), o.desktopHide = o.desktopHide ?? Mt().desktopHide, o.mobileHide = o.mobileHide ?? Mt().mobileHide, o.margin === void 0 && n.margin && (o.margin = { ...n.margin }), o.padding === void 0 && n.padding && (o.padding = { ...n.padding }), o.letterSpacing === void 0 && n.letterSpacing !== void 0 && (o.letterSpacing = n.letterSpacing), o.backgroundGradient) {
1486
+ const i = o.backgroundColor;
1487
+ i && (o.backgroundGradient.solid = i);
1488
+ }
1489
+ return !o.backgroundImage && n.backgroundImage !== void 0 && (o.backgroundImage = n.backgroundImage, o.backgroundSize = n.backgroundSize, o.backgroundPosition = n.backgroundPosition, o.backgroundRepeat = n.backgroundRepeat), "icon" in n && (o.icon = o.icon ?? n.icon, o.iconAlt = o.iconAlt ?? n.iconAlt ?? "", o.iconPosition = o.iconPosition ?? n.iconPosition ?? "before", o.iconSize = o.iconSize ?? n.iconSize ?? 20, o.iconGap = o.iconGap ?? n.iconGap ?? 8), {
1490
+ ...e,
1491
+ type: "component",
1492
+ componentType: r,
1493
+ props: o
1494
+ };
1495
+ }, Fr = (e) => {
1496
+ if (e.type === "component") return on(e);
1497
+ const { defaultProps: t } = zt();
1498
+ return e.type in t ? on({
1499
+ ...e,
1500
+ type: "component",
1501
+ componentType: e.type
1502
+ }) : En(e);
1503
+ }, Hr = (e) => {
1504
+ const t = e.children ?? e.components ?? [], { components: r, children: n, ...o } = e, i = e.backgroundColor !== void 0 || e.backgroundGradient !== void 0 || e.backgroundImage !== void 0, { backgroundColor: a, backgroundGradient: l, ...c } = Lr;
1505
+ let m = je(c, o);
1506
+ return i ? (m.backgroundColor = e.backgroundColor, m.backgroundGradient = e.backgroundGradient) : (m.backgroundColor = a, m.backgroundGradient = l), e.backgroundImage || (m.backgroundImage = "", m.backgroundSize = "cover", m.backgroundPosition = "center center", m.backgroundRepeat = "no-repeat"), {
1507
+ ...m,
1508
+ children: t.map(Fr)
1509
+ };
1510
+ }, Ur = (e) => {
1511
+ const t = je(zr, e);
1512
+ return t.backgroundColor === void 0 && (t.backgroundColor = "transparent"), t;
1513
+ }, En = (e) => {
1514
+ if (e.type === "row-spacer") return Ur(e);
1515
+ const { columns: t, ...r } = e, n = e.backgroundColor !== void 0 || e.backgroundGradient !== void 0 || e.backgroundImage !== void 0, { backgroundColor: o, backgroundGradient: i, ...a } = jr;
1516
+ let l = je(a, r);
1517
+ return n ? (l.backgroundColor = e.backgroundColor, l.backgroundGradient = e.backgroundGradient) : (l.backgroundColor = o, l.backgroundGradient = i), e.backgroundImage || (l.backgroundImage = "", l.backgroundSize = "cover", l.backgroundPosition = "center center", l.backgroundRepeat = "no-repeat"), l.minHeight === void 0 && (l.minHeight = 0), Array.isArray(t) && (l.columns = t.map(Hr)), l;
1518
+ }, lt = (e) => {
1519
+ const t = je(Pr, e);
1520
+ return e.bodyBackgroundImage || (t.bodyBackgroundImage = "", t.bodyBackgroundSize = "cover", t.bodyBackgroundPosition = "center center", t.bodyBackgroundRepeat = "no-repeat"), t;
1521
+ }, ct = (e) => e.map(En), ge = "maildeno:autosave", It = "1.0", an = (e, t, r = null, n, o) => {
1522
+ const i = Date.now();
1523
+ return {
1524
+ schemaVersion: It,
1525
+ templateId: r,
1526
+ expiresAt: i + 2592e6,
1527
+ touchedAt: i,
1528
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
1529
+ ...n !== void 0 && { name: n },
1530
+ ...o !== void 0 && { tags: o },
1531
+ content: {
1532
+ rows: Rn(e),
1533
+ canvas: An(t)
1534
+ }
1535
+ };
1536
+ }, _t = null, Jr = () => {
1537
+ const e = L("idle"), t = L(null);
1538
+ return {
1539
+ saveToLocal: (l, c, m = null, b, h) => {
1540
+ e.value = "saving";
1541
+ const R = () => {
1542
+ try {
1543
+ const E = an(l, c, m, b, h);
1544
+ localStorage.setItem(ge, JSON.stringify(E)), t.value = /* @__PURE__ */ new Date(), _t && clearTimeout(_t), e.value = "saved", _t = setTimeout(() => {
1545
+ e.value = "idle";
1546
+ }, 2500);
1547
+ } catch (E) {
1548
+ console.error("[AutoSave] Failed to write to localStorage:", E), e.value = "error", setTimeout(() => {
1549
+ e.value = "idle";
1550
+ }, 3e3);
1551
+ }
1552
+ };
1553
+ typeof window < "u" && "requestIdleCallback" in window ? window.requestIdleCallback(R, { timeout: 2e3 }) : setTimeout(R, 0);
1554
+ },
1555
+ flushSave: (l, c, m = null, b, h) => {
1556
+ try {
1557
+ const R = an(l, c, m, b, h);
1558
+ localStorage.setItem(ge, JSON.stringify(R)), t.value = /* @__PURE__ */ new Date();
1559
+ } catch {
1560
+ }
1561
+ },
1562
+ loadFromLocal: () => {
1563
+ try {
1564
+ const l = localStorage.getItem(ge);
1565
+ if (!l) return null;
1566
+ const c = JSON.parse(l);
1567
+ return c.schemaVersion !== It ? (console.warn(`[AutoSave] Schema mismatch (stored=${c.schemaVersion}, current=${It}). Discarding.`), localStorage.removeItem(ge), null) : Date.now() > c.expiresAt ? (console.info("[AutoSave] Draft expired. Clearing."), localStorage.removeItem(ge), null) : !c.content?.rows || !c.content?.canvas || !Array.isArray(c.content.rows) ? (console.warn("[AutoSave] Malformed payload. Discarding."), localStorage.removeItem(ge), null) : {
1568
+ rows: ct(c.content.rows),
1569
+ canvas: lt(c.content.canvas),
1570
+ updatedAt: c.updatedAt,
1571
+ templateId: c.templateId ?? null,
1572
+ ...c.name !== void 0 && { name: c.name },
1573
+ ...c.tags !== void 0 && { tags: c.tags }
1574
+ };
1575
+ } catch (l) {
1576
+ return console.error("[AutoSave] Failed to read from localStorage:", l), localStorage.removeItem(ge), null;
1577
+ }
1578
+ },
1579
+ clearLocal: () => {
1580
+ localStorage.removeItem(ge), e.value = "idle", t.value = null;
1581
+ },
1582
+ hasDraft: (l) => {
1583
+ try {
1584
+ const c = localStorage.getItem(ge);
1585
+ if (!c) return !1;
1586
+ const m = JSON.parse(c);
1587
+ return !(Date.now() > m.expiresAt || l !== void 0 && m.templateId !== l);
1588
+ } catch {
1589
+ return !1;
1590
+ }
1591
+ },
1592
+ saveStatus: e,
1593
+ lastSaved: t
1594
+ };
1595
+ }, Dt = (e) => !e || /\{\{.*?\}\}/.test(e) || /^(https?:\/\/|mailto:|tel:)/i.test(e) ? e : `https://${e}`, Ft = (e) => e == null ? "" : String(e).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;"), Ht = (e) => e == null ? "" : String(e).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;"), Gr = (e) => {
1596
+ if (e == null) return "";
1597
+ const t = String(e);
1598
+ return t.indexOf("&quot;") === -1 ? t : t.replace(/style="([^"]*)"/g, (r, n) => `style="${n.replace(/&quot;/g, "'")}"`);
1599
+ }, Ut = /* @__PURE__ */ new Map();
1600
+ function ia(e, t) {
1601
+ const r = typeof e == "string" ? t : e;
1602
+ if (!r) {
1603
+ console.error("[maildeno-editor] registerBlock was called without a definition.");
1604
+ return;
1605
+ }
1606
+ const n = typeof e == "string" ? e : r.name;
1607
+ if (!n) {
1608
+ console.error("[maildeno-editor] registerBlock needs a name — either as the first argument or as `name` on the definition.");
1609
+ return;
1610
+ }
1611
+ Ut.set(n, {
1612
+ ...r,
1613
+ name: n
1614
+ });
1615
+ }
1616
+ function Jt(e) {
1617
+ return Ut.get(e);
1618
+ }
1619
+ function sa() {
1620
+ return Ut;
1621
+ }
1622
+ var qr = () => {
1623
+ const e = (n, o) => {
1624
+ if (!(n?.useGradient === !0 && Array.isArray(n?.gradient?.colors) && n.gradient.colors.length >= 2)) {
1625
+ const h = n && typeof n == "object" && n.solid ? n.solid : o;
1626
+ return !h || h === "transparent" ? "" : `background-color:${h};`;
1627
+ }
1628
+ const { type: i, direction: a, colors: l } = n.gradient, c = l.map((h) => `${h.color} ${h.position}%`).join(", "), m = i === "radial" ? `radial-gradient(circle at center, ${c})` : `linear-gradient(${a}, ${c})`, b = n.solid || o || "";
1629
+ return `${b && b !== "transparent" ? `background-color:${b};` : ""}background:${m};`;
1630
+ }, t = (n, o) => n?.useGradient === !0 && Array.isArray(n?.gradient?.colors) && n.gradient.colors.length >= 2 ? {
1631
+ vmlOpen: `
1632
+ <!--[if mso]>
1633
+ <v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="t" stroke="f"
1634
+ style="mso-width-percent:1000;">
1635
+ <v:fill type="solid" color="${n.solid || o || "#ffffff"}" />
1636
+ <v:textbox style="mso-fit-shape-to-text:true;">
1637
+ <![endif]-->`,
1638
+ vmlClose: `
1639
+ <!--[if mso]>
1640
+ </v:textbox>
1641
+ </v:rect>
1642
+ <![endif]-->`
1643
+ } : {
1644
+ vmlOpen: "",
1645
+ vmlClose: ""
1646
+ };
1647
+ return { generateHTMLComponent: (n) => {
1648
+ const o = n.componentType ?? n.type, { props: i } = n;
1649
+ let a = "";
1650
+ const l = `eb-${n.id}`, c = i.margin ? `margin:${i.margin?.top ?? 0}px ${i.margin?.right ?? 0}px ${i.margin?.bottom ?? 0}px ${i.margin?.left ?? 0}px;` : "", m = i.padding ? `padding:${i.padding?.top ?? 0}px ${i.padding?.right ?? 0}px ${i.padding?.bottom ?? 0}px ${i.padding?.left ?? 0}px;` : "", b = (R, E, x) => {
1651
+ const N = [x ? `${l}-${x}` : l];
1652
+ return R && N.push("desktop-hide"), E && N.push("mobile-hide"), N.join(" ");
1653
+ }, h = Jt(o);
1654
+ return h ? h.renderEmail.html(i, {
1655
+ uid: l,
1656
+ marginStyle: c,
1657
+ paddingStyle: m,
1658
+ escapeHtml: Ft,
1659
+ escapeAttr: Ht,
1660
+ safeUrl: Dt,
1661
+ resolveBgCss: e,
1662
+ resolveBgVml: t,
1663
+ getResponsiveClasses: b,
1664
+ react: null
1665
+ }) : a;
1666
+ } };
1667
+ }, Mn = (e) => e.replace(/<br\s*\/?>/gi, "<br />"), pt = (e) => e.split(",").map((t) => t.trim().replace(/^'+|'+$/g, "").trim()).join(", "), In = (e) => e.replace(/font-family\s*:\s*([^;]+)/gi, (t, r) => `font-family:${pt(r)}`), Wr = (e) => e.trim().replace(/-([a-z])/g, (t, r) => r.toUpperCase()), Vr = (e) => e.split(";").map((t) => t.trim()).filter(Boolean).map((t) => {
1668
+ const r = t.indexOf(":");
1669
+ if (r < 0) return null;
1670
+ const n = t.slice(0, r).trim(), o = t.slice(r + 1).trim(), i = n.toLowerCase() === "font-family" ? pt(o) : In(o);
1671
+ return `${Wr(n)}: "${i}"`;
1672
+ }).filter((t) => t !== null).join(", "), Kr = (e) => e.replace(/\bcontenteditable\s*=\s*(["']?)([^"'\s>]+)\1/gi, (t, r, n) => {
1673
+ const o = n.toLowerCase();
1674
+ return o === "true" || o === "false" ? `contentEditable={${o}}` : `contentEditable="${n}"`;
1675
+ }), Yr = (e) => {
1676
+ let t = Gr(e);
1677
+ return t = Mn(t), t = Kr(t), t = t.replace(/\bstyle="([^"]*)"/g, (r, n) => `style={{ ${Vr(n)} }}`), t;
1678
+ }, Xr = () => {
1679
+ const e = (r, n) => {
1680
+ if (!(r?.useGradient === !0 && Array.isArray(r?.gradient?.colors) && r.gradient.colors.length >= 2)) {
1681
+ const b = r && typeof r == "object" && r.solid ? r.solid : n;
1682
+ return !b || b === "transparent" ? "" : `background-color:${b};`;
1683
+ }
1684
+ const { type: o, direction: i, colors: a } = r.gradient, l = a.map((b) => `${b.color} ${b.position}%`).join(", "), c = o === "radial" ? `radial-gradient(circle at center, ${l})` : `linear-gradient(${i}, ${l})`, m = r.solid || n || "";
1685
+ return `${m && m !== "transparent" ? `background-color:${m};` : ""}background:${c};`;
1686
+ };
1687
+ return { generateReactEmailComponent: (r) => {
1688
+ const n = r.componentType ?? r.type, { props: o } = r;
1689
+ let i = "";
1690
+ const a = `eb-${r.id}`, l = o.margin ? `margin:${o.margin?.top ?? 0}px ${o.margin?.right ?? 0}px ${o.margin?.bottom ?? 0}px ${o.margin?.left ?? 0}px;` : "", c = o.padding ? `padding:${o.padding?.top ?? 0}px ${o.padding?.right ?? 0}px ${o.padding?.bottom ?? 0}px ${o.padding?.left ?? 0}px;` : "", m = (R, E) => R?.useGradient === !0 && Array.isArray(R?.gradient?.colors) && R.gradient.colors.length >= 2 ? {
1691
+ vmlOpen: "",
1692
+ vmlClose: ""
1693
+ } : {
1694
+ vmlOpen: "",
1695
+ vmlClose: ""
1696
+ }, b = (R, E, x) => {
1697
+ const N = [x ? `${a}-${x}` : a];
1698
+ return R && N.push("desktop-hide"), E && N.push("mobile-hide"), N.join(" ");
1699
+ }, h = Jt(n);
1700
+ return h ? h.renderEmail.reactEmail(o, {
1701
+ uid: a,
1702
+ marginStyle: l,
1703
+ paddingStyle: c,
1704
+ escapeHtml: Ft,
1705
+ escapeAttr: Ht,
1706
+ safeUrl: Dt,
1707
+ resolveBgCss: e,
1708
+ resolveBgVml: m,
1709
+ getResponsiveClasses: b,
1710
+ react: {
1711
+ parseCssString: Qr,
1712
+ parseMarginPaddingDiscrete: Zr,
1713
+ normalizeFontFamily: pt,
1714
+ styleObj: Nn,
1715
+ normalizeInlineStylesToReact: Yr,
1716
+ buildInlineJsx: eo
1717
+ }
1718
+ }) : i;
1719
+ } };
1720
+ };
1721
+ function Qr(e) {
1722
+ const t = {};
1723
+ return e.split(";").map((r) => r.trim()).filter(Boolean).forEach((r) => {
1724
+ const n = r.indexOf(":");
1725
+ if (n < 0) return;
1726
+ const o = r.slice(0, n).trim(), i = r.slice(n + 1).trim(), a = o.replace(/-([a-z])/g, (l, c) => c.toUpperCase());
1727
+ t[a] = In(i);
1728
+ }), t;
1729
+ }
1730
+ function Zr(e, t) {
1731
+ const r = {};
1732
+ return e && (r.marginTop = `${e?.top ?? 0}px`, r.marginRight = `${e?.right ?? 0}px`, r.marginBottom = `${e?.bottom ?? 0}px`, r.marginLeft = `${e?.left ?? 0}px`), t && (r.paddingTop = `${t?.top ?? 0}px`, r.paddingRight = `${t?.right ?? 0}px`, r.paddingBottom = `${t?.bottom ?? 0}px`, r.paddingLeft = `${t?.left ?? 0}px`), r;
1733
+ }
1734
+ function Nn(e) {
1735
+ return Object.entries(e).filter(([, t]) => t != null && t !== "").map(([t, r]) => `${t}: "${r}"`).join(", ");
1736
+ }
1737
+ function eo(e, t, r, n, o) {
1738
+ return `<${e}${o ? `
1739
+ as="${o}"` : ""}
1740
+ className="${t}"
1741
+ style={{ ${Nn(r)} }}
1742
+ >
1743
+ ${n}
1744
+ </${e}>
1745
+ `;
1746
+ }
1747
+ var Bn = () => {
1748
+ const e = (a, l) => {
1749
+ if (!(a?.useGradient === !0 && Array.isArray(a?.gradient?.colors) && a.gradient.colors.length >= 2)) {
1750
+ const x = a && typeof a == "object" && a.solid ? a.solid : l;
1751
+ return !x || x === "transparent" ? "" : `background-color:${x};`;
1752
+ }
1753
+ const { type: c, direction: m, colors: b } = a.gradient, h = b.map((x) => `${x.color} ${x.position}%`).join(", "), R = c === "radial" ? `radial-gradient(circle at center, ${h})` : `linear-gradient(${m}, ${h})`, E = a.solid || l || "";
1754
+ return `${E && E !== "transparent" ? `background-color:${E};` : ""}background:${R};`;
1755
+ }, t = (a, l) => a?.useGradient === !0 && Array.isArray(a?.gradient?.colors) && a.gradient.colors.length >= 2 ? {
1756
+ vmlOpen: `
1757
+ <!--[if mso]>
1758
+ <v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="t" stroke="f"
1759
+ style="mso-width-percent:1000;">
1760
+ <v:fill type="solid" color="${a.solid || l || "#ffffff"}" />
1761
+ <v:textbox style="mso-fit-shape-to-text:true;">
1762
+ <![endif]-->`,
1763
+ vmlClose: `
1764
+ <!--[if mso]>
1765
+ </v:textbox>
1766
+ </v:rect>
1767
+ <![endif]-->`
1768
+ } : {
1769
+ vmlOpen: "",
1770
+ vmlClose: ""
1771
+ }, r = (a, l) => a && typeof a == "object" && a.solid && a.solid !== "transparent" ? a.solid : l && l !== "transparent" ? l : "", n = (a) => a ? `${a.top ?? 0}px ${a.right ?? 0}px ${a.bottom ?? 0}px ${a.left ?? 0}px` : "0px";
1772
+ return {
1773
+ generateMJMLComponent: (a) => {
1774
+ const l = a.componentType ?? a.type, { props: c } = a, m = `eb-${a.id}`, b = c.margin ? `margin:${c.margin?.top ?? 0}px ${c.margin?.right ?? 0}px ${c.margin?.bottom ?? 0}px ${c.margin?.left ?? 0}px;` : "", h = c.padding ? `padding:${c.padding?.top ?? 0}px ${c.padding?.right ?? 0}px ${c.padding?.bottom ?? 0}px ${c.padding?.left ?? 0}px;` : "", R = (x, N, j) => {
1775
+ const u = [j ? `${m}-${j}` : m];
1776
+ return x && u.push("desktop-hide"), N && u.push("mobile-hide"), u.join(" ");
1777
+ }, E = Jt(l);
1778
+ return E ? E.renderEmail.mjml(c, {
1779
+ uid: m,
1780
+ marginStyle: b,
1781
+ paddingStyle: h,
1782
+ escapeHtml: Ft,
1783
+ escapeAttr: Ht,
1784
+ safeUrl: Dt,
1785
+ resolveBgCss: e,
1786
+ resolveBgVml: t,
1787
+ getResponsiveClasses: R,
1788
+ react: null
1789
+ }) : "";
1790
+ },
1791
+ assembleMJML: (a, l, c, m, b, h = 600, R = "") => {
1792
+ const E = m ? `<mj-style inline="false">
1793
+ @import url('${m}');
1794
+ </mj-style>` : "", x = `<mj-style inline="false">
1795
+ .desktop-hide { display: none !important; }
1796
+ ul li:last-child, ol li:last-child { margin-bottom: 0 !important; }
1797
+ </mj-style>`, N = R.trim() ? `<mj-style inline="false">
1798
+ ${R}
1799
+ </mj-style>` : "", j = b.trim() ? `<mj-style inline="false">
1800
+ @media only screen and (max-width:${h}px) {
1801
+ ${b}
1802
+ }
1803
+ </mj-style>` : "", u = c.bodyBackgroundColor || "#ffffff", d = c.bodyBackgroundImage ? [
1804
+ `background-url="${c.bodyBackgroundImage}"`,
1805
+ `background-size="${c.bodyBackgroundSize || "cover"}"`,
1806
+ `background-position="${c.bodyBackgroundPosition || "center center"}"`,
1807
+ `background-repeat="${c.bodyBackgroundRepeat || "no-repeat"}"`
1808
+ ].join(" ") : "", s = c.backgroundColor || "#ffffff", y = n(c.padding);
1809
+ return `<mjml lang="${c.language}">
1810
+ <mj-head>
1811
+ ${E}
1812
+ <mj-title>${a}</mj-title>
1813
+ <mj-preview>${c.preheaderText} &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp;</mj-preview>
1814
+ <mj-attributes>
1815
+ <mj-all font-family="Arial, sans-serif" />
1816
+ </mj-attributes>
1817
+ <mj-raw>
1818
+ <meta name="color-scheme" content="light dark">
1819
+ <meta name="supported-color-schemes" content="light dark">
1820
+ <meta name="format-detection" content="telephone=no, date=no, address=no, email=no, url=no">
1821
+ </mj-raw>
1822
+ ${x}
1823
+ ${N}
1824
+ ${j}
1825
+ </mj-head>
1826
+ <mj-body background-color="${u}" width="${c.width ?? 600}px">
1827
+ <mj-wrapper full-width="full-width" ${d} padding="0">
1828
+ <mj-section background-color="${s}" padding="${y}">
1829
+ ${l}
1830
+ </mj-section>
1831
+ </mj-wrapper>
1832
+ </mj-body>
1833
+ </mjml>`;
1834
+ },
1835
+ resolveSolidColor: r,
1836
+ padAttr: n
1837
+ };
1838
+ }, On = /* @__PURE__ */ Symbol("maildeno-editor:info-dialog");
1839
+ function la() {
1840
+ const e = jn();
1841
+ return Ie(On, e), e;
1842
+ }
1843
+ var to = () => {
1844
+ const e = Oe(On);
1845
+ return e || (console.warn("[maildeno-editor] useInfoDialog() couldn't find a provided instance — falling back to a standalone instance (open() won't visibly show anything)."), jn());
1846
+ };
1847
+ function jn() {
1848
+ const e = L(!1), t = L("Info"), r = L("");
1849
+ return {
1850
+ visible: e,
1851
+ header: t,
1852
+ message: r,
1853
+ open: (o, i = "Info") => {
1854
+ r.value = o, t.value = i, e.value = !0;
1855
+ }
1856
+ };
1857
+ }
1858
+ var ca = ["is_empty", "is_not_empty"], ua = ["in", "not_in"], da = [
1859
+ ">",
1860
+ "<",
1861
+ ">=",
1862
+ "<="
1863
+ ], pa = [
1864
+ "date_before",
1865
+ "date_after",
1866
+ "date_on"
1867
+ ], ma = [
1868
+ {
1869
+ label: "Equals ==",
1870
+ value: "=="
1871
+ },
1872
+ {
1873
+ label: "Not Equals !=",
1874
+ value: "!="
1875
+ },
1876
+ {
1877
+ label: "Contains",
1878
+ value: "contains"
1879
+ },
1880
+ {
1881
+ label: "Not Contains",
1882
+ value: "not_contains"
1883
+ },
1884
+ {
1885
+ label: "Starts With",
1886
+ value: "starts_with"
1887
+ },
1888
+ {
1889
+ label: "Ends With",
1890
+ value: "ends_with"
1891
+ },
1892
+ {
1893
+ label: "In List (comma-separated)",
1894
+ value: "in"
1895
+ },
1896
+ {
1897
+ label: "Not In List (comma-separated)",
1898
+ value: "not_in"
1899
+ },
1900
+ {
1901
+ label: "Greater Than > (numeric)",
1902
+ value: ">"
1903
+ },
1904
+ {
1905
+ label: "Less Than < (numeric)",
1906
+ value: "<"
1907
+ },
1908
+ {
1909
+ label: "Greater Than or Equal >=",
1910
+ value: ">="
1911
+ },
1912
+ {
1913
+ label: "Less Than or Equal <=",
1914
+ value: "<="
1915
+ },
1916
+ {
1917
+ label: "Date Before",
1918
+ value: "date_before"
1919
+ },
1920
+ {
1921
+ label: "Date After",
1922
+ value: "date_after"
1923
+ },
1924
+ {
1925
+ label: "Date On",
1926
+ value: "date_on"
1927
+ },
1928
+ {
1929
+ label: "Is Empty",
1930
+ value: "is_empty"
1931
+ },
1932
+ {
1933
+ label: "Is Not Empty",
1934
+ value: "is_not_empty"
1935
+ }
1936
+ ], sn = (e) => e.split(/[,\n;]+/).map((t) => t.trim()).filter(Boolean), Qe = (e, t) => [parseFloat(e ?? ""), parseFloat(t)], Ze = (e, t) => !isNaN(e) && !isNaN(t), Ee = (e) => {
1937
+ if (!e?.trim()) return null;
1938
+ const t = /^\d{4}-\d{2}-\d{2}$/.test(e.trim()) ? /* @__PURE__ */ new Date(`${e.trim()}T00:00:00Z`) : new Date(e.trim());
1939
+ return isNaN(t.getTime()) ? null : new Date(Date.UTC(t.getUTCFullYear(), t.getUTCMonth(), t.getUTCDate()));
1940
+ }, Nt = (e, t) => {
1941
+ const r = t[e.tag.toLowerCase()], n = r?.toLowerCase() ?? "", o = e.value.toLowerCase();
1942
+ switch (e.operator) {
1943
+ case "==":
1944
+ return n === o;
1945
+ case "!=":
1946
+ return n !== o;
1947
+ case "contains":
1948
+ return n.includes(o);
1949
+ case "not_contains":
1950
+ return !n.includes(o);
1951
+ case "starts_with":
1952
+ return n.startsWith(o);
1953
+ case "ends_with":
1954
+ return n.endsWith(o);
1955
+ case "in":
1956
+ return sn(o).includes(n);
1957
+ case "not_in":
1958
+ return !sn(o).includes(n);
1959
+ case ">": {
1960
+ const [i, a] = Qe(r, e.value);
1961
+ return Ze(i, a) && i > a;
1962
+ }
1963
+ case "<": {
1964
+ const [i, a] = Qe(r, e.value);
1965
+ return Ze(i, a) && i < a;
1966
+ }
1967
+ case ">=": {
1968
+ const [i, a] = Qe(r, e.value);
1969
+ return Ze(i, a) && i >= a;
1970
+ }
1971
+ case "<=": {
1972
+ const [i, a] = Qe(r, e.value);
1973
+ return Ze(i, a) && i <= a;
1974
+ }
1975
+ case "date_before": {
1976
+ const i = Ee(r), a = Ee(e.value);
1977
+ return i !== null && a !== null && i.getTime() < a.getTime();
1978
+ }
1979
+ case "date_after": {
1980
+ const i = Ee(r), a = Ee(e.value);
1981
+ return i !== null && a !== null && i.getTime() > a.getTime();
1982
+ }
1983
+ case "date_on": {
1984
+ const i = Ee(r), a = Ee(e.value);
1985
+ return i !== null && a !== null && i.getTime() === a.getTime();
1986
+ }
1987
+ case "is_empty":
1988
+ return r === void 0 || r.trim() === "";
1989
+ case "is_not_empty":
1990
+ return r !== void 0 && r.trim() !== "";
1991
+ default:
1992
+ return !0;
1993
+ }
1994
+ }, ln = (e, t) => {
1995
+ if (!e.rules.length) return !0;
1996
+ const r = e.rules.map((n) => Nt(n, t));
1997
+ return e.match === "any" ? r.some(Boolean) : r.every(Boolean);
1998
+ }, mt = () => ({
1999
+ evaluateVisibility: (t, r) => {
2000
+ if (!t?.enabled) return !0;
2001
+ const n = t.rules?.length > 0, o = (t.groups?.length ?? 0) > 0;
2002
+ if (!n && !o) return !0;
2003
+ const i = (t.rules ?? []).map((c) => Nt(c, r)), a = (t.groups ?? []).map((c) => ln(c, r)), l = [...i, ...a];
2004
+ return t.match === "any" ? l.some(Boolean) : l.every(Boolean);
2005
+ },
2006
+ evaluateRule: Nt,
2007
+ evaluateGroup: ln
2008
+ }), zn = (e) => {
2009
+ const { type: t, direction: r, colors: n } = e.gradient, o = n.map((i) => `${i.color} ${i.position}%`).join(", ");
2010
+ return t === "radial" ? `radial-gradient(circle at center, ${o})` : `linear-gradient(${r}, ${o})`;
2011
+ }, ue = (e) => {
2012
+ const t = [], r = e.backgroundGradient;
2013
+ if (r?.useGradient === !0 && Array.isArray(r?.gradient?.colors) && r.gradient.colors.length >= 2) {
2014
+ const n = zn(r), o = r.solid || e.backgroundColor || "";
2015
+ o && o !== "transparent" && t.push(`background-color:${o}`), t.push(`background:${n}`);
2016
+ } else e.backgroundColor && e.backgroundColor !== "transparent" && t.push(`background-color:${e.backgroundColor}`);
2017
+ return e.backgroundImage && (t.push(`background-image:url('${e.backgroundImage}')`), t.push(`background-size:${e.backgroundSize}`), t.push(`background-position:${e.backgroundPosition}`), t.push(`background-repeat:${e.backgroundRepeat}`)), t;
2018
+ }, et = (e) => {
2019
+ const t = {}, r = e.backgroundGradient;
2020
+ if (r?.useGradient === !0 && Array.isArray(r?.gradient?.colors) && r.gradient.colors.length >= 2) {
2021
+ const n = zn(r), o = r.solid || e.backgroundColor || "";
2022
+ o && o !== "transparent" && (t.backgroundColor = o), t.background = n;
2023
+ } else e.backgroundColor && e.backgroundColor !== "transparent" && (t.backgroundColor = e.backgroundColor);
2024
+ return e.backgroundImage && (t.backgroundImage = `url(${e.backgroundImage})`, t.backgroundSize = e.backgroundSize, t.backgroundPosition = e.backgroundPosition, t.backgroundRepeat = e.backgroundRepeat), t;
2025
+ }, no = 5, Ln = (e, t, r) => {
2026
+ if (!(r >= no) && Array.isArray(e))
2027
+ for (const n of e) {
2028
+ if (!n || n.type === "row-spacer") continue;
2029
+ n.mobileStack && (n.gap ?? 0) > 0 && t.add(n.gap);
2030
+ const o = n.columns;
2031
+ if (Array.isArray(o))
2032
+ for (const i of o) {
2033
+ const a = i?.children ?? i?.components;
2034
+ if (!Array.isArray(a) || a.length === 0) continue;
2035
+ const l = a.filter((c) => c?.type === "row");
2036
+ l.length > 0 && Ln(l, t, r + 1);
2037
+ }
2038
+ }
2039
+ }, Pn = (e) => {
2040
+ const t = /* @__PURE__ */ new Set();
2041
+ if (Ln(e, t, 0), t.size === 0) return "";
2042
+ const r = [...t].sort((n, o) => n - o);
2043
+ return `${r.map((n) => `.mobile-stack.gap-${n}`).join(`,
2044
+ `) + " { display:block !important; width:100% !important; }"}
2045
+ ${r.map((n) => `.mobile-stack.gap-${n} { height:${n}px !important; line-height:${n}px !important; }`).join(`
2046
+ `)}`;
2047
+ }, tt = L(/* @__PURE__ */ new Set()), ft = () => {
2048
+ const e = L([
2049
+ "Arial",
2050
+ "Arial Black",
2051
+ "Comic Sans MS",
2052
+ "Courier New",
2053
+ "Georgia",
2054
+ "Helvetica",
2055
+ "Impact",
2056
+ "Lucida Console",
2057
+ "Lucida Sans Unicode",
2058
+ "Palatino Linotype",
2059
+ "Tahoma",
2060
+ "Times New Roman",
2061
+ "Trebuchet MS",
2062
+ "Verdana",
2063
+ "ABeeZee",
2064
+ "Abel",
2065
+ "Abril Fatface",
2066
+ "Adamina",
2067
+ "Alegreya",
2068
+ "Alegreya Sans",
2069
+ "Alfa Slab One",
2070
+ "Alice",
2071
+ "Amatic SC",
2072
+ "Amiri",
2073
+ "Anton",
2074
+ "Archivo",
2075
+ "Archivo Black",
2076
+ "Archivo Narrow",
2077
+ "Arimo",
2078
+ "Arvo",
2079
+ "Asap",
2080
+ "Asap Condensed",
2081
+ "Assistant",
2082
+ "Atkinson Hyperlegible",
2083
+ "Barlow",
2084
+ "Barlow Condensed",
2085
+ "Barlow Semi Condensed",
2086
+ "Be Vietnam Pro",
2087
+ "Bebas Neue",
2088
+ "BioRhyme",
2089
+ "Bitter",
2090
+ "Bodoni Moda",
2091
+ "Bree Serif",
2092
+ "Bricolage Grotesque",
2093
+ "Cabin",
2094
+ "Cabin Condensed",
2095
+ "Cairo",
2096
+ "Cal Sans",
2097
+ "Cardo",
2098
+ "Catamaran",
2099
+ "Caveat",
2100
+ "Chivo",
2101
+ "Comfortaa",
2102
+ "Commissioner",
2103
+ "Cormorant",
2104
+ "Cormorant Garamond",
2105
+ "Courier Prime",
2106
+ "Crimson Pro",
2107
+ "Crimson Text",
2108
+ "DM Mono",
2109
+ "DM Sans",
2110
+ "DM Serif Display",
2111
+ "DM Serif Text",
2112
+ "Dancing Script",
2113
+ "Domine",
2114
+ "Dosis",
2115
+ "EB Garamond",
2116
+ "Eczar",
2117
+ "Epilogue",
2118
+ "Exo",
2119
+ "Exo 2",
2120
+ "Figtree",
2121
+ "Fira Code",
2122
+ "Fira Mono",
2123
+ "Fira Sans",
2124
+ "Fira Sans Condensed",
2125
+ "Fjalla One",
2126
+ "Frank Ruhl Libre",
2127
+ "Fraunces",
2128
+ "Fredoka",
2129
+ "Funnel Sans",
2130
+ "Geist Mono",
2131
+ "Geologica",
2132
+ "Hanken Grotesk",
2133
+ "Heebo",
2134
+ "Hind",
2135
+ "Hind Madurai",
2136
+ "Hind Siliguri",
2137
+ "IBM Plex Mono",
2138
+ "IBM Plex Sans",
2139
+ "IBM Plex Sans Condensed",
2140
+ "IBM Plex Serif",
2141
+ "Inconsolata",
2142
+ "Inknut Antiqua",
2143
+ "Instrument Sans",
2144
+ "Instrument Serif",
2145
+ "Inter",
2146
+ "Inter Tight",
2147
+ "JetBrains Mono",
2148
+ "Josefin Sans",
2149
+ "Josefin Slab",
2150
+ "Jost",
2151
+ "Kalam",
2152
+ "Kanit",
2153
+ "Karla",
2154
+ "Khand",
2155
+ "Kumbh Sans",
2156
+ "Lato",
2157
+ "Lexend",
2158
+ "Lexend Deca",
2159
+ "Libre Baskerville",
2160
+ "Libre Bodoni",
2161
+ "Libre Caslon Text",
2162
+ "Libre Franklin",
2163
+ "Lobster",
2164
+ "Lora",
2165
+ "Manrope",
2166
+ "Marcellus",
2167
+ "Maven Pro",
2168
+ "Merriweather",
2169
+ "Merriweather Sans",
2170
+ "Mohave",
2171
+ "Montserrat",
2172
+ "Montserrat Alternates",
2173
+ "Mukta",
2174
+ "Mulish",
2175
+ "Neuton",
2176
+ "Newsreader",
2177
+ "Noticia Text",
2178
+ "Noto Sans",
2179
+ "Noto Sans Display",
2180
+ "Noto Sans Mono",
2181
+ "Noto Serif",
2182
+ "Noto Serif Display",
2183
+ "Nunito",
2184
+ "Nunito Sans",
2185
+ "Old Standard TT",
2186
+ "Onest",
2187
+ "Open Sans",
2188
+ "Oswald",
2189
+ "Outfit",
2190
+ "Overpass",
2191
+ "Overpass Mono",
2192
+ "Oxygen",
2193
+ "PT Mono",
2194
+ "PT Sans",
2195
+ "PT Sans Narrow",
2196
+ "PT Serif",
2197
+ "Pacifico",
2198
+ "Padauk",
2199
+ "Petrona",
2200
+ "Philosopher",
2201
+ "Piazzolla",
2202
+ "Playfair",
2203
+ "Playfair Display",
2204
+ "Playfair Display SC",
2205
+ "Plus Jakarta Sans",
2206
+ "Poppins",
2207
+ "Prata",
2208
+ "Prompt",
2209
+ "Proza Libre",
2210
+ "Public Sans",
2211
+ "Quattrocento",
2212
+ "Quattrocento Sans",
2213
+ "Questrial",
2214
+ "Quicksand",
2215
+ "REM",
2216
+ "Radio Canada",
2217
+ "Raleway",
2218
+ "Readex Pro",
2219
+ "Recursive",
2220
+ "Red Hat Display",
2221
+ "Red Hat Mono",
2222
+ "Red Hat Text",
2223
+ "Roboto",
2224
+ "Roboto Condensed",
2225
+ "Roboto Flex",
2226
+ "Roboto Mono",
2227
+ "Roboto Serif",
2228
+ "Roboto Slab",
2229
+ "Rokkitt",
2230
+ "Rubik",
2231
+ "Saira",
2232
+ "Saira Condensed",
2233
+ "Sanchez",
2234
+ "Sansita",
2235
+ "Sarabun",
2236
+ "Sen",
2237
+ "Signika",
2238
+ "Signika Negative",
2239
+ "Sintony",
2240
+ "Smooch Sans",
2241
+ "Sofia Sans",
2242
+ "Sono",
2243
+ "Sora",
2244
+ "Source Code Pro",
2245
+ "Source Sans 3",
2246
+ "Source Sans Pro",
2247
+ "Source Serif 4",
2248
+ "Source Serif Pro",
2249
+ "Space Grotesk",
2250
+ "Space Mono",
2251
+ "Spectral",
2252
+ "Syne",
2253
+ "Tajawal",
2254
+ "Teko",
2255
+ "Tenor Sans",
2256
+ "TikTok Sans",
2257
+ "Tinos",
2258
+ "Titillium Web",
2259
+ "Ubuntu",
2260
+ "Ubuntu Mono",
2261
+ "Unbounded",
2262
+ "Urbanist",
2263
+ "Vazirmatn",
2264
+ "Vollkorn",
2265
+ "Wix Madefor Display",
2266
+ "Wix Madefor Text",
2267
+ "Work Sans",
2268
+ "Yanone Kaffeesatz",
2269
+ "Yrsa",
2270
+ "Zilla Slab"
2271
+ ]), t = /* @__PURE__ */ new Set([
2272
+ "Arial",
2273
+ "Arial Black",
2274
+ "Comic Sans MS",
2275
+ "Courier New",
2276
+ "Georgia",
2277
+ "Helvetica",
2278
+ "Impact",
2279
+ "Lucida Console",
2280
+ "Lucida Sans Unicode",
2281
+ "Palatino Linotype",
2282
+ "Tahoma",
2283
+ "Times New Roman",
2284
+ "Trebuchet MS",
2285
+ "Verdana"
2286
+ ]), r = /* @__PURE__ */ new Set([
2287
+ "Alegreya",
2288
+ "Alegreya Sans",
2289
+ "Archivo",
2290
+ "Archivo Narrow",
2291
+ "Arimo",
2292
+ "Arvo",
2293
+ "Asap",
2294
+ "Asap Condensed",
2295
+ "Assistant",
2296
+ "Atkinson Hyperlegible",
2297
+ "Barlow",
2298
+ "Barlow Condensed",
2299
+ "Barlow Semi Condensed",
2300
+ "Be Vietnam Pro",
2301
+ "Bitter",
2302
+ "Bree Serif",
2303
+ "Cabin",
2304
+ "Cabin Condensed",
2305
+ "Cardo",
2306
+ "Catamaran",
2307
+ "Chivo",
2308
+ "Commissioner",
2309
+ "Cormorant",
2310
+ "Cormorant Garamond",
2311
+ "Courier Prime",
2312
+ "Crimson Pro",
2313
+ "Crimson Text",
2314
+ "DM Sans",
2315
+ "DM Serif Text",
2316
+ "Domine",
2317
+ "EB Garamond",
2318
+ "Eczar",
2319
+ "Epilogue",
2320
+ "Exo",
2321
+ "Exo 2",
2322
+ "Figtree",
2323
+ "Fira Code",
2324
+ "Fira Sans",
2325
+ "Fira Sans Condensed",
2326
+ "Frank Ruhl Libre",
2327
+ "Fraunces",
2328
+ "Hanken Grotesk",
2329
+ "Heebo",
2330
+ "IBM Plex Mono",
2331
+ "IBM Plex Sans",
2332
+ "IBM Plex Sans Condensed",
2333
+ "IBM Plex Serif",
2334
+ "Inconsolata",
2335
+ "Instrument Sans",
2336
+ "Instrument Serif",
2337
+ "Inter",
2338
+ "Inter Tight",
2339
+ "JetBrains Mono",
2340
+ "Josefin Sans",
2341
+ "Josefin Slab",
2342
+ "Jost",
2343
+ "Karla",
2344
+ "Lato",
2345
+ "Libre Baskerville",
2346
+ "Libre Bodoni",
2347
+ "Libre Caslon Text",
2348
+ "Libre Franklin",
2349
+ "Lora",
2350
+ "Manrope",
2351
+ "Maven Pro",
2352
+ "Merriweather",
2353
+ "Merriweather Sans",
2354
+ "Montserrat",
2355
+ "Mulish",
2356
+ "Neuton",
2357
+ "Newsreader",
2358
+ "Noticia Text",
2359
+ "Noto Sans",
2360
+ "Noto Sans Display",
2361
+ "Noto Serif",
2362
+ "Noto Serif Display",
2363
+ "Nunito",
2364
+ "Nunito Sans",
2365
+ "Open Sans",
2366
+ "Oswald",
2367
+ "Outfit",
2368
+ "Overpass",
2369
+ "Overpass Mono",
2370
+ "Oxygen",
2371
+ "PT Sans",
2372
+ "PT Serif",
2373
+ "Petrona",
2374
+ "Piazzolla",
2375
+ "Playfair",
2376
+ "Playfair Display",
2377
+ "Plus Jakarta Sans",
2378
+ "Poppins",
2379
+ "Proza Libre",
2380
+ "Public Sans",
2381
+ "Quattrocento",
2382
+ "Quattrocento Sans",
2383
+ "Quicksand",
2384
+ "Radio Canada",
2385
+ "Raleway",
2386
+ "Readex Pro",
2387
+ "Recursive",
2388
+ "Red Hat Display",
2389
+ "Red Hat Mono",
2390
+ "Red Hat Text",
2391
+ "Roboto",
2392
+ "Roboto Condensed",
2393
+ "Roboto Mono",
2394
+ "Roboto Serif",
2395
+ "Roboto Slab",
2396
+ "Rokkitt",
2397
+ "Rubik",
2398
+ "Saira",
2399
+ "Saira Condensed",
2400
+ "Sansita",
2401
+ "Sarabun",
2402
+ "Signika Negative",
2403
+ "Source Code Pro",
2404
+ "Source Sans 3",
2405
+ "Source Sans Pro",
2406
+ "Source Serif 4",
2407
+ "Source Serif Pro",
2408
+ "Spectral",
2409
+ "Tajawal",
2410
+ "Tinos",
2411
+ "Titillium Web",
2412
+ "Ubuntu",
2413
+ "Ubuntu Mono",
2414
+ "Vazirmatn",
2415
+ "Vollkorn",
2416
+ "Wix Madefor Display",
2417
+ "Wix Madefor Text",
2418
+ "Work Sans",
2419
+ "Yrsa",
2420
+ "Zilla Slab"
2421
+ ]), n = [
2422
+ 400,
2423
+ 500,
2424
+ 600,
2425
+ 700
2426
+ ], o = (h) => t.has(h), i = (h) => h.trim().replace(/\s+/g, "+"), a = (h) => {
2427
+ if (r.has(h)) {
2428
+ const R = n.map((x) => `0,${x}`), E = n.map((x) => `1,${x}`);
2429
+ return `ital,wght@${[...R, ...E].join(";")}`;
2430
+ }
2431
+ return `wght@${n.join(";")}`;
2432
+ }, l = (h) => {
2433
+ if (!h || o(h) || tt.value.has(h)) return;
2434
+ const R = document.createElement("link");
2435
+ R.rel = "stylesheet", R.href = `https://fonts.googleapis.com/css2?family=${i(h)}:${a(h)}&display=swap`, document.head.appendChild(R), tt.value.add(h);
2436
+ }, c = (h) => {
2437
+ const R = Array.from(new Set(h)).filter((E) => E && !o(E));
2438
+ return R.length ? `https://fonts.googleapis.com/css2?${R.map((E) => `family=${i(E)}:${a(E)}`).join("&")}&display=swap` : "";
2439
+ };
2440
+ return {
2441
+ googleFonts: e,
2442
+ loadGoogleFont: l,
2443
+ getGoogleFontImports: c,
2444
+ syncFontsForTemplate: (h) => {
2445
+ if (!h || h.length === 0) return;
2446
+ const R = [], E = /* @__PURE__ */ new Set();
2447
+ for (const j of h)
2448
+ j && (E.has(j) || (E.add(j), !o(j) && (tt.value.has(j) || R.push(j))));
2449
+ if (R.length === 0) return;
2450
+ const x = c(R);
2451
+ if (!x) return;
2452
+ const N = document.createElement("link");
2453
+ N.rel = "stylesheet", N.href = x, N.dataset.canvasFonts = R.join(","), document.head.appendChild(N);
2454
+ for (const j of R) tt.value.add(j);
2455
+ },
2456
+ preconnectGoogleFonts: () => {
2457
+ if (typeof document > "u") return;
2458
+ const h = (R, E = !1) => {
2459
+ const x = `link[rel="preconnect"][href="${R}"]`;
2460
+ if (document.head.querySelector(x)) return;
2461
+ const N = document.createElement("link");
2462
+ N.rel = "preconnect", N.href = R, E && (N.crossOrigin = "anonymous"), document.head.appendChild(N);
2463
+ };
2464
+ h("https://fonts.googleapis.com"), h("https://fonts.gstatic.com", !0);
2465
+ },
2466
+ isWebSafeFont: o,
2467
+ WEB_SAFE_FONTS: t,
2468
+ FONTS_WITH_ITALICS: r,
2469
+ DEFAULT_WEIGHTS: n
2470
+ };
2471
+ };
2472
+ function Je(e) {
2473
+ if (typeof e != "string") return "auto";
2474
+ const t = e.trim().toLowerCase();
2475
+ return /^(?:auto|(?:\d+(?:\.\d+)?|\.\d+)(?:px|%))$/.test(t) ? t : "auto";
2476
+ }
2477
+ function ro(e) {
2478
+ const t = Je(e.width), r = Je(e.height);
2479
+ return [
2480
+ t,
2481
+ r,
2482
+ e.mobile?.width,
2483
+ e.mobile?.height
2484
+ ].some((n) => Je(n) !== "auto") ? {
2485
+ width: t,
2486
+ height: r,
2487
+ boxSizing: "border-box",
2488
+ textAlign: "center"
2489
+ } : {};
2490
+ }
2491
+ function oo(e, t) {
2492
+ const r = t === "width" ? "100%" : "auto";
2493
+ if (typeof e != "string" && typeof e != "number") return r;
2494
+ let n = String(e).trim().toLowerCase();
2495
+ if (/^(?:\d+(?:\.\d+)?|\.\d+)$/.test(n) && (n += t === "width" ? "%" : "px"), t === "height" && n.endsWith("%")) return r;
2496
+ const o = Je(n);
2497
+ return o === "auto" && n !== "auto" ? r : o;
2498
+ }
2499
+ var Gt = () => ({ emailMobileStyles: (t, r) => {
2500
+ const n = t.componentType ?? t.type, o = t.props.mobileStack === !0, i = t.props.mobile;
2501
+ if (!i && !(n === "menu" && o)) return "";
2502
+ const a = i ?? {}, l = [], c = [], m = [], b = (/* @__PURE__ */ new Set(["button", "anchor"])).has(n), h = n === "button" && !!ro(t.props).width, R = (/* @__PURE__ */ new Set(["menu", "socials"])).has(n), E = (u, d) => {
2503
+ d && u.push(d);
2504
+ }, x = () => {
2505
+ const u = a.backgroundGradient;
2506
+ if (u != null) {
2507
+ if (u.useGradient === !0 && Array.isArray(u.gradient?.colors) && u.gradient.colors.length >= 2) {
2508
+ const { type: s, direction: y, colors: C } = u.gradient, _ = C.map((w) => `${w.color} ${w.position}%`).join(", "), f = s === "radial" ? `radial-gradient(circle at center, ${_})` : `linear-gradient(${y}, ${_})`, p = u.solid || a.backgroundColor || "", g = [];
2509
+ return g.push(`background-color: ${p && p !== "transparent" ? p : "transparent"} !important`), g.push(`background: ${f} !important`), g;
2510
+ }
2511
+ const d = u.solid ?? a.backgroundColor;
2512
+ return d != null ? ["background: none !important", `background-color: ${d} !important`] : [];
2513
+ }
2514
+ return a.backgroundColor != null ? ["background: none !important", `background-color: ${a.backgroundColor} !important`] : [];
2515
+ }, N = (u) => {
2516
+ E(u, a.fontSize != null && `font-size: ${a.fontSize}px !important`), E(u, a.lineHeight != null && `line-height: ${a.lineHeight} !important`), E(u, a.letterSpacing != null && `letter-spacing: ${a.letterSpacing}px !important`), E(u, a.color != null && `color: ${a.color} !important`), E(u, a.fontWeight != null && `font-weight: ${a.fontWeight} !important`), E(u, a.fontFamily != null && `font-family: '${a.fontFamily}', Arial, sans-serif !important`), E(u, a.fontStyle != null && `font-style: ${a.fontStyle} !important`), E(u, a.textTransform != null && `text-transform: ${a.textTransform} !important`), E(u, a.textDecoration != null && `text-decoration: ${a.textDecoration} !important`), h || u.push(...x());
2517
+ };
2518
+ if (a.margin) {
2519
+ const u = a.margin;
2520
+ l.push(`margin: ${u.top}px ${u.right}px ${u.bottom}px ${u.left}px !important`);
2521
+ }
2522
+ if (a.padding && !b && !R) {
2523
+ const u = a.padding;
2524
+ l.push(`padding: ${u.top}px ${u.right}px ${u.bottom}px ${u.left}px !important`);
2525
+ }
2526
+ if (a.align != null && !R && l.push(`text-align: ${a.align} !important`), b) {
2527
+ N(c);
2528
+ const u = h ? x() : c;
2529
+ if (a.padding) {
2530
+ const d = a.padding, s = `padding: ${d.top}px ${d.right}px ${d.bottom}px ${d.left}px !important`;
2531
+ h ? m.push(`.${r}-button-content { ${s} }`) : c.push(s);
2532
+ }
2533
+ if (a.border) {
2534
+ const d = a.border;
2535
+ u.push(de(d, !0));
2536
+ }
2537
+ if (a.borderRadius != null && u.push(`border-radius: ${X(a.borderRadius)} !important`), n === "button") {
2538
+ for (const s of ["width", "height"]) a[s] != null && u.push(`${s}: ${Je(a[s])} !important`);
2539
+ const d = [];
2540
+ E(d, a.fontSize != null && `font-size: ${a.fontSize}px !important`), E(d, a.letterSpacing != null && `letter-spacing: ${a.letterSpacing}px !important`), E(d, a.color != null && `color: ${a.color} !important`), E(d, a.fontWeight != null && `font-weight: ${a.fontWeight} !important`), E(d, a.fontFamily != null && `font-family: '${a.fontFamily}', Arial, sans-serif !important`), E(d, a.fontStyle != null && `font-style: ${a.fontStyle} !important`), E(d, a.textTransform != null && `text-transform: ${a.textTransform} !important`), E(d, a.textDecoration != null && `text-decoration: ${a.textDecoration} !important`), d.length > 0 && m.push(`.${r}-text { ${d.join("; ")} }`);
2541
+ }
2542
+ h && u.length > 0 && m.push(`.${r}-button-table { ${u.join("; ")} }`);
2543
+ } else if (n === "image") {
2544
+ for (const u of ["width", "height"]) a[u] != null && c.push(`${u}: ${oo(a[u], u)} !important`);
2545
+ E(c, a.borderRadius != null && `border-radius: ${X(a.borderRadius)} !important`), E(c, a.border != null && de(a.border, !0));
2546
+ } else if (n === "video")
2547
+ E(c, a.width != null && `width: ${a.width}% !important`), E(c, a.height != null && `height: ${a.height} !important`), E(c, a.borderRadius != null && `border-radius: ${X(a.borderRadius)} !important`), E(c, a.border != null && de(a.border, !0));
2548
+ else if (n === "divider") {
2549
+ const u = [], d = [];
2550
+ if (a.width != null && u.push(`width: ${a.width}% !important`), a.align != null) {
2551
+ const s = a.align === "left" ? "0" : "auto", y = a.align === "right" ? "0" : "auto";
2552
+ u.push(`margin-left: ${s} !important`), u.push(`margin-right: ${y} !important`);
2553
+ }
2554
+ a.height != null && (d.push(`height: ${a.height}px !important`), d.push(`line-height: ${a.height}px !important`)), d.push(...x()), u.length > 0 && m.push(`.${r}-divider-table { ${u.join("; ")} }`), d.length > 0 && m.push(`.${r}-divider-td { ${d.join("; ")} }`);
2555
+ } else if (n === "spacer") {
2556
+ const u = [];
2557
+ a.height != null && (u.push(`height: ${a.height}px !important`), u.push(`line-height: ${a.height}px !important`)), u.push(...x()), u.length > 0 && m.push(`.${r}-spacer-td { ${u.join("; ")} }`);
2558
+ } else if (n === "list")
2559
+ N(l), a.itemSpacing != null && m.push(`.${r} li { margin-bottom: ${a.itemSpacing}px !important; }`);
2560
+ else if (n === "menu") {
2561
+ const u = [];
2562
+ if (u.push(...x()), a.padding) {
2563
+ const s = a.padding;
2564
+ u.push(`padding: ${s.top}px ${s.right}px ${s.bottom}px ${s.left}px !important`);
2565
+ }
2566
+ u.length > 0 && m.push(`.${r}-menu-td { ${u.join("; ")} }`), a.align != null && m.push(`.${r}-menu-td { text-align: ${a.align} !important; }`);
2567
+ const d = [];
2568
+ if (a.fontSize != null && d.push(`font-size: ${a.fontSize}px !important`), a.lineHeight != null && d.push(`line-height: ${a.lineHeight} !important`), a.letterSpacing != null && d.push(`letter-spacing: ${a.letterSpacing}px !important`), a.color != null && d.push(`color: ${a.color} !important`), a.fontWeight != null && d.push(`font-weight: ${a.fontWeight} !important`), a.fontFamily != null && d.push(`font-family: '${a.fontFamily}', Arial, sans-serif !important`), a.fontStyle != null && d.push(`font-style: ${a.fontStyle} !important`), a.textTransform != null && d.push(`text-transform: ${a.textTransform} !important`), a.textDecoration != null && d.push(`text-decoration: ${a.textDecoration} !important`), d.length > 0 && m.push(`.${r}-menu-td a { ${d.join("; ")} }`), o) {
2569
+ const s = a.spacing ?? t.props.spacing ?? 0;
2570
+ m.push(`.${r}-menu-item a { display: block !important; white-space: normal !important; margin-left: 0 !important; margin-right: 0 !important; margin-bottom: ${s}px !important; }`), m.push(`.${r}-menu-item:last-of-type a { margin-bottom: 0 !important; }`);
2571
+ } else if (a.spacing != null) {
2572
+ const s = Math.ceil(a.spacing / 2);
2573
+ m.push(`.${r}-menu-item a { margin-left: ${s}px !important; margin-right: ${s}px !important; }`), m.push(`.${r}-menu-item:first-of-type a { margin-left: 0 !important; }`), m.push(`.${r}-menu-item:last-of-type a { margin-right: 0 !important; }`);
2574
+ }
2575
+ } else if (n === "socials") {
2576
+ const u = [];
2577
+ if (a.padding) {
2578
+ const d = a.padding;
2579
+ u.push(`padding: ${d.top}px ${d.right}px ${d.bottom}px ${d.left}px !important`);
2580
+ }
2581
+ if (a.align != null) {
2582
+ const d = a.align === "left" ? "0" : "auto", s = a.align === "right" ? "0" : "auto";
2583
+ m.push(`.${r}-socials-inner { display:inline-table !important; margin-left: ${d} !important; margin-right: ${s} !important; }`), u.push(`text-align: ${a.align} !important`);
2584
+ }
2585
+ if (u.length > 0 && m.push(`.${r}-socials-td { ${u.join("; ")} }`), a.iconSize != null && m.push(`.${r}-socials-inner img { width: ${a.iconSize}px !important; height: ${a.iconSize}px !important; }`), a.spacing != null) {
2586
+ const d = Math.ceil(a.spacing / 2);
2587
+ m.push(`.${r}-socials-item a { margin-left: ${d}px !important; margin-right: ${d}px !important; }`), m.push(`.${r}-socials-item:first-of-type a { margin-left: 0 !important; }`), m.push(`.${r}-socials-item:last-of-type a { margin-right: 0 !important; }`);
2588
+ }
2589
+ } else N(l);
2590
+ const j = [];
2591
+ if (l.length > 0 && j.push(`.${r} { ${l.join("; ")} }`), c.length > 0) {
2592
+ const u = b ? `.${r}-link` : n === "image" ? `.${r} img` : n === "video" ? `.${r} video` : `.${r}`;
2593
+ j.push(`${u} { ${c.join("; ")} }`);
2594
+ }
2595
+ return j.push(...m), j.join(`
2596
+ `);
2597
+ } }), cn = (e) => pe(e) ? de(e) : "", Dn = (e, t, r = [], n) => {
2598
+ const o = `padding:${n?.top ?? 0}px ${n?.right ?? 0}px ${n?.bottom ?? 0}px ${n?.left ?? 0}px`, i = t && re(t.radius ?? 0) && pe(t), a = t && pe(t) && !re(t.radius ?? 0);
2599
+ if (!i) {
2600
+ const m = [o];
2601
+ return a && m.push(cn(t)), m.push("line-height:0"), m.push("font-size:0"), `<div style="${m.join(";")}">${e}</div>`;
2602
+ }
2603
+ const l = [
2604
+ `border-radius:${X(t.radius)}`,
2605
+ "overflow:hidden",
2606
+ "line-height:0",
2607
+ "font-size:0"
2608
+ ];
2609
+ pe(t) && l.push(cn(t));
2610
+ const c = [
2611
+ o,
2612
+ "line-height:0",
2613
+ "font-size:0"
2614
+ ];
2615
+ return `<div style="${l.join(";")}"><div style="${c.join(";")}">${e}</div></div>`;
2616
+ }, ao = (e, t, r = {}, n, o = !0) => {
2617
+ const i = `${n?.top ?? 0}px ${n?.right ?? 0}px ${n?.bottom ?? 0}px ${n?.left ?? 0}px`, a = t && re(t.radius ?? 0) && pe(t) && o, l = t && pe(t) && !re(t.radius ?? 0) && o;
2618
+ if (!a) {
2619
+ const b = {
2620
+ padding: i,
2621
+ lineHeight: "0",
2622
+ fontSize: "0"
2623
+ };
2624
+ return l && (Object.assign(b, Rt(t)), re(t.radius ?? 0) && (b.borderRadius = X(t.radius))), `<div style={{ ${Object.entries(b).map(([h, R]) => `${h}:"${R}"`).join(", ")} }}>${e}</div>`;
2625
+ }
2626
+ const c = {
2627
+ borderRadius: X(t.radius),
2628
+ overflow: "hidden",
2629
+ lineHeight: "0",
2630
+ fontSize: "0"
2631
+ };
2632
+ pe(t) && Object.assign(c, Rt(t));
2633
+ const m = {
2634
+ padding: i,
2635
+ lineHeight: "0",
2636
+ fontSize: "0"
2637
+ };
2638
+ return `<div style={{ ${Object.entries(c).map(([b, h]) => `${b}:"${h}"`).join(", ")} }}><div style={{ ${Object.entries(m).map(([b, h]) => `${b}:"${h}"`).join(", ")} }}>${e}</div></div>`;
2639
+ }, Tt = null, At = null;
2640
+ function Fn() {
2641
+ return Tt ??= Promise.all([import("./standalone-DHvJ30Td.js"), import("./html-wb0gSX1o.js")]).then(([e, t]) => ({
2642
+ prettier: e.default ?? e,
2643
+ plugins: [t.default ?? t]
2644
+ })).catch((e) => {
2645
+ throw Tt = null, e;
2646
+ }), Tt;
2647
+ }
2648
+ function io() {
2649
+ return At ??= Promise.all([
2650
+ import("./standalone-DHvJ30Td.js"),
2651
+ import("./babel-DV7WPQI0.js"),
2652
+ import("./estree-DY9POgc0.js")
2653
+ ]).then(([e, t, r]) => ({
2654
+ prettier: e.default ?? e,
2655
+ plugins: [t.default ?? t, r.default ?? r]
2656
+ })).catch((e) => {
2657
+ throw At = null, e;
2658
+ }), At;
2659
+ }
2660
+ async function qt(e, t) {
2661
+ try {
2662
+ return await t();
2663
+ } catch (r) {
2664
+ return console.warn("[maildeno-editor] formatter unavailable; returning unformatted output", r), e;
2665
+ }
2666
+ }
2667
+ var so = async (e) => qt(e, async () => {
2668
+ const { prettier: t, plugins: r } = await Fn();
2669
+ return t.format(e, {
2670
+ parser: "html",
2671
+ plugins: r
2672
+ });
2673
+ }), lo = async (e) => qt(e, async () => {
2674
+ const { prettier: t, plugins: r } = await io();
2675
+ return t.format(e, {
2676
+ parser: "babel-ts",
2677
+ plugins: r
2678
+ });
2679
+ }), co = async (e) => qt(e, async () => {
2680
+ const { prettier: t, plugins: r } = await Fn();
2681
+ return t.format(e, {
2682
+ parser: "html",
2683
+ plugins: r
2684
+ });
2685
+ }), un = (e) => e.trim().toLowerCase().replace(/\s+/g, "_"), uo = (e) => {
2686
+ const t = e.indexOf("|");
2687
+ if (t === -1) return { key: un(e) };
2688
+ const r = e.slice(0, t), n = e.slice(t + 1).trim().replace(/^['"]|['"]$/g, "");
2689
+ return {
2690
+ key: un(r),
2691
+ pipeDefault: n
2692
+ };
2693
+ }, dn = (e, t, r) => !r || !e ? e : e.replace(/\{\{\s*([^}]+?)\s*\}\}/g, (n, o) => {
2694
+ const { key: i, pipeDefault: a } = uo(o);
2695
+ return Object.prototype.hasOwnProperty.call(t, i) && t[i] !== "" ? t[i] : a !== void 0 ? a : n;
2696
+ }), Hn = (e, t, r, n, o) => {
2697
+ let i = dn(e, t, r);
2698
+ return i = dn(i, n, o), i;
2699
+ }, Wt = /* @__PURE__ */ new Map();
2700
+ function fa(e) {
2701
+ for (const t of e) Wt.set(t.key, t);
2702
+ }
2703
+ function po() {
2704
+ return [...Wt.keys()];
2705
+ }
2706
+ function mo(e, t) {
2707
+ return Wt.get(e)?.tokens?.[t];
2708
+ }
2709
+ var Vt = {
2710
+ unsubscribe_url: {
2711
+ handlebars: "{{{unsubscribe_url}}}",
2712
+ sendgrid: "{{{unsubscribe_url}}}",
2713
+ iterable: "{{unsubscribeUrl}}",
2714
+ mailchimp: "*|UNSUB|*",
2715
+ klaviyo: "{% unsubscribe_link %}",
2716
+ liquid: "{{ unsubscribe_url }}",
2717
+ braze: "{{${set_user_to_unsubscribed_url}}}",
2718
+ hubspot: "{{ unsubscribe_link_url }}",
2719
+ sfmc: "%%unsub_center_url%%",
2720
+ activecampaign: "%UNSUBSCRIBELINK%",
2721
+ marketo: "{{system.unsubscribeLink}}",
2722
+ pardot: "%%unsubscribe%%",
2723
+ campaign_monitor: "<unsubscribe>Unsubscribe</unsubscribe>"
2724
+ },
2725
+ webview_url: {
2726
+ handlebars: "{{{webview_url}}}",
2727
+ sendgrid: "{{{webview_url}}}",
2728
+ iterable: "{{webViewUrl}}",
2729
+ mailchimp: "*|ARCHIVE|*",
2730
+ klaviyo: "{% web_view_link %}",
2731
+ liquid: "{{ webview_url }}",
2732
+ braze: "{{ webview_url }}",
2733
+ hubspot: "{{ view_as_page_url }}",
2734
+ sfmc: "%%view_email_url%%",
2735
+ activecampaign: "%VIEWINBROWSERLINK%",
2736
+ marketo: "{{system.viewAsWebpageLink}}",
2737
+ pardot: "%%view_online%%",
2738
+ campaign_monitor: "<webversion>View online</webversion>"
2739
+ },
2740
+ email: {
2741
+ handlebars: "{{ email }}",
2742
+ sendgrid: "{{ email }}",
2743
+ iterable: "{{email}}",
2744
+ mailchimp: "*|EMAIL|*",
2745
+ klaviyo: "{{ email }}",
2746
+ liquid: "{{ email }}",
2747
+ braze: "{{${email_address}}}",
2748
+ hubspot: "{{ contact.email }}",
2749
+ sfmc: "%%emailaddr%%",
2750
+ activecampaign: "%EMAIL%",
2751
+ marketo: "{{lead.Email Address}}",
2752
+ pardot: "%%email%%",
2753
+ campaign_monitor: "[email]"
2754
+ },
2755
+ first_name: {
2756
+ handlebars: "{{ first_name }}",
2757
+ sendgrid: "{{ first_name }}",
2758
+ iterable: "{{firstName}}",
2759
+ mailchimp: "*|FNAME|*",
2760
+ klaviyo: "{{ first_name }}",
2761
+ liquid: "{{ first_name }}",
2762
+ braze: "{{${first_name}}}",
2763
+ hubspot: "{{ contact.firstname }}",
2764
+ sfmc: "%%First Name%%",
2765
+ activecampaign: "%FIRSTNAME%",
2766
+ marketo: "{{lead.First Name}}",
2767
+ pardot: "%%first_name%%",
2768
+ campaign_monitor: "[firstname]"
2769
+ },
2770
+ last_name: {
2771
+ handlebars: "{{ last_name }}",
2772
+ sendgrid: "{{ last_name }}",
2773
+ iterable: "{{lastName}}",
2774
+ mailchimp: "*|LNAME|*",
2775
+ klaviyo: "{{ last_name }}",
2776
+ liquid: "{{ last_name }}",
2777
+ braze: "{{${last_name}}}",
2778
+ hubspot: "{{ contact.lastname }}",
2779
+ sfmc: "%%Last Name%%",
2780
+ activecampaign: "%LASTNAME%",
2781
+ marketo: "{{lead.Last Name}}",
2782
+ pardot: "%%last_name%%",
2783
+ campaign_monitor: "[lastname]"
2784
+ },
2785
+ full_name: {
2786
+ handlebars: "{{ full_name }}",
2787
+ sendgrid: "{{ full_name }}",
2788
+ iterable: "{{firstName}} {{lastName}}",
2789
+ mailchimp: "*|FNAME|* *|LNAME|*",
2790
+ klaviyo: "{{ first_name }} {{ last_name }}",
2791
+ liquid: "{{ full_name }}",
2792
+ braze: "{{${first_name}}} {{${last_name}}}",
2793
+ hubspot: "{{ contact.firstname }} {{ contact.lastname }}",
2794
+ sfmc: "%%First Name%% %%Last Name%%",
2795
+ activecampaign: "%FIRSTNAME% %LASTNAME%",
2796
+ marketo: "{{lead.Full Name}}",
2797
+ pardot: "%%full_name%%"
2798
+ },
2799
+ company: {
2800
+ handlebars: "{{ company }}",
2801
+ sendgrid: "{{ company }}",
2802
+ iterable: "{{company}}",
2803
+ mailchimp: "*|COMPANY|*",
2804
+ klaviyo: "{{ organization }}",
2805
+ liquid: "{{ company }}",
2806
+ braze: "{{custom_attribute.${company}}}",
2807
+ hubspot: "{{ contact.company }}",
2808
+ sfmc: "%%Company%%",
2809
+ activecampaign: "%ORG%",
2810
+ marketo: "{{lead.Company Name}}",
2811
+ pardot: "%%company%%"
2812
+ },
2813
+ current_date: {
2814
+ handlebars: "{{ current_date }}",
2815
+ sendgrid: "{{ current_date }}",
2816
+ iterable: "{{now}}",
2817
+ mailchimp: "*|DATE:d F Y|*",
2818
+ klaviyo: "{{ 'now' | date: '%B %d, %Y' }}",
2819
+ liquid: "{{ 'now' | date: '%B %d, %Y' }}",
2820
+ braze: "{{ 'now' | date: '%B %d, %Y' }}",
2821
+ hubspot: "{{ today }}",
2822
+ sfmc: "%%=Format(Now(),'M/d/yyyy')=%%"
2823
+ }
2824
+ }, fo = (e, t, r) => {
2825
+ const n = !!r?.trim(), o = r?.trim() ?? "";
2826
+ switch (t) {
2827
+ case "liquid":
2828
+ case "klaviyo":
2829
+ case "hubspot":
2830
+ return n ? `{{ ${e} | default: '${o}' }}` : `{{ ${e} }}`;
2831
+ case "braze":
2832
+ return n ? `{{custom_attribute.${e} | default: '${o}'}}` : `{{custom_attribute.${e}}}`;
2833
+ case "handlebars":
2834
+ case "sendgrid":
2835
+ return n ? `{{ ${e} }}{{!-- default: ${o} --}}` : `{{ ${e} }}`;
2836
+ case "iterable":
2837
+ return n ? `{{${e}|default:${o}}}` : `{{${e}}}`;
2838
+ case "mailchimp":
2839
+ return n ? `*|${e.toUpperCase()}:${o}|*` : `*|${e.toUpperCase()}|*`;
2840
+ case "sfmc":
2841
+ return n ? `%%=IIF(Empty(@${e}),'${o}',@${e})=%%` : `%%=v(@${e})=%%`;
2842
+ case "activecampaign":
2843
+ return `%${e.toUpperCase()}%`;
2844
+ case "marketo":
2845
+ return n ? `{{lead.${e}:default ${o}}}` : `{{lead.${e}}}`;
2846
+ case "pardot":
2847
+ return `%%${e}%%`;
2848
+ case "campaign_monitor":
2849
+ return `[${e}]`;
2850
+ default:
2851
+ return `{{ ${e} }}`;
2852
+ }
2853
+ }, pn = (e, t, r) => {
2854
+ const n = r.trim();
2855
+ if (!n) return e;
2856
+ switch (t) {
2857
+ case "mailchimp":
2858
+ return /^\*\|[\w:]+\|\*$/.test(e) ? e.replace(/\|\*$/, `:${n}|*`) : e;
2859
+ case "marketo":
2860
+ return /^\{\{[^}]+\}\}$/.test(e) ? e.replace(/\}\}$/, `:default ${n}}}`) : e;
2861
+ case "liquid":
2862
+ case "klaviyo":
2863
+ case "hubspot":
2864
+ return /^\{\{\s*[^}]+\s*\}\}$/.test(e) ? e.replace(/\s*\}\}$/, ` | default: '${n}'}}`) : e;
2865
+ case "braze":
2866
+ return /^\{\{[^}]+\}\}$/.test(e) ? e.replace(/\}\}$/, ` | default: '${n}'}}`) : e;
2867
+ case "iterable":
2868
+ return /^\{\{[^}]+\}\}$/.test(e) ? e.replace(/\}\}$/, `|default:${n}}}`) : e;
2869
+ case "sfmc":
2870
+ return /^%%[^%]+%%$/.test(e) ? `%%=IIF(Empty(${e}),'${n}',${e})=%%` : e;
2871
+ case "handlebars":
2872
+ case "sendgrid":
2873
+ return `${e}{{!-- default: ${n} --}}`;
2874
+ default:
2875
+ return e;
2876
+ }
2877
+ }, mn = (e, t, r) => {
2878
+ const n = Vt[e];
2879
+ if (n) {
2880
+ const i = n[t];
2881
+ if (i) return r?.trim() ? pn(i, t, r) : i;
2882
+ }
2883
+ const o = mo(e, t);
2884
+ return o ? r?.trim() ? pn(o, t, r) : o : fo(e, t, r);
2885
+ }, go = (e, t) => {
2886
+ if (!e) return "";
2887
+ let r = e.replace(/<span[^>]*\bdata-merge="([^"]+)"(?:[^>]*\bdata-merge-default="([^"]*)")?[^>]*>.*?<\/span>/gs, (n, o, i) => mn(o, t, i?.trim() || void 0));
2888
+ return r = r.replace(/\{\{\s*(?:'([^']*)'|"([^"]*)"|(\w+))(?:\s*\|\s*(?:'([^']*)'|"([^"]*)"|([^'"\}\s][^'"\}]*?)))?\s*\}\}/g, (n, o, i, a, l, c, m) => {
2889
+ const b = (o ?? i ?? a ?? "").trim(), h = (l ?? c ?? m ?? "").trim();
2890
+ return mn(b, t, h || void 0);
2891
+ }), r;
2892
+ }, ga = () => [...Object.keys(Vt), ...po()], ha = (e, t) => Vt[e]?.[t] ?? null, Ge = (e) => {
2893
+ let t = (e ?? "").trim().replace(/[^A-Za-z0-9_$]+/g, "_");
2894
+ return /^[0-9]/.test(t) && (t = `_${t}`), t || "_tag";
2895
+ }, fn = (e, t) => {
2896
+ const r = e.trim();
2897
+ return r ? t?.trim() ? `{${r} ?? "${t.trim().replace(/"/g, '\\"')}"}` : `{${r}}` : "";
2898
+ }, ho = (e) => {
2899
+ if (!e) return "";
2900
+ let t = e.replace(/<span[^>]*\bdata-merge="([^"]+)"(?:[^>]*\bdata-merge-default="([^"]*)")?[^>]*>.*?<\/span>/gs, (r, n, o) => fn(n, o?.trim() || void 0));
2901
+ return t = t.replace(/\{\{\s*(?:'([^']*)'|"([^"]*)"|(\w+))(?:\s*\|\s*(?:'([^']*)'|"([^"]*)"|([^'"\}\s][^'"\}]*?)))?\s*\}\}/g, (r, n, o, i, a, l, c) => {
2902
+ const m = (n ?? o ?? i ?? "").trim(), b = (a ?? l ?? c ?? "").trim();
2903
+ return fn(m, b || void 0);
2904
+ }), t = t.replace(/(\b(?!style=)\w[\w-]*=)"([^"]*\{[^}]+\}[^"]*)"/g, (r, n, o) => {
2905
+ const i = o.match(/^\{(\w+)\}$/);
2906
+ return i ? `${n}{${i[1]}}` : `${n}{\`${o.replace(/\{(\w+)\}/g, "${$1}")}\`}`;
2907
+ }), t;
2908
+ }, vo = (e) => {
2909
+ if (e.length === 0) return {
2910
+ propsInterface: "",
2911
+ propsDestructure: ""
2912
+ };
2913
+ const t = /* @__PURE__ */ new Map();
2914
+ for (const { tagId: n, fallback: o } of e) t.has(n) || t.set(n, o);
2915
+ const r = [...t.entries()];
2916
+ return {
2917
+ propsInterface: `interface EmailProps {
2918
+ ${r.map(([n]) => ` ${n}?: string;`).join(`
2919
+ `)}
2920
+ }`,
2921
+ propsDestructure: `{ ${r.map(([n, o]) => o?.trim() ? `${n} = "${o.trim().replace(/"/g, '\\"')}"` : n).join(", ")} }: EmailProps`
2922
+ };
2923
+ }, bo = (e) => {
2924
+ const t = /* @__PURE__ */ new Map();
2925
+ for (const r of e.matchAll(/<span[^>]*\bdata-merge="([^"]+)"(?:[^>]*\bdata-merge-default="([^"]*)")?[^>]*>.*?<\/span>/gs)) {
2926
+ const n = r[1].trim();
2927
+ n && !t.has(n) && t.set(n, r[2]?.trim() || void 0);
2928
+ }
2929
+ for (const r of e.matchAll(/\{\{\s*(?:'([^']*)'|"([^"]*)"|(\w+))(?:\s*\|\s*(?:'([^']*)'|"([^"]*)"|([^'"\}\s][^'"\}]*?)))?\s*\}\}/g)) {
2930
+ const n = (r[1] ?? r[2] ?? r[3] ?? "").trim(), o = (r[4] ?? r[5] ?? r[6] ?? "").trim();
2931
+ n && !t.has(n) && t.set(n, o || void 0);
2932
+ }
2933
+ return [...t.entries()].map(([r, n]) => ({
2934
+ tagId: r,
2935
+ fallback: n
2936
+ }));
2937
+ }, $o = (e) => {
2938
+ const t = /* @__PURE__ */ new Set(), r = (o) => {
2939
+ if (o?.enabled) {
2940
+ for (const i of o.rules ?? []) i.tag?.trim() && t.add(Ge(i.tag));
2941
+ for (const i of o.groups ?? []) for (const a of i.rules ?? []) a.tag?.trim() && t.add(Ge(a.tag));
2942
+ }
2943
+ }, n = (o) => {
2944
+ for (const i of o) if (i.type === "row") {
2945
+ r(i.visibility);
2946
+ for (const a of i.columns ?? []) {
2947
+ r(a.props?.visibility);
2948
+ const l = a.children ?? a.components ?? [];
2949
+ n(l);
2950
+ }
2951
+ } else i.type === "row-spacer" ? r(i.visibility) : r(i.props?.visibility);
2952
+ };
2953
+ for (const o of e) {
2954
+ r(o.visibility);
2955
+ for (const i of o.columns ?? [])
2956
+ r(i.props?.visibility), n(i.children ?? i.components ?? []);
2957
+ }
2958
+ return [...t];
2959
+ }, yo = (e) => e.length === 0 ? "" : ` // Visibility data — replace with real values from your data source
2960
+ ${e.map((t) => ` const ${t} = "";`).join(`
2961
+ `)}`, Un = (e, t, r, n, o = !1) => {
2962
+ const i = n?.mergeTagActive || n?.linkTagActive;
2963
+ if (t === "wrap" || !i) return go(e, r);
2964
+ if (o) {
2965
+ const { mergeTagContext: a, mergeTagActive: l, linkTagContext: c, linkTagActive: m } = n;
2966
+ return Hn(e, a ?? {}, l ?? !1, c ?? {}, m ?? !1);
2967
+ }
2968
+ return e;
2969
+ }, Jn = (e, t, r) => {
2970
+ if (t === "wrap" || !r) return e;
2971
+ const { mergeTagContext: n, mergeTagActive: o, linkTagContext: i, linkTagActive: a } = r;
2972
+ return !o && !a ? e : Hn(e, n, o, i, a);
2973
+ }, Kt = /* @__PURE__ */ new Map(), Gn = /* @__PURE__ */ new Map();
2974
+ function va(e, t, r) {
2975
+ Kt.set(e, t), r && Gn.set(e, r);
2976
+ }
2977
+ var So = {
2978
+ label: "Custom",
2979
+ group: "custom",
2980
+ description: "Registered ESP syntax with no metadata override.",
2981
+ supportsNesting: !0
2982
+ };
2983
+ function ko(e, t) {
2984
+ return t[e] ?? Kt.get(e) ?? So;
2985
+ }
2986
+ function qn(e) {
2987
+ return Gn.get(e);
2988
+ }
2989
+ function ba() {
2990
+ return [...Kt.entries()].map(([e, t]) => ({
2991
+ id: e,
2992
+ meta: t
2993
+ }));
2994
+ }
2995
+ var wo = {
2996
+ handlebars: {
2997
+ label: "Handlebars (Generic)",
2998
+ group: "handlebars",
2999
+ description: "Generic Handlebars.js template syntax",
3000
+ supportsNesting: !0
3001
+ },
3002
+ sendgrid: {
3003
+ label: "SendGrid",
3004
+ group: "handlebars",
3005
+ description: "SendGrid Dynamic Templates (Handlebars)",
3006
+ docsUrl: "https://docs.sendgrid.com/for-developers/sending-email/using-handlebars",
3007
+ supportsNesting: !0
3008
+ },
3009
+ iterable: {
3010
+ label: "Iterable",
3011
+ group: "handlebars",
3012
+ description: "Iterable templating (Handlebars-compatible)",
3013
+ docsUrl: "https://support.iterable.com/hc/en-us/articles/205480365",
3014
+ supportsNesting: !0
3015
+ },
3016
+ mailchimp: {
3017
+ label: "Mailchimp",
3018
+ group: "custom",
3019
+ description: "Mailchimp merge tag conditionals *|IF:…|*",
3020
+ docsUrl: "https://mailchimp.com/help/use-conditional-merge-tag-blocks/",
3021
+ supportsNesting: !1
3022
+ },
3023
+ klaviyo: {
3024
+ label: "Klaviyo",
3025
+ group: "liquid",
3026
+ description: "Klaviyo (Liquid templating)",
3027
+ docsUrl: "https://help.klaviyo.com/hc/en-us/articles/115002775012",
3028
+ supportsNesting: !0
3029
+ },
3030
+ liquid: {
3031
+ label: "Liquid (Generic)",
3032
+ group: "liquid",
3033
+ description: "Generic Liquid template syntax (Shopify, etc.)",
3034
+ supportsNesting: !0
3035
+ },
3036
+ braze: {
3037
+ label: "Braze",
3038
+ group: "liquid",
3039
+ description: "Braze (Liquid + Connected Content)",
3040
+ docsUrl: "https://www.braze.com/docs/user_guide/personalization_and_dynamic_content/liquid/",
3041
+ supportsNesting: !0
3042
+ },
3043
+ hubspot: {
3044
+ label: "HubSpot",
3045
+ group: "liquid",
3046
+ description: "HubSpot (HubL — Liquid-based)",
3047
+ docsUrl: "https://developers.hubspot.com/docs/cms/hubl/intro-to-hubl",
3048
+ supportsNesting: !0
3049
+ },
3050
+ sfmc: {
3051
+ label: "Salesforce Marketing Cloud",
3052
+ group: "ampscript",
3053
+ description: "SFMC AMPscript conditionals",
3054
+ docsUrl: "https://ampscript.guide/if/",
3055
+ supportsNesting: !0
3056
+ },
3057
+ activecampaign: {
3058
+ label: "ActiveCampaign",
3059
+ group: "custom",
3060
+ description: "ActiveCampaign conditional content tags",
3061
+ docsUrl: "https://help.activecampaign.com/hc/en-us/articles/220358207",
3062
+ supportsNesting: !0
3063
+ },
3064
+ marketo: {
3065
+ label: "Marketo",
3066
+ group: "custom",
3067
+ description: "Marketo Velocity Script conditionals",
3068
+ docsUrl: "https://nation.marketo.com/t5/product-blogs/velocity-scripting/ba-p/232782",
3069
+ supportsNesting: !0
3070
+ },
3071
+ campaign_monitor: {
3072
+ label: "Campaign Monitor",
3073
+ group: "custom",
3074
+ description: "Campaign Monitor conditional merge tags",
3075
+ docsUrl: "https://help.campaignmonitor.com/custom-fields-and-personalization",
3076
+ supportsNesting: !1
3077
+ },
3078
+ pardot: {
3079
+ label: "Pardot / MCAE",
3080
+ group: "custom",
3081
+ description: "Pardot (Marketing Cloud Account Engagement) conditionals",
3082
+ docsUrl: "https://help.salesforce.com/s/articleView?id=pardot_variable_tags.htm",
3083
+ supportsNesting: !1
3084
+ },
3085
+ mso: {
3086
+ label: "Outlook (MSO)",
3087
+ group: "mso",
3088
+ description: "Microsoft Office VML conditional comments for Outlook",
3089
+ supportsNesting: !1
3090
+ }
3091
+ }, $a = [
3092
+ {
3093
+ syntax: "handlebars",
3094
+ label: "Handlebars",
3095
+ eq: "native",
3096
+ neq: "helper",
3097
+ contains: "helper",
3098
+ not_contains: "helper",
3099
+ starts_with: "helper",
3100
+ ends_with: "helper",
3101
+ in: "helper",
3102
+ not_in: "helper",
3103
+ numeric: "helper",
3104
+ is_empty: "helper",
3105
+ date: "helper"
3106
+ },
3107
+ {
3108
+ syntax: "sendgrid",
3109
+ label: "SendGrid",
3110
+ eq: "native",
3111
+ neq: "none",
3112
+ contains: "none",
3113
+ not_contains: "none",
3114
+ starts_with: "none",
3115
+ ends_with: "none",
3116
+ in: "none",
3117
+ not_in: "none",
3118
+ numeric: "none",
3119
+ is_empty: "none",
3120
+ date: "none"
3121
+ },
3122
+ {
3123
+ syntax: "iterable",
3124
+ label: "Iterable",
3125
+ eq: "native",
3126
+ neq: "helper",
3127
+ contains: "helper",
3128
+ not_contains: "helper",
3129
+ starts_with: "helper",
3130
+ ends_with: "helper",
3131
+ in: "helper",
3132
+ not_in: "helper",
3133
+ numeric: "helper",
3134
+ is_empty: "helper",
3135
+ date: "helper"
3136
+ },
3137
+ {
3138
+ syntax: "liquid",
3139
+ label: "Liquid",
3140
+ eq: "native",
3141
+ neq: "native",
3142
+ contains: "native",
3143
+ not_contains: "native",
3144
+ starts_with: "none",
3145
+ ends_with: "none",
3146
+ in: "fallback",
3147
+ not_in: "fallback",
3148
+ numeric: "native",
3149
+ is_empty: "native",
3150
+ date: "native"
3151
+ },
3152
+ {
3153
+ syntax: "klaviyo",
3154
+ label: "Klaviyo",
3155
+ eq: "native",
3156
+ neq: "native",
3157
+ contains: "native",
3158
+ not_contains: "native",
3159
+ starts_with: "none",
3160
+ ends_with: "none",
3161
+ in: "fallback",
3162
+ not_in: "fallback",
3163
+ numeric: "native",
3164
+ is_empty: "native",
3165
+ date: "native"
3166
+ },
3167
+ {
3168
+ syntax: "braze",
3169
+ label: "Braze",
3170
+ eq: "native",
3171
+ neq: "native",
3172
+ contains: "native",
3173
+ not_contains: "native",
3174
+ starts_with: "none",
3175
+ ends_with: "none",
3176
+ in: "fallback",
3177
+ not_in: "fallback",
3178
+ numeric: "native",
3179
+ is_empty: "native",
3180
+ date: "native"
3181
+ },
3182
+ {
3183
+ syntax: "hubspot",
3184
+ label: "HubSpot",
3185
+ eq: "native",
3186
+ neq: "native",
3187
+ contains: "native",
3188
+ not_contains: "native",
3189
+ starts_with: "none",
3190
+ ends_with: "none",
3191
+ in: "fallback",
3192
+ not_in: "fallback",
3193
+ numeric: "native",
3194
+ is_empty: "native",
3195
+ date: "native"
3196
+ },
3197
+ {
3198
+ syntax: "sfmc",
3199
+ label: "SFMC",
3200
+ eq: "native",
3201
+ neq: "native",
3202
+ contains: "native",
3203
+ not_contains: "native",
3204
+ starts_with: "native",
3205
+ ends_with: "native",
3206
+ in: "fallback",
3207
+ not_in: "fallback",
3208
+ numeric: "native",
3209
+ is_empty: "native",
3210
+ date: "native"
3211
+ },
3212
+ {
3213
+ syntax: "activecampaign",
3214
+ label: "ActiveCampaign",
3215
+ eq: "native",
3216
+ neq: "native",
3217
+ contains: "native",
3218
+ not_contains: "native",
3219
+ starts_with: "none",
3220
+ ends_with: "none",
3221
+ in: "native",
3222
+ not_in: "fallback",
3223
+ numeric: "native",
3224
+ is_empty: "native",
3225
+ date: "fallback"
3226
+ },
3227
+ {
3228
+ syntax: "marketo",
3229
+ label: "Marketo",
3230
+ eq: "native",
3231
+ neq: "native",
3232
+ contains: "native",
3233
+ not_contains: "native",
3234
+ starts_with: "native",
3235
+ ends_with: "native",
3236
+ in: "fallback",
3237
+ not_in: "fallback",
3238
+ numeric: "native",
3239
+ is_empty: "native",
3240
+ date: "native"
3241
+ },
3242
+ {
3243
+ syntax: "mailchimp",
3244
+ label: "Mailchimp",
3245
+ eq: "native",
3246
+ neq: "native",
3247
+ contains: "fallback",
3248
+ not_contains: "fallback",
3249
+ starts_with: "fallback",
3250
+ ends_with: "fallback",
3251
+ in: "fallback",
3252
+ not_in: "fallback",
3253
+ numeric: "native",
3254
+ is_empty: "fallback",
3255
+ date: "fallback"
3256
+ },
3257
+ {
3258
+ syntax: "pardot",
3259
+ label: "Pardot",
3260
+ eq: "native",
3261
+ neq: "native",
3262
+ contains: "none",
3263
+ not_contains: "none",
3264
+ starts_with: "none",
3265
+ ends_with: "none",
3266
+ in: "none",
3267
+ not_in: "none",
3268
+ numeric: "none",
3269
+ is_empty: "none",
3270
+ date: "none"
3271
+ },
3272
+ {
3273
+ syntax: "campaign_monitor",
3274
+ label: "Campaign Monitor",
3275
+ eq: "native",
3276
+ neq: "native",
3277
+ contains: "none",
3278
+ not_contains: "none",
3279
+ starts_with: "none",
3280
+ ends_with: "none",
3281
+ in: "none",
3282
+ not_in: "none",
3283
+ numeric: "none",
3284
+ is_empty: "none",
3285
+ date: "none"
3286
+ },
3287
+ {
3288
+ syntax: "mso",
3289
+ label: "MSO/Outlook",
3290
+ eq: "native",
3291
+ neq: "none",
3292
+ contains: "none",
3293
+ not_contains: "none",
3294
+ starts_with: "none",
3295
+ ends_with: "none",
3296
+ in: "none",
3297
+ not_in: "none",
3298
+ numeric: "none",
3299
+ is_empty: "none",
3300
+ date: "none"
3301
+ }
3302
+ ], xo = (e, t) => {
3303
+ const r = Ge(e);
3304
+ switch (t) {
3305
+ case "sfmc":
3306
+ return `AttributeValue("${r}")`;
3307
+ case "marketo":
3308
+ return `$!{${r}}`;
3309
+ case "mailchimp":
3310
+ return r.toUpperCase();
3311
+ default:
3312
+ return r;
3313
+ }
3314
+ }, Te = (e, t) => {
3315
+ const { operator: r, value: n } = e, o = xo(e.tag, t);
3316
+ switch (t) {
3317
+ case "handlebars":
3318
+ case "sendgrid":
3319
+ case "iterable":
3320
+ switch (r) {
3321
+ case "==":
3322
+ return `(eq ${o} '${n}')`;
3323
+ case "!=":
3324
+ return `(neq ${o} '${n}')`;
3325
+ case "contains":
3326
+ return `(contains ${o} '${n}')`;
3327
+ case "not_contains":
3328
+ return `(not (contains ${o} '${n}'))`;
3329
+ case "starts_with":
3330
+ return `(startsWith ${o} '${n}')`;
3331
+ case "ends_with":
3332
+ return `(endsWith ${o} '${n}')`;
3333
+ case "in":
3334
+ return `(in ${o} ${n.split(",").map((i) => `'${i.trim()}'`).join(" ")})`;
3335
+ case "not_in":
3336
+ return `(not (in ${o} ${n.split(",").map((i) => `'${i.trim()}'`).join(" ")}))`;
3337
+ case ">":
3338
+ return `(gt ${o} ${n})`;
3339
+ case "<":
3340
+ return `(lt ${o} ${n})`;
3341
+ case ">=":
3342
+ return `(gte ${o} ${n})`;
3343
+ case "<=":
3344
+ return `(lte ${o} ${n})`;
3345
+ case "is_empty":
3346
+ return `(isEmpty ${o})`;
3347
+ case "is_not_empty":
3348
+ return `(not (isEmpty ${o}))`;
3349
+ case "date_before":
3350
+ return `(dateBefore ${o} '${n}')`;
3351
+ case "date_after":
3352
+ return `(dateAfter ${o} '${n}')`;
3353
+ case "date_on":
3354
+ return `(dateOn ${o} '${n}')`;
3355
+ default:
3356
+ return `(eq ${o} '${n}')`;
3357
+ }
3358
+ case "liquid":
3359
+ case "klaviyo":
3360
+ case "braze":
3361
+ case "hubspot":
3362
+ switch (r) {
3363
+ case "==":
3364
+ return `${o} == '${n}'`;
3365
+ case "!=":
3366
+ return `${o} != '${n}'`;
3367
+ case "contains":
3368
+ return `${o} contains '${n}'`;
3369
+ case "not_contains":
3370
+ return `not (${o} contains '${n}')`;
3371
+ case "starts_with":
3372
+ case "ends_with":
3373
+ return null;
3374
+ case "in":
3375
+ return n.split(",").map((i) => `${o} == '${i.trim()}'`).join(" or ");
3376
+ case "not_in":
3377
+ return n.split(",").map((i) => `${o} != '${i.trim()}'`).join(" and ");
3378
+ case ">":
3379
+ return `${o} > ${n}`;
3380
+ case "<":
3381
+ return `${o} < ${n}`;
3382
+ case ">=":
3383
+ return `${o} >= ${n}`;
3384
+ case "<=":
3385
+ return `${o} <= ${n}`;
3386
+ case "is_empty":
3387
+ return `${o} == blank`;
3388
+ case "is_not_empty":
3389
+ return `${o} != blank`;
3390
+ case "date_before":
3391
+ return `${Bt(e.tag)} < ${Ot(e.tag, n)}`;
3392
+ case "date_after":
3393
+ return `${Bt(e.tag)} > ${Ot(e.tag, n)}`;
3394
+ case "date_on":
3395
+ return `${o} | date: '%F' == '${n}'`;
3396
+ default:
3397
+ return `${o} == '${n}'`;
3398
+ }
3399
+ case "mailchimp":
3400
+ switch (r) {
3401
+ case "==":
3402
+ return `${o}='${n}'`;
3403
+ case "!=":
3404
+ return `${o}!='${n}'`;
3405
+ case ">":
3406
+ case "<":
3407
+ case ">=":
3408
+ case "<=": {
3409
+ const i = Number(n);
3410
+ return Number.isNaN(i) ? `${o}='${n}'` : `${o}${r}${i}`;
3411
+ }
3412
+ case "date_before":
3413
+ return `${o}<'${n}'`;
3414
+ case "date_after":
3415
+ return `${o}>'${n}'`;
3416
+ case "date_on":
3417
+ return `${o}='${n}'`;
3418
+ default:
3419
+ return `${o}='${n}'`;
3420
+ }
3421
+ case "sfmc":
3422
+ switch (r) {
3423
+ case "==":
3424
+ return `${o} == '${n}'`;
3425
+ case "!=":
3426
+ return `${o} != '${n}'`;
3427
+ case "contains":
3428
+ return `Contains(${o}, '${n}')`;
3429
+ case "not_contains":
3430
+ return `Not Contains(${o}, '${n}')`;
3431
+ case "starts_with":
3432
+ return `IndexOf(${o}, '${n}') == 1`;
3433
+ case "ends_with":
3434
+ return `Substring(${o}, Subtract(Length(${o}), Subtract(Length('${n}'), 1)), Length('${n}')) == '${n}'`;
3435
+ case "in":
3436
+ return n.split(",").map((i) => `${o} == '${i.trim()}'`).join(" OR ");
3437
+ case "not_in":
3438
+ return n.split(",").map((i) => `${o} != '${i.trim()}'`).join(" AND ");
3439
+ case ">":
3440
+ return `${o} > ${n}`;
3441
+ case "<":
3442
+ return `${o} < ${n}`;
3443
+ case ">=":
3444
+ return `${o} >= ${n}`;
3445
+ case "<=":
3446
+ return `${o} <= ${n}`;
3447
+ case "is_empty":
3448
+ return `Empty(${o})`;
3449
+ case "is_not_empty":
3450
+ return `Not Empty(${o})`;
3451
+ case "date_before":
3452
+ return `DateDiff(DateParse(${o}), DateParse('${n}'), "D") < 0`;
3453
+ case "date_after":
3454
+ return `DateDiff(DateParse(${o}), DateParse('${n}'), "D") > 0`;
3455
+ case "date_on":
3456
+ return `DateDiff(DateParse(${o}), DateParse('${n}'), "D") == 0`;
3457
+ default:
3458
+ return `${o} == '${n}'`;
3459
+ }
3460
+ case "activecampaign":
3461
+ switch (r) {
3462
+ case "==":
3463
+ return `${o} EQUALS ${n}`;
3464
+ case "!=":
3465
+ return `${o} NOT EQUALS ${n}`;
3466
+ case "contains":
3467
+ return `${o} CONTAINS ${n}`;
3468
+ case "not_contains":
3469
+ return `${o} NOT CONTAINS ${n}`;
3470
+ case "starts_with":
3471
+ case "ends_with":
3472
+ return null;
3473
+ case "in":
3474
+ return `${o} IN ${n.split(",").map((i) => i.trim()).join(",")}`;
3475
+ case "not_in":
3476
+ return `${o} NOT IN ${n.split(",").map((i) => i.trim()).join(",")}`;
3477
+ case ">":
3478
+ return `${o} GREATER THAN ${n}`;
3479
+ case "<":
3480
+ return `${o} LESS THAN ${n}`;
3481
+ case ">=":
3482
+ return `${o} GREATER THAN OR EQUAL TO ${n}`;
3483
+ case "<=":
3484
+ return `${o} LESS THAN OR EQUAL TO ${n}`;
3485
+ case "is_empty":
3486
+ return `${o} IS EMPTY`;
3487
+ case "is_not_empty":
3488
+ return `${o} IS NOT EMPTY`;
3489
+ case "date_before":
3490
+ return `${o} LESS THAN ${n}`;
3491
+ case "date_after":
3492
+ return `${o} GREATER THAN ${n}`;
3493
+ case "date_on":
3494
+ return `${o} EQUALS ${n}`;
3495
+ default:
3496
+ return `${o} EQUALS ${n}`;
3497
+ }
3498
+ case "marketo":
3499
+ switch (r) {
3500
+ case "==":
3501
+ return `${o} == '${n}'`;
3502
+ case "!=":
3503
+ return `${o} != '${n}'`;
3504
+ case "contains":
3505
+ return `${o} && ${o}.contains('${n}')`;
3506
+ case "not_contains":
3507
+ return `!${o} || !${o}.contains('${n}')`;
3508
+ case "starts_with":
3509
+ return `${o}.startsWith('${n}')`;
3510
+ case "ends_with":
3511
+ return `${o}.endsWith('${n}')`;
3512
+ case "in":
3513
+ return n.split(",").map((i) => `${o} == '${i.trim()}'`).join(" || ");
3514
+ case "not_in":
3515
+ return n.split(",").map((i) => `${o} != '${i.trim()}'`).join(" && ");
3516
+ case ">":
3517
+ return `${o}.toInteger() > ${n}`;
3518
+ case "<":
3519
+ return `${o}.toInteger() < ${n}`;
3520
+ case ">=":
3521
+ return `${o}.toInteger() >= ${n}`;
3522
+ case "<=":
3523
+ return `${o}.toInteger() <= ${n}`;
3524
+ case "is_empty":
3525
+ return `!${o} || ${o} == ''`;
3526
+ case "is_not_empty":
3527
+ return `${o} && ${o} != ''`;
3528
+ case "date_before":
3529
+ return `$date.parse('yyyy-MM-dd', ${o}).before($date.parse('yyyy-MM-dd', '${n}'))`;
3530
+ case "date_after":
3531
+ return `$date.parse('yyyy-MM-dd', ${o}).after($date.parse('yyyy-MM-dd', '${n}'))`;
3532
+ case "date_on":
3533
+ return `$date.parse('yyyy-MM-dd', ${o}).equals($date.parse('yyyy-MM-dd', '${n}'))`;
3534
+ default:
3535
+ return `${o} == '${n}'`;
3536
+ }
3537
+ case "campaign_monitor":
3538
+ case "pardot":
3539
+ switch (r) {
3540
+ case "==":
3541
+ return `${o}='${n}'`;
3542
+ case "!=":
3543
+ return `${o}!='${n}'`;
3544
+ case "date_before":
3545
+ case "date_after":
3546
+ case "date_on":
3547
+ return `${o}='${n}'`;
3548
+ default:
3549
+ return `${o}='${n}'`;
3550
+ }
3551
+ case "mso":
3552
+ return "mso | IE";
3553
+ default:
3554
+ return `${o} == '${n}'`;
3555
+ }
3556
+ }, gn = (e, t, r) => {
3557
+ if (e.length === 1) return e[0];
3558
+ switch (r) {
3559
+ case "handlebars":
3560
+ case "sendgrid":
3561
+ case "iterable":
3562
+ return t === "all" ? `(and ${e.join(" ")})` : `(or ${e.join(" ")})`;
3563
+ case "sfmc":
3564
+ case "activecampaign":
3565
+ case "mailchimp":
3566
+ case "campaign_monitor":
3567
+ case "pardot":
3568
+ return e.join(t === "all" ? " AND " : " OR ");
3569
+ case "marketo":
3570
+ return e.join(t === "all" ? " && " : " || ");
3571
+ case "liquid":
3572
+ case "klaviyo":
3573
+ case "braze":
3574
+ case "hubspot":
3575
+ return e.join(t === "all" ? " and " : " or ");
3576
+ default:
3577
+ return e.join(t === "all" ? " && " : " || ");
3578
+ }
3579
+ }, Wn = (e, t) => {
3580
+ const r = qn(t)?.wrapOpenTag;
3581
+ if (r) return r(e);
3582
+ switch (t) {
3583
+ case "handlebars":
3584
+ case "sendgrid":
3585
+ case "iterable":
3586
+ return `{{#if ${e}}}`;
3587
+ case "liquid":
3588
+ case "klaviyo":
3589
+ case "braze":
3590
+ case "hubspot":
3591
+ return `{% if ${e} %}`;
3592
+ case "mailchimp":
3593
+ return `*|IF:${e}|*`;
3594
+ case "sfmc":
3595
+ return `%%[ IF ${e} THEN ]%%`;
3596
+ case "activecampaign":
3597
+ return `%IF ${e}%`;
3598
+ case "marketo":
3599
+ return `#if(${e})`;
3600
+ case "campaign_monitor":
3601
+ return `<singleline:${e}>`;
3602
+ case "pardot":
3603
+ return `%%if ${e}%%`;
3604
+ case "mso":
3605
+ return `<!--[if ${e}]>`;
3606
+ default:
3607
+ return `{{#if ${e}}}`;
3608
+ }
3609
+ }, Vn = (e) => {
3610
+ const t = qn(e)?.wrapCloseTag;
3611
+ if (t) return t();
3612
+ switch (e) {
3613
+ case "handlebars":
3614
+ case "sendgrid":
3615
+ case "iterable":
3616
+ return "{{/if}}";
3617
+ case "liquid":
3618
+ case "klaviyo":
3619
+ case "braze":
3620
+ case "hubspot":
3621
+ return "{% endif %}";
3622
+ case "mailchimp":
3623
+ return "*|END:IF|*";
3624
+ case "sfmc":
3625
+ return "%%[ ENDIF ]%%";
3626
+ case "activecampaign":
3627
+ return "%/IF%";
3628
+ case "marketo":
3629
+ return "#end";
3630
+ case "campaign_monitor":
3631
+ return "</singleline>";
3632
+ case "pardot":
3633
+ return "%%endif%%";
3634
+ case "mso":
3635
+ return "<![endif]-->";
3636
+ default:
3637
+ return "{{/if}}";
3638
+ }
3639
+ }, Bt = (e) => `__esp_ts_${e.replace(/[^a-zA-Z0-9]/g, "_")}`, Ot = (e, t) => `__esp_cmp_${e.replace(/[^a-zA-Z0-9]/g, "_")}_${t.replace(/[^a-zA-Z0-9]/g, "_")}`, Co = (e) => {
3640
+ const t = /* @__PURE__ */ new Set(), r = [];
3641
+ for (const n of e) {
3642
+ const o = n.operator;
3643
+ if (o !== "date_before" && o !== "date_after") continue;
3644
+ const i = Bt(n.tag), a = Ot(n.tag, n.value);
3645
+ t.has(i) || (t.add(i), r.push(`{%- assign ${i} = ${Ge(n.tag)} | date: '%s' -%}`)), t.has(a) || (t.add(a), r.push(`{%- assign ${a} = '${n.value}' | date: '%s' -%}`));
3646
+ }
3647
+ return r;
3648
+ }, _o = (e) => e === "liquid" || e === "klaviyo" || e === "braze" || e === "hubspot", To = (e, t) => {
3649
+ const r = (a, l) => a.length === 0 ? l : [...a].reverse().reduce((c, m) => `*|IF:${m}|*
3650
+ ${c}
3651
+ *|END:IF|*`, l), n = (a, l) => a.length === 0 ? l : a.map((c) => `*|IF:${c}|*
3652
+ ${l}
3653
+ *|END:IF|*`).join(`
3654
+ `), o = (a, l, c) => {
3655
+ const m = a.map((b) => Te(b, "mailchimp")).filter((b) => b !== null);
3656
+ return m.length === 0 ? null : l === "all" ? r(m, c) : n(m, c);
3657
+ }, i = (t.rules ?? []).map((a) => Te(a, "mailchimp")).filter((a) => a !== null);
3658
+ if (t.match === "all") {
3659
+ let a = e;
3660
+ for (const l of [...t.groups ?? []].reverse()) {
3661
+ const c = l.rules.map((m) => Te(m, "mailchimp")).filter((m) => m !== null);
3662
+ c.length !== 0 && (a = l.match === "all" ? r(c, a) : n(c, a));
3663
+ }
3664
+ return i.length > 0 ? r(i, a) : a;
3665
+ } else {
3666
+ const a = [...i.map((l) => `*|IF:${l}|*
3667
+ ${e}
3668
+ *|END:IF|*`), ...(t.groups ?? []).map((l) => o(l.rules, l.match, e)).filter((l) => l !== null)];
3669
+ return a.length > 0 ? a.join(`
3670
+ `) : e;
3671
+ }
3672
+ }, Kn = (e, t) => {
3673
+ const r = ko(t, wo), n = (e.rules ?? []).map((a) => Te(a, t)).filter((a) => a !== null);
3674
+ let o;
3675
+ r.supportsNesting ? o = (e.groups ?? []).map((a) => {
3676
+ const l = a.rules.map((m) => Te(m, t)).filter((m) => m !== null);
3677
+ if (l.length === 0) return null;
3678
+ const c = gn(l, a.match, t);
3679
+ return l.length > 1 ? `(${c})` : c;
3680
+ }).filter((a) => a !== null) : o = (e.groups ?? []).flatMap((a) => a.rules).map((a) => Te(a, t)).filter((a) => a !== null);
3681
+ const i = [...n, ...o];
3682
+ return i.length === 0 ? null : {
3683
+ expression: gn(i, e.match, t),
3684
+ preludes: _o(t) ? Co([...e.rules ?? [], ...(e.groups ?? []).flatMap((a) => a.rules)]) : []
3685
+ };
3686
+ }, be = (e, t, r = "handlebars") => {
3687
+ if (!t?.enabled) return e;
3688
+ const n = (t.rules?.length ?? 0) > 0, o = (t.groups?.length ?? 0) > 0;
3689
+ if (!n && !o) return e;
3690
+ if (r === "mailchimp") return To(e, t);
3691
+ const i = Kn(t, r);
3692
+ if (!i) return e;
3693
+ const { expression: a, preludes: l } = i, c = Wn(a, r), m = Vn(r);
3694
+ return `${l.length > 0 ? `${l.join(`
3695
+ `)}
3696
+ ` : ""}${c}
3697
+ ${e}
3698
+ ${m}`;
3699
+ }, ya = (e, t = "handlebars") => {
3700
+ if (!e?.enabled) return null;
3701
+ const r = (e.rules?.length ?? 0) > 0, n = (e.groups?.length ?? 0) > 0;
3702
+ if (!r && !n) return null;
3703
+ if (t === "mailchimp") {
3704
+ const c = [...e.rules ?? [], ...(e.groups ?? []).flatMap((b) => b.rules)], m = c.map((b) => Te(b, "mailchimp")).find((b) => b !== null);
3705
+ return m ? {
3706
+ openTag: `*|IF:${m}|*${c.length > 1 && e.match === "all" ? " …nested…" : ""}`,
3707
+ closeTag: "*|END:IF|*"
3708
+ } : null;
3709
+ }
3710
+ const o = Kn(e, t);
3711
+ if (!o) return null;
3712
+ const { expression: i, preludes: a } = o, l = Wn(i, t);
3713
+ return {
3714
+ openTag: `${a.length > 0 ? `${a.join(`
3715
+ `)}
3716
+ ` : ""}${l}`,
3717
+ closeTag: Vn(t)
3718
+ };
3719
+ }, Yn = (e) => {
3720
+ const t = Ge(e.tag), r = String(e.value ?? "");
3721
+ switch (e.operator) {
3722
+ case "==":
3723
+ return `String(${t}).toLowerCase() === ${JSON.stringify(r.toLowerCase())}`;
3724
+ case "!=":
3725
+ return `String(${t}).toLowerCase() !== ${JSON.stringify(r.toLowerCase())}`;
3726
+ case "contains":
3727
+ return `String(${t}).toLowerCase().includes(${JSON.stringify(r.toLowerCase())})`;
3728
+ case "not_contains":
3729
+ return `!String(${t}).toLowerCase().includes(${JSON.stringify(r.toLowerCase())})`;
3730
+ case "starts_with":
3731
+ return `String(${t}).toLowerCase().startsWith(${JSON.stringify(r.toLowerCase())})`;
3732
+ case "ends_with":
3733
+ return `String(${t}).toLowerCase().endsWith(${JSON.stringify(r.toLowerCase())})`;
3734
+ case "in": {
3735
+ const n = r.split(/[,\n;]+/).map((o) => o.trim().toLowerCase()).filter(Boolean);
3736
+ return `${JSON.stringify(n)}.includes(String(${t}).toLowerCase())`;
3737
+ }
3738
+ case "not_in": {
3739
+ const n = r.split(/[,\n;]+/).map((o) => o.trim().toLowerCase()).filter(Boolean);
3740
+ return `!${JSON.stringify(n)}.includes(String(${t}).toLowerCase())`;
3741
+ }
3742
+ case ">":
3743
+ return `Number(${t}) > ${Number(r)}`;
3744
+ case "<":
3745
+ return `Number(${t}) < ${Number(r)}`;
3746
+ case ">=":
3747
+ return `Number(${t}) >= ${Number(r)}`;
3748
+ case "<=":
3749
+ return `Number(${t}) <= ${Number(r)}`;
3750
+ case "date_before":
3751
+ return `(${t} ? new Date(${t}).setHours(0,0,0,0) : NaN) < new Date(${JSON.stringify(r)}).setHours(0,0,0,0)`;
3752
+ case "date_after":
3753
+ return `(${t} ? new Date(${t}).setHours(0,0,0,0) : NaN) > new Date(${JSON.stringify(r)}).setHours(0,0,0,0)`;
3754
+ case "date_on":
3755
+ return `(${t} ? new Date(${t}).setHours(0,0,0,0) : NaN) === new Date(${JSON.stringify(r)}).setHours(0,0,0,0)`;
3756
+ case "is_empty":
3757
+ return `(!${t} || String(${t}).trim() === "")`;
3758
+ case "is_not_empty":
3759
+ return `(!!${t} && String(${t}).trim() !== "")`;
3760
+ default:
3761
+ return "true";
3762
+ }
3763
+ }, Ao = (e) => {
3764
+ if (!e.rules.length) return null;
3765
+ const t = e.rules.map(Yn);
3766
+ return t.length === 1 ? t[0] : `(${t.join(e.match === "any" ? " || " : " && ")})`;
3767
+ }, Ro = (e) => {
3768
+ const t = (e.rules ?? []).map(Yn), r = (e.groups ?? []).map(Ao).filter((i) => i !== null), n = [...t, ...r];
3769
+ if (n.length === 0) return null;
3770
+ if (n.length === 1) return n[0];
3771
+ const o = e.match === "any" ? " || " : " && ";
3772
+ return `(${n.join(o)})`;
3773
+ }, nt = (e, t) => {
3774
+ if (!t?.enabled) return e;
3775
+ const r = (t.rules?.length ?? 0) > 0, n = (t.groups?.length ?? 0) > 0;
3776
+ if (!r && !n) return e;
3777
+ const o = Ro(t);
3778
+ return o ? `{${o} && (
3779
+ ${e.split(`
3780
+ `).map((i) => ` ${i}`).join(`
3781
+ `)}
3782
+ )}` : e;
3783
+ }, Ae = ({ content: e, filename: t, mimeType: r }) => {
3784
+ const n = new Blob([e], { type: r }), o = URL.createObjectURL(n), i = document.createElement("a");
3785
+ i.href = o, i.download = t, i.click(), URL.revokeObjectURL(o);
3786
+ }, gt = (e) => e.toLowerCase().replace(/\s+/g, "-"), Ne = (e, t) => `${e}${t === "wrap" ? "-master" : "-snapshot"}`, Eo = /(<style[\s>][\s\S]*?<\/style>|<script[\s>][\s\S]*?<\/script>|<!--[\s\S]*?-->)/gi;
3787
+ function Xn(e) {
3788
+ const t = e.split(Eo), r = [];
3789
+ return t.forEach((n, o) => {
3790
+ if (o % 2 === 1) {
3791
+ let i = n.replace(/^[ \t]+|[ \t]+$/gm, "");
3792
+ i = i.replace(/\n{2,}/g, `
3793
+ `), r.push(i);
3794
+ } else {
3795
+ let i = n.replace(/>\s+</g, "><");
3796
+ i = i.replace(/[ \t]{2,}/g, " "), i = i.replace(/\n+/g, ""), r.push(i);
3797
+ }
3798
+ }), r.join("");
3799
+ }
3800
+ function Mo(e) {
3801
+ return e && Xn(e);
3802
+ }
3803
+ function Io(e) {
3804
+ return e && Xn(e);
3805
+ }
3806
+ function No(e) {
3807
+ if (!e) return e;
3808
+ let t = e.replace(/^[ \t]+|[ \t]+$/gm, "");
3809
+ return t = t.replace(/\n{3,}/g, `
3810
+
3811
+ `), t.trim();
3812
+ }
3813
+ function Be(e, t) {
3814
+ switch (e) {
3815
+ case "html":
3816
+ return Mo(t);
3817
+ case "mjml":
3818
+ return Io(t);
3819
+ case "react-email":
3820
+ return No(t);
3821
+ default:
3822
+ return t;
3823
+ }
3824
+ }
3825
+ var Qn = "maildeno:export:minify", st = L(Bo());
3826
+ function Bo() {
3827
+ if (typeof window > "u") return !1;
3828
+ try {
3829
+ return localStorage.getItem(Qn) === "true";
3830
+ } catch {
3831
+ return !1;
3832
+ }
3833
+ }
3834
+ vn(st, (e) => {
3835
+ if (!(typeof window > "u"))
3836
+ try {
3837
+ localStorage.setItem(Qn, String(e));
3838
+ } catch {
3839
+ }
3840
+ });
3841
+ function Yt() {
3842
+ return {
3843
+ minifyOutput: st,
3844
+ toggleMinify: () => {
3845
+ st.value = !st.value;
3846
+ }
3847
+ };
3848
+ }
3849
+ var Oo = 5, jo = (e) => {
3850
+ const { rows: t, canvasStyles: r, generators: n, espSyntax: o, visibilityContext: i, tagSubstitution: a, guardEmpty: l, collectFonts: c, collectMobileCSS: m, buildMobileStyleBlock: b } = e, { evaluateVisibility: h } = mt(), R = (s) => s.type === "component" ? s.props?.visibility : s.visibility, E = (s) => {
3851
+ if (!s?.enabled) return !1;
3852
+ const y = (s.rules?.length ?? 0) > 0, C = (s.groups?.length ?? 0) > 0;
3853
+ return y || C;
3854
+ }, x = (s, y, C, _) => {
3855
+ let f = "";
3856
+ for (const p of s) {
3857
+ if (C === "prune" && !h(R(p), y)) continue;
3858
+ const g = p.type;
3859
+ if (g === "row") {
3860
+ if (_ >= Oo) continue;
3861
+ const v = N(p, y, C, _ + 1);
3862
+ v.trim() && (f += `<table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;">${v}</table>`);
3863
+ continue;
3864
+ }
3865
+ if (g === "row-spacer") {
3866
+ if (!p.height || p.height <= 0) continue;
3867
+ const v = ue(p);
3868
+ let S = `<div height="${p.height}" style="height:${p.height}px;line-height:${p.height}px;font-size:1px;mso-line-height-rule:exactly;${v.join(";")}">&nbsp;</div>`;
3869
+ C === "wrap" && E(p.visibility) && (S = be(S, p.visibility, o.value)), f += S;
3870
+ continue;
3871
+ }
3872
+ let w = Jn(n.html(p), C, a?.value);
3873
+ const $ = p.props?.visibility;
3874
+ C === "wrap" && E($) && (w = be(w, $, o.value)), f += w;
3875
+ }
3876
+ return f;
3877
+ }, N = (s, y, C, _ = 0) => {
3878
+ if (s.type === "row-spacer") {
3879
+ if (!s.height || s.height <= 0) return "";
3880
+ const I = ue(s);
3881
+ let P = `
3882
+ <tr>
3883
+ <td>
3884
+ <div height="${s.height}" style="height:${s.height}px;line-height:${s.height}px;font-size:1px;mso-line-height-rule:exactly;${I.join(";")}">&nbsp;
3885
+ </div>
3886
+ </td>
3887
+ </tr>
3888
+ `;
3889
+ return C === "wrap" && E(s.visibility) && (P = be(P, s.visibility, o.value)), P;
3890
+ }
3891
+ const f = ue(s), p = r.value.mobileBreakpoint || 600, g = (s.gap || 0) / p * 100, w = 100 - g * (s.columns.length - 1), $ = [];
3892
+ let v = 0;
3893
+ s.columns.forEach((I) => {
3894
+ const P = I.width / 100 * w;
3895
+ $.push(P), v += P;
3896
+ });
3897
+ const S = w - v;
3898
+ Math.abs(S) > 0.01 && $.length > 0 && ($[$.length - 1] += S);
3899
+ let T = "";
3900
+ s.columns.forEach((I, P) => {
3901
+ if (C === "prune" && !h(I.props?.visibility, y)) return;
3902
+ const V = $[P], q = s.mobileStack ? "mobile-stack" : "", W = ue(I), Z = [
3903
+ `width:${V}%`,
3904
+ `max-width:${V}%`,
3905
+ `vertical-align:${I.verticalAlign ?? "middle"}`,
3906
+ "box-sizing:border-box",
3907
+ ...W,
3908
+ de(I.border),
3909
+ `border-radius:${X(I.border.radius)}`,
3910
+ "overflow:hidden",
3911
+ "line-height:0",
3912
+ "font-size:0",
3913
+ `padding:${I.padding?.top ?? 0}px ${I.padding?.right ?? 0}px ${I.padding?.bottom ?? 0}px ${I.padding?.left ?? 0}px`
3914
+ ], ee = I.children ?? I.components ?? [], me = x(ee, y, C, _);
3915
+ T += `
3916
+ <td valign="${I.verticalAlign ?? "middle"}"${q ? ` class="${q}"` : ""} style="${Z.join(";")}">
3917
+ ${me}
3918
+ </td>
3919
+ `, P < s.columns.length - 1 && s.gap && (T += `
3920
+ <td
3921
+ class="${q ? `gap-${s.gap} ${q}` : `gap-${s.gap}`}"
3922
+ width="${g}%"
3923
+ style="width:${g}%;max-width:${g}%;font-size:0;line-height:0;padding:0;">
3924
+ &nbsp;
3925
+ </td>
3926
+ `);
3927
+ });
3928
+ const k = s.columns.some((I) => re(I.border?.radius ?? 0));
3929
+ let M = `<table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:${(s.gap ?? 0) > 0 || k ? "separate" : "collapse"};">
3930
+ <tr>
3931
+ ${T}
3932
+ </tr>
3933
+ </table>`;
3934
+ const O = re(s.border?.radius ?? 0), B = [
3935
+ ...f,
3936
+ O ? `border-radius:${X(s.border.radius, 2)}` : "",
3937
+ "overflow:hidden"
3938
+ ].filter(Boolean);
3939
+ let D = Dn(M, s.border, [], s.padding);
3940
+ return C === "wrap" && E(s.visibility) && (D = be(D, s.visibility, o.value)), (s.minHeight ?? 0) > 0 && B.push(`min-height:${s.minHeight}px`), `
3941
+ <tr>
3942
+ <td${B.length ? ` style="${B.join(";")}"` : ""}>
3943
+ ${D}
3944
+ </td>
3945
+ </tr>
3946
+ `;
3947
+ }, j = (s, y) => {
3948
+ const { getGoogleFontImports: C } = ft(), { emailMobileStyles: _ } = Gt(), f = i?.value ?? {}, p = C([...c(s, f)]), g = m(s, f, _), w = b(r.value.mobileBreakpoint, g), $ = [
3949
+ "margin:0",
3950
+ "padding:0",
3951
+ r.value.bodyBackgroundColor ? `background-color:${r.value.bodyBackgroundColor}` : "",
3952
+ r.value.bodyBackgroundImage ? [
3953
+ `background-image:url('${r.value.bodyBackgroundImage}')`,
3954
+ `background-size:${r.value.bodyBackgroundSize}`,
3955
+ `background-position:${r.value.bodyBackgroundPosition}`,
3956
+ `background-repeat:${r.value.bodyBackgroundRepeat}`,
3957
+ "min-height:auto"
3958
+ ].join(";") : ""
3959
+ ].filter(Boolean).join(";");
3960
+ let v = `<!DOCTYPE html>
3961
+ <html lang="${r.value.language}" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
3962
+ <head>
3963
+ <meta charset="UTF-8">
3964
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3965
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
3966
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
3967
+ <meta name="x-apple-disable-message-reformatting">
3968
+ <meta name="color-scheme" content="light dark">
3969
+ <meta name="supported-color-schemes" content="light dark">
3970
+ <meta name="format-detection" content="telephone=no, date=no, address=no, email=no, url=no">
3971
+ <title>${y}</title>
3972
+ <!--[if mso]>
3973
+ <xml>
3974
+ <o:OfficeDocumentSettings>
3975
+ <o:PixelsPerInch>96</o:PixelsPerInch>
3976
+ <o:AllowPNG/>
3977
+ </o:OfficeDocumentSettings>
3978
+ </xml>
3979
+ <![endif]-->
3980
+ ${p ? `<link href="${p}" rel="stylesheet">` : ""}
3981
+ <style>
3982
+ ${w}
3983
+ </style>
3984
+ </head>
3985
+
3986
+ <body style="${$};">
3987
+ <div style="display:none;font-size:1px;color:#fefefe;line-height:1px;max-height:0;max-width:0;opacity:0;overflow:hidden;">
3988
+ ${r.value.preheaderText} &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp; &#847; &zwnj; &nbsp;
3989
+ </div>
3990
+ <table width="100%" cellpadding="0" cellspacing="0">
3991
+ <tr>
3992
+ <td style="padding:${r.value.padding?.top ?? 0}px ${r.value.padding?.right ?? 0}px ${r.value.padding?.bottom ?? 0}px ${r.value.padding?.left ?? 0}px;">
3993
+
3994
+ <table
3995
+ width="100%"
3996
+ align="center"
3997
+ cellpadding="0"
3998
+ cellspacing="0"
3999
+ class="email-container"
4000
+ style="width:100%;max-width:${r.value.width}px;background:${r.value.backgroundColor};border-collapse:collapse;"
4001
+ >
4002
+ `;
4003
+ return t.value.forEach((S) => {
4004
+ if (s === "prune" && !h(S.visibility, f)) return;
4005
+ const T = N(S, f, s, 0);
4006
+ T.trim() && (v += T);
4007
+ }), v += `
4008
+ </table>
4009
+ </td>
4010
+ </tr>
4011
+ </table>
4012
+ </body>
4013
+ </html>
4014
+ `, v = Un(v, s, o.value, a?.value), v;
4015
+ };
4016
+ return {
4017
+ export: async (s = "prune", y) => {
4018
+ if (!l("Export")) return;
4019
+ const C = y || "Untitled Template", _ = j(s, C), f = gt(C), { minifyOutput: p } = Yt();
4020
+ if (p.value) Ae({
4021
+ content: Be("html", _),
4022
+ filename: `${Ne(f, s)}.html`,
4023
+ mimeType: "text/html"
4024
+ });
4025
+ else {
4026
+ const g = await so(_);
4027
+ Ae({
4028
+ content: g,
4029
+ filename: `${Ne(f, s)}.html`,
4030
+ mimeType: "text/html"
4031
+ });
4032
+ }
4033
+ },
4034
+ getHTML: (s = "prune", y) => {
4035
+ if (!t.value || t.value.length === 0) return null;
4036
+ const C = j(s, y || "Untitled Template");
4037
+ return Be("html", C);
4038
+ }
4039
+ };
4040
+ }, zo = 5, Lo = (e) => {
4041
+ const { rows: t, canvasStyles: r, generators: n, espSyntax: o, visibilityContext: i, tagSubstitution: a, guardEmpty: l, collectFonts: c, collectMobileCSS: m, buildMobileStyleBlock: b } = e, { evaluateVisibility: h } = mt(), R = (d) => {
4042
+ if (!d?.enabled) return !1;
4043
+ const s = (d.rules?.length ?? 0) > 0, y = (d.groups?.length ?? 0) > 0;
4044
+ return s || y;
4045
+ }, E = (d, s, y, C, _) => {
4046
+ let f = "";
4047
+ for (const p of d) {
4048
+ const g = p.type === "component" ? p.props?.visibility : p.visibility;
4049
+ if (y === "prune" && !h(g, s)) continue;
4050
+ const w = p.type;
4051
+ if (w === "row") {
4052
+ if (_ >= zo) continue;
4053
+ const v = x(p, s, y, _ + 1);
4054
+ v.trim() && (f += ` ${v.trim()}
4055
+ `);
4056
+ continue;
4057
+ }
4058
+ if (w === "row-spacer") {
4059
+ if (!p.height || p.height <= 0) continue;
4060
+ const v = et(p), S = Object.keys(v).length > 0 ? `, ${Object.entries(v).map(([k, M]) => `${k}:"${M}"`).join(", ")}` : "";
4061
+ let T = `<div style={{ display: "block", height: "${p.height}px", lineHeight: "${p.height}px", fontSize: "1px"${S} }}>&nbsp;</div>`;
4062
+ y === "wrap" && R(p.visibility) && (T = nt(T, p.visibility)), f += ` ${T}
4063
+ `;
4064
+ continue;
4065
+ }
4066
+ let $ = Jn(n.react(p), y, a?.value);
4067
+ y === "wrap" && R(p.props?.visibility) && ($ = nt($, p.props.visibility)), f += ` ${$.trim()}
4068
+ `;
4069
+ }
4070
+ return f;
4071
+ }, x = (d, s, y, C = 0) => {
4072
+ if (y === "prune" && !h(d.visibility, s)) return "";
4073
+ if (d.type === "row-spacer") {
4074
+ if (!d.height || d.height <= 0) return "";
4075
+ const I = et(d), P = Object.keys(I).length > 0 ? `, ${Object.entries(I).map(([q, W]) => `${q}:"${W}"`).join(", ")}` : "";
4076
+ let V = `
4077
+ {/* Row Spacer */}
4078
+ <Section>
4079
+ <div style={{ display: "block", height: "${d.height}px", lineHeight: "${d.height}px", fontSize: "1px"${P} }}>&nbsp;</div>
4080
+ </Section>`;
4081
+ return y === "wrap" && R(d.visibility) && (V = nt(V, d.visibility)), V;
4082
+ }
4083
+ const _ = r.value.mobileBreakpoint || 600, f = (d.gap || 0) / _ * 100, p = 100 - f * (d.columns.length - 1), g = [];
4084
+ let w = 0;
4085
+ d.columns.forEach((I) => {
4086
+ const P = I.width / 100 * p;
4087
+ g.push(P), w += P;
4088
+ });
4089
+ const $ = p - w;
4090
+ Math.abs($) > 0.01 && g.length > 0 && (g[g.length - 1] += $);
4091
+ let v = "";
4092
+ d.columns.forEach((I, P) => {
4093
+ if (y === "prune" && !h(I.props?.visibility, s)) return;
4094
+ const V = g[P], q = d.mobileStack ? "mobile-stack" : "", W = et(I), Z = {
4095
+ width: `${V}%`,
4096
+ boxSizing: "border-box",
4097
+ verticalAlign: I.verticalAlign ?? "middle",
4098
+ ...Rt(I.border),
4099
+ borderRadius: X(I.border?.radius ?? 0),
4100
+ overflow: "hidden",
4101
+ lineHeight: "0",
4102
+ fontSize: "0",
4103
+ padding: `${I.padding?.top ?? 0}px ${I.padding?.right ?? 0}px ${I.padding?.bottom ?? 0}px ${I.padding?.left ?? 0}px`,
4104
+ ...W
4105
+ }, ee = Object.entries(Z).map(([oe, ze]) => `${oe}:"${ze}"`).join(", "), me = I.children ?? I.components ?? [], Se = E(me, s, y, d, C);
4106
+ v += `<Column
4107
+ className="${q}"
4108
+ style={{ ${ee} }}
4109
+ >
4110
+ ${Se}
4111
+ </Column>
4112
+ `, P < d.columns.length - 1 && d.gap && (v += `<Column
4113
+ className="${q ? `gap-${d.gap} ${q}` : `gap-${d.gap}`}"
4114
+ style={{ width:"${f}%", maxWidth:"${f}%", fontSize:"0", lineHeight:"0" }}
4115
+ >&nbsp;</Column>
4116
+ `);
4117
+ });
4118
+ const S = et(d), T = re(d.border?.radius ?? 0), k = {
4119
+ ...S,
4120
+ ...T ? { borderRadius: X(d.border.radius, 2) } : {},
4121
+ overflow: "hidden"
4122
+ }, M = Object.entries(k).filter(([I, P]) => P !== void 0 && P !== "").map(([I, P]) => `${I}:"${P}"`).join(", "), O = M ? ` style={{ ${M} }}` : "", B = `<Row>${v}</Row>`;
4123
+ let D = ` <Section${O}>
4124
+ ${ao(B, d.border, {}, d.padding, !0)}
4125
+ </Section>`;
4126
+ return y === "wrap" && R(d.visibility) && (D = nt(D, d.visibility)), D;
4127
+ }, N = (d = "prune", s) => {
4128
+ const y = s || "Untitled Template", C = y.replace(/[^a-zA-Z0-9 ]/g, "").split(" ").map((B) => B.charAt(0).toUpperCase() + B.slice(1)).join(""), { getGoogleFontImports: _ } = ft(), { emailMobileStyles: f } = Gt(), p = i?.value ?? {}, g = c(d, p), w = _([...g]), $ = m(d, p, f), v = b(r.value.mobileBreakpoint, $), S = t.value.map((B) => x(B, p, d, 0)).filter(Boolean).join(`
4129
+ `), T = w?.includes("fonts.googleapis.com"), k = w ? T ? ` {/* Google Fonts via <link> — all families in one request */}
4130
+ <link href="${w}" rel="stylesheet" />` : [...g].map((B) => ` <Font
4131
+ fontFamily="${pt(B)}"
4132
+ fallbackFontFamily="Arial"
4133
+ webFont={{ url: "${w}", format: "woff2" }}
4134
+ fontWeight={400}
4135
+ fontStyle="normal"
4136
+ />`).join(`
4137
+ `) : "";
4138
+ let M = `import React from "react";
4139
+ import {
4140
+ Preview,
4141
+ Body,
4142
+ Container,
4143
+ Button,
4144
+ Column,
4145
+ Font,
4146
+ Head,
4147
+ Heading,
4148
+ Hr,
4149
+ Html,
4150
+ Img,
4151
+ Link,
4152
+ Row,
4153
+ Section,
4154
+ Text,
4155
+ } from "@react-email/components";
4156
+
4157
+ ${w ? T ? "// Google Fonts loaded via <link> (email-safe fallback strategy)" : `// Custom web font${g.size > 1 ? "s" : ""} loaded via <Font> — one instance per family` : "// No custom fonts used"}
4158
+
4159
+ const styles = \`
4160
+ ${v}
4161
+ \`;
4162
+
4163
+ export default function ${C}() {
4164
+ return (
4165
+ <Html lang="${r.value.language}">
4166
+ <Head>
4167
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes" />
4168
+ <meta name="x-apple-disable-message-reformatting" />
4169
+ <meta httpEquiv="Content-Type" content="text/html; charset=UTF-8" />
4170
+ <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
4171
+ <meta name="color-scheme" content="light dark" />
4172
+ <meta name="supported-color-schemes" content="light dark" />
4173
+ <meta name="format-detection" content="telephone=no, date=no, address=no, email=no, url=no" />
4174
+ <title>${y}</title>
4175
+ <style>{styles}</style>
4176
+ ${k}
4177
+ </Head>
4178
+ <Preview>${r.value.preheaderText}</Preview>
4179
+ <Body style={{ margin:0, padding:0, backgroundColor:"${r.value.bodyBackgroundColor}" }}>
4180
+ <Container style={{
4181
+ margin: 0,
4182
+ padding: 0,
4183
+ maxWidth: "100%",
4184
+ ${r.value.bodyBackgroundImage ? `
4185
+ backgroundImage: "url('${r.value.bodyBackgroundImage}')",
4186
+ backgroundSize: "${r.value.bodyBackgroundSize}",
4187
+ backgroundPosition: "${r.value.bodyBackgroundPosition}",
4188
+ backgroundRepeat: "${r.value.bodyBackgroundRepeat}",
4189
+ ` : ""}
4190
+ }}>
4191
+ <Container
4192
+ className="email-container"
4193
+ style={{
4194
+ width:"100%",
4195
+ maxWidth:"${r.value.width}px",
4196
+ backgroundColor:"${r.value.backgroundColor}",
4197
+ padding:"${r.value.padding?.top ?? 0}px ${r.value.padding?.right ?? 0}px ${r.value.padding?.bottom ?? 0}px ${r.value.padding?.left ?? 0}px"
4198
+ }}
4199
+ >
4200
+ ${S}
4201
+ </Container>
4202
+ </Container>
4203
+ </Body>
4204
+ </Html>
4205
+ );
4206
+ }
4207
+ `;
4208
+ const O = a?.value?.mergeTagActive || a?.value?.linkTagActive;
4209
+ if (d === "wrap" || !O) {
4210
+ const B = bo(M), D = new Set(B.map((W) => W.tagId)), I = $o(t.value).filter((W) => !D.has(W)), { propsInterface: P, propsDestructure: V } = vo(B), q = yo(I);
4211
+ (P || q) && (M = M.replace(/^(export default function (\w+))\(\)\s*\{/m, [
4212
+ P ? `${P}
4213
+
4214
+ ` : "",
4215
+ `$1(${V || ""}) {`,
4216
+ q ? `
4217
+ ${q}
4218
+ ` : ""
4219
+ ].join(""))), M = ho(M);
4220
+ }
4221
+ return M = Mn(M), M;
4222
+ };
4223
+ return {
4224
+ export: async (d = "prune", s) => {
4225
+ if (!l("Export")) return;
4226
+ const y = s || "Untitled Template", C = N(d, y), _ = gt(y), { minifyOutput: f } = Yt();
4227
+ if (f.value) Ae({
4228
+ content: Be("react-email", C),
4229
+ filename: `${Ne(_, d)}.tsx`,
4230
+ mimeType: "text/plain"
4231
+ });
4232
+ else {
4233
+ const p = await lo(C);
4234
+ Ae({
4235
+ content: p,
4236
+ filename: `${Ne(_, d)}.tsx`,
4237
+ mimeType: "text/plain"
4238
+ });
4239
+ }
4240
+ },
4241
+ getReactEmail: (d = "prune", s) => {
4242
+ if (!t.value || t.value.length === 0) return null;
4243
+ const y = N(d, s || "Untitled Template");
4244
+ return Be("react-email", y);
4245
+ }
4246
+ };
4247
+ }, Po = 5, Do = (e) => {
4248
+ const { rows: t, canvasStyles: r, generators: n, espSyntax: o, visibilityContext: i, tagSubstitution: a, guardEmpty: l, collectFonts: c, collectMobileCSS: m } = e, { evaluateVisibility: b } = mt(), h = (u) => {
4249
+ if (!u?.enabled) return !1;
4250
+ const d = (u.rules?.length ?? 0) > 0, s = (u.groups?.length ?? 0) > 0;
4251
+ return d || s;
4252
+ }, R = (u, d, s, y) => {
4253
+ let C = "";
4254
+ for (const _ of u) {
4255
+ const f = _.type === "component" ? _.props?.visibility : _.visibility;
4256
+ if (s === "prune" && !b(f, d)) continue;
4257
+ const p = _.type;
4258
+ if (p === "row") {
4259
+ if (y >= Po) continue;
4260
+ const w = E(_, d, s, y + 1);
4261
+ if (w.trim()) {
4262
+ let $ = w;
4263
+ s === "wrap" && h(_.visibility) && ($ = be($, _.visibility, o.value)), C += $;
4264
+ }
4265
+ continue;
4266
+ }
4267
+ if (p === "row-spacer") {
4268
+ if (!_.height || _.height <= 0) continue;
4269
+ const w = ue(_);
4270
+ let $ = `<div height="${_.height}" style="height:${_.height}px;line-height:${_.height}px;font-size:1px;mso-line-height-rule:exactly;${w.join(";")}">&nbsp;</div>`;
4271
+ s === "wrap" && h(_.visibility) && ($ = be($, _.visibility, o.value)), C += $;
4272
+ continue;
4273
+ }
4274
+ let g = `<div style="font-family:none;font-size:0;line-height:0;text-align:left;color:#000000;">${n.mjml(_).replace(/^<mj-text[^>]*>/i, "").replace(/<\/mj-text>\s*$/i, "")}</div>`;
4275
+ s === "wrap" && h(_.props?.visibility) && (g = be(g, _.props.visibility, o.value)), C += g;
4276
+ }
4277
+ return C;
4278
+ }, E = (u, d, s, y) => {
4279
+ if (!u.columns?.length) return "";
4280
+ const C = ue(u), _ = r.value.mobileBreakpoint || 600, f = u.gap || 0, p = f / _ * 100, g = 100 - p * (u.columns.length - 1), w = [];
4281
+ let $ = 0;
4282
+ u.columns.forEach((B) => {
4283
+ const D = B.width / 100 * g;
4284
+ w.push(D), $ += D;
4285
+ });
4286
+ const v = g - $;
4287
+ Math.abs(v) > 0.01 && w.length > 0 && (w[w.length - 1] += v);
4288
+ let S = "";
4289
+ u.columns.forEach((B, D) => {
4290
+ if (s === "prune" && !b(B.props?.visibility, d)) return;
4291
+ const I = w[D], P = u.mobileStack ? "mobile-stack" : "", V = ue(B), q = [
4292
+ `width:${I}%`,
4293
+ "box-sizing:border-box",
4294
+ `vertical-align:${B.verticalAlign ?? "middle"}`,
4295
+ de(B.border),
4296
+ `border-radius:${X(B.border.radius)}`,
4297
+ "overflow:hidden",
4298
+ ...V
4299
+ ], W = B.children ?? B.components ?? [], Z = R(W, d, s, y), ee = Dn(Z, B.border, [], B.padding), me = P ? ` class="${P}"` : "";
4300
+ if (S += `<td valign="${B.verticalAlign ?? "middle"}"${me} style="${q.join(";")}">
4301
+ ${ee}
4302
+ </td>
4303
+ `, D < u.columns.length - 1 && f > 0) {
4304
+ const Se = P ? `gap-${f} ${P}` : `gap-${f}`;
4305
+ S += `<td class="${Se}" width="${p}%" style="width:${p}%;max-width:${p}%;font-size:0;line-height:0;padding:0;">&nbsp;</td>
4306
+ `;
4307
+ }
4308
+ });
4309
+ const T = pe(u.border) ? `${de(u.border)};border-radius:${X(u.border.radius)};overflow:hidden;` : `border-radius:${X(u.border.radius)};overflow:hidden;`, k = u.padding ? `${u.padding.top ?? 0}px ${u.padding.right ?? 0}px ${u.padding.bottom ?? 0}px ${u.padding.left ?? 0}px` : "0px", M = C.length ? `${C.join(";")};` : "", O = u.columns.some((B) => re(B.border?.radius ?? 0));
4310
+ return `<div style="padding:${k};${T}${M}">
4311
+ <table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:${(u.gap ?? 0) > 0 || O ? "separate" : "collapse"};">
4312
+ <tr>
4313
+ ${S}</tr>
4314
+ </table>
4315
+ </div>`;
4316
+ }, x = (u = "prune", d) => {
4317
+ const s = d || "Untitled Template", { getGoogleFontImports: y } = ft(), { emailMobileStyles: C } = Gt(), { assembleMJML: _ } = Bn(), f = i?.value ?? {}, p = y([...c(u, f)]), g = m(u, f, C), w = Pn(t.value), $ = [
4318
+ ".email-container { max-width:100% !important; width:100% !important; }",
4319
+ ".desktop-hide { display:block !important; }",
4320
+ ".mobile-hide { display:none !important; }",
4321
+ ".mobile-stack { display:block !important; width:100% !important; min-width:100% !important; max-width:100% !important; box-sizing:border-box !important; }",
4322
+ ...w ? [w] : []
4323
+ ].join(`
4324
+
4325
+ `), v = g.length > 0 ? [
4326
+ $,
4327
+ "/* Mobile property overrides */",
4328
+ ...g
4329
+ ].join(`
4330
+ `) : $, S = [];
4331
+ t.value.forEach((k) => {
4332
+ if (u === "prune" && !b(k.visibility, f)) return;
4333
+ if (k.type === "row-spacer") {
4334
+ if (!k.height || k.height <= 0) return;
4335
+ const F = ue(k);
4336
+ let te = ` <mj-raw>
4337
+ <table width="100%" cellpadding="0" cellspacing="0">
4338
+ <tr>
4339
+ <td>
4340
+ <div height="${k.height}" style="height:${k.height}px;line-height:${k.height}px;font-size:1px;mso-line-height-rule:exactly;${F.join(";")}">&nbsp;</div>
4341
+ </td>
4342
+ </tr>
4343
+ </table>
4344
+ </mj-raw>`;
4345
+ u === "wrap" && h(k.visibility) && (te = be(te, k.visibility, o.value)), S.push(te);
4346
+ return;
4347
+ }
4348
+ const M = r.value.mobileBreakpoint || 600, O = k.gap || 0, B = O / M * 100, D = 100 - B * (k.columns.length - 1), I = [];
4349
+ let P = 0;
4350
+ k.columns.forEach((F) => {
4351
+ const te = F.width / 100 * D;
4352
+ I.push(te), P += te;
4353
+ });
4354
+ const V = D - P;
4355
+ Math.abs(V) > 0.01 && I.length > 0 && (I[I.length - 1] += V);
4356
+ const q = ue(k), W = (() => {
4357
+ const F = k.backgroundGradient;
4358
+ return F?.useGradient === !0 && Array.isArray(F?.gradient?.colors) && F.gradient.colors.length >= 2 ? F.solid || k.backgroundColor || "" : k.backgroundColor || "";
4359
+ })(), Z = W && W !== "transparent" ? W : "", ee = k.padding ? `${k.padding.top ?? 0}px ${k.padding.right ?? 0}px ${k.padding.bottom ?? 0}px ${k.padding.left ?? 0}px` : "0px", me = re(k.border?.radius ?? 0), Se = pe(k.border) && !re(k.border?.radius ?? 0), oe = [...q, "overflow:hidden"];
4360
+ Se && (oe.push(de(k.border)), oe.push(`padding:${ee}`)), me && oe.push(`border-radius:${X(k.border.radius, 2)}`), (k.minHeight ?? 0) > 0 && oe.push(`min-height:${k.minHeight}px`);
4361
+ const ze = oe.length ? ` style="${oe.join(";")}"` : "";
4362
+ let Le = "";
4363
+ pe(k.border) && (Le = `${de(k.border)};`, re(k.border?.radius ?? 0) && (Le += `border-radius:${X(k.border.radius)};overflow:hidden;`));
4364
+ const ht = [
4365
+ `padding:${ee}`,
4366
+ "font-size:0",
4367
+ "line-height:0",
4368
+ Le
4369
+ ].filter(Boolean).join(";");
4370
+ let Re = "";
4371
+ k.columns.forEach((F, te) => {
4372
+ if (u === "prune" && !b(F.props?.visibility, f)) return;
4373
+ const H = I[te], Q = k.mobileStack ? "mobile-stack" : "", vt = ue(F), bt = [
4374
+ `width:${H}%`,
4375
+ "box-sizing:border-box",
4376
+ `vertical-align:${F.verticalAlign ?? "middle"}`,
4377
+ ...vt,
4378
+ de(F.border),
4379
+ `border-radius:${X(F.border?.radius ?? 0)}`,
4380
+ "overflow:hidden",
4381
+ "line-height:0",
4382
+ "font-size:0",
4383
+ `padding:${F.padding?.top ?? 0}px ${F.padding?.right ?? 0}px ${F.padding?.bottom ?? 0}px ${F.padding?.left ?? 0}px`
4384
+ ], $t = F.children ?? F.components ?? [], We = R($t, f, u, 0), yt = Q ? ` class="${Q}"` : "";
4385
+ if (Re += `<td valign="${F.verticalAlign ?? "middle"}"${yt} style="${bt.join(";")}">
4386
+ ${We}
4387
+ </td>
4388
+ `, te < k.columns.length - 1 && O > 0) {
4389
+ const St = Q ? `gap-${O} ${Q}` : `gap-${O}`;
4390
+ Re += `<td class="${St}" width="${B}%" style="width:${B}%;max-width:${B}%;font-size:0;line-height:0;padding:0;">&nbsp;</td>
4391
+ `;
4392
+ }
4393
+ });
4394
+ const U = k.columns.some((F) => re(F.border?.radius ?? 0));
4395
+ let K = `<div style="${ht}">${`<table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:${(k.gap ?? 0) > 0 || U ? "separate" : "collapse"};">
4396
+ <tr>
4397
+ ${Re}</tr>
4398
+ </table>`}</div>`;
4399
+ u === "wrap" && h(k.visibility) && (K = be(K, k.visibility, o.value));
4400
+ const ke = r.value.width ?? 600;
4401
+ S.push(` <mj-raw>
4402
+ <!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:${ke}px;" width="${ke}"${Z ? ` bgcolor="${Z}"` : ""}><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
4403
+ <div style="margin:0px auto;max-width:${ke}px;">
4404
+ <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
4405
+ <tbody>
4406
+ <tr>
4407
+ <td${ze}>
4408
+ ${K}
4409
+ </td>
4410
+ </tr>
4411
+ </tbody>
4412
+ </table>
4413
+ </div>
4414
+ <!--[if mso | IE]></td></tr></table><![endif]-->
4415
+ </mj-raw>`);
4416
+ });
4417
+ let T = _(s, S.join(`
4418
+ `), r.value, p, v, r.value.mobileBreakpoint ?? 600, "");
4419
+ return T = Un(T, u, o.value, a?.value, !0), T;
4420
+ };
4421
+ return {
4422
+ export: async (u = "prune", d) => {
4423
+ if (!l("Export")) return;
4424
+ const s = d || "Untitled Template", y = x(u, s), C = gt(s), { minifyOutput: _ } = Yt();
4425
+ if (_.value) Ae({
4426
+ content: Be("mjml", y),
4427
+ filename: `${Ne(C, u)}.mjml`,
4428
+ mimeType: "text/plain"
4429
+ });
4430
+ else {
4431
+ const f = await co(y);
4432
+ Ae({
4433
+ content: f,
4434
+ filename: `${Ne(C, u)}.mjml`,
4435
+ mimeType: "text/plain"
4436
+ });
4437
+ }
4438
+ },
4439
+ getMJML: (u = "prune", d) => {
4440
+ if (!t.value || t.value.length === 0) return null;
4441
+ const s = x(u, d || "Untitled Template");
4442
+ return Be("mjml", s);
4443
+ }
4444
+ };
4445
+ }, Fo = (e) => {
4446
+ const { rows: t, canvasStyles: r, saveToHistoryFn: n, guardEmpty: o } = e, i = e.notify ?? ((b, h = "Import failed") => console.error(`[maildeno-editor] ${h}: ${b}`)), a = (b) => {
4447
+ const h = b || "Untitled Template";
4448
+ return {
4449
+ template_id: at(h),
4450
+ template_name: h,
4451
+ canvas: An(JSON.parse(JSON.stringify(r.value))),
4452
+ rows: Rn(JSON.parse(JSON.stringify(t.value))),
4453
+ schema_version: "1.0"
4454
+ };
4455
+ };
4456
+ return {
4457
+ export: (b) => {
4458
+ if (!o("Export")) return;
4459
+ const h = a(b);
4460
+ Ae({
4461
+ content: JSON.stringify(h, null, 2),
4462
+ filename: `${gt(h.template_name)}.json`,
4463
+ mimeType: "application/json"
4464
+ });
4465
+ },
4466
+ import: (b, h) => {
4467
+ const R = new FileReader();
4468
+ R.onload = (E) => {
4469
+ try {
4470
+ let x = JSON.parse(E.target?.result);
4471
+ x = bn(x), x.canvas && x.rows ? (r.value = lt(x.canvas), t.value = ct(x.rows), h.value = null, n("import")) : i("That file isn't a Maildeno template. Export one from the editor (Export → JSON) and try again.", "Invalid template file");
4472
+ } catch (x) {
4473
+ i(x.message, "Couldn't load template");
4474
+ }
4475
+ }, R.readAsText(b);
4476
+ },
4477
+ getJSON: (b) => !t.value || t.value.length === 0 ? null : a(b)
4478
+ };
4479
+ }, Ho = 5, hn = /font-family\s*:\s*([^;<]+)/gi, Uo = (e) => e.replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&apos;/g, "'"), Jo = (e) => {
4480
+ if (!e || typeof e != "string") return [];
4481
+ if (e.indexOf("font-family") === -1) return [];
4482
+ const t = Uo(e), r = [];
4483
+ let n;
4484
+ for (hn.lastIndex = 0; (n = hn.exec(t)) !== null; ) {
4485
+ const o = n[1];
4486
+ if (!o) continue;
4487
+ let i = o;
4488
+ const a = i.trimStart()[0];
4489
+ if (a === '"' || a === "'") {
4490
+ const c = i.indexOf(a), m = i.indexOf(a, c + 1);
4491
+ if (m !== -1) {
4492
+ const b = i.slice(m + 1).search(/["<]/);
4493
+ i = b === -1 ? i : i.slice(0, m + 1 + b);
4494
+ }
4495
+ } else {
4496
+ const c = i.search(/["<]/);
4497
+ c !== -1 && (i = i.slice(0, c));
4498
+ }
4499
+ const l = (i.split(",")[0] ?? "").trim().replace(/^['"]|['"]$/g, "").trim();
4500
+ l && r.push(l);
4501
+ }
4502
+ return r;
4503
+ }, Go = (e, t, r, n, o, i, a, l, c, m) => {
4504
+ let b, h, R, E;
4505
+ typeof r == "object" && !("value" in r) ? (b = r, h = n, R = o, E = i) : (b = {
4506
+ html: r,
4507
+ react: n,
4508
+ mjml: o
4509
+ }, h = i, R = a, E = l);
4510
+ const { evaluateVisibility: x } = mt(), { open: N } = m ?? to(), j = c ?? L({ syntax: "handlebars" }), u = (v, S, T, k, M = 0) => {
4511
+ if (!(M >= Ho))
4512
+ for (const O of v) {
4513
+ const B = O.type;
4514
+ if (B === "row") {
4515
+ if (S === "prune" && !x(O.visibility, T)) continue;
4516
+ for (const D of O.columns ?? []) {
4517
+ const I = D.children ?? D.components ?? [];
4518
+ u(I, S, T, k, M + 1);
4519
+ }
4520
+ continue;
4521
+ }
4522
+ B !== "row-spacer" && (S === "prune" && !x(O.props?.visibility, T) || k(O));
4523
+ }
4524
+ }, d = (v) => !e.value || e.value.length === 0 ? (N("Your template is empty. Please add at least one row before exporting.", v), !1) : !0, s = (v, S) => {
4525
+ const T = /* @__PURE__ */ new Set();
4526
+ return e.value.forEach((k) => {
4527
+ v === "prune" && !x(k.visibility, S) || k.columns && k.columns.forEach((M) => {
4528
+ const O = M.children ?? M.components ?? [];
4529
+ u(O, v, S, (B) => {
4530
+ if (B.props?.fontFamily && T.add(B.props.fontFamily), B.props?.mobile?.fontFamily && T.add(B.props.mobile.fontFamily), typeof B.props?.content == "string") {
4531
+ const D = Jo(B.props.content);
4532
+ for (const I of D) T.add(I);
4533
+ }
4534
+ });
4535
+ });
4536
+ }), T;
4537
+ }, y = (v, S, T) => {
4538
+ const k = [];
4539
+ return e.value.forEach((M) => {
4540
+ v === "prune" && !x(M.visibility, S) || M.columns && M.columns.forEach((O) => {
4541
+ const B = O.children ?? O.components ?? [];
4542
+ u(B, v, S, (D) => {
4543
+ const I = T(D, `eb-${D.id}`);
4544
+ I && k.push(I);
4545
+ });
4546
+ });
4547
+ }), k;
4548
+ }, C = (v, S) => {
4549
+ const T = Pn(e.value), k = S.length > 0 ? `
4550
+
4551
+ /* Mobile property overrides */
4552
+ ${S.join(`
4553
+
4554
+ `)}` : "";
4555
+ return `
4556
+ .desktop-hide { display: none !important; }
4557
+ ul li:last-child, ol li:last-child { margin-bottom: 0 !important; }
4558
+ @media only screen and (max-width:${v}px) {
4559
+ ${`
4560
+ .email-container { max-width:100% !important; width:100% !important; }
4561
+
4562
+ .desktop-hide { display:block !important; }
4563
+
4564
+ .mobile-hide { display:none !important; }
4565
+
4566
+ .mobile-stack { display:block !important; width:100% !important; min-width:100% !important; max-width:100% !important; box-sizing:border-box !important; }
4567
+ ${T ? `
4568
+ ${T}` : ""}${k}
4569
+ `}
4570
+ }`;
4571
+ }, _ = Ce(() => j.value.syntax), f = {
4572
+ rows: e,
4573
+ canvasStyles: t,
4574
+ generators: b,
4575
+ espSyntax: _,
4576
+ visibilityContext: R,
4577
+ tagSubstitution: E,
4578
+ guardEmpty: d,
4579
+ collectFonts: s,
4580
+ collectMobileCSS: y,
4581
+ buildMobileStyleBlock: C
4582
+ }, p = jo(f), g = Lo(f), w = Do(f), $ = Fo({
4583
+ rows: e,
4584
+ canvasStyles: t,
4585
+ saveToHistoryFn: h,
4586
+ guardEmpty: d,
4587
+ notify: (v, S) => N(v, S ?? "Import failed")
4588
+ });
4589
+ return {
4590
+ exportHTML: p.export,
4591
+ getExportedHTML: p.getHTML,
4592
+ exportReactEmail: g.export,
4593
+ getExportedReactEmail: g.getReactEmail,
4594
+ exportMJML: w.export,
4595
+ getExportedMJML: w.getMJML,
4596
+ exportJSON: $.export,
4597
+ getExportedJSON: $.getJSON,
4598
+ importJSON: $.import,
4599
+ espConfig: j
4600
+ };
4601
+ }, qo = 3e3, Me = null, Ue, rt, se = -1, ot = () => ({
4602
+ language: "en-US",
4603
+ preheaderText: "View this email in your browser",
4604
+ bodyBackgroundColor: "#f9fafb",
4605
+ bodyBackgroundImage: "",
4606
+ bodyBackgroundSize: "cover",
4607
+ bodyBackgroundPosition: "center center",
4608
+ bodyBackgroundRepeat: "no-repeat",
4609
+ backgroundColor: "#ffffff",
4610
+ width: 600,
4611
+ padding: {
4612
+ top: 0,
4613
+ right: 0,
4614
+ bottom: 0,
4615
+ left: 0
4616
+ },
4617
+ mobileBreakpoint: 600
4618
+ }), Zn = /* @__PURE__ */ Symbol("maildeno-editor:email-builder");
4619
+ function Sa(e, t, r) {
4620
+ const n = Wo(e, t, r);
4621
+ return Ie(Zn, n), n;
4622
+ }
4623
+ var ka = () => {
4624
+ const e = Oe(Zn);
4625
+ if (!e) throw new Error("[maildeno-editor] useEmailBuilder() was called outside an EmailEditor instance. This composable only works inside the component tree under <EmailEditor>, which is where provideEmailBuilder() creates the shared instance.");
4626
+ return e;
4627
+ };
4628
+ function Wo(e, t, r) {
4629
+ const n = e ?? vr(), o = br(), i = L([]), a = L(null), l = L(ot()), c = L(null), m = L([]), b = L(null), h = L(null), R = L("properties"), E = L("desktop"), x = L(!1), N = L(!1), j = L(null), u = L("create"), d = L({}), s = L(null), y = (A, z, J = "") => {
4630
+ s.value = {
4631
+ componentId: A,
4632
+ tagName: z,
4633
+ default: J
4634
+ };
4635
+ }, C = L({}), _ = L(!1), f = L({}), p = L(!1), g = L(null), w = L(null), $ = L(!1), v = L(!1), S = L(null), T = L({ syntax: "handlebars" }), { defaultProps: k } = zt(), M = Cr(), O = () => M.getCurrentState(i, l), B = (A) => M.restoreState(A, i, l, a, b, h), { generateHTMLComponent: D } = qr(), { generateReactEmailComponent: I } = Xr(), { generateMJMLComponent: P } = Bn(), V = {
4636
+ html: D,
4637
+ react: I,
4638
+ mjml: P
4639
+ }, { saveToLocal: q, flushSave: W, loadFromLocal: Z, clearLocal: ee, hasDraft: me, saveStatus: Se, lastSaved: oe } = Jr(), { syncFontsForTemplate: ze } = ft(), Le = 5, ht = (A) => {
4640
+ const z = /* @__PURE__ */ new Set(), J = (G, we) => {
4641
+ if (!(we >= Le))
4642
+ for (const Ve of G) {
4643
+ if (!Ve) continue;
4644
+ const Zt = Ve.type;
4645
+ if (Zt === "row") {
4646
+ for (const en of Ve.columns ?? []) J(en.children ?? en.components ?? [], we + 1);
4647
+ continue;
4648
+ }
4649
+ if (Zt === "row-spacer") continue;
4650
+ const Ke = Ve.props;
4651
+ Ke?.fontFamily && z.add(Ke.fontFamily), Ke?.mobile?.fontFamily && z.add(Ke.mobile.fontFamily);
4652
+ }
4653
+ };
4654
+ for (const G of A)
4655
+ if (G && G.type !== "row-spacer")
4656
+ for (const we of G.columns ?? []) J(we.children ?? we.components ?? [], 0);
4657
+ return Array.from(z);
4658
+ };
4659
+ {
4660
+ let A = null;
4661
+ fr(() => {
4662
+ const z = ht(i.value);
4663
+ A && clearTimeout(A), A = setTimeout(() => {
4664
+ A = null, ze(z);
4665
+ }, 200);
4666
+ });
4667
+ }
4668
+ const Re = r ?? hr();
4669
+ let U = null, K = !1;
4670
+ const ke = () => {
4671
+ K || Re.value && (U && clearTimeout(U), U = setTimeout(() => {
4672
+ U = null;
4673
+ const A = M.version.value;
4674
+ A !== se && (se = A, Ue = c.value ?? void 0, q(i.value, l.value, Me, Ue, rt));
4675
+ }, qo));
4676
+ };
4677
+ function F(A = "change", z = !1) {
4678
+ M.saveToHistory(O, A, z), ke();
4679
+ }
4680
+ function te(A) {
4681
+ F(A, !0);
4682
+ }
4683
+ const H = kr(i, a, k, te, F), Q = () => H.rebuildIdRegistry(), vt = (A) => H.addRow(A, !0), bt = () => H.addSpacer(!0), $t = (A, z) => H.reorderRows(A, z, !0), We = (A, z) => {
4684
+ if (A?.id && (z.add(A.id), A.type === "row" && Array.isArray(A.columns)))
4685
+ for (const J of A.columns) {
4686
+ J?.id && z.add(J.id);
4687
+ const G = J.children ?? J.components ?? [];
4688
+ for (const we of G) We(we, z);
4689
+ }
4690
+ }, yt = (A) => {
4691
+ const z = H.findRow(A);
4692
+ if (z) {
4693
+ const J = /* @__PURE__ */ new Set();
4694
+ We(z, J), a.value && J.has(a.value) && (a.value = null), b.value && J.has(b.value) && (b.value = null), h.value && (J.has(h.value.rowId) || J.has(h.value.columnId)) && (h.value = null);
4695
+ }
4696
+ H.deleteRow(A);
4697
+ }, St = Ce(() => ({
4698
+ mergeTagContext: C.value,
4699
+ mergeTagActive: _.value,
4700
+ linkTagContext: f.value,
4701
+ linkTagActive: p.value
4702
+ })), ce = Go(i, l, V, F, d, St, void 0, void 0, T, t);
4703
+ {
4704
+ const A = () => {
4705
+ U && (clearTimeout(U), U = null, W(i.value, l.value, Me, Ue, rt), se = M.version.value);
4706
+ };
4707
+ window.addEventListener("beforeunload", A), pr(() => {
4708
+ window.removeEventListener("beforeunload", A), U && (clearTimeout(U), U = null, W(i.value, l.value, Me, Ue, rt), se = M.version.value);
4709
+ });
4710
+ }
4711
+ const Xt = () => {
4712
+ if (i.value.length > 0)
4713
+ return x.value = !0, Q(), a.value = null, b.value = null, h.value = null, R.value = "properties", null;
4714
+ const A = Z();
4715
+ return !A || A.templateId !== null ? (x.value = !0, null) : (x.value = !1, K = !0, i.value = A.rows, l.value = A.canvas, a.value = null, b.value = null, h.value = null, R.value = "properties", $e(() => {
4716
+ K = !1, Q(), M.initialize(O()), se = M.version.value, x.value = !0;
4717
+ }), oe.value = new Date(A.updatedAt), A.name !== void 0 && (c.value = A.name), A.tags !== void 0 && (m.value = A.tags), A.updatedAt);
4718
+ }, er = async (A) => {
4719
+ if (!Re.value) throw new Error("[maildeno-editor] this editor has no saveTemplate — nothing was saved");
4720
+ const { templateId: z } = await n.saveTemplate(A, j.value ?? void 0);
4721
+ j.value = z, u.value === "create" && (u.value = "edit");
4722
+ const J = ce.getExportedJSON(A.name);
4723
+ return J && console.info("[maildeno-editor] Saved — exported JSON:", J), z;
4724
+ }, tr = async (A) => {
4725
+ const z = await n.loadTemplate(A);
4726
+ return z ? (Qt({
4727
+ canvas: z.canvasStyles,
4728
+ content: { rows: z.rows },
4729
+ name: z.name,
4730
+ tags: z.tags
4731
+ }, A), j.value = A, u.value = "edit", !0) : !1;
4732
+ }, nr = () => {
4733
+ x.value = !1, h.value = null, b.value = null, R.value = "properties", U && (clearTimeout(U), U = null);
4734
+ const A = Z();
4735
+ if (A && A.templateId === null) {
4736
+ Xt();
4737
+ return;
4738
+ }
4739
+ A && A.templateId !== null && ee(), K = !0, i.value = [], a.value = null, l.value = ot(), Me = null, c.value = null, m.value = [], $e(() => {
4740
+ K = !1, Q(), M.initialize(O()), se = M.version.value, x.value = !0;
4741
+ });
4742
+ }, rr = () => {
4743
+ x.value = !1, h.value = null, b.value = null, R.value = "properties", U && (clearTimeout(U), U = null), ee(), K = !0, i.value = [], a.value = null, l.value = ot(), Me = null, j.value = null, u.value = "create", c.value = null, m.value = [], $e(() => {
4744
+ K = !1, Q(), M.initialize(O()), se = M.version.value, x.value = !0;
4745
+ });
4746
+ }, Qt = (A, z, J) => {
4747
+ x.value = !1, Me = z, Ue = A.name, rt = A.tags, c.value = A.name ?? null, m.value = A.tags ?? [], U && (clearTimeout(U), U = null);
4748
+ const G = Z();
4749
+ if (G && G.templateId === z) {
4750
+ console.info(`[EmailBuilder] Restoring local draft for template ${z} (saved ${G.updatedAt}).`), G.name !== void 0 && (c.value = G.name), G.tags !== void 0 && (m.value = G.tags), K = !0, l.value = G.canvas, i.value = G.rows, a.value = null, b.value = null, h.value = null, R.value = "properties", $e(() => {
4751
+ K = !1, Q(), M.initialize(O()), se = M.version.value, x.value = !0, J?.();
4752
+ }), oe.value = new Date(G.updatedAt);
4753
+ return;
4754
+ }
4755
+ G && G.templateId !== z && (console.info(`[EmailBuilder] Clearing stale draft (belongs to ${G.templateId}, current is ${z}).`), ee()), K = !0, l.value = lt(JSON.parse(JSON.stringify(A.canvas))), i.value = ct(JSON.parse(JSON.stringify(A.content?.rows ?? []))), a.value = null, b.value = null, h.value = null, R.value = "properties", $e(() => {
4756
+ K = !1, Q(), M.initialize(O()), se = M.version.value, x.value = !0, J?.();
4757
+ });
4758
+ }, kt = (A, z = "restore-version") => {
4759
+ U && (clearTimeout(U), U = null), K = !0, l.value = lt(JSON.parse(JSON.stringify(A.canvas))), i.value = ct(JSON.parse(JSON.stringify(A.content?.rows ?? []))), a.value = null, b.value = null, h.value = null, R.value = "properties", $e(() => {
4760
+ K = !1, Q(), te(z);
4761
+ });
4762
+ }, or = () => {
4763
+ M.undo(B) && (Q(), ke());
4764
+ }, ar = () => {
4765
+ M.redo(B) && (Q(), ke());
4766
+ }, ir = () => {
4767
+ i.value = [], a.value = null, b.value = null, h.value = null, R.value = "properties", l.value = ot(), $e(() => {
4768
+ Q(), M.initialize(O()), se = M.version.value;
4769
+ });
4770
+ }, sr = () => {
4771
+ o.require({
4772
+ message: "Are you sure you want to clear the current template? This cannot be undone.",
4773
+ header: "Clear Template",
4774
+ acceptLabel: "Yes",
4775
+ rejectLabel: "Cancel",
4776
+ acceptClass: "!bg-red-600 !hover:bg-red-700 !border-red-600 !px-6 !py-2",
4777
+ rejectClass: "!bg-gray-200 !hover:bg-gray-300 !text-gray-800 !border-gray-200 !px-6 !py-2",
4778
+ accept: () => ir(),
4779
+ reject: () => {
4780
+ }
4781
+ });
4782
+ }, lr = (A, z = {}) => {
4783
+ const J = bn(A), G = {
4784
+ canvas: J.canvas,
4785
+ content: { rows: J.rows }
4786
+ };
4787
+ if (z.history === "reset") {
4788
+ kt(G, "set-json"), $e(() => {
4789
+ M.initialize(O()), se = M.version.value;
4790
+ });
4791
+ return;
4792
+ }
4793
+ kt(G, "set-json");
4794
+ }, cr = () => {
4795
+ const A = a.value;
4796
+ if (!A) return null;
4797
+ const z = H.findComponent(A);
4798
+ return {
4799
+ id: A,
4800
+ type: z?.componentType ?? z?.type ?? null
4801
+ };
4802
+ }, ur = (A) => A !== null && !H.findComponent(A) ? !1 : (a.value = A, !0), dr = (A) => vn(() => M.version.value, () => A());
4803
+ return {
4804
+ rows: i,
4805
+ canvasStyles: l,
4806
+ templateTags: m,
4807
+ savedTemplateName: c,
4808
+ previewMode: E,
4809
+ sidebarTab: R,
4810
+ selectedId: a,
4811
+ selectedRowId: b,
4812
+ selectedColumn: h,
4813
+ visibilityPreviewContext: d,
4814
+ mergeTagInsertQueue: s,
4815
+ triggerMergeTagInsert: y,
4816
+ mergeTagPreviewContext: C,
4817
+ mergeTagPreviewActive: _,
4818
+ linkTagPreviewContext: f,
4819
+ linkTagPreviewActive: p,
4820
+ isBuilderReady: x,
4821
+ linksActive: N,
4822
+ espConfig: T,
4823
+ canvasHoveredId: g,
4824
+ nestedRowDragId: w,
4825
+ isRowDragActive: $,
4826
+ isTopLevelRowDragActive: v,
4827
+ layerHoveredId: S,
4828
+ addRow: H.addRow,
4829
+ addNestedRow: H.addNestedRow,
4830
+ findRow: H.findRow,
4831
+ deleteRow: yt,
4832
+ moveRow: H.moveRow,
4833
+ moveNestedRow: H.moveNestedRow,
4834
+ reorderRows: H.reorderRows,
4835
+ addSpacer: H.addSpacer,
4836
+ duplicateRow: H.duplicateRow,
4837
+ duplicateRowSpacer: H.duplicateRowSpacer,
4838
+ addRowSilent: vt,
4839
+ addSpacerSilent: bt,
4840
+ reorderRowsSilent: $t,
4841
+ addComponent: H.addComponent,
4842
+ addComponentAtIndex: H.addComponentAtIndex,
4843
+ deleteComponent: H.deleteComponent,
4844
+ moveComponent: H.moveComponent,
4845
+ moveComponentBetweenColumns: H.moveComponentBetweenColumns,
4846
+ findComponent: H.findComponent,
4847
+ updateComponent: H.updateComponent,
4848
+ duplicateComponent: H.duplicateComponent,
4849
+ exportHTML: ce.exportHTML,
4850
+ getExportedHTML: ce.getExportedHTML,
4851
+ exportReactEmail: ce.exportReactEmail,
4852
+ getExportedReactEmail: ce.getExportedReactEmail,
4853
+ exportMJML: ce.exportMJML,
4854
+ getExportedMJML: ce.getExportedMJML,
4855
+ exportJSON: ce.exportJSON,
4856
+ getExportedJSON: ce.getExportedJSON,
4857
+ importJSON: (A) => ce.importJSON(A, a),
4858
+ clearTemplate: sr,
4859
+ undo: or,
4860
+ redo: ar,
4861
+ canUndo: M.canUndo,
4862
+ canRedo: M.canRedo,
4863
+ historyStatus: M.historyStatus,
4864
+ saveToHistory: F,
4865
+ saveToHistoryImmediate: te,
4866
+ initFromStorage: Xt,
4867
+ clearLocal: ee,
4868
+ loadFromLocal: Z,
4869
+ hasDraft: me,
4870
+ saveStatus: Se,
4871
+ lastSaved: oe,
4872
+ initForCreate: nr,
4873
+ startNewTemplate: rr,
4874
+ loadTemplate: Qt,
4875
+ loadTemplateById: tr,
4876
+ saveTemplate: er,
4877
+ templateId: j,
4878
+ builderMode: u,
4879
+ loadVersionSnapshot: kt,
4880
+ setJson: lr,
4881
+ getSelection: cr,
4882
+ setSelection: ur,
4883
+ onChange: dr
4884
+ };
4885
+ }
4886
+ export {
4887
+ Gr as A,
4888
+ Yo as B,
4889
+ ca as C,
4890
+ sa as D,
4891
+ to as E,
4892
+ ta as F,
4893
+ vr as G,
4894
+ Qo as H,
4895
+ ut as I,
4896
+ yn as K,
4897
+ Et as L,
4898
+ Rn as M,
4899
+ aa as N,
4900
+ Jt as O,
4901
+ oa as P,
4902
+ na as R,
4903
+ ma as S,
4904
+ la as T,
4905
+ Xo as U,
4906
+ Zo as V,
4907
+ ea as W,
4908
+ Je as _,
4909
+ $a as a,
4910
+ ua as b,
4911
+ ba as c,
4912
+ ha as d,
4913
+ mn as f,
4914
+ ro as g,
4915
+ oo as h,
4916
+ wo as i,
4917
+ An as j,
4918
+ ia as k,
4919
+ va as l,
4920
+ fa as m,
4921
+ ka as n,
4922
+ ya as o,
4923
+ po as p,
4924
+ Y as q,
4925
+ Yt as r,
4926
+ ko as s,
4927
+ Sa as t,
4928
+ ga as u,
4929
+ ft as v,
4930
+ mt as w,
4931
+ da as x,
4932
+ pa as y,
4933
+ br as z
4934
+ };