@useinsider/guido 3.9.1-beta.c408b35 → 3.9.1-beta.c64c39e

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.
@@ -10,17 +10,17 @@ import { en as h } from "../config/i18n/en/index.js";
10
10
  import { ToasterTypeOptions as L } from "../enums/toaster.js";
11
11
  import { useStripoApi as $ } from "../services/stripoApi.js";
12
12
  import G from "../static/styles/customEditorStyle.css.js";
13
- import { useEditorStore as E } from "../stores/editor.js";
13
+ import { useEditorStore as C } from "../stores/editor.js";
14
14
  import { dynamicContentToMergeTags as J } from "../utils/genericUtil.js";
15
15
  import N from "../package.json.js";
16
- const ce = (C, l) => {
17
- const { features: c, template: w, isFeatureEnabled: u } = R(), { handleError: m, showToaster: b } = H(), { getToken: k, getCustomFonts: T, getSyncModulesStatus: B } = $(), { handleEvent: F } = q(), { getStripoBlocksConfig: v } = U(), V = async (s, r = [], i = !1) => {
16
+ const ce = (E, l) => {
17
+ const { features: c, template: w, isFeatureEnabled: u } = R(), { handleError: m, showToaster: b } = H(), { getToken: T, getCustomFonts: k, getSyncModulesStatus: B } = $(), { handleEvent: F } = q(), { getStripoBlocksConfig: v } = U(), V = async (s, r = [], i = !1) => {
18
18
  var g, S, y;
19
- const e = E(), { html: p, css: a } = s, { baseBlocks: o, extensions: d } = await v(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, A = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, M = ((y = w.value) == null ? void 0 : y.forceRecreate) ?? !1;
19
+ const e = C(), { html: p, css: a } = s, { baseBlocks: t, extensions: d } = await v(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, A = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, M = ((y = w.value) == null ? void 0 : y.forceRecreate) ?? !1;
20
20
  await window.UIEditor.initEditor(
21
21
  document.querySelector("#guido-editor"),
22
22
  {
23
- metadata: C,
23
+ metadata: E,
24
24
  html: p,
25
25
  css: a,
26
26
  forceRecreate: M,
@@ -42,13 +42,12 @@ const ce = (C, l) => {
42
42
  messageSettingsEnabled: !0,
43
43
  displayGmailAnnotations: !0,
44
44
  displayHiddenPreheader: !1,
45
- keepModuleStylesEnabled: !0,
46
45
  displayTitle: !1,
47
46
  displayUTM: !1,
48
47
  selectElementAfterDrop: !0,
49
48
  sameFontSizeForOutlook: !0,
50
49
  allowedScriptSourceDomains: "https://email-static.useinsider.com https://edge.fullstory.com https://rs.fullstory.com",
51
- ...o ? { baseBlocks: o } : {},
50
+ ...t ? { baseBlocks: t } : {},
52
51
  editorFonts: {
53
52
  showDefaultStandardFonts: !0,
54
53
  showDefaultNotStandardFonts: !0,
@@ -62,32 +61,32 @@ const ce = (C, l) => {
62
61
  )
63
62
  }
64
63
  ],
65
- async onTokenRefreshRequest(t) {
64
+ async onTokenRefreshRequest(o) {
66
65
  try {
67
- const n = await k();
68
- t(n);
66
+ const n = await T();
67
+ o(n);
69
68
  } catch (n) {
70
69
  m(n, "Failed to refresh token");
71
70
  }
72
71
  },
73
72
  onTemplateLoaded() {
74
73
  try {
75
- const { importCss: t } = x(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: P } = I(), { injectFullStory: D } = O();
76
- t(), n(), D(), P(), l.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
74
+ const { importCss: o } = x(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: P } = I(), { injectFullStory: D } = O();
75
+ o(), n(), D(), P(), l.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
77
76
  e.hasChanges = !1;
78
77
  }, 1e3);
79
- } catch (t) {
80
- m(t, "Failed to load custom interface appearance");
78
+ } catch (o) {
79
+ m(o, "Failed to load custom interface appearance");
81
80
  }
82
81
  },
83
- onCodeEditorVisibilityChanged(t) {
84
- e.isCodeEditorOpen = t;
82
+ onCodeEditorVisibilityChanged(o) {
83
+ e.isCodeEditorOpen = o;
85
84
  },
86
- onEditorVisualModeChanged(t) {
87
- e.editorVisualMode = t.toLowerCase();
85
+ onEditorVisualModeChanged(o) {
86
+ e.editorVisualMode = o.toLowerCase();
88
87
  },
89
- onVersionHistoryVisibilityChanged(t) {
90
- e.isVersionHistoryOpen = t;
88
+ onVersionHistoryVisibilityChanged(o) {
89
+ e.isVersionHistoryOpen = o;
91
90
  },
92
91
  onDataChanged() {
93
92
  e.hasChanges = !0;
@@ -108,19 +107,19 @@ const ce = (C, l) => {
108
107
  Promise.resolve(s()).then(r, i);
109
108
  return;
110
109
  }
111
- const e = N.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
112
- o.id = "UiEditorScript", o.type = "module", o.src = a, o.onload = () => {
110
+ const e = N.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, t = document.createElement("script");
111
+ t.id = "UiEditorScript", t.type = "module", t.src = a, t.onload = () => {
113
112
  Promise.resolve(s()).then(r, i);
114
- }, o.onerror = () => {
113
+ }, t.onerror = () => {
115
114
  i(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
116
- }, document.body.appendChild(o);
115
+ }, document.body.appendChild(t);
117
116
  });
118
117
  return { initPlugin: async (s) => {
119
- const r = E();
118
+ const r = C();
120
119
  try {
121
120
  await _(async () => {
122
121
  const [i, e] = await Promise.all([
123
- T(),
122
+ k(),
124
123
  B()
125
124
  ]);
126
125
  r.syncModulesEnabled = e, await V(s, i, e);
@@ -1,30 +1,30 @@
1
- import { useConfig as _ } from "../../../composables/useConfig.js";
2
- import { useRecommendation as q } from "../../../composables/useRecommendation.js";
3
- import { CSS_CLASS_RECO_BUTTON as C } from "../../../extensions/Blocks/Recommendation/constants/selectors.js";
4
- import { useRecommendationExtensionStore as E } from "../../../extensions/Blocks/Recommendation/store/recommendation.js";
5
- import { isIgnoredRecommendationBlock as w } from "./recommendationIgnoreUtils.js";
6
- function P(t, r, e, n, s = "") {
7
- const c = `{{${s}${t}_${r}_${e}}}`, o = `{{${s}${t}_${r}_currency}}`;
8
- return n === "before" ? `${o} ${c}` : `${c} ${o}`;
9
- }
10
- function m(t) {
1
+ import { useConfig as C } from "../../../composables/useConfig.js";
2
+ import { useRecommendation as E } from "../../../composables/useRecommendation.js";
3
+ import { CSS_CLASS_RECO_BUTTON as q } from "../../../extensions/Blocks/Recommendation/constants/selectors.js";
4
+ import { useRecommendationExtensionStore as w } from "../../../extensions/Blocks/Recommendation/store/recommendation.js";
5
+ import { isIgnoredRecommendationBlock as P } from "./recommendationIgnoreUtils.js";
6
+ function R(t, r, e, o, s = "") {
7
+ const i = `{{${s}${t}_${r}_${e}}}`, n = `{{${s}${t}_${r}_currency}}`;
8
+ return o === "before" ? `${n} ${i}` : `${i} ${n}`;
9
+ }
10
+ function y(t) {
11
11
  let r = t;
12
12
  for (; r.children.length === 1; )
13
13
  [r] = r.children;
14
14
  return r;
15
15
  }
16
- function b(t, r, e, n, s, c) {
16
+ function A(t, r, e, o, s, i) {
17
17
  switch (r) {
18
18
  case "productImage": {
19
- const o = t.querySelector("img");
20
- o && (o.setAttribute("src", `{{${c}${e}_${n}_image_url}}`), o.setAttribute("alt", `{{${c}${e}_${n}_name}}`));
21
- const i = t.querySelector("a");
22
- i && (i.setAttribute("href", `{{${c}${e}_${n}_url}}`), i.classList.add(C));
19
+ const n = t.querySelector("img");
20
+ n && (n.setAttribute("src", `{{${i}${e}_${o}_image_url}}`), n.setAttribute("alt", `{{${i}${e}_${o}_name}}`));
21
+ const c = t.querySelector("a");
22
+ c && (c.setAttribute("href", `{{${i}${e}_${o}_url}}`), c.classList.add(q));
23
23
  break;
24
24
  }
25
25
  case "productName": {
26
- const o = t.querySelector("p");
27
- o && (m(o).textContent = `{{${c}${e}_${n}_name}}`);
26
+ const n = t.querySelector("p");
27
+ n && (y(n).textContent = `{{${i}${e}_${o}_name}}`);
28
28
  break;
29
29
  }
30
30
  // Inline mode ("Move to next line" OFF) merges BOTH prices into one row
@@ -32,145 +32,176 @@ function b(t, r, e, n, s, c) {
32
32
  // substitute by cell content, not by the row's anchor (SD-145161).
33
33
  case "productPrice":
34
34
  case "productOldPrice": {
35
- const o = (d, l) => {
36
- d && (m(d).textContent = P(
35
+ const n = (l, d) => {
36
+ l && (y(l).textContent = R(
37
37
  e,
38
- n,
39
- l,
38
+ o,
39
+ d,
40
40
  s,
41
- c
41
+ i
42
42
  ));
43
- }, i = t.querySelector(".product-price p"), a = t.querySelector(".product-old-price p"), u = !i && !a ? t.querySelector("p") : null;
44
- o(i ?? (r === "productPrice" ? u : null), "price"), o(a ?? (r === "productOldPrice" ? u : null), "original_price");
43
+ }, c = t.querySelector(".product-price p"), a = t.querySelector(".product-old-price p"), u = !c && !a ? t.querySelector("p") : null;
44
+ n(c ?? (r === "productPrice" ? u : null), "price"), n(a ?? (r === "productOldPrice" ? u : null), "original_price");
45
45
  break;
46
46
  }
47
47
  case "productButton": {
48
- const o = t.querySelector("a");
49
- o && o.setAttribute("href", `{{${c}${e}_${n}_url}}`);
48
+ const n = t.querySelector("a");
49
+ n && n.setAttribute("href", `{{${i}${e}_${o}_url}}`);
50
50
  break;
51
51
  }
52
52
  case "productOmnibusPrice": {
53
- const o = t.querySelector(".omnibus-price-value");
54
- if (o) {
55
- o.textContent = `{{${c}${e}_${n}_omnibus_price}}`;
56
- const i = o.closest("p");
57
- i && (i.setAttribute("product-attr", "omnibus_price"), i.setAttribute("composition", "true"));
53
+ const n = t.querySelector(".omnibus-price-value");
54
+ if (n) {
55
+ n.textContent = `{{${i}${e}_${o}_omnibus_price}}`;
56
+ const c = n.closest("p");
57
+ c && (c.setAttribute("product-attr", "omnibus_price"), c.setAttribute("composition", "true"));
58
58
  }
59
59
  break;
60
60
  }
61
61
  case "productOmnibusDiscount": {
62
- const o = t.querySelector(".omnibus-discount-value");
63
- if (o) {
64
- o.textContent = `{{${c}${e}_${n}_omnibus_discount}}`;
65
- const i = o.closest("p");
66
- i && (i.setAttribute("product-attr", "omnibus_discount"), i.setAttribute("composition", "true"));
62
+ const n = t.querySelector(".omnibus-discount-value");
63
+ if (n) {
64
+ n.textContent = `{{${i}${e}_${o}_omnibus_discount}}`;
65
+ const c = n.closest("p");
66
+ c && (c.setAttribute("product-attr", "omnibus_discount"), c.setAttribute("composition", "true"));
67
67
  }
68
68
  break;
69
69
  }
70
70
  default: {
71
- const o = t.getAttribute("product-attr") ? t : t.querySelector("[product-attr]");
72
- if (o) {
73
- const i = o.getAttribute("product-attr"), a = o.querySelector("p");
74
- a && (m(a).textContent = `{{${c}${e}_${n}_${i}}}`);
71
+ const n = t.getAttribute("product-attr") ? t : t.querySelector("[product-attr]");
72
+ if (n) {
73
+ const c = n.getAttribute("product-attr"), a = n.querySelector("p");
74
+ a && (y(a).textContent = `{{${i}${e}_${o}_${c}}}`);
75
75
  }
76
76
  break;
77
77
  }
78
78
  }
79
79
  }
80
- function R(t, r, e, n) {
81
- t.querySelectorAll(".recommendation-product-row").forEach((c, o) => {
82
- c.querySelectorAll("[data-attribute-type]").forEach((a) => {
83
- const u = a.getAttribute("data-attribute-type") || "", d = a.querySelectorAll(".attribute-cell");
84
- d.length > 0 ? d.forEach((l) => {
85
- b(l, u, r, o, e, n);
86
- }) : b(a, u, r, o, e, n);
87
- });
80
+ const B = "name";
81
+ function S(t, r, e, o) {
82
+ const s = `${o}${r}_${e}_${B}`;
83
+ return {
84
+ open: t.createComment(`{% if ${s} and ${s} != "" %}`),
85
+ close: t.createComment("{% endif %}")
86
+ };
87
+ }
88
+ function L(t, r, e) {
89
+ return S(t, r, 0, e);
90
+ }
91
+ function N(t, r, e, o) {
92
+ if (!t.innerHTML.includes("{{"))
93
+ return;
94
+ const { open: s, close: i } = S(t.ownerDocument, r, e, o);
95
+ t.insertBefore(s, t.firstChild), t.appendChild(i);
96
+ }
97
+ function T(t, r, e, o) {
98
+ var n, c;
99
+ if (!t.innerHTML.includes("{{"))
100
+ return;
101
+ const { open: s, close: i } = S(t.ownerDocument, r, e, o);
102
+ (n = t.parentNode) == null || n.insertBefore(s, t), (c = t.parentNode) == null || c.insertBefore(i, t.nextSibling);
103
+ }
104
+ function v(t, r, e, o) {
105
+ t.querySelectorAll(".recommendation-product-row").forEach((i, n) => {
106
+ i.querySelectorAll("[data-attribute-type]").forEach((a) => {
107
+ const u = a.getAttribute("data-attribute-type") || "", l = a.querySelectorAll(".attribute-cell");
108
+ l.length > 0 ? l.forEach((d) => {
109
+ A(d, u, r, n, e, o);
110
+ }) : A(a, u, r, n, e, o);
111
+ }), T(i, r, n, o);
88
112
  });
89
113
  }
90
- function W(t, r, e, n) {
114
+ function O(t, r, e, o) {
91
115
  const s = t.querySelectorAll(".recommendation-product-row");
92
116
  if (!s.length)
93
117
  return;
94
- const [c] = s, o = c.querySelector("[data-attribute-type]"), i = o ? o.querySelectorAll(".attribute-cell").length : 1;
118
+ const [i] = s, n = i.querySelector("[data-attribute-type]"), c = n ? n.querySelectorAll(".attribute-cell").length : 1;
95
119
  s.forEach((a, u) => {
96
- a.querySelectorAll("[data-attribute-type]").forEach((l) => {
97
- const p = l.getAttribute("data-attribute-type") || "";
98
- l.querySelectorAll(".attribute-cell").forEach(($, S) => {
99
- const g = u * i + S;
100
- b($, p, r, g, e, n);
120
+ a.querySelectorAll("[data-attribute-type]").forEach((d) => {
121
+ const p = d.getAttribute("data-attribute-type") || "";
122
+ d.querySelectorAll(".attribute-cell").forEach((m, f) => {
123
+ const h = u * c + f;
124
+ A(m, p, r, h, e, o), N(m, r, h, o);
101
125
  });
102
126
  });
103
127
  });
104
128
  }
105
- function v(t, r, e, n) {
106
- t.querySelectorAll(".ins-recommendation-product-container").forEach((c) => {
107
- W(c, r, e, n);
129
+ function W(t, r, e, o) {
130
+ t.querySelectorAll(".ins-recommendation-product-container").forEach((i) => {
131
+ O(i, r, e, o);
108
132
  });
109
133
  }
110
- function O(t, r, e) {
111
- const n = t.getAttribute("data-layout") || "grid", s = t.getAttribute("currency-alignment") || "after";
112
- n === "list" ? R(t, r, s, e) : v(t, r, s, e);
134
+ function D(t, r, e) {
135
+ const o = t.getAttribute("data-layout") || "grid", s = t.getAttribute("currency-alignment") || "after";
136
+ o === "list" ? v(t, r, s, e) : W(t, r, s, e);
113
137
  }
114
- function f(t, r, e) {
115
- const n = new RegExp(`${r}\\s*:\\s*(\\d+)\\s*px`, "i"), s = t.match(n);
138
+ function $(t, r, e) {
139
+ const o = new RegExp(`${r}\\s*:\\s*(\\d+)\\s*px`, "i"), s = t.match(o);
116
140
  return s ? parseInt(s[1]) : e;
117
141
  }
118
- function y(t) {
142
+ function _(t) {
119
143
  const r = t.trim();
120
144
  return r.endsWith("%") ? parseFloat(r) < 100 : /^\d+(?:\.\d+)?(?:px)?$/.test(r) && parseInt(r) > 0;
121
145
  }
122
- function A(t) {
146
+ function g(t) {
123
147
  const r = t.getAttribute("width");
124
- if (r && y(r))
148
+ if (r && _(r))
125
149
  return r.trim();
126
150
  const e = (t.getAttribute("style") || "").match(/(?:^|[;\s])width\s*:\s*(\d+(?:\.\d+)?(?:px|%))/i);
127
- return e && y(e[1]) ? e[1] : null;
151
+ return e && _(e[1]) ? e[1] : null;
128
152
  }
129
153
  function M(t, r) {
130
154
  let e = t.parentElement;
131
155
  for (; e && e !== r; ) {
132
- if (e.tagName === "TD" && A(e))
156
+ if (e.tagName === "TD" && g(e))
133
157
  return e;
134
158
  e = e.parentElement;
135
159
  }
136
160
  return null;
137
161
  }
138
- function T(t) {
139
- const r = t.getAttribute("style") || "", e = f(r, "width", 600), n = f(r, "padding", 0) * 2, s = Math.max(0, e - n);
140
- s !== 0 && t.querySelectorAll("img.adapt-img").forEach((c) => {
141
- if (c.hasAttribute("width"))
162
+ function G(t) {
163
+ const r = t.getAttribute("style") || "", e = $(r, "width", 600), o = $(r, "padding", 0) * 2, s = Math.max(0, e - o);
164
+ s !== 0 && t.querySelectorAll("img.adapt-img").forEach((i) => {
165
+ if (i.hasAttribute("width"))
142
166
  return;
143
- const o = M(c, t);
144
- if (!o)
167
+ const n = M(i, t);
168
+ if (!n)
145
169
  return;
146
- const i = A(o), a = f(o.getAttribute("style") || "", "padding", 0) * 2, u = i.endsWith("%") ? Math.floor(s * parseFloat(i) / 100) : parseInt(i), d = Math.max(1, u - a);
147
- c.setAttribute("width", String(d));
148
- const l = c.getAttribute("style") || "";
149
- if (!/\bwidth\s*:\s*\d/i.test(l)) {
150
- const p = l && !l.trim().endsWith(";") ? "; " : "";
151
- c.setAttribute("style", `${l}${p}width: ${d}px`);
170
+ const c = g(n), a = $(n.getAttribute("style") || "", "padding", 0) * 2, u = c.endsWith("%") ? Math.floor(s * parseFloat(c) / 100) : parseInt(c), l = Math.max(1, u - a);
171
+ i.setAttribute("width", String(l));
172
+ const d = i.getAttribute("style") || "";
173
+ if (!/\bwidth\s*:\s*\d/i.test(d)) {
174
+ const p = d && !d.trim().endsWith(";") ? "; " : "";
175
+ i.setAttribute("style", `${d}${p}width: ${l}px`);
152
176
  }
153
177
  });
154
178
  }
155
- function B(t, r) {
179
+ function H(t, r) {
156
180
  const e = t.match(/<!DOCTYPE[^>]*>/i);
157
181
  return (e ? `${e[0]}
158
182
  ` : "") + r.documentElement.outerHTML;
159
183
  }
160
- function G(t) {
161
- const r = t.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), e = new DOMParser().parseFromString(r, "text/html"), n = e.querySelectorAll(".recommendation-block-v2");
162
- if (!n.length)
184
+ function Y(t) {
185
+ const r = t.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), e = new DOMParser().parseFromString(r, "text/html"), o = e.querySelectorAll(".recommendation-block-v2");
186
+ if (!o.length)
163
187
  return t;
164
- const { buildCampaignUrl: s } = q(), c = E();
165
- c.recommendationCampaignUrls = {};
166
- const { isFeatureEnabled: o } = _(), i = o("liquidSyntax") ? "reco_" : "";
167
- return n.forEach((u) => {
168
- var l, p;
169
- const d = u.getAttribute("recommendation-id");
170
- d && ((l = u.parentNode) == null || l.insertBefore(e.createComment("REC_START"), u), (p = u.parentNode) == null || p.insertBefore(e.createComment("REC_END"), u.nextSibling), u.querySelectorAll('[data-visibility="0"]').forEach((h) => h.remove()), s(d), w(u) || O(u, d, i), T(u));
171
- }), B(r, e).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
188
+ const { buildCampaignUrl: s } = E(), i = w();
189
+ i.recommendationCampaignUrls = {};
190
+ const { isFeatureEnabled: n } = C(), c = n("liquidSyntax") ? "reco_" : "";
191
+ return o.forEach((u) => {
192
+ var d, p, b, m;
193
+ const l = u.getAttribute("recommendation-id");
194
+ if (l) {
195
+ if ((d = u.parentNode) == null || d.insertBefore(e.createComment("REC_START"), u), (p = u.parentNode) == null || p.insertBefore(e.createComment("REC_END"), u.nextSibling), u.querySelectorAll('[data-visibility="0"]').forEach((f) => f.remove()), s(l), !P(u)) {
196
+ D(u, l, c);
197
+ const { open: f, close: h } = L(e, l, c);
198
+ (b = u.parentNode) == null || b.insertBefore(f, u), (m = u.parentNode) == null || m.insertBefore(h, u.nextSibling);
199
+ }
200
+ G(u);
201
+ }
202
+ }), H(r, e).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
172
203
  }
173
204
  export {
174
- P as formatPriceVariable,
175
- G as prepareRecommendationBlocks
205
+ R as formatPriceVariable,
206
+ Y as prepareRecommendationBlocks
176
207
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.9.1-beta.c408b35",
3
+ "version": "3.9.1-beta.c64c39e",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",