@useinsider/guido 3.21.2-beta.d9d48aa → 3.21.2-beta.e9f918d

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 (30) hide show
  1. package/README.md +0 -9
  2. package/dist/@types/config/schemas.js +33 -35
  3. package/dist/components/Guido.vue.js +5 -5
  4. package/dist/components/Guido.vue2.js +96 -100
  5. package/dist/composables/useModuleRepair.js +23 -32
  6. package/dist/composables/useSave.js +75 -68
  7. package/dist/composables/validators/useHtmlDocumentCountValidator.js +22 -0
  8. package/dist/config/migrator/index.js +9 -10
  9. package/dist/enums/academy.js +1 -2
  10. package/dist/guido.css +1 -1
  11. package/dist/services/templateLibraryApi.js +36 -31
  12. package/dist/src/@types/config/schemas.d.ts +0 -4
  13. package/dist/src/composables/useConfig.d.ts +0 -2
  14. package/dist/src/composables/useModuleRepair.d.ts +11 -2
  15. package/dist/src/composables/validators/useHtmlDocumentCountValidator.d.ts +3 -0
  16. package/dist/src/enums/academy.d.ts +0 -1
  17. package/dist/src/stores/config.d.ts +0 -20
  18. package/dist/src/stores/editor.d.ts +0 -25
  19. package/dist/src/utils/templatePreparation.d.ts +2 -1
  20. package/dist/stores/editor.js +14 -15
  21. package/dist/utils/pairProductVariables.js +98 -90
  22. package/dist/utils/templatePreparation.js +30 -30
  23. package/package.json +2 -2
  24. package/dist/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.js +0 -17
  25. package/dist/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue2.js +0 -30
  26. package/dist/config/migrator/legacyUnsubscribeTextMigrator.js +0 -16
  27. package/dist/src/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.d.ts +0 -2
  28. package/dist/src/config/migrator/legacyUnsubscribeTextMigrator.d.ts +0 -1
  29. package/dist/src/utils/legacyUnsubscribeConversion.d.ts +0 -10
  30. package/dist/utils/legacyUnsubscribeConversion.js +0 -49
