@useinsider/guido 2.1.0-beta.c2eabd2 → 2.1.0-beta.c305789

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 (55) hide show
  1. package/dist/components/Guido.vue.js +1 -1
  2. package/dist/components/Guido.vue2.js +36 -39
  3. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +5 -5
  4. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue2.js +2 -2
  5. package/dist/components/organisms/header/EditorActions.vue.js +10 -8
  6. package/dist/components/organisms/header/EditorActions.vue2.js +40 -31
  7. package/dist/components/organisms/header/MigrationConfirmModal.vue.js +17 -0
  8. package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +41 -0
  9. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  10. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  11. package/dist/composables/useStripo.js +25 -23
  12. package/dist/composables/useVersionHistoryApi.js +1 -1
  13. package/dist/config/i18n/en/index.js +11 -0
  14. package/dist/config/i18n/en/labels.json.js +12 -0
  15. package/dist/config/i18n/en/toasters.json.js +56 -0
  16. package/dist/config/i18n/en/tooltips.json.js +82 -0
  17. package/dist/config/i18n/index.js +7 -0
  18. package/dist/config/migrator/itemsBlockMigrator.js +136 -130
  19. package/dist/config/migrator/recommendationMigrator.js +45 -40
  20. package/dist/extensions/Blocks/Items/block.js +45 -25
  21. package/dist/extensions/Blocks/Items/iconsRegistry.js +6 -5
  22. package/dist/extensions/Blocks/Items/items.css.js +48 -0
  23. package/dist/extensions/Blocks/Recommendation/block.js +49 -29
  24. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +4 -3
  25. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +48 -0
  26. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  27. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  28. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  29. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  30. package/dist/extensions/Blocks/common-control.js +12 -4
  31. package/dist/extensions/Blocks/common-icons.js +39 -0
  32. package/dist/guido.css +1 -1
  33. package/dist/services/stripoApi.js +20 -17
  34. package/dist/src/components/Guido.vue.d.ts +1 -1
  35. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  36. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  37. package/dist/src/components/organisms/header/MigrationConfirmModal.vue.d.ts +6 -0
  38. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  39. package/dist/src/components/wrappers/WpModal.vue.d.ts +2 -2
  40. package/dist/src/config/i18n/en/index.d.ts +1 -0
  41. package/dist/src/config/i18n/index.d.ts +16 -0
  42. package/dist/src/extensions/Blocks/Items/block.d.ts +1 -0
  43. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +1 -0
  44. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  45. package/dist/src/extensions/Blocks/common-control.d.ts +5 -0
  46. package/dist/src/extensions/Blocks/common-icons.d.ts +1 -0
  47. package/dist/src/stores/template.d.ts +3 -0
  48. package/dist/static/styles/components/notification.css.js +18 -0
  49. package/dist/static/styles/components/tools.css.js +6 -2
  50. package/dist/static/styles/variables.css.js +2 -0
  51. package/dist/static/templates/empty/index.html.js +74 -0
  52. package/dist/static/templates/empty/style.css.js +779 -0
  53. package/dist/stores/template.js +9 -0
  54. package/dist/stores/unsubscribe.js +37 -34
  55. package/package.json +1 -1
@@ -1,24 +1,29 @@
1
1
  var h = Object.defineProperty;
