@useinsider/guido 3.12.0-beta.40db55d → 3.12.0-beta.458ffd7

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 (38) hide show
  1. package/README.md +7 -14
  2. package/dist/@types/config/schemas.js +64 -50
  3. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +1 -1
  4. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +8 -8
  5. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +5 -5
  6. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue2.js +10 -10
  7. package/dist/components/organisms/header/ViewOptions.vue.js +3 -3
  8. package/dist/components/organisms/header/version-history/ViewOptions.vue.js +1 -1
  9. package/dist/composables/useAllowlistToast.js +21 -0
  10. package/dist/composables/usePreviewInteractionGuard.js +36 -11
  11. package/dist/composables/useRecommendationPreview.js +61 -60
  12. package/dist/composables/useSave.js +44 -24
  13. package/dist/composables/useUserRole.js +13 -0
  14. package/dist/composables/validators/useAllowlistValidator.js +31 -0
  15. package/dist/enums/roles.js +4 -0
  16. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
  17. package/dist/extensions/Blocks/Recommendation/controls/blockBackground/index.js +10 -0
  18. package/dist/extensions/Blocks/Recommendation/extension.js +23 -21
  19. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +41 -40
  20. package/dist/extensions/Blocks/Unsubscribe/utils/constants.js +3 -2
  21. package/dist/extensions/Blocks/controlFactories.js +125 -75
  22. package/dist/guido.css +1 -1
  23. package/dist/src/@types/config/schemas.d.ts +32 -0
  24. package/dist/src/composables/useAllowlistToast.d.ts +17 -0
  25. package/dist/src/composables/useConfig.d.ts +4 -0
  26. package/dist/src/composables/usePreviewInteractionGuard.d.ts +1 -1
  27. package/dist/src/composables/useUserRole.d.ts +8 -0
  28. package/dist/src/composables/validators/useAllowlistValidator.d.ts +9 -0
  29. package/dist/src/enums/roles.d.ts +9 -0
  30. package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
  31. package/dist/src/extensions/Blocks/Recommendation/controls/blockBackground/index.d.ts +14 -0
  32. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +1 -0
  33. package/dist/src/extensions/Blocks/Unsubscribe/utils/constants.d.ts +1 -0
  34. package/dist/src/extensions/Blocks/controlFactories.d.ts +36 -0
  35. package/dist/src/stores/config.d.ts +36 -0
  36. package/dist/src/utils/urlSchemes.d.ts +6 -0
  37. package/dist/utils/urlSchemes.js +4 -0
  38. package/package.json +5 -10