@@ -1,84 +1,91 @@
1
- import { useActionsApi as R } from "./useActionsApi.js";
2
- import { useConfig as q } from "./useConfig.js";
3
- import { useEditorLock as O } from "./useEditorLock.js";
4
- import { useSaveStart as D, useSaveComplete as F } from "./useGuidoActions.js";
5
- import { useSaveValidation as j } from "./useSaveValidation.js";
6
- import { useSaveValidationRollout as z } from "./useSaveValidationRollout.js";
7
- import { useSyncModuleExtractor as G } from "./useSyncModuleExtractor.js";
8
- import { ToasterTypeOptions as I } from "../enums/toaster.js";
9
- import { useStripoApi as J } from "../services/stripoApi.js";
10
- import { useConfigStore as K } from "../stores/config.js";
11
- import { useDynamicContentStore as N } from "../stores/dynamic-content.js";
12
- import { useSaveValidationStore as Q } from "../stores/save-validation.js";
13
- import { useTemplatePreparation as X, getHtmlReferencedUnsubscribePages as Y } from "../utils/templatePreparation.js";
14
- import { useAllowlist as Z } from "./useAllowlist.js";
15
- import { useHtmlValidator as _ } from "./useHtmlValidator.js";
16
- import { useToaster as $ } from "./useToaster.js";
17
- import { useCouponBlockValidator as tt } from "./validators/useCouponBlockValidator.js";
18
- import { useLiquidValidator as et } from "./validators/useLiquidValidator.js";
19
- import { useSyncModuleBlockValidator as ot } from "./validators/useSyncModuleBlockValidator.js";
20
- import { useUnsubscribeBlockValidator as st } from "./validators/useUnsubscribeBlockValidator.js";
21
- const Bt = () => {
22
- const a = D(), p = F(), { validateHtml: v } = _(), { validateLiquidSyntax: S } = et(), { validateCouponBlockTags: y } = tt(), { validateUnsubscribeBlockUniqueness: w, validateUnsubscribeBlockHasTemplate: E } = st(), { validateSyncModuleBlocks: n } = ot(), { callbacks: r, isFeatureEnabled: d } = q(), { extractSyncModuleData: b } = G(), { setSyncModuleUnsubscriptionPages: g } = J(), { editorSave: H, getTemplateData: V } = R(), { showToaster: x } = $(), { getBlockedDomains: k, resolveToast: C } = Z(), { prepareTemplateDetails: m } = X(), { collectSaveValidationErrors: B } = j(), { isEnabled: h } = z(), T = Q(), P = N(), f = K(), { runExclusive: l } = O(), c = async (t, e, o) => {
23
- if (!d("allowlistEnabled"))
1
+ import { useActionsApi as q } from "./useActionsApi.js";
2
+ import { useConfig as O } from "./useConfig.js";
3
+ import { useEditorLock as D } from "./useEditorLock.js";
4
+ import { useSaveStart as F, useSaveComplete as j } from "./useGuidoActions.js";
5
+ import { useSaveValidation as z } from "./useSaveValidation.js";
6
+ import { useSaveValidationRollout as G } from "./useSaveValidationRollout.js";
7
+ import { useSyncModuleExtractor as I } from "./useSyncModuleExtractor.js";
8
+ import { ToasterTypeOptions as J } from "../enums/toaster.js";
9
+ import { useStripoApi as K } from "../services/stripoApi.js";
10
+ import { useConfigStore as N } from "../stores/config.js";
11
+ import { useDynamicContentStore as Q } from "../stores/dynamic-content.js";
12
+ import { useSaveValidationStore as X } from "../stores/save-validation.js";
13
+ import { useTemplatePreparation as Y, getHtmlReferencedUnsubscribePages as Z } from "../utils/templatePreparation.js";
14
+ import { useAllowlist as _ } from "./useAllowlist.js";
15
+ import { useHtmlValidator as $ } from "./useHtmlValidator.js";
16
+ import { useToaster as tt } from "./useToaster.js";
17
+ import { useCouponBlockValidator as et } from "./validators/useCouponBlockValidator.js";
18
+ import { useHtmlDocumentCountValidator as ot } from "./validators/useHtmlDocumentCountValidator.js";
19
+ import { useLiquidValidator as it } from "./validators/useLiquidValidator.js";
20
+ import { useSyncModuleBlockValidator as st } from "./validators/useSyncModuleBlockValidator.js";
21
+ import { useUnsubscribeBlockValidator as at } from "./validators/useUnsubscribeBlockValidator.js";
22
+ const Pt = () => {
23
+ const n = F(), w = j(), { validateHtml: y } = $(), { validateLiquidSyntax: E } = it(), { validateCouponBlockTags: b } = et(), { validateUnsubscribeBlockUniqueness: g, validateUnsubscribeBlockHasTemplate: H } = at(), { validateSyncModuleBlocks: l } = st(), { validateSingleHtmlDocument: c } = ot(), { callbacks: r, isFeatureEnabled: v } = O(), { extractSyncModuleData: V } = I(), { setSyncModuleUnsubscriptionPages: x } = K(), { editorSave: C, getTemplateData: u } = q(), { showToaster: k } = tt(), { getBlockedDomains: h, resolveToast: B } = _(), { prepareTemplateDetails: p } = Y(), { collectSaveValidationErrors: T } = z(), { isEnabled: P } = G(), L = X(), U = Q(), S = N(), { runExclusive: m } = D(), d = async (t, e, i) => {
24
+ if (!v("allowlistEnabled"))
24
25
  return !1;
25
- const i = await k(t, e);
26
- if (!i.length)
26
+ const o = await h(t, e);
27
+ if (!o.length)
27
28
  return !1;
28
- if (!o) {
29
- const s = await C(i);
30
- s != null && s.message && x({
31
- type: I.Warning,
29
+ if (!i) {
30
+ const s = await B(o);
31
+ s != null && s.message && k({
32
+ type: J.Warning,
32
33
  message: s.message,
33
34
  actionButton: s.actionButton
34
35
  });
35
36
  }
36
37
  return !0;
37
- }, L = async (t) => !y(t.compiledHtml) || !w(t.compiledHtml) || !E(t.compiledHtml) ? !1 : d("liquidSyntax") ? S(t.compiledHtml) : v(t.compiledHtml, t.dynamicContentList, !0), u = async (t, e) => {
38
- if (!await H())
38
+ }, A = async (t) => !b(t.compiledHtml) || !g(t.compiledHtml) || !H(t.compiledHtml) ? !1 : v("liquidSyntax") ? E(t.compiledHtml) : y(t.compiledHtml, t.dynamicContentList, !0), f = async (t, e) => {
39
+ if (!await C())
39
40
  return;
40
- const { unsubscribePayload: i, stripoModules: s } = b(t.rawHtml);
41
- if (await g(i), t.modules = s, !e.suppress) {
42
- const W = e.blankCompiled ? { compiledHtml: "", ampHtml: "" } : {};
43
- p({ ...t, ...W, silent: e.silent });
41
+ const { unsubscribePayload: o, stripoModules: s } = V(t.rawHtml);
42
+ if (await x(o), t.modules = s, !e.suppress) {
43
+ const a = e.blankCompiled ? { compiledHtml: "", ampHtml: "" } : {};
44
+ w({ ...t, ...a, silent: e.silent });
44
45
  }
45
46
  return t;
46
- }, U = async (t, e) => {
47
- var i;
48
- a();
49
- const o = await m();
50
- if (n(o.rawHtml, e)) {
51
- if (h.value && !e) {
52
- const s = await B(
47
+ }, M = async (t, e) => {
48
+ var s;
49
+ n();
50
+ const i = await u();
51
+ if (!c(i.html, e))
52
+ return;
53
+ const o = await p(i);
54
+ if (l(o.rawHtml, e)) {
55
+ if (P.value && !e) {
56
+ const a = await T(
53
57
  o.compiledHtml,
54
58
  o.dynamicContentList
55
59
  );
56
- if (s.length) {
57
- T.open(s, "save");
60
+ if (a.length) {
61
+ L.open(a, "save");
58
62
  return;
59
63
  }
60
- } else if (!await L(o))
64
+ } else if (!await A(o))
61
65
  return;
62
- if (!((i = r.value) != null && i.externalValidation && !await r.value.externalValidation(o)) && !await c(o.compiledHtml, o.css, e))
63
- return u(o, { silent: e, suppress: t });
66
+ if (!((s = r.value) != null && s.externalValidation && !await r.value.externalValidation(o)) && !await d(o.compiledHtml, o.css, e))
67
+ return f(o, { silent: e, suppress: t });
64
68
  }
65
- }, A = async () => {
66
- var e;
67
- if (!f.allowSaveWithErrors)
69
+ }, W = async () => {
70
+ var i;
71
+ if (!S.allowSaveWithErrors)
72
+ return;
73
+ n();
74
+ const t = await u();
75
+ if (!c(t.html, !1))
68
76
  return;
69
- a();
70
- const t = await m();
71
- if (n(t.rawHtml, !1) && !((e = r.value) != null && e.externalValidation && !await r.value.externalValidation(t)) && !await c(t.compiledHtml, t.css, !1))
72
- return u(t, { silent: !1, blankCompiled: !0 });
73
- }, M = async () => {
74
- if (!f.allowSaveWithErrors)
77
+ const e = await p(t);
78
+ if (l(e.rawHtml, !1) && !((i = r.value) != null && i.externalValidation && !await r.value.externalValidation(e)) && !await d(e.compiledHtml, e.css, !1))
79
+ return f(e, { silent: !1, blankCompiled: !0 });
80
+ }, R = async () => {
81
+ if (!S.allowSaveWithErrors)
75
82
  return;
76
- a();
77
- const { html: t, css: e } = await V();
78
- if (!n(t, !0) || await c(t, e, !0))
83
+ n();
84
+ const { html: t, css: e } = await u();
85
+ if (!c(t, !0) || !l(t, !0) || await d(t, e, !0))
79
86
  return;
80
- const o = Y(t), i = {
81
- dynamicContentList: P.getSelectedDynamicContentList,
87
+ const i = Z(t), o = {
88
+ dynamicContentList: U.getSelectedDynamicContentList,
82
89
  compiledHtml: "",
83
90
  rawHtml: t,
84
91
  css: e,
@@ -88,16 +95,16 @@ const Bt = () => {
88
95
  // No campaignUrls: hosts overwrite their stored map with any object, and raw HTML can't rebuild it.
89
96
  recommendation: { configs: {} },
90
97
  unsubscribe: {
91
- status: o.length > 0,
92
- config: o
98
+ status: i.length > 0,
99
+ config: i
93
100
  }
94
101
  };
95
- return u(i, { silent: !0 });
102
+ return f(o, { silent: !0 });
96
103
  };
97
- return { save: (t = !1, e = !1) => l(
98
- () => U(t, e)
99
- ), saveWithErrors: () => l(A), saveRawOnly: () => l(M) };
104
+ return { save: (t = !1, e = !1) => m(
105
+ () => M(t, e)
106
+ ), saveWithErrors: () => m(W), saveRawOnly: () => m(R) };
100
107
  };
101
108
  export {
102
- Bt as useSave
109
+ Pt as useSave
103
110
  };
@@ -0,0 +1,22 @@
1
+ import { useToaster as i } from "../useToaster.js";
2
+ import { useTranslations as m } from "../useTranslations.js";
3
+ import { ToasterTypeOptions as c } from "../../enums/toaster.js";
4
+ const u = "newsletter.multiple-html-designs-detected", r = `(?:[^>"']|"[^"]*"|'[^']*')*`, a = "style|script|noscript|xmp|iframe|noembed|noframes|textarea|title", T = /<html(?=[\s>/])/gi, A = new RegExp(
5
+ `<!--[\\s\\S]*?-->|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<(${a})(?=[\\s/>])${r}>[\\s\\S]*?</\\1\\s*>|<([a-zA-Z][\\w:-]*)${r}>`,
6
+ "gi"
7
+ ), p = (e) => Array.from(e.matchAll(A)).filter(([, , t]) => (t == null ? void 0 : t.toLowerCase()) === "html").length, g = () => {
8
+ const { showToaster: e } = i(), t = m();
9
+ return { validateSingleHtmlDocument: (o, l = !1) => {
10
+ var n;
11
+ if ((((n = o.match(T)) == null ? void 0 : n.length) ?? 0) < 2)
12
+ return !0;
13
+ const s = p(o);
14
+ return s <= 1 ? !0 : (console.debug("guido:save:blocked", { reason: "multiple-html-documents", htmlRootCount: s }), l || e({
15
+ type: c.Warning,
16
+ message: t(u)
17
+ }), !1);
18
+ } };
19
+ };
20
+ export {
21
+ g as useHtmlDocumentCountValidator
22
+ };
@@ -1,18 +1,17 @@
1
1
  import { migrateCheckbox as i } from "./checkboxMigrator.js";
2
2
  import { migrateCouponBlock as e } from "./couponBlockMigrator.js";
3
3
  import { migrateItemsBlock as a } from "./itemsBlockMigrator.js";
4
- import { migrateLegacyUnsubscribeText as n } from "./legacyUnsubscribeTextMigrator.js";
5
- import { migrateProductNameLink as c } from "./productNameLinkMigrator.js";
6
- import { migrateRadioButton as g } from "./radioButtonMigrator.js";
7
- import { migrateRecommendation as f } from "./recommendationMigrator.js";
8
- import { migrateRecommendationPartnerScope as p } from "./recommendationPartnerMigrator.js";
9
- import { migrateRecommendationTitle as s } from "./recommendationTitleMigrator.js";
4
+ import { migrateProductNameLink as n } from "./productNameLinkMigrator.js";
5
+ import { migrateRadioButton as c } from "./radioButtonMigrator.js";
6
+ import { migrateRecommendation as g } from "./recommendationMigrator.js";
7
+ import { migrateRecommendationPartnerScope as f } from "./recommendationPartnerMigrator.js";
8
+ import { migrateRecommendationTitle as p } from "./recommendationTitleMigrator.js";
10
9
  import { migrateSocialIcons as d } from "./socialIconMigrator.js";
11
10
  import { migrateUnsubscribe as l } from "./unsubscribeMigrator.js";
12
- const T = async (o, t = {}, r) => {
13
- let m = o;
14
- return m = i(m), m = g(m), m = n(m), m = await l(m), m = e(m), m = f(m, t), r && (m = p(m, r)), m = s(m), m = a(m), m = c(m), m = d(m), m;
11
+ const h = async (r, t = {}, o) => {
12
+ let m = r;
13
+ return m = i(m), m = c(m), m = await l(m), m = e(m), m = g(m, t), o && (m = f(m, o)), m = p(m), m = a(m), m = n(m), m = d(m), m;
15
14
  };
16
15
  export {
17
- T as migrate
16
+ h as migrate
18
17
  };
@@ -2,8 +2,7 @@ const e = "https://academy.insiderone.com", o = {
2
2
  EMAIL_EDITOR: `${e}/docs/email-drag-and-drop-editor`,
3
3
  GLOBAL_UNSUBSCRIBE: `${e}/docs/global-unsubscribe-preference-center`,
4
4
  AMP_FOR_EMAILS: `${e}/docs/amp-for-emails`,
5
- EMAIL_RECOMMENDATION_BLOCK: `${e}/docs/new-editor-email-recommendation-block`,
6
- LEGACY_UNSUBSCRIBE_MODULE: `${e}/docs/new-editor-add-unsubscribe-pages-into-emails`
5
+ EMAIL_RECOMMENDATION_BLOCK: `${e}/docs/new-editor-email-recommendation-block`
7
6
  };
8
7
  export {
9
8
  o as ACADEMY_LINKS
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.auth-error-modal[data-v-b4d7ae51]{position:relative;z-index:145}.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-b8f24f34] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-baf7a5dd]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.validation-error-list[data-v-e48cebe9]{gap:16px}.validation-error-row[data-v-e48cebe9]{gap:8px;padding:24px;border:1px solid #E1E1E1;border-radius:8px}.validation-error-row__icon[data-v-e48cebe9]{flex-shrink:0;font-size:24px;line-height:0}.validation-error-row__text[data-v-e48cebe9]{font-size:13px;line-height:16px;color:#292929;word-break:break-word}.guido-editor__wrapper[data-v-6cdd5182]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-6cdd5182]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-6cdd5182]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-19d8cb42] .vueperslides__bullets,[data-v-ec2027ff] .vueperslides__bullets,[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd] .in-skeleton{width:100%!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}.legacy-strategy-updated-modal[data-v-da2225a1]{position:relative;z-index:145}
1
+ @charset "UTF-8";.auth-error-modal[data-v-b4d7ae51]{position:relative;z-index:145}.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-b8f24f34] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-baf7a5dd]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.validation-error-list[data-v-e48cebe9]{gap:16px}.validation-error-row[data-v-e48cebe9]{gap:8px;padding:24px;border:1px solid #E1E1E1;border-radius:8px}.validation-error-row__icon[data-v-e48cebe9]{flex-shrink:0;font-size:24px;line-height:0}.validation-error-row__text[data-v-e48cebe9]{font-size:13px;line-height:16px;color:#292929;word-break:break-word}.guido-editor__wrapper[data-v-c5146fc5]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-c5146fc5]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-c5146fc5]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-19d8cb42] .vueperslides__bullets,[data-v-ec2027ff] .vueperslides__bullets,[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd] .in-skeleton{width:100%!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}.legacy-strategy-updated-modal[data-v-da2225a1]{position:relative;z-index:145}
@@ -1,24 +1,26 @@
1
- import { useConfig as w } from "../composables/useConfig.js";
2
- import { useHttp as b } from "../composables/useHttp.js";
3
- import { useToaster as C } from "../composables/useToaster.js";
4
- import { useTranslations as h } from "../composables/useTranslations.js";
5
- import { useLiquidValidator as S } from "../composables/validators/useLiquidValidator.js";
6
- import { EditorType as v } from "../enums/defaults.js";
7
- import { ToasterTypeOptions as x } from "../enums/toaster.js";
8
- import { useRecommendationExtensionStore as E } from "../extensions/Blocks/Recommendation/store/recommendation.js";
9
- import { useSaveAsTemplateStore as N } from "../stores/save-as-template.js";
1
+ import { useActionsApi as h } from "../composables/useActionsApi.js";
2
+ import { useConfig as S } from "../composables/useConfig.js";
3
+ import { useHttp as v } from "../composables/useHttp.js";
4
+ import { useToaster as x } from "../composables/useToaster.js";
5
+ import { useTranslations as A } from "../composables/useTranslations.js";
6
+ import { useHtmlDocumentCountValidator as E } from "../composables/validators/useHtmlDocumentCountValidator.js";
7
+ import { useLiquidValidator as N } from "../composables/validators/useLiquidValidator.js";
8
+ import { EditorType as H } from "../enums/defaults.js";
9
+ import { ToasterTypeOptions as P } from "../enums/toaster.js";
10
+ import { useRecommendationExtensionStore as D } from "../extensions/Blocks/Recommendation/store/recommendation.js";
11
+ import { useSaveAsTemplateStore as L } from "../stores/save-as-template.js";
10
12
  import { base64EncodeWithSpecialChars as r } from "../utils/base64.js";
11
- import { isPlainObject as P } from "../utils/genericUtil.js";
12
- import { useTemplatePreparation as A } from "../utils/templatePreparation.js";
13
- const B = () => {
14
- const { get: n, post: m } = b(), { handleError: o, showToaster: l } = C(), { config: c, isFeatureEnabled: p } = w(), { validateLiquidSyntax: f } = S(), u = h();
13
+ import { isPlainObject as q } from "../utils/genericUtil.js";
14
+ import { useTemplatePreparation as F } from "../utils/templatePreparation.js";
15
+ const Z = () => {
16
+ const { get: n, post: m } = v(), { handleError: s, showToaster: l } = x(), { config: c, isFeatureEnabled: p } = S(), { validateLiquidSyntax: T } = N(), { validateSingleHtmlDocument: w } = E(), { getTemplateData: b } = h(), u = A();
15
17
  return {
16
18
  getCategories: async () => {
17
19
  try {
18
20
  const { data: e = [] } = await n("/newsletter/template-library/get-template-categories");
19
21
  return e;
20
22
  } catch (e) {
21
- return o(e, "Failed to fetch template categories"), [];
23
+ return s(e, "Failed to fetch template categories"), [];
22
24
  }
23
25
  },
24
26
  checkTemplateNameAvailability: async (e) => {
@@ -35,27 +37,30 @@ const B = () => {
35
37
  );
36
38
  return t.toString();
37
39
  } catch (t) {
38
- return o(t, "Failed to create category"), "";
40
+ return s(t, "Failed to create category"), "";
39
41
  }
40
42
  },
41
43
  createTemplate: async () => {
42
44
  var e, t, d, y;
43
45
  try {
44
- const { prepareTemplateDetails: i } = A(), s = N(), a = await i();
45
- if (p("liquidSyntax") && !await f(a.compiledHtml))
46
+ const { prepareTemplateDetails: i } = F(), o = L(), g = await b();
47
+ if (!w(g.html))
46
48
  return !1;
47
- const T = {
48
- name: s.getTemplateName,
49
- categories: s.getSelectedCategoryIds,
49
+ const a = await i(g);
50
+ if (p("liquidSyntax") && !await T(a.compiledHtml))
51
+ return !1;
52
+ const C = {
53
+ name: o.getTemplateName,
54
+ categories: o.getSelectedCategoryIds,
50
55
  productId: ((t = (e = c.value) == null ? void 0 : e.partner) == null ? void 0 : t.productType) || 0,
51
- editorType: v,
56
+ editorType: H,
52
57
  messageType: ((y = (d = c.value) == null ? void 0 : d.partner) == null ? void 0 : y.messageType) || 0,
53
58
  content: r(a.compiledHtml),
54
59
  css: r(a.css),
55
60
  unsubscriptionPreferencePageStatus: !1,
56
61
  unsubscriptionPreferencePages: [],
57
62
  recommendationCampaignUrls: r(
58
- E().recommendationCampaignUrls
63
+ D().recommendationCampaignUrls
59
64
  ),
60
65
  recommendationConfigs: r({}),
61
66
  isGuido: !0,
@@ -67,31 +72,31 @@ const B = () => {
67
72
  css: a.css,
68
73
  dynamicContentList: a.dynamicContentList
69
74
  })
70
- }, { data: g } = await m(
75
+ }, { data: f } = await m(
71
76
  "/newsletter/template-library/create-template",
72
- T
77
+ C
73
78
  );
74
- if (!P(g))
79
+ if (!q(f))
75
80
  throw new Error("Unexpected create-template response");
76
- return g.type === "alert" ? (l({
81
+ return f.type === "alert" ? (l({
77
82
  message: u(
78
83
  "newsletter.template-library-save-alert",
79
- { templateName: s.getTemplateName }
84
+ { templateName: o.getTemplateName }
80
85
  ),
81
- type: x.Error
86
+ type: P.Error
82
87
  }), !1) : (l({
83
88
  message: u(
84
89
  "newsletter.template-library-save-success",
85
- { templateName: s.getTemplateName }
90
+ { templateName: o.getTemplateName }
86
91
  ),
87
92
  type: "success"
88
93
  }), !0);
89
94
  } catch (i) {
90
- return o(i, "Failed to create template"), !1;
95
+ return s(i, "Failed to create template"), !1;
91
96
  }
92
97
  }
93
98
  };
94
99
  };
95
100
  export {
96
- B as useTemplateLibraryApi
101
+ Z as useTemplateLibraryApi
97
102
  };
@@ -414,8 +414,6 @@ export declare const FeaturesSchema: v.ObjectSchema<{
414
414
  /** Allow persisting a template that still has validation errors (drawer "Save and Continue" soft-save). Host sets false for transactional + unsubscribe. */
415
415
  readonly allowSaveWithErrors: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
416
416
  readonly reusableRecommendationStrategy: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
417
- /** Convert linkless legacy unsubscribe blocks into text blocks and warn with a modal (opt-in) */
418
- readonly legacyUnsubscribeConversion: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
419
417
  }, undefined>;
420
418
  /**
421
419
  * Default block types available in Stripo
@@ -834,8 +832,6 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
834
832
  /** Allow persisting a template that still has validation errors (drawer "Save and Continue" soft-save). Host sets false for transactional + unsubscribe. */
835
833
  readonly allowSaveWithErrors: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
836
834
  readonly reusableRecommendationStrategy: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
837
- /** Convert linkless legacy unsubscribe blocks into text blocks and warn with a modal (opt-in) */
838
- readonly legacyUnsubscribeConversion: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
839
835
  }, undefined>, {}>;
840
836
  /** Block configuration */
841
837
  readonly blocks: v.OptionalSchema<v.ObjectSchema<{
@@ -104,7 +104,6 @@ export declare const useConfig: () => {
104
104
  linkTrackingIds: boolean;
105
105
  allowSaveWithErrors: boolean;
106
106
  reusableRecommendationStrategy: boolean;
107
- legacyUnsubscribeConversion: boolean;
108
107
  };
109
108
  blocks: {
110
109
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -244,7 +243,6 @@ export declare const useConfig: () => {
244
243
  linkTrackingIds: boolean;
245
244
  allowSaveWithErrors: boolean;
246
245
  reusableRecommendationStrategy: boolean;
247
- legacyUnsubscribeConversion: boolean;
248
246
  } | null>;
249
247
  blocks: import("vue").ComputedRef<{
250
248
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1,8 +1,17 @@
1
1
  import type { ModuleAddData, ModuleModifier } from '@@/Types/stripo';
2
2
  export declare const UNRESOLVED_DYNAMIC_CONTENT_ON_DROP_KEY = "dynamic-content.unresolved-attributes-on-drop";
3
3
  /**
4
- * Repairs dropped/copied saved modules (items currency, linkless legacy unsubscribe → text block,
5
- * dynamic-content labels → tokens) in one write-back; wired via Stripo's `onModuleAdd` (see `useStripo`).
4
+ * Repairs saved modules as they are dropped or copied into the editor, in one pass
5
+ * over the module HTML. Two independent repairs run through a single write-back:
6
+ *
7
+ * - Dynamic content: saved modules serialize merge-tag chips by their display label
8
+ * (`{{ Phone Number }}`); this maps them back to their canonical token
9
+ * (`{{phone_number}}`) using the account's dynamic-content list.
10
+ * - Items currency: v2 Items blocks can carry price `data-curency` /
11
+ * `data-currency_symbol` attrs that drifted from their `esd-ext-config`; these are
12
+ * healed from config (the export contract reads those exact attrs).
13
+ *
14
+ * Wired into Stripo via the `onModuleAdd` init callback (see `useStripo`).
6
15
  */
7
16
  export declare const useModuleRepair: () => {
8
17
  handleModuleAdd: (data: ModuleAddData, modifier: ModuleModifier) => void;
@@ -0,0 +1,3 @@
1
+ export declare const useHtmlDocumentCountValidator: () => {
2
+ validateSingleHtmlDocument: (rawHtml: string, silent?: boolean) => boolean;
3
+ };
@@ -9,6 +9,5 @@ export declare const ACADEMY_LINKS: {
9
9
  readonly GLOBAL_UNSUBSCRIBE: "https://academy.insiderone.com/docs/global-unsubscribe-preference-center";
10
10
  readonly AMP_FOR_EMAILS: "https://academy.insiderone.com/docs/amp-for-emails";
11
11
  readonly EMAIL_RECOMMENDATION_BLOCK: "https://academy.insiderone.com/docs/new-editor-email-recommendation-block";
12
- readonly LEGACY_UNSUBSCRIBE_MODULE: "https://academy.insiderone.com/docs/new-editor-add-unsubscribe-pages-into-emails";
13
12
  };
14
13
  export type AcademyLinkKey = keyof typeof ACADEMY_LINKS;