2
- var T = (A, e, t) => e in A ? h(A, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : A[e] = t;
3
- var m = (A, e, t) => T(A, typeof e != "symbol" ? e + "" : e, t);
4
- import P, { prepareProductRows as S } from "../../extensions/Blocks/Recommendation/templates/grid/migration.js";
5
- import { getDefaultProducts as q } from "../../extensions/Blocks/Recommendation/templates/utils.js";
6
- class w {
2
+ var T = (d, e, t) => e in d ? h(d, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[e] = t;
3
+ var A = (d, e, t) => T(d, typeof e != "symbol" ? e + "" : e, t);
4
+ import { BLOCK_ID as S } from "../../extensions/Blocks/Recommendation/block.js";
5
+ import P, { prepareProductRows as q } from "../../extensions/Blocks/Recommendation/templates/grid/migration.js";
6
+ import { useTemplateStore as w } from "../../stores/template.js";
7
+ import { getDefaultProducts as B } from "../../extensions/Blocks/Recommendation/templates/utils.js";
8
+ class $ {
7
9
  constructor() {
8
- m(this, "parser");
10
+ A(this, "parser");
9
11
  this.parser = new DOMParser();
10
12
  }
11
13
  migrate(e) {
12
14
  try {
13
15
  const t = this.parser.parseFromString(e, "text/html"), s = t.querySelectorAll(
14
16
  'td.ins-recommendation-v3-block-1, td.product-block[esd-handler-name*="EmailRecommendationV3"]'
15
- );
16
- return s.length === 0 ? e : (s.forEach((o) => {
17
- const l = o.getAttribute("id"), r = this.extractBgColor(o), i = this.extractTitle(o), u = this.extractProductRows(o), c = P.replace("{-{-TITLE-}-}", i).replace("{-{-PRODUCT_ROWS-}-}", u), a = this.parser.parseFromString(
18
- `<table id="tempDoc"><tbody><tr>${c}</tr></tbody></table>`,
17
+ ), o = w();
18
+ return o.migrations = {
19
+ ...o.migrations,
20
+ [S]: s.length
21
+ }, s.length === 0 ? e : (s.forEach((n) => {
22
+ const r = n.getAttribute("id"), i = this.extractBgColor(n), u = this.extractTitle(n), c = this.extractProductRows(n), l = P.replace("{-{-TITLE-}-}", u).replace("{-{-PRODUCT_ROWS-}-}", c), a = this.parser.parseFromString(
23
+ `<table id="tempDoc"><tbody><tr>${l}</tr></tbody></table>`,
19
24
  "text/html"
20
25
  ).querySelector(".ins-recommendation-v3-block-v2");
21
- a && o.parentNode && (l && a.setAttribute("id", l), r && a.setAttribute("bgcolor", r), o.parentNode.replaceChild(a, o));
26
+ a && n.parentNode && (r && a.setAttribute("id", r), i && a.setAttribute("bgcolor", i), n.parentNode.replaceChild(a, n));
22
27
  }), t.documentElement.outerHTML);
23
28
  } catch (t) {
24
29
  return console.error("RecommendationMigrator failed:", t), e;
@@ -64,7 +69,7 @@ class w {
64
69
  * @returns HTML string for the title block
65
70
  */
66
71
  extractTitle(e) {
67
- var a, g;
72
+ var g, a;
68
73
  const t = e.querySelector(".ext-recommendation-title");
69
74
  if (!t)
70
75
  return this.buildTitleBlock({
@@ -76,7 +81,7 @@ class w {
76
81
  });
77
82
  const s = t.querySelector("p");
78
83
  if (!s) {
79
- const p = ((a = t.textContent) == null ? void 0 : a.trim()) || "You May Also Like!", b = t.getAttribute("align") || "center";
84
+ const p = ((g = t.textContent) == null ? void 0 : g.trim()) || "You May Also Like!", b = t.getAttribute("align") || "center";
80
85
  return this.buildTitleBlock({
81
86
  text: p,
82
87
  isBold: !0,
@@ -85,13 +90,13 @@ class w {
85
90
  styles: "font-size: 28px; color: #333333;"
86
91
  });
87
92
  }
88
- const o = ((g = s.textContent) == null ? void 0 : g.trim()) || "You May Also Like!", l = t.getAttribute("align") || s.getAttribute("align") || "center", r = s.getAttribute("style") || "", i = /font-weight\s*:\s*bold/i.test(r) || !!s.querySelector("b, strong"), u = /font-style\s*:\s*italic/i.test(r) || !!s.querySelector("i, em"), c = this.removeStyleProperties(r, ["font-weight", "font-style"]), n = this.convertInlineToBlock(c);
93
+ const o = ((a = s.textContent) == null ? void 0 : a.trim()) || "You May Also Like!", n = t.getAttribute("align") || s.getAttribute("align") || "center", r = s.getAttribute("style") || "", i = /font-weight\s*:\s*bold/i.test(r) || !!s.querySelector("b, strong"), u = /font-style\s*:\s*italic/i.test(r) || !!s.querySelector("i, em"), c = this.removeStyleProperties(r, ["font-weight", "font-style"]), l = this.convertInlineToBlock(c);
89
94
  return this.buildTitleBlock({
90
95
  text: o,
91
96
  isBold: i,
92
97
  isItalic: u,
93
- align: l,
94
- styles: n
98
+ align: n,
99
+ styles: l
95
100
  });
96
101
  }
97
102
  /**
@@ -103,8 +108,8 @@ class w {
103
108
  const t = this.extractProductConfig(e);
104
109
  if (!t)
105
110
  return console.warn("[RecommendationMigrator] No product config found, using defaults"), this.generateProductRows(6, 3, {});
106
- const { totalCount: s, productsPerRow: o } = t, l = this.extractProductStyles(e);
107
- return this.generateProductRows(s, o, l);
111
+ const { totalCount: s, productsPerRow: o } = t, n = this.extractProductStyles(e);
112
+ return this.generateProductRows(s, o, n);
108
113
  }
109
114
  /**
110
115
  * Extracts Stripo padding/margin utility classes from a class string
@@ -152,12 +157,12 @@ class w {
152
157
  * @returns HTML string for product rows with applied styles
153
158
  */
154
159
  generateProductRows(e, t, s) {
155
- const o = q(), l = [];
160
+ const o = B(), n = [];
156
161
  for (let i = 0; i < e; i++) {
157
162
  const u = o[i % o.length];
158
- l.push({ ...u });
163
+ n.push({ ...u });
159
164
  }
160
- let r = S(l, t);
165
+ let r = q(n, t);
161
166
  return r = this.applyExtractedStyles(r, s), r;
162
167
  }
163
168
  /**
@@ -171,30 +176,30 @@ class w {
171
176
  return console.warn("[RecommendationMigrator] No product card found, using default styles"), t;
172
177
  const o = this.extractCardBgColor(s);
173
178
  o && (t.cardBgColor = o);
174
- const l = s.querySelector(".ext-product-image");
175
- if (l) {
176
- const n = l.querySelector("img"), a = n == null ? void 0 : n.getAttribute("width"), g = l.getAttribute("style") || "", p = l.getAttribute("align") || "center", b = l.getAttribute("class") || "", d = this.extractStripoClasses(b);
177
- t.imageWidth = a || "120", t.imageAlign = p, t.imageTdStyle = g, t.imageClasses = d;
179
+ const n = s.querySelector(".ext-product-image");
180
+ if (n) {
181
+ const l = n.querySelector("img"), g = l == null ? void 0 : l.getAttribute("width"), a = n.getAttribute("style") || "", p = n.getAttribute("align") || "center", b = n.getAttribute("class") || "", m = this.extractStripoClasses(b);
182
+ t.imageWidth = g || "120", t.imageAlign = p, t.imageTdStyle = a, t.imageClasses = m;
178
183
  }
179
184
  const r = s.querySelector(".ext-product-name");
180
185
  if (r) {
181
- const n = r.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = r.getAttribute("align") || "center", p = r.getAttribute("style") || "", b = r.getAttribute("class") || "", d = this.extractStripoClasses(b);
182
- t.nameStyle = a, t.nameAlign = g, t.nameTdStyle = p, t.nameClasses = d;
186
+ const l = r.querySelector("p"), g = (l == null ? void 0 : l.getAttribute("style")) || "", a = r.getAttribute("align") || "center", p = r.getAttribute("style") || "", b = r.getAttribute("class") || "", m = this.extractStripoClasses(b);
187
+ t.nameStyle = g, t.nameAlign = a, t.nameTdStyle = p, t.nameClasses = m;
183
188
  }
184
189
  const i = s.querySelector(".ext-product-price");
185
190
  if (i) {
186
- const n = i.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = i.getAttribute("align") || "center", p = i.getAttribute("style") || "", b = i.getAttribute("class") || "", d = this.extractStripoClasses(b);
187
- t.priceStyle = a, t.priceAlign = g, t.priceTdStyle = p, t.priceClasses = d;
191
+ const l = i.querySelector("p"), g = (l == null ? void 0 : l.getAttribute("style")) || "", a = i.getAttribute("align") || "center", p = i.getAttribute("style") || "", b = i.getAttribute("class") || "", m = this.extractStripoClasses(b);
192
+ t.priceStyle = g, t.priceAlign = a, t.priceTdStyle = p, t.priceClasses = m;
188
193
  }
189
194
  const u = s.querySelector(".ext-product-original-price");
190
195
  if (u) {
191
- const n = u.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = u.getAttribute("align") || "center", p = u.getAttribute("style") || "", b = u.getAttribute("class") || "", d = this.extractStripoClasses(b);
192
- t.oldPriceStyle = a, t.oldPriceAlign = g, t.oldPriceTdStyle = p, t.oldPriceClasses = d;
196
+ const l = u.querySelector("p"), g = (l == null ? void 0 : l.getAttribute("style")) || "", a = u.getAttribute("align") || "center", p = u.getAttribute("style") || "", b = u.getAttribute("class") || "", m = this.extractStripoClasses(b);
197
+ t.oldPriceStyle = g, t.oldPriceAlign = a, t.oldPriceTdStyle = p, t.oldPriceClasses = m;
193
198
  }
194
199
  const c = s.querySelector(".ext-product-button");
195
200
  if (c) {
196
- const n = c.querySelector(".es-button-border"), a = c.querySelector("a.es-button"), g = (n == null ? void 0 : n.getAttribute("style")) || "", p = (a == null ? void 0 : a.getAttribute("style")) || "", b = c.getAttribute("align") || "center", d = c.getAttribute("style") || "", f = c.getAttribute("class") || "", C = this.extractStripoClasses(f), y = ((c == null ? void 0 : c.textContent) || "").trim();
197
- t.buttonBorderStyle = g, t.buttonLinkStyle = p, t.buttonAlign = b, t.buttonTdStyle = d, t.buttonClasses = C, t.buttonText = y;
201
+ const l = c.querySelector(".es-button-border"), g = c.querySelector("a.es-button"), a = (l == null ? void 0 : l.getAttribute("style")) || "", p = (g == null ? void 0 : g.getAttribute("style")) || "", b = c.getAttribute("align") || "center", m = c.getAttribute("style") || "", f = c.getAttribute("class") || "", C = this.extractStripoClasses(f), y = ((c == null ? void 0 : c.textContent) || "").trim();
202
+ t.buttonBorderStyle = a, t.buttonLinkStyle = p, t.buttonAlign = b, t.buttonTdStyle = m, t.buttonClasses = C, t.buttonText = y;
198
203
  }
199
204
  return t;
200
205
  }
@@ -240,8 +245,8 @@ class w {
240
245
  i && t.oldPriceStyle && i.setAttribute("style", t.oldPriceStyle);
241
246
  }), (t.buttonBorderStyle || t.buttonLinkStyle || t.buttonAlign || t.buttonTdStyle || t.buttonClasses) && s.querySelectorAll(".product-button").forEach((r) => {
242
247
  if (t.buttonAlign && r.setAttribute("align", t.buttonAlign), t.buttonTdStyle && r.setAttribute("style", t.buttonTdStyle), t.buttonClasses) {
243
- const n = `${r.getAttribute("class") || ""} ${t.buttonClasses}`.trim();
244
- r.setAttribute("class", n);
248
+ const l = `${r.getAttribute("class") || ""} ${t.buttonClasses}`.trim();
249
+ r.setAttribute("class", l);
245
250
  }
246
251
  const i = r.querySelector(".es-button-border");
247
252
  i && t.buttonBorderStyle && i.setAttribute("style", t.buttonBorderStyle);
@@ -270,8 +275,8 @@ class w {
270
275
  * Removes specified style properties from a style string
271
276
  */
272
277
  removeStyleProperties(e, t) {
273
- return e ? t.reduce((o, l) => {
274
- const r = new RegExp(`${l}\\s*:\\s*[^;]*;?`, "gi");
278
+ return e ? t.reduce((o, n) => {
279
+ const r = new RegExp(`${n}\\s*:\\s*[^;]*;?`, "gi");
275
280
  return o.replace(r, "");
276
281
  }, e).replace(/;\s*;/g, ";").replace(/^;|;$/g, "").trim() : "";
277
282
  }
@@ -285,9 +290,9 @@ class w {
285
290
  return /display\s*:/i.test(t) || (t = t ? `${t}; display: block` : "display: block"), t.replace(/;\s*;/g, ";").replace(/^;|;$/g, "").replace(/"/g, "'").trim();
286
291
  }
287
292
  }
288
- function k(A) {
289
- return new w().migrate(A);
293
+ function v(d) {
294
+ return new $().migrate(d);
290
295
  }
291
296
  export {
292
- k as migrateRecommendation
297
+ v as migrateRecommendation
293
298
  };
@@ -1,18 +1,19 @@
1
- import { useOnboardingStore as d } from "../../../stores/onboarding.js";
2
- import { Block as g, BlockCompositionType as f, ModificationDescription as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
3
- import { SETTINGS_ENUMS as c, DefaultConfigValues as i } from "./enums/settingsEnums.js";
4
- import { getDefaultTemplate as p } from "./template.js";
5
- import { getItemsBlockContainer as u, getItemsBlockConfig as C, getDefaultItemsBlockConfig as I } from "./utils/nodeConfigUtils.js";
6
- const y = "items-block";
7
- class B extends g {
1
+ import { useOnboardingStore as g } from "../../../stores/onboarding.js";
2
+ import { useTemplateStore as f } from "../../../stores/template.js";
3
+ import { Block as u, BlockCompositionType as I, UIElementType as c, UEAttr as C, ModificationDescription as r } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
4
+ import { SETTINGS_ENUMS as l, DefaultConfigValues as s } from "./enums/settingsEnums.js";
5
+ import { getDefaultTemplate as y } from "./template.js";
6
+ import { getItemsBlockContainer as b, getItemsBlockConfig as k, getDefaultItemsBlockConfig as N } from "./utils/nodeConfigUtils.js";
7
+ const m = "items-block";
8
+ class M extends u {
8
9
  getId() {
9
- return y;
10
+ return m;
10
11
  }
11
12
  getIcon() {
12
13
  return "items-icon";
13
14
  }
14
15
  getBlockCompositionType() {
15
- return f.CONTAINER;
16
+ return I.CONTAINER;
16
17
  }
17
18
  getName() {
18
19
  return this.api.translate("Items");
@@ -20,35 +21,54 @@ class B extends g {
20
21
  getDescription() {
21
22
  return this.api.translate("Items lets you display personalized products based on user behavior.");
22
23
  }
24
+ getSettingsPanelTitleHtml() {
25
+ if (f().migrations[m] === 0)
26
+ return "";
27
+ const n = this.api.translate("Items"), o = this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Items block and test your message to ensure it works properly.");
28
+ return `<div>
29
+ <div style="display: flex; align-items: center;">
30
+ <span>${n}</span>
31
+ </div>
32
+ <div class="items-migration-info">
33
+ <${c.ICON}
34
+ ${C.ICON.src}="migration-info-icon"
35
+ class="items-migration-info__icon">
36
+ </${c.ICON}>
37
+ <p class="items-migration-info__text">
38
+ ${o}
39
+ </p>
40
+ </div>
41
+ </div>`;
42
+ }
23
43
  getTemplate() {
24
- return p({
25
- orientation: c.ORIENTATION.VERTICAL,
26
- itemsType: c.ITEMS_TYPE.CART_ITEMS,
44
+ return y({
45
+ orientation: l.ORIENTATION.VERTICAL,
46
+ itemsType: l.ITEMS_TYPE.CART_ITEMS,
27
47
  itemId: "{{Abandoned Cart Item (1) Url}}",
28
- currencySymbol: i.productPriceCurrencySymbolControlValue,
29
- currencyLocation: i.productPriceCurrencyLocationControlValue,
30
- formattedPrice: i.productPriceFormattedControlValue === "1"
48
+ currencySymbol: s.productPriceCurrencySymbolControlValue,
49
+ currencyLocation: s.productPriceCurrencyLocationControlValue,
50
+ formattedPrice: s.productPriceFormattedControlValue === "1"
31
51
  });
32
52
  }
33
53
  allowInnerBlocksDND() {
34
54
  return !1;
35
55
  }
36
- onCreated(n) {
37
- const s = this.api.getDocumentModifier(), r = this.api.getDocumentRootCssNode();
38
- r.querySelector('[product-attr="imageSrc"] img') || s.modifyCss(r).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
39
- const e = u(n);
56
+ onCreated(i) {
57
+ const n = this.api.getDocumentModifier(), o = this.api.getDocumentRootCssNode();
58
+ o.querySelector('[product-attr="imageSrc"] img') || n.modifyCss(o).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
59
+ const e = b(i);
40
60
  if (!e)
41
61
  return;
42
- const a = e.getNodeConfig(), l = a && Object.keys(a).length > 0, t = C(n);
62
+ const a = e.getNodeConfig(), d = a && Object.keys(a).length > 0, t = k(i);
43
63
  if (t != null && t.initialized)
44
- l ? t.blockInstanceId || this.api.getDocumentModifier().modifyHtml(e).setNodeConfig({ ...t, blockInstanceId: String(Date.now()) }).apply(new o("Assign block instance ID to block")) : this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(t).apply(new o("Migrate legacy config to nodeConfig"));
64
+ d ? t.blockInstanceId || this.api.getDocumentModifier().modifyHtml(e).setNodeConfig({ ...t, blockInstanceId: String(Date.now()) }).apply(new r("Assign block instance ID to block")) : this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(t).apply(new r("Migrate legacy config to nodeConfig"));
45
65
  else {
46
- const m = I();
47
- this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(m).apply(new o("Initialize Items block with default configuration")), d().startOnboarding("itemsOnboarding");
66
+ const p = N();
67
+ this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(p).apply(new r("Initialize Items block with default configuration")), g().startOnboarding("itemsOnboarding");
48
68
  }
49
69
  }
50
70
  }
51
71
  export {
52
- y as BLOCK_ID,
53
- B as ItemsBlock
72
+ m as BLOCK_ID,
73
+ M as ItemsBlock
54
74
  };
@@ -1,5 +1,6 @@
1
1
  import { IconsRegistry as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- class i extends o {
2
+ import { MIGRATION_INFO_ICON as r } from "../common-icons.js";
3
+ class s extends o {
3
4
  registerIconsSvg(t) {
4
5
  t["items-icon"] = `
5
6
  <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -19,14 +20,14 @@ class i extends o {
19
20
  </svg>
20
21
  `, t["horizontal-orientation"] = `
21
22
  <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
22
- <path d="M10 19H4C3.44772 19 3 18.5523 3 18V2C3 1.44772 3.44772 1 4 1H10V19Z" stroke="currentColor"
23
+ <path d="M10 19H4C3.44772 19 3 18.5523 3 18V2C3 1.44772 3.44772 1 4 1H10V19Z" stroke="currentColor"
23
24
  stroke-width="2" fill="none"/>
24
- <path d="M17 2V18C17 18.5523 16.5523 19 16 19H10V1H16C16.5523 1 17 1.44772 17 2Z" stroke="currentColor"
25
+ <path d="M17 2V18C17 18.5523 16.5523 19 16 19H10V1H16C16.5523 1 17 1.44772 17 2Z" stroke="currentColor"
25
26
  stroke-width="2" fill="none"/>
26
27
  </svg>
27
- `;
28
+ `, t["migration-info-icon"] = r;
28
29
  }
29
30
  }
30
31
  export {
31
- i as ItemsIconsRegistry
32
+ s as ItemsIconsRegistry
32
33
  };
@@ -17,6 +17,54 @@ const n = `/* Utils */
17
17
  .container:has(.items-controls-container) {
18
18
  padding: 0
19
19
  }
20
+
21
+ /* ─── Migration Info Box ─────────────────────────────────────────────── */
22
+ /* Shown in the settings panel title when a block was migrated from legacy */
23
+
24
+ /* Layout variables for positioning the absolutely-placed info box */
25
+ :host {
26
+ --items-migration-padding: 16px;
27
+ --items-migration-title-height: 61px;
28
+ --items-migration-box-height: 98px;
29
+ }
30
+
31
+ /* Push tabs down when info box is present inside the control panel header */
32
+ .control-panel-header:has(.items-migration-info) {
33
+ position: relative;
34
+ margin-bottom: calc(2 * var(--items-migration-padding) + var(--items-migration-box-height));
35
+ }
36
+
37
+ /* Info box container */
38
+ .items-migration-info {
39
+ display: flex;
40
+ align-items: flex-start;
41
+ gap: 8px;
42
+ padding: 12px;
43
+ background: var(--guido-color-background-onpage-message-info);
44
+ border: 1px solid var(--guido-color-border-onpage-message-info);
45
+ border-radius: 4px;
46
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07);
47
+ position: absolute;
48
+ left: var(--items-migration-padding);
49
+ right: var(--items-migration-padding);
50
+ top: calc(var(--items-migration-padding) + var(--items-migration-title-height));
51
+ }
52
+
53
+ /* Icon — 18x19 icon inside a 24x24 bounding box (matches Figma) */
54
+ .items-migration-info__icon {
55
+ flex-shrink: 0;
56
+ width: 24px;
57
+ height: 24px;
58
+ }
59
+
60
+ /* Text content */
61
+ .items-migration-info__text {
62
+ margin: 4px 0;
63
+ white-space: normal;
64
+ font-size: 13px;
65
+ font-weight: 400;
66
+ line-height: 16px;
67
+ }
20
68
  `;
21
69
  export {
22
70
  n as default
@@ -1,13 +1,14 @@
1
- var p = Object.defineProperty;
2
- var f = (r, o, t) => o in r ? p(r, o, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[o] = t;
3
- var g = (r, o, t) => f(r, typeof o != "symbol" ? o + "" : o, t);
4
- import { Block as h, BlockCompositionType as I, ModificationDescription as _ } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
- import { ensureMobileCssRulesExist as d } from "./controls/mobileLayout/cssRules.js";
1
+ var h = Object.defineProperty;
2
+ var I = (r, o, t) => o in r ? h(r, o, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[o] = t;
3
+ var g = (r, o, t) => I(r, typeof o != "symbol" ? o + "" : o, t);
4
+ import { useTemplateStore as k } from "../../../stores/template.js";
5
+ import { Block as _, BlockCompositionType as B, UIElementType as d, UEAttr as C, ModificationDescription as A } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
+ import { ensureMobileCssRulesExist as u } from "./controls/mobileLayout/cssRules.js";
6
7
  import { RecommendationConfigService as s } from "./services/configService.js";
7
- import { useRecommendationExtensionStore as u } from "./store/recommendation.js";
8
- import { getDefaultTemplate as k } from "./templates/grid/template.js";
9
- const B = "recommendation-block", c = "ins-recommendation-v3-block-v2", a = "recommendation-id";
10
- class y extends h {
8
+ import { useRecommendationExtensionStore as p } from "./store/recommendation.js";
9
+ import { getDefaultTemplate as R } from "./templates/grid/template.js";
10
+ const f = "recommendation-block", c = "ins-recommendation-v3-block-v2", a = "recommendation-id";
11
+ class E extends _ {
11
12
  constructor() {
12
13
  super();
13
14
  /**
@@ -17,13 +18,13 @@ class y extends h {
17
18
  g(this, "_pendingBlockId", null);
18
19
  }
19
20
  getId() {
20
- return B;
21
+ return f;
21
22
  }
22
23
  getIcon() {
23
24
  return "recommendation-icon";
24
25
  }
25
26
  getBlockCompositionType() {
26
- return I.CONTAINER;
27
+ return B.CONTAINER;
27
28
  }
28
29
  getName() {
29
30
  return this.api.translate("Recommendation Block");
@@ -31,6 +32,25 @@ class y extends h {
31
32
  getDescription() {
32
33
  return this.api.translate("Recommendation Block Title Description");
33
34
  }
35
+ getSettingsPanelTitleHtml() {
36
+ if (k().migrations[f] === 0)
37
+ return "";
38
+ const e = this.api.translate("Recommendation Block"), i = this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.");
39
+ return `<div>
40
+ <div style="display: flex; align-items: center;">
41
+ <span>${e}</span>
42
+ </div>
43
+ <div class="recommendation-migration-info">
44
+ <${d.ICON}
45
+ ${C.ICON.src}="migration-info-icon"
46
+ class="recommendation-migration-info__icon">
47
+ </${d.ICON}>
48
+ <p class="recommendation-migration-info__text">
49
+ ${i}
50
+ </p>
51
+ </div>
52
+ </div>`;
53
+ }
34
54
  /**
35
55
  * Returns the template HTML for a new recommendation block.
36
56
  * Generates a unique recommendation ID and embeds the instance class
@@ -40,7 +60,7 @@ class y extends h {
40
60
  */
41
61
  getTemplate() {
42
62
  const t = this._generateNextId();
43
- return this._pendingBlockId = t, k(t);
63
+ return this._pendingBlockId = t, R(t);
44
64
  }
45
65
  /**
46
66
  * Called when a new block is dropped into the template
@@ -52,8 +72,8 @@ class y extends h {
52
72
  onCreated(t) {
53
73
  const e = this._pendingBlockId ?? this._generateNextId();
54
74
  this._pendingBlockId = null, this._assignRecommendationId(t, e);
55
- const n = s.initializeConfig(this.api, t, { recommendationId: e }), i = u();
56
- i.setCurrentBlock(e), d(this.api), i.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 });
75
+ const i = s.initializeConfig(this.api, t, { recommendationId: e }), n = p();
76
+ n.setCurrentBlock(e), u(this.api), n.patchCurrentBlockConfig({ language: i.language }, { triggerRefetch: !1 });
57
77
  }
58
78
  /**
59
79
  * Called when the document changes or template is loaded
@@ -73,7 +93,7 @@ class y extends h {
73
93
  "Assign recommendation ID to legacy block"
74
94
  );
75
95
  }
76
- s.needsMigration(t) && this._migrateFromLegacy(t), d(this.api);
96
+ s.needsMigration(t) && this._migrateFromLegacy(t), u(this.api);
77
97
  }
78
98
  }
79
99
  /**
@@ -84,7 +104,7 @@ class y extends h {
84
104
  */
85
105
  onDelete(t) {
86
106
  const e = this._getRecommendationId(t);
87
- e && u().removeBlockState(e);
107
+ e && p().removeBlockState(e);
88
108
  }
89
109
  /**
90
110
  * Generates the next unique recommendation ID by scanning all existing blocks
@@ -94,9 +114,9 @@ class y extends h {
94
114
  let t = 0;
95
115
  try {
96
116
  const e = this.api.getDocumentRoot();
97
- e && "querySelectorAll" in e && e.querySelectorAll(`.${c}`).forEach((i) => {
98
- if ("getAttribute" in i) {
99
- const m = i.getAttribute(a), l = m ? parseInt(m) : 0;
117
+ e && "querySelectorAll" in e && e.querySelectorAll(`.${c}`).forEach((n) => {
118
+ if ("getAttribute" in n) {
119
+ const m = n.getAttribute(a), l = m ? parseInt(m) : 0;
100
120
  l > t && (t = l);
101
121
  }
102
122
  });
@@ -111,11 +131,11 @@ class y extends h {
111
131
  * added classes via setAttribute.
112
132
  */
113
133
  _assignRecommendationId(t, e) {
114
- const n = this._getBlockElement(t);
115
- if (!n)
134
+ const i = this._getBlockElement(t);
135
+ if (!i)
116
136
  return;
117
- const i = this.api.getDocumentModifier();
118
- i.modifyHtml(n).setAttribute(a, e.toString()), i.apply(new _(`Assign recommendation ID ${e}`));
137
+ const n = this.api.getDocumentModifier();
138
+ n.modifyHtml(i).setAttribute(a, e.toString()), n.apply(new A(`Assign recommendation ID ${e}`));
119
139
  }
120
140
  /**
121
141
  * Gets the recommendation-id from a block node
@@ -124,11 +144,11 @@ class y extends h {
124
144
  const e = this._getBlockElement(t);
125
145
  if (!e || !("getAttribute" in e))
126
146
  return null;
127
- const n = e.getAttribute(a);
128
- if (!n)
147
+ const i = e.getAttribute(a);
148
+ if (!i)
129
149
  return null;
130
- const i = parseInt(n);
131
- return Number.isNaN(i) ? null : i;
150
+ const n = parseInt(i);
151
+ return Number.isNaN(n) ? null : n;
132
152
  }
133
153
  /**
134
154
  * Gets the block element (the element with BLOCK_CLASS)
@@ -149,6 +169,6 @@ class y extends h {
149
169
  }
150
170
  }
151
171
  export {
152
- B as BLOCK_ID,
153
- y as RecommendationBlock
172
+ f as BLOCK_ID,
173
+ E as RecommendationBlock
154
174
  };
@@ -1,5 +1,6 @@
1
1
  import { IconsRegistry as r } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- class o extends r {
2
+ import { MIGRATION_INFO_ICON as t } from "../common-icons.js";
3
+ class h extends r {
3
4
  registerIconsSvg(C) {
4
5
  C["recommendation-icon"] = `
5
6
  <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
@@ -59,9 +60,9 @@ class o extends r {
59
60
  <circle cx="3" cy="16" r="1" stroke="currentColor" stroke-width="1"/>
60
61
  <rect x="7" y="15" width="11" height="2" rx="1"/>
61
62
  </svg>
62
- `;
63
+ `, C["migration-info-icon"] = t;
63
64
  }
64
65
  }
65
66
  export {
66
- o as RecommendationIconsRegistry
67
+ h as RecommendationIconsRegistry
67
68
  };
@@ -22,6 +22,54 @@ const n = `/* Utils */
22
22
  ue-orderable.orderable-disabled .droppable-icon {
23
23
  display: none;
24
24
  }
25
+
26
+ /* ─── Migration Info Box ─────────────────────────────────────────────── */
27
+ /* Shown in the settings panel title when a block was migrated from legacy */
28
+
29
+ /* Layout variables for positioning the absolutely-placed info box */
30
+ :host {
31
+ --rec-migration-padding: 16px;
32
+ --rec-migration-title-height: 61px;
33
+ --rec-migration-box-height: 98px;
34
+ }
35
+
36
+ /* Push tabs down when info box is present inside the control panel header */
37
+ .control-panel-header:has(.recommendation-migration-info) {
38
+ position: relative;
39
+ margin-bottom: calc(2 * var(--rec-migration-padding) + var(--rec-migration-box-height));
40
+ }
41
+
42
+ /* Info box container */
43
+ .recommendation-migration-info {
44
+ display: flex;
45
+ align-items: flex-start;
46
+ gap: 8px;
47
+ padding: 12px;
48
+ background: var(--guido-color-background-onpage-message-info);
49
+ border: 1px solid var(--guido-color-border-onpage-message-info);
50
+ border-radius: 4px;
51
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07);
52
+ position: absolute;
53
+ left: var(--rec-migration-padding);
54
+ right: var(--rec-migration-padding);
55
+ top: calc(var(--rec-migration-padding) + var(--rec-migration-title-height));
56
+ }
57
+
58
+ /* Icon — 18x19 icon inside a 24x24 bounding box (matches Figma) */
59
+ .recommendation-migration-info__icon {
60
+ flex-shrink: 0;
61
+ width: 24px;
62
+ height: 24px;
63
+ }
64
+
65
+ /* Text content */
66
+ .recommendation-migration-info__text {
67
+ margin: 4px 0;
68
+ white-space: normal;
69
+ font-size: 13px;
70
+ font-weight: 400;
71
+ line-height: 16px;
72
+ }
25
73
  `;
26
74
  export {
27
75
  n as default