@@ -1,111 +1,112 @@
1
- import { BLOCK_ROOT_SELECTOR as S, CURRENCY_ATTR as p, CONTAINER_SELECTOR as O } from "../extensions/Blocks/Recommendation/constants/selectors.js";
2
- import { useRecommendationExtensionStore as h } from "../extensions/Blocks/Recommendation/store/recommendation.js";
3
- import { formatPrice as E } from "../extensions/Blocks/Recommendation/utils/priceFormatter.js";
4
- const f = `${S}[recommendation-id]`, C = ".product-old-price", R = /\{\{(?:reco_)?(\d+_\d+_[a-zA-Z0-9_.]+)\}\}/g, T = new RegExp(
1
+ import { BLOCK_ROOT_SELECTOR as f, CURRENCY_ATTR as A, CONTAINER_SELECTOR as O } from "../extensions/Blocks/Recommendation/constants/selectors.js";
2
+ import { useRecommendationExtensionStore as C } from "../extensions/Blocks/Recommendation/store/recommendation.js";
3
+ import { formatPrice as _ } from "../extensions/Blocks/Recommendation/utils/priceFormatter.js";
4
+ import { BASE_SAFE_URL_SCHEMES as R } from "../utils/urlSchemes.js";
5
+ const S = `${f}[recommendation-id]`, h = ".product-old-price", T = /\{\{(?:reco_)?(\d+_\d+_[a-zA-Z0-9_.]+)\}\}/g, b = new RegExp(
5
6
  "\\{%\\s*if\\s+([\\s\\S]+?)\\s*%\\}([\\s\\S]*?)(?:\\{%\\s*else\\s*%\\}([\\s\\S]*?))?\\{%\\s*endif\\s*%\\}",
6
7
  "g"
7
8
  );
8
- function b(e) {
9
+ function L(e) {
9
10
  return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
10
11
  }
11
- function _(e) {
12
- var s;
13
- const n = (s = e.replace(/[\u0000-\u0020]+/g, "").toLowerCase().match(/^([a-z][a-z0-9+.-]*):/)) == null ? void 0 : s[1];
14
- return n && n !== "http" && n !== "https" && n !== "mailto" ? "" : e;
12
+ function g(e) {
13
+ var c;
14
+ const i = (c = e.replace(/[\u0000-\u0020]+/g, "").toLowerCase().match(/^([a-z][a-z0-9+.-]*):/)) == null ? void 0 : c[1];
15
+ return i && !R.includes(`${i}:`) ? "" : e;
15
16
  }
16
17
  function N(e) {
17
- const t = e.getAttribute(p.CURRENCY) || "USD", n = e.getAttribute(p.DECIMAL_SEPARATOR) || ".", s = e.getAttribute(p.THOUSAND_SEPARATOR) || ",";
18
+ const t = e.getAttribute(A.CURRENCY) || "USD", i = e.getAttribute(A.DECIMAL_SEPARATOR) || ".", c = e.getAttribute(A.THOUSAND_SEPARATOR) || ",";
18
19
  return {
19
20
  code: t,
20
- symbol: e.getAttribute(p.SYMBOL) || t,
21
- alignment: e.getAttribute(p.ALIGNMENT) === "0" ? "before" : "after",
22
- decimalCount: parseInt(e.getAttribute(p.DECIMAL_COUNT) || "2") || 2,
23
- decimalSeparator: n,
24
- thousandSeparator: s
21
+ symbol: e.getAttribute(A.SYMBOL) || t,
22
+ alignment: e.getAttribute(A.ALIGNMENT) === "0" ? "before" : "after",
23
+ decimalCount: parseInt(e.getAttribute(A.DECIMAL_COUNT) || "2") || 2,
24
+ decimalSeparator: i,
25
+ thousandSeparator: c
25
26
  };
26
27
  }
27
- function g(e, t) {
28
+ function E(e, t) {
28
29
  return (e == null ? void 0 : e[t]) ?? Object.values(e ?? {})[0] ?? 0;
29
30
  }
30
- function L(e, t) {
31
- const n = g(e.original_price, t), s = g(e.price, t), o = n > 0 ? Math.round((n - s) / n * 100) : 0;
32
- return o > 0 ? `${o}%` : "0%";
31
+ function $(e, t) {
32
+ const i = E(e.original_price, t), c = E(e.price, t), n = i > 0 ? Math.round((i - c) / i * 100) : 0;
33
+ return n > 0 ? `${n}%` : "0%";
33
34
  }
34
- function P(e, t, n, s, o, a) {
35
- s.forEach((i, c) => {
36
- const r = (m) => `${n}_${c}_${m}`, u = E({ price: g(i.price, o.code), currency: o }), l = E({ price: g(i.original_price, o.code), currency: o }), d = L(i, o.code);
37
- e.set(r("name"), i.name ?? ""), e.set(r("image_url"), _(i.image_url ?? "")), e.set(r("url"), _(i.url ?? "")), e.set(r("item_id"), i.item_id ?? ""), e.set(r("currency"), ""), e.set(r("price"), u), e.set(r("original_price"), l), e.set(r("discount"), d), e.set(r("omnibus_price"), l), e.set(r("omnibus_discount"), d), a && u === l && t.add(`${n}_${c}`), Object.entries(i.product_attributes ?? {}).forEach(([m, A]) => {
38
- e.set(r(`product_attribute.${m}`), String(A)), e.set(r(m), String(A));
35
+ function P(e, t, i, c, n, a) {
36
+ c.forEach((o, s) => {
37
+ const r = (m) => `${i}_${s}_${m}`, u = _({ price: E(o.price, n.code), currency: n }), l = _({ price: E(o.original_price, n.code), currency: n }), d = $(o, n.code);
38
+ e.set(r("name"), o.name ?? ""), e.set(r("image_url"), g(o.image_url ?? "")), e.set(r("url"), g(o.url ?? "")), e.set(r("item_id"), o.item_id ?? ""), e.set(r("currency"), ""), e.set(r("price"), u), e.set(r("original_price"), l), e.set(r("discount"), d), e.set(r("omnibus_price"), l), e.set(r("omnibus_discount"), d), a && u === l && t.add(`${i}_${s}`), Object.entries(o.product_attributes ?? {}).forEach(([m, p]) => {
39
+ e.set(r(`product_attribute.${m}`), String(p)), e.set(r(m), String(p));
39
40
  });
40
41
  });
41
42
  }
42
- function $(e, t) {
43
- const n = e.match(/^(.+?)\s*(!=|==)\s*"([^"]*)"$/);
44
- if (!n)
43
+ function z(e, t) {
44
+ const i = e.match(/^(.+?)\s*(!=|==)\s*"([^"]*)"$/);
45
+ if (!i)
45
46
  return !0;
46
- const [, s, o, a] = n, i = t.get(s.trim()) ?? "";
47
- return o === "!=" ? i !== a : i === a;
47
+ const [, c, n, a] = i, o = t.get(c.trim()) ?? "";
48
+ return n === "!=" ? o !== a : o === a;
48
49
  }
49
- function z(e, t) {
50
+ function w(e, t) {
50
51
  return e.replace(
51
- T,
52
- (n, s, o, a) => s.split(/\s+and\s+/).every((c) => $(c.trim(), t)) ? o : a ?? ""
52
+ b,
53
+ (i, c, n, a) => c.split(/\s+and\s+/).every((s) => z(s.trim(), t)) ? n : a ?? ""
53
54
  );
54
55
  }
55
- function w(e) {
56
+ function D(e) {
56
57
  let t = e;
57
58
  for (; t.children.length === 1; )
58
59
  [t] = t.children;
59
60
  return t;
60
61
  }
61
- function D(e, t) {
62
- var i;
62
+ function I(e, t) {
63
+ var o;
63
64
  if (!t.size)
64
65
  return e;
65
- const n = e.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), s = new DOMParser().parseFromString(n, "text/html");
66
- s.querySelectorAll(f).forEach((c) => {
67
- const r = Number(c.getAttribute("recommendation-id"));
66
+ const i = e.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), c = new DOMParser().parseFromString(i, "text/html");
67
+ c.querySelectorAll(S).forEach((s) => {
68
+ const r = Number(s.getAttribute("recommendation-id"));
68
69
  if (!Number.isFinite(r))
69
70
  return;
70
- const u = c.querySelectorAll(O);
71
- (u.length ? Array.from(u) : [c]).forEach((d) => {
72
- d.querySelectorAll(C).forEach((m, A) => {
73
- t.has(`${r}_${A}`) && (w(m).textContent = "");
71
+ const u = s.querySelectorAll(O);
72
+ (u.length ? Array.from(u) : [s]).forEach((d) => {
73
+ d.querySelectorAll(h).forEach((m, p) => {
74
+ t.has(`${r}_${p}`) && (D(m).textContent = "");
74
75
  });
75
76
  });
76
77
  });
77
- const o = (i = e.match(/<!DOCTYPE[^>]*>/i)) == null ? void 0 : i[0];
78
- return ((o ? `${o}
79
- ` : "") + s.documentElement.outerHTML).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
78
+ const n = (o = e.match(/<!DOCTYPE[^>]*>/i)) == null ? void 0 : o[0];
79
+ return ((n ? `${n}
80
+ ` : "") + c.documentElement.outerHTML).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
80
81
  }
81
- function I(e) {
82
+ function y(e) {
82
83
  if (!e || !e.includes("recommendation-block-v2"))
83
84
  return e;
84
- const t = h(), n = new DOMParser().parseFromString(e, "text/html"), s = Array.from(n.querySelectorAll(f)), o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set();
85
- if (s.forEach((c) => {
85
+ const t = C(), i = new DOMParser().parseFromString(e, "text/html"), c = Array.from(i.querySelectorAll(S)), n = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set();
86
+ if (c.forEach((s) => {
86
87
  var l;
87
- const r = Number(c.getAttribute("recommendation-id"));
88
+ const r = Number(s.getAttribute("recommendation-id"));
88
89
  if (!Number.isFinite(r))
89
90
  return;
90
91
  const u = ((l = t.blockStates[r]) == null ? void 0 : l.recommendationProducts) ?? [];
91
92
  u.length && P(
92
- o,
93
+ n,
93
94
  a,
94
95
  r,
95
96
  u,
96
- N(c),
97
- c.getAttribute("hide-price") === "true"
97
+ N(s),
98
+ s.getAttribute("hide-price") === "true"
98
99
  );
99
- }), !o.size)
100
+ }), !n.size)
100
101
  return e;
101
- let i = D(e, a);
102
- return i = i.replace(
103
- R,
104
- (c, r) => o.has(r) ? b(o.get(r)) : c
105
- ), i = z(i, o), i;
102
+ let o = I(e, a);
103
+ return o = o.replace(
104
+ T,
105
+ (s, r) => n.has(r) ? L(n.get(r)) : s
106
+ ), o = w(o, n), o;
106
107
  }
107
- const q = () => ({ substituteRecommendationPreview: I });
108
+ const q = () => ({ substituteRecommendationPreview: y });
108
109
  export {
109
- I as substituteRecommendationPreview,
110
+ y as substituteRecommendationPreview,
110
111
  q as useRecommendationPreview
111
112
  };
@@ -1,32 +1,52 @@
1
- import { useActionsApi as H } from "./useActionsApi.js";
2
- import { useConfig as y } from "./useConfig.js";
3
- import { useSaveStart as w, useSaveComplete as k } from "./useGuidoActions.js";
4
- import { useSyncModuleExtractor as q } from "./useSyncModuleExtractor.js";
5
- import { useStripoApi as C } from "../services/stripoApi.js";
6
- import { useTemplatePreparation as E } from "../utils/templatePreparation.js";
7
- import { useHtmlValidator as B } from "./useHtmlValidator.js";
8
- import { useCouponBlockValidator as L } from "./validators/useCouponBlockValidator.js";
9
- import { useLiquidValidator as P } from "./validators/useLiquidValidator.js";
10
- import { useUnsubscribeBlockValidator as U } from "./validators/useUnsubscribeBlockValidator.js";
11
- const K = () => {
12
- const o = w(), s = k(), { validateHtml: r } = B(), { validateLiquidSyntax: l } = P(), { validateCouponBlockTags: n } = L(), { validateUnsubscribeBlockUniqueness: d, validateUnsubscribeBlockHasTemplate: c } = U(), { callbacks: i, isFeatureEnabled: u } = y(), { extractSyncModuleData: m } = q(), { setSyncModuleUnsubscriptionPages: p } = C(), { editorSave: v } = H();
13
- return { save: async (f = !1, S = !1) => {
14
- var a;
15
- o();
16
- const { prepareTemplateDetails: V } = E(), t = await V();
17
- if (!n(t.compiledHtml) || !d(t.compiledHtml) || !c(t.compiledHtml))
1
+ import { useActionsApi as B } from "./useActionsApi.js";
2
+ import { useConfig as E } from "./useConfig.js";
3
+ import { useSaveStart as q, useSaveComplete as C } from "./useGuidoActions.js";
4
+ import { useSyncModuleExtractor as D } from "./useSyncModuleExtractor.js";
5
+ import { ToasterTypeOptions as L } from "../enums/toaster.js";
6
+ import { useStripoApi as P } from "../services/stripoApi.js";
7
+ import { useTemplatePreparation as U } from "../utils/templatePreparation.js";
8
+ import { useAllowlistToast as M } from "./useAllowlistToast.js";
9
+ import { useHtmlValidator as h } from "./useHtmlValidator.js";
10
+ import { useToaster as F } from "./useToaster.js";
11
+ import { useAllowlistValidator as O } from "./validators/useAllowlistValidator.js";
12
+ import { useCouponBlockValidator as W } from "./validators/useCouponBlockValidator.js";
13
+ import { useLiquidValidator as j } from "./validators/useLiquidValidator.js";
14
+ import { useUnsubscribeBlockValidator as z } from "./validators/useUnsubscribeBlockValidator.js";
15
+ const at = () => {
16
+ const c = q(), d = C(), { validateHtml: u } = h(), { validateLiquidSyntax: p } = j(), { validateCouponBlockTags: f } = W(), { validateUnsubscribeBlockUniqueness: v, validateUnsubscribeBlockHasTemplate: w } = z(), { callbacks: s, isFeatureEnabled: l } = E(), { extractSyncModuleData: S } = D(), { setSyncModuleUnsubscriptionPages: b } = P(), { editorSave: V } = B(), { showToaster: T } = F(), { getBlockedDomains: g } = O(), { resolveAllowlistToast: y } = M();
17
+ return { save: async (H = !1, r = !1) => {
18
+ var n, e, m;
19
+ c();
20
+ const { prepareTemplateDetails: x } = U(), t = await x();
21
+ if (!f(t.compiledHtml) || !v(t.compiledHtml) || !w(t.compiledHtml))
18
22
  return;
19
- if (u("liquidSyntax")) {
20
- if (!await l(t.compiledHtml))
23
+ if (l("liquidSyntax")) {
24
+ if (!await p(t.compiledHtml))
21
25
  return;
22
- } else if (!await r(t.compiledHtml, t.dynamicContentList, !0))
26
+ } else if (!await u(t.compiledHtml, t.dynamicContentList, !0))
23
27
  return;
24
- if ((a = i.value) != null && a.externalValidation && !await i.value.externalValidation(t) || !await v())
28
+ if ((n = s.value) != null && n.externalValidation && !await s.value.externalValidation(t))
25
29
  return;
26
- const { unsubscribePayload: b, stripoModules: x } = m(t.rawHtml);
27
- return await p(b), t.modules = x, f || s({ ...t, silent: S }), t;
30
+ if (l("allowlistEnabled")) {
31
+ const o = await g(t.compiledHtml, t.css);
32
+ if (o.length) {
33
+ if (!r) {
34
+ const a = (m = (e = s.value) == null ? void 0 : e.resolveAllowlistToast) == null ? void 0 : m.call(e, o), i = a != null && a.message ? a : await y(o);
35
+ i != null && i.message && T({
36
+ type: L.Warning,
37
+ message: i.message,
38
+ actionButton: i.actionButton
39
+ });
40
+ }
41
+ return;
42
+ }
43
+ }
44
+ if (!await V())
45
+ return;
46
+ const { unsubscribePayload: k, stripoModules: A } = S(t.rawHtml);
47
+ return await b(k), t.modules = A, H || d({ ...t, silent: r }), t;
28
48
  } };
29
49
  };
30
50
  export {
31
- K as useSave
51
+ at as useSave
32
52
  };
@@ -0,0 +1,13 @@
1
+ import { RoleEnums as t } from "../enums/roles.js";
2
+ import { useHttp as o } from "./useHttp.js";
3
+ const s = "/get-user-role-and-email";
4
+ let r = null, n = null;
5
+ const f = () => {
6
+ const { get: l } = o();
7
+ return { getIsManageUser: async () => r !== null ? r : (n || (n = l(s).then(({ data: e }) => (r = (e == null ? void 0 : e.role) === t.MANAGE_USERS, r)).catch((e) => (console.error("[GUIDO_ALLOWLIST] role fetch failed", e), !1)).finally(() => {
8
+ n = null;
9
+ })), n) };
10
+ };
11
+ export {
12
+ f as useUserRole
13
+ };
@@ -0,0 +1,31 @@
1
+ import { base64EncodeWithSpecialChars as d } from "../../utils/base64.js";
2
+ import { useHttp as p } from "../useHttp.js";
3
+ const w = "/allowlist/check-single-item", h = /(?:https?:\/\/|www\.)[^\s"'<>()]+/gi, u = /&quot;\/\//gi, D = () => {
4
+ const { get: i } = p(), r = (e, o) => {
5
+ const c = `${e || ""} ${o || ""}`.replace(u, "https://").match(h) || [], t = /* @__PURE__ */ new Set();
6
+ return c.forEach((n) => {
7
+ const m = /^https?:\/\//i.test(n) ? n : `https://${n}`;
8
+ try {
9
+ const { hostname: a } = new URL(m);
10
+ a && t.add(a.replace(/^www\./i, "").toLowerCase());
11
+ } catch {
12
+ }
13
+ }), [...t];
14
+ }, l = async (e) => {
15
+ const o = encodeURIComponent(d(`https://${e}`)), { data: s } = await i(`${w}?item=${o}&type=domain`);
16
+ return s.type === "success";
17
+ };
18
+ return { getBlockedDomains: async (e, o) => {
19
+ try {
20
+ const s = r(e, o);
21
+ return s.length ? (await Promise.all(
22
+ s.map(async (t) => ({ domain: t, allowlisted: await l(t) }))
23
+ )).filter((t) => !t.allowlisted).map((t) => t.domain) : [];
24
+ } catch (s) {
25
+ return console.error("[GUIDO_ALLOWLIST] getBlockedDomains failed", s), [];
26
+ }
27
+ } };
28
+ };
29
+ export {
30
+ D as useAllowlistValidator
31
+ };
@@ -0,0 +1,4 @@
1
+ var e = /* @__PURE__ */ ((r) => (r.MANAGE_USERS = "manage-users", r))(e || {});
2
+ export {
3
+ e as RoleEnums
4
+ };
@@ -1,4 +1,4 @@
1
- var o = /* @__PURE__ */ ((c) => (c.BUTTON_ALIGN = "recommendation-block-button-align-control", c.BUTTON_BORDER = "recommendation-block-button-border-control", c.BUTTON_BORDER_RADIUS = "recommendation-block-button-border-radius-control", c.BUTTON_COLOR = "recommendation-block-button-color-control", c.BUTTON_FIT_TO_CONTENT = "recommendation-block-button-fit-to-content-control", c.BUTTON_FONT_FAMILY = "recommendation-block-button-font-family-control", c.BUTTON_MARGINS = "recommendation-block-button-margins-control", c.BUTTON_PADDINGS = "recommendation-block-button-paddings-control", c.BUTTON_TEXT = "recommendation-block-button-text-control", c.BUTTON_TEXT_SIZE = "recommendation-block-button-text-size-control", c.BUTTON_TEXT_STYLE_AND_FONT_COLOR = "recommendation-block-button-text-style-and-font-color-control", c.NAME_ALIGN = "recommendation-block-name-align-control", c.NAME_BACKGROUND = "recommendation-block-name-background-control", c.NAME_COLOR = "recommendation-block-name-color-control", c.NAME_FONT_FAMILY = "recommendation-block-name-font-family-control", c.NAME_PADDINGS = "recommendation-block-name-paddings-control", c.NAME_SIZE = "recommendation-block-name-size-control", c.NAME_STYLE = "recommendation-block-name-style-control", c.NAME_TEXT_TRIM = "recommendation-block-name-text-trim-control", c.PRICE_ALIGN = "recommendation-block-price-align-control", c.PRICE_BACKGROUND = "recommendation-block-price-background-control", c.PRICE_COLOR = "recommendation-block-price-color-control", c.PRICE_FONT_FAMILY = "recommendation-block-price-font-family-control", c.PRICE_PADDINGS = "recommendation-block-price-paddings-control", c.PRICE_SIZE = "recommendation-block-price-size-control", c.PRICE_STYLE = "recommendation-block-price-style-control", c.OLD_PRICE_ALIGN = "recommendation-block-old-price-align-control", c.OLD_PRICE_BACKGROUND = "recommendation-block-old-price-background-control", c.OLD_PRICE_COLOR = "recommendation-block-old-price-color-control", c.OLD_PRICE_FONT_FAMILY = "recommendation-block-old-price-font-family-control", c.OLD_PRICE_PADDINGS = "recommendation-block-old-price-paddings-control", c.OLD_PRICE_SIZE = "recommendation-block-old-price-size-control", c.OLD_PRICE_STYLE = "recommendation-block-old-price-style-control", c.OMNIBUS_PRICE_ALIGN = "recommendation-block-omnibus-price-align-control", c.OMNIBUS_PRICE_BACKGROUND = "recommendation-block-omnibus-price-background-control", c.OMNIBUS_PRICE_COLOR = "recommendation-block-omnibus-price-color-control", c.OMNIBUS_PRICE_FONT_FAMILY = "recommendation-block-omnibus-price-font-family-control", c.OMNIBUS_PRICE_PADDINGS = "recommendation-block-omnibus-price-paddings-control", c.OMNIBUS_PRICE_SIZE = "recommendation-block-omnibus-price-size-control", c.OMNIBUS_PRICE_STYLE = "recommendation-block-omnibus-price-style-control", c.OMNIBUS_PRICE_TEXT_BEFORE = "recommendation-block-omnibus-price-text-before-control", c.OMNIBUS_PRICE_TEXT_AFTER = "recommendation-block-omnibus-price-text-after-control", c.OMNIBUS_DISCOUNT_ALIGN = "recommendation-block-omnibus-discount-align-control", c.OMNIBUS_DISCOUNT_BACKGROUND = "recommendation-block-omnibus-discount-background-control", c.OMNIBUS_DISCOUNT_COLOR = "recommendation-block-omnibus-discount-color-control", c.OMNIBUS_DISCOUNT_FONT_FAMILY = "recommendation-block-omnibus-discount-font-family-control", c.OMNIBUS_DISCOUNT_PADDINGS = "recommendation-block-omnibus-discount-paddings-control", c.OMNIBUS_DISCOUNT_SIZE = "recommendation-block-omnibus-discount-size-control", c.OMNIBUS_DISCOUNT_STYLE = "recommendation-block-omnibus-discount-style-control", c.OMNIBUS_DISCOUNT_TEXT_BEFORE = "recommendation-block-omnibus-discount-text-before-control", c.OMNIBUS_DISCOUNT_TEXT_AFTER = "recommendation-block-omnibus-discount-text-after-control", c.IMAGE_SIZE = "recommendation-block-image-size-control", c.IMAGE_MARGINS = "recommendation-block-image-margins-control", c.CUSTOM_ATTR_ALIGN = "recommendation-block-custom-attr-align-control", c.CUSTOM_ATTR_BACKGROUND = "recommendation-block-custom-attr-background-control", c.CUSTOM_ATTR_COLOR = "recommendation-block-custom-attr-color-control", c.CUSTOM_ATTR_FONT_FAMILY = "recommendation-block-custom-attr-font-family-control", c.CUSTOM_ATTR_PADDINGS = "recommendation-block-custom-attr-paddings-control", c.CUSTOM_ATTR_SIZE = "recommendation-block-custom-attr-size-control", c.CUSTOM_ATTR_STYLE = "recommendation-block-custom-attr-style-control", c.CUSTOM_ATTR_TEXT_TRIM = "recommendation-block-custom-attr-text-trim-control", c.SYNC_INFO_MESSAGE = "recommendation-block-sync-info-message", c))(o || {});
1
+ var o = /* @__PURE__ */ ((c) => (c.BLOCK_BACKGROUND = "recommendation-block-background-color-control", c.BUTTON_ALIGN = "recommendation-block-button-align-control", c.BUTTON_BORDER = "recommendation-block-button-border-control", c.BUTTON_BORDER_RADIUS = "recommendation-block-button-border-radius-control", c.BUTTON_COLOR = "recommendation-block-button-color-control", c.BUTTON_FIT_TO_CONTENT = "recommendation-block-button-fit-to-content-control", c.BUTTON_FONT_FAMILY = "recommendation-block-button-font-family-control", c.BUTTON_MARGINS = "recommendation-block-button-margins-control", c.BUTTON_PADDINGS = "recommendation-block-button-paddings-control", c.BUTTON_TEXT = "recommendation-block-button-text-control", c.BUTTON_TEXT_SIZE = "recommendation-block-button-text-size-control", c.BUTTON_TEXT_STYLE_AND_FONT_COLOR = "recommendation-block-button-text-style-and-font-color-control", c.NAME_ALIGN = "recommendation-block-name-align-control", c.NAME_BACKGROUND = "recommendation-block-name-background-control", c.NAME_COLOR = "recommendation-block-name-color-control", c.NAME_FONT_FAMILY = "recommendation-block-name-font-family-control", c.NAME_PADDINGS = "recommendation-block-name-paddings-control", c.NAME_SIZE = "recommendation-block-name-size-control", c.NAME_STYLE = "recommendation-block-name-style-control", c.NAME_TEXT_TRIM = "recommendation-block-name-text-trim-control", c.PRICE_ALIGN = "recommendation-block-price-align-control", c.PRICE_BACKGROUND = "recommendation-block-price-background-control", c.PRICE_COLOR = "recommendation-block-price-color-control", c.PRICE_FONT_FAMILY = "recommendation-block-price-font-family-control", c.PRICE_PADDINGS = "recommendation-block-price-paddings-control", c.PRICE_SIZE = "recommendation-block-price-size-control", c.PRICE_STYLE = "recommendation-block-price-style-control", c.OLD_PRICE_ALIGN = "recommendation-block-old-price-align-control", c.OLD_PRICE_BACKGROUND = "recommendation-block-old-price-background-control", c.OLD_PRICE_COLOR = "recommendation-block-old-price-color-control", c.OLD_PRICE_FONT_FAMILY = "recommendation-block-old-price-font-family-control", c.OLD_PRICE_PADDINGS = "recommendation-block-old-price-paddings-control", c.OLD_PRICE_SIZE = "recommendation-block-old-price-size-control", c.OLD_PRICE_STYLE = "recommendation-block-old-price-style-control", c.OMNIBUS_PRICE_ALIGN = "recommendation-block-omnibus-price-align-control", c.OMNIBUS_PRICE_BACKGROUND = "recommendation-block-omnibus-price-background-control", c.OMNIBUS_PRICE_COLOR = "recommendation-block-omnibus-price-color-control", c.OMNIBUS_PRICE_FONT_FAMILY = "recommendation-block-omnibus-price-font-family-control", c.OMNIBUS_PRICE_PADDINGS = "recommendation-block-omnibus-price-paddings-control", c.OMNIBUS_PRICE_SIZE = "recommendation-block-omnibus-price-size-control", c.OMNIBUS_PRICE_STYLE = "recommendation-block-omnibus-price-style-control", c.OMNIBUS_PRICE_TEXT_BEFORE = "recommendation-block-omnibus-price-text-before-control", c.OMNIBUS_PRICE_TEXT_AFTER = "recommendation-block-omnibus-price-text-after-control", c.OMNIBUS_DISCOUNT_ALIGN = "recommendation-block-omnibus-discount-align-control", c.OMNIBUS_DISCOUNT_BACKGROUND = "recommendation-block-omnibus-discount-background-control", c.OMNIBUS_DISCOUNT_COLOR = "recommendation-block-omnibus-discount-color-control", c.OMNIBUS_DISCOUNT_FONT_FAMILY = "recommendation-block-omnibus-discount-font-family-control", c.OMNIBUS_DISCOUNT_PADDINGS = "recommendation-block-omnibus-discount-paddings-control", c.OMNIBUS_DISCOUNT_SIZE = "recommendation-block-omnibus-discount-size-control", c.OMNIBUS_DISCOUNT_STYLE = "recommendation-block-omnibus-discount-style-control", c.OMNIBUS_DISCOUNT_TEXT_BEFORE = "recommendation-block-omnibus-discount-text-before-control", c.OMNIBUS_DISCOUNT_TEXT_AFTER = "recommendation-block-omnibus-discount-text-after-control", c.IMAGE_SIZE = "recommendation-block-image-size-control", c.IMAGE_MARGINS = "recommendation-block-image-margins-control", c.CUSTOM_ATTR_ALIGN = "recommendation-block-custom-attr-align-control", c.CUSTOM_ATTR_BACKGROUND = "recommendation-block-custom-attr-background-control", c.CUSTOM_ATTR_COLOR = "recommendation-block-custom-attr-color-control", c.CUSTOM_ATTR_FONT_FAMILY = "recommendation-block-custom-attr-font-family-control", c.CUSTOM_ATTR_PADDINGS = "recommendation-block-custom-attr-paddings-control", c.CUSTOM_ATTR_SIZE = "recommendation-block-custom-attr-size-control", c.CUSTOM_ATTR_STYLE = "recommendation-block-custom-attr-style-control", c.CUSTOM_ATTR_TEXT_TRIM = "recommendation-block-custom-attr-text-trim-control", c.SYNC_INFO_MESSAGE = "recommendation-block-sync-info-message", c))(o || {});
2
2
  export {
3
3
  o as RecommendationControlId
4
4
  };
@@ -0,0 +1,10 @@
1
+ import { createBlockBackgroundColorControl as o } from "../../../controlFactories.js";
2
+ import { RecommendationControlId as r } from "../../constants/controlIds.js";
3
+ import { BLOCK_ROOT_SELECTOR as t } from "../../constants/selectors.js";
4
+ const c = o(
5
+ r.BLOCK_BACKGROUND,
6
+ t
7
+ );
8
+ export {
9
+ c as BlockBackgroundColorControl
10
+ };
@@ -1,4 +1,4 @@
1
- import { ExtensionBuilder as r } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
1
+ import { ExtensionBuilder as t } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
2
  import { RecommendationBlock as m } from "./block.js";
3
3
  import n from "./canvasPreview.css.js";
4
4
  import { RecommendationBlockControl as i } from "./controls/main/index.js";
@@ -6,42 +6,44 @@ import "./constants/selectors.js";
6
6
  import "./store/recommendation.js";
7
7
  import "./utils/captureStyleTemplates.js";
8
8
  import { NameControls as e } from "./controls/name/index.js";
9
- import { PriceControls as s } from "./controls/price/index.js";
10
- import { OldPriceControls as l } from "./controls/oldPrice/index.js";
9
+ import { PriceControls as l } from "./controls/price/index.js";
10
+ import { OldPriceControls as s } from "./controls/oldPrice/index.js";
11
11
  import { OmnibusPriceControls as p } from "./controls/omnibusPrice/index.js";
12
12
  import { OmnibusDiscountControls as a } from "./controls/omnibusDiscount/index.js";
13
13
  import { ButtonControls as c } from "./controls/button/index.js";
14
- import { ImageControls as f } from "./controls/image/index.js";
15
- import { CustomAttributeControls as C } from "./controls/customAttribute/index.js";
14
+ import { ImageControls as C } from "./controls/image/index.js";
15
+ import { CustomAttributeControls as f } from "./controls/customAttribute/index.js";
16
16
  import { SpacingControl as d } from "./controls/spacing/index.js";
17
- import { CardBackgroundColorControl as u } from "./controls/cardBackground/index.js";
18
- import { RecommendationCardCompositionControl as g } from "./controls/cardComposition/index.js";
19
- import { SyncInfoMessageControl as y } from "./controls/syncInfoMessage.js";
17
+ import { BlockBackgroundColorControl as u } from "./controls/blockBackground/index.js";
18
+ import { CardBackgroundColorControl as g } from "./controls/cardBackground/index.js";
19
+ import { RecommendationCardCompositionControl as y } from "./controls/cardComposition/index.js";
20
+ import { SyncInfoMessageControl as B } from "./controls/syncInfoMessage.js";
20
21
  import { RecommendationIconsRegistry as P } from "./iconsRegistry.js";
21
22
  import R from "./recommendation.css.js";
22
23
  import { SettingsPanel as S } from "./settingsPanel.js";
23
- const w = [
24
+ const k = [
24
25
  e,
25
- s,
26
26
  l,
27
+ s,
27
28
  p,
28
29
  a,
29
30
  c,
30
- f,
31
- C
32
- ], B = [
31
+ C,
32
+ f
33
+ ], w = [
33
34
  i,
34
35
  u,
35
- d,
36
36
  g,
37
- y
37
+ d,
38
+ y,
39
+ B
38
40
  ], b = [
39
- ...B,
40
- ...w.flatMap((o) => Object.values(o))
41
- ], U = b.reduce(
42
- (o, t) => o.addControl(t),
43
- new r().addBlock(m).withSettingsPanelRegistry(S)
41
+ ...w,
42
+ ...k.flatMap((o) => Object.values(o))
43
+ ], W = b.reduce(
44
+ (o, r) => o.addControl(r),
45
+ new t().addBlock(m).withSettingsPanelRegistry(S)
44
46
  ).addStyles(R).withPreviewStyles(n).withIconsRegistry(P).build();
45
47
  export {
46
- U as default
48
+ W as default
47
49
  };
@@ -1,9 +1,9 @@
1
- import { SettingsPanelRegistry as E, SettingsPanelTab as _, SettingsTab as O, ContainerControls as C, TextControls as R } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { BLOCK_ID as U } from "./block.js";
1
+ import { SettingsPanelRegistry as E, SettingsPanelTab as _, SettingsTab as I, ContainerControls as C } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { BLOCK_ID as R } from "./block.js";
3
3
  import { RecommendationBlockId as S } from "./constants/blockIds.js";
4
4
  import { RecommendationControlId as T } from "./constants/controlIds.js";
5
5
  import "./constants/selectors.js";
6
- import { CONTROL_BLOCK_ID as A } from "./controls/main/index.js";
6
+ import { CONTROL_BLOCK_ID as U } from "./controls/main/index.js";
7
7
  import "./store/recommendation.js";
8
8
  import "./utils/captureStyleTemplates.js";
9
9
  import "./controls/name/index.js";
@@ -13,37 +13,38 @@ import "./controls/omnibusPrice/index.js";
13
13
  import "./controls/omnibusDiscount/index.js";
14
14
  import "./controls/button/index.js";
15
15
  import "./controls/image/index.js";
16
- import { SPACING_CONTROL_ID as L } from "./controls/spacing/index.js";
17
- import { CARD_BACKGROUND_COLOR_CONTROL_ID as D } from "./controls/cardBackground/index.js";
18
- import { COMPOSITION_CONTROL_BLOCK_ID as B } from "./controls/cardComposition/index.js";
16
+ import { SPACING_CONTROL_ID as A } from "./controls/spacing/index.js";
17
+ import "./controls/blockBackground/index.js";
18
+ import { CARD_BACKGROUND_COLOR_CONTROL_ID as L } from "./controls/cardBackground/index.js";
19
+ import { COMPOSITION_CONTROL_BLOCK_ID as D } from "./controls/cardComposition/index.js";
19
20
  import { SYNC_INFO_MESSAGE_CONTROL_ID as N } from "./controls/syncInfoMessage.js";
20
- class d extends E {
21
- registerBlockControls(I) {
22
- I[U] = [
21
+ class s extends E {
22
+ registerBlockControls(O) {
23
+ O[R] = [
23
24
  new _(
24
- O.SETTINGS,
25
+ I.SETTINGS,
25
26
  [
26
- A,
27
+ U,
27
28
  C.EXTERNAL_INDENTS
28
29
  ]
29
30
  ),
30
31
  new _(
31
- O.STYLES,
32
+ I.STYLES,
32
33
  [
33
- R.TEXT_BLOCK_BACKGROUND_COLOR,
34
- D,
35
- L
34
+ T.BLOCK_BACKGROUND,
35
+ L,
36
+ A
36
37
  ]
37
38
  ),
38
39
  new _(
39
40
  "Card Composition",
40
41
  [
41
- B
42
+ D
42
43
  ]
43
44
  ).withLabel(this.api.translate("Card Composition"))
44
- ], I[S.NAME] = [
45
+ ], O[S.NAME] = [
45
46
  new _(
46
- O.SETTINGS,
47
+ I.SETTINGS,
47
48
  [
48
49
  N,
49
50
  T.NAME_STYLE,
@@ -53,7 +54,7 @@ class d extends E {
53
54
  ]
54
55
  ),
55
56
  new _(
56
- O.STYLES,
57
+ I.STYLES,
57
58
  [
58
59
  T.NAME_BACKGROUND,
59
60
  T.NAME_FONT_FAMILY,
@@ -61,9 +62,9 @@ class d extends E {
61
62
  T.NAME_COLOR
62
63
  ]
63
64
  )
64
- ], I[S.PRICE] = [
65
+ ], O[S.PRICE] = [
65
66
  new _(
66
- O.SETTINGS,
67
+ I.SETTINGS,
67
68
  [
68
69
  N,
69
70
  T.PRICE_STYLE,
@@ -72,7 +73,7 @@ class d extends E {
72
73
  ]
73
74
  ),
74
75
  new _(
75
- O.STYLES,
76
+ I.STYLES,
76
77
  [
77
78
  T.PRICE_BACKGROUND,
78
79
  T.PRICE_FONT_FAMILY,
@@ -80,9 +81,9 @@ class d extends E {
80
81
  T.PRICE_COLOR
81
82
  ]
82
83
  )
83
- ], I[S.OLD_PRICE] = [
84
+ ], O[S.OLD_PRICE] = [
84
85
  new _(
85
- O.SETTINGS,
86
+ I.SETTINGS,
86
87
  [
87
88
  N,
88
89
  T.OLD_PRICE_STYLE,
@@ -91,7 +92,7 @@ class d extends E {
91
92
  ]
92
93
  ),
93
94
  new _(
94
- O.STYLES,
95
+ I.STYLES,
95
96
  [
96
97
  T.OLD_PRICE_BACKGROUND,
97
98
  T.OLD_PRICE_FONT_FAMILY,
@@ -99,9 +100,9 @@ class d extends E {
99
100
  T.OLD_PRICE_COLOR
100
101
  ]
101
102
  )
102
- ], I[S.OMNIBUS_PRICE] = [
103
+ ], O[S.OMNIBUS_PRICE] = [
103
104
  new _(
104
- O.SETTINGS,
105
+ I.SETTINGS,
105
106
  [
106
107
  N,
107
108
  T.OMNIBUS_PRICE_TEXT_BEFORE,
@@ -112,7 +113,7 @@ class d extends E {
112
113
  ]
113
114
  ),
114
115
  new _(
115
- O.STYLES,
116
+ I.STYLES,
116
117
  [
117
118
  T.OMNIBUS_PRICE_BACKGROUND,
118
119
  T.OMNIBUS_PRICE_FONT_FAMILY,
@@ -120,9 +121,9 @@ class d extends E {
120
121
  T.OMNIBUS_PRICE_COLOR
121
122
  ]
122
123
  )
123
- ], I[S.OMNIBUS_DISCOUNT] = [
124
+ ], O[S.OMNIBUS_DISCOUNT] = [
124
125
  new _(
125
- O.SETTINGS,
126
+ I.SETTINGS,
126
127
  [
127
128
  N,
128
129
  T.OMNIBUS_DISCOUNT_TEXT_BEFORE,
@@ -133,7 +134,7 @@ class d extends E {
133
134
  ]
134
135
  ),
135
136
  new _(
136
- O.STYLES,
137
+ I.STYLES,
137
138
  [
138
139
  T.OMNIBUS_DISCOUNT_BACKGROUND,
139
140
  T.OMNIBUS_DISCOUNT_FONT_FAMILY,
@@ -141,9 +142,9 @@ class d extends E {
141
142
  T.OMNIBUS_DISCOUNT_COLOR
142
143
  ]
143
144
  )
144
- ], I[S.BUTTON] = [
145
+ ], O[S.BUTTON] = [
145
146
  new _(
146
- O.SETTINGS,
147
+ I.SETTINGS,
147
148
  [
148
149
  N,
149
150
  T.BUTTON_TEXT,
@@ -153,7 +154,7 @@ class d extends E {
153
154
  ]
154
155
  ),
155
156
  new _(
156
- O.STYLES,
157
+ I.STYLES,
157
158
  [
158
159
  T.BUTTON_COLOR,
159
160
  T.BUTTON_FONT_FAMILY,
@@ -164,9 +165,9 @@ class d extends E {
164
165
  T.BUTTON_BORDER
165
166
  ]
166
167
  )
167
- ], I[S.CUSTOM_ATTRIBUTE] = [
168
+ ], O[S.CUSTOM_ATTRIBUTE] = [
168
169
  new _(
169
- O.SETTINGS,
170
+ I.SETTINGS,
170
171
  [
171
172
  T.CUSTOM_ATTR_STYLE,
172
173
  T.CUSTOM_ATTR_ALIGN,
@@ -175,7 +176,7 @@ class d extends E {
175
176
  ]
176
177
  ),
177
178
  new _(
178
- O.STYLES,
179
+ I.STYLES,
179
180
  [
180
181
  T.CUSTOM_ATTR_BACKGROUND,
181
182
  T.CUSTOM_ATTR_FONT_FAMILY,
@@ -183,9 +184,9 @@ class d extends E {
183
184
  T.CUSTOM_ATTR_COLOR
184
185
  ]
185
186
  )
186
- ], I[S.IMAGE] = [
187
+ ], O[S.IMAGE] = [
187
188
  new _(
188
- O.SETTINGS,
189
+ I.SETTINGS,
189
190
  [
190
191
  N,
191
192
  T.IMAGE_SIZE,
@@ -196,5 +197,5 @@ class d extends E {
196
197
  }
197
198
  }
198
199
  export {
199
- d as SettingsPanel
200
+ s as SettingsPanel
200
201
  };
@@ -5,9 +5,10 @@ const s = {
5
5
  PAGE_TYPE: "data-unsubscribe-page-type",
6
6
  PAGE_LIST: "data-unsubscribe-page-list",
7
7
  BLOCK_ID: "data-unsubscribe-block-id"
8
- }, c = ".unsubscribe-block-v2";
8
+ }, c = ".unsubscribe-block-v2", u = 'a[data-unsubscribe-link="true"], a.unsubscribe-link';
9
9
  export {
10
10
  b as DATA_ATTRIBUTES,
11
11
  c as UNSUBSCRIBE_BLOCK_SELECTOR,
12
- s as UNSUBSCRIBE_EVENTS
12
+ s as UNSUBSCRIBE_EVENTS,
13
+ u as UNSUBSCRIBE_LINK_SELECTOR
13
14
  };