@useinsider/guido 3.10.1-beta.e36dd40 → 3.11.0-beta.04af241

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 (50) hide show
  1. package/dist/components/organisms/header/EditorActions.vue.js +1 -1
  2. package/dist/components/organisms/header/HeaderWrapper.vue.js +3 -3
  3. package/dist/components/organisms/header/HeaderWrapper.vue2.js +2 -0
  4. package/dist/components/organisms/header/version-history/VersionHistory.vue.js +1 -1
  5. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +5 -5
  6. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +2 -2
  7. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +3 -3
  8. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +9 -9
  9. package/dist/composables/useCortexBlueprintBridge.js +7 -7
  10. package/dist/composables/useCustomInterfaceAppearance.js +16 -18
  11. package/dist/composables/useEmailTemplateApplier.js +9 -9
  12. package/dist/composables/useExport.js +18 -18
  13. package/dist/composables/useHtmlValidator.js +90 -90
  14. package/dist/composables/useStripo.js +53 -51
  15. package/dist/composables/useStripoNotifications.js +26 -0
  16. package/dist/composables/useToaster.js +11 -11
  17. package/dist/composables/useVersionHistoryApi.js +2 -2
  18. package/dist/composables/validators/useLiquidValidator.js +1 -1
  19. package/dist/composables/validators/useUnsubscribeBlockValidator.js +10 -10
  20. package/dist/config/compiler/recommendationCompilerRules.js +55 -38
  21. package/dist/config/compiler/utils/recommendationCompilerUtils.js +88 -77
  22. package/dist/config/i18n/en/labels.json.js +4 -1
  23. package/dist/enums/toaster.js +2 -2
  24. package/dist/enums/unsubscribe.js +41 -36
  25. package/dist/extensions/Blocks/Checkbox/block.js +5 -3
  26. package/dist/extensions/Blocks/Checkbox/control.js +42 -28
  27. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +43 -41
  28. package/dist/extensions/Blocks/RadioButton/block.js +9 -7
  29. package/dist/extensions/Blocks/RadioButton/control.js +64 -50
  30. package/dist/extensions/Blocks/Recommendation/useRecommendationBlockWarning.js +7 -7
  31. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +2 -0
  32. package/dist/guido.css +1 -1
  33. package/dist/package.json.js +1 -1
  34. package/dist/services/blankTemplate.js +1 -1
  35. package/dist/services/templateLibraryApi.js +8 -7
  36. package/dist/src/composables/useStripoNotifications.d.ts +10 -0
  37. package/dist/src/enums/toaster.d.ts +2 -2
  38. package/dist/src/enums/unsubscribe.d.ts +2 -0
  39. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +1 -0
  40. package/dist/src/stores/toaster.d.ts +2 -3
  41. package/dist/src/utils/environmentUtil.d.ts +5 -2
  42. package/dist/static/styles/components/dropdown-menu.css.js +12 -0
  43. package/dist/static/styles/components/wide-panel.css.js +7 -0
  44. package/dist/stores/toaster.js +10 -10
  45. package/dist/utils/environmentUtil.js +3 -2
  46. package/dist/utils/templatePreparation.js +20 -16
  47. package/package.json +12 -3
  48. package/dist/src/composables/useHtmlValidator.test.d.ts +0 -1
  49. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.test.d.ts +0 -1
  50. package/dist/static/styles/components/notification.css.js +0 -74
@@ -1,16 +1,16 @@
1
- var E = Object.defineProperty;
2
- var d = (i, n, e) => n in i ? E(i, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[n] = e;
3
- var o = (i, n, e) => d(i, typeof n != "symbol" ? n + "" : n, e);
4
- import { useHttp as l } from "../../../composables/useHttp.js";
5
- import { getDefaultUnsubscribeGroup as L, DEFAULT_UNSUBSCRIBE_GROUP_SEND_GRID_ID as h } from "../../../enums/unsubscribe.js";
6
- import { Control as p, UIElementType as r, UEAttr as t, ModificationDescription as m } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
- const b = "ui-elements-checkbox", u = "select", { get: C } = l();
8
- class I extends p {
1
+ var p = Object.defineProperty;
2
+ var L = (i, n, e) => n in i ? p(i, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[n] = e;
3
+ var a = (i, n, e) => L(i, typeof n != "symbol" ? n + "" : n, e);
4
+ import { useHttp as h } from "../../../composables/useHttp.js";
5
+ import { getDefaultUnsubscribeGroup as T, PIXEL_TRACKING_SEND_GRID_ID as C, UNSUBSCRIBE_SENTINEL_SEND_GRID_IDS as I } from "../../../enums/unsubscribe.js";
6
+ import { Control as m, UIElementType as r, UEAttr as t, ModificationDescription as S } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
+ const b = "ui-elements-checkbox", E = "select", { get: _ } = h();
8
+ class G extends m {
9
9
  constructor() {
10
10
  super(...arguments);
11
- o(this, "currentNode");
12
- o(this, "selectedUnsubGroup");
13
- o(this, "unsubList", []);
11
+ a(this, "currentNode");
12
+ a(this, "selectedUnsubGroup");
13
+ a(this, "unsubList", []);
14
14
  }
15
15
  getId() {
16
16
  return b;
@@ -19,12 +19,12 @@ class I extends p {
19
19
  if (this.selectedUnsubGroup = "", this.currentNode && "getAttribute" in this.currentNode) {
20
20
  const e = this.currentNode.getAttribute("id");
21
21
  if (e) {
22
- const s = e === h ? e : Number(e);
22
+ const s = I.includes(e) ? e : Number(e);
23
23
  s && (this.selectedUnsubGroup = s);
24
24
  }
25
25
  }
26
26
  this.api.updateValues({
27
- [u]: this.selectedUnsubGroup
27
+ [E]: this.selectedUnsubGroup
28
28
  });
29
29
  }
30
30
  _getLabel(e, s = `${Math.random()}`) {
@@ -46,17 +46,19 @@ class I extends p {
46
46
  return this.unsubList.map((e) => this._getSelectItem(e.name, e.sendGridId)).join("");
47
47
  }
48
48
  getTemplate() {
49
+ const e = this.api.translate("Unsubscribe & Preference Center Type"), s = this.api.translate("Select Unsubscribe and Preference Type");
49
50
  return `
50
51
  <div class="checkbox-controls-container">
51
- <div class="checkbox-select-container container two-columns stretch">
52
+ <div class="checkbox-select-container container one-column stretch">
52
53
  <${r.LABEL}
53
- ${t.LABEL.text}="${this.api.translate("Unsubscribe Group")}"
54
+ ${t.LABEL.text}="${e}"
54
55
  ${t.LABEL.name}="${Math.random()}">
55
56
  </${r.LABEL}>
56
57
 
57
58
  <${r.SELECTPICKER}
58
- ${t.SELECTPICKER.name}="${u}"
59
- ${t.SELECTPICKER.placeholder}="${this.api.translate("Select Unsubscribe Group")}">
59
+ ${t.SELECTPICKER.name}="${E}"
60
+ ${t.SELECTPICKER.searchable}="true"
61
+ ${t.SELECTPICKER.placeholder}="${s}">
60
62
  ${this._getSelect()}
61
63
  </${r.SELECTPICKER}>
62
64
  </div>
@@ -64,30 +66,42 @@ class I extends p {
64
66
  `;
65
67
  }
66
68
  _onSelectChange(e) {
67
- this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute("id", e.toString()).apply(new m(`Updated text to ${e}`));
69
+ this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute("id", e.toString()).apply(new S(`Updated text to ${e}`));
68
70
  }
69
71
  _listenToFormUpdates() {
70
- this.api.onValueChanged(u, (e) => this._onSelectChange(e));
72
+ this.api.onValueChanged(E, (e) => this._onSelectChange(e));
71
73
  }
72
74
  onTemplateNodeUpdated(e) {
73
75
  this.currentNode = e, this._setFormValues();
74
76
  }
75
77
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
76
78
  async onRender() {
77
- const e = await C(
79
+ const e = await _(
78
80
  "/unsubscribe-groups/unsubscribe-list"
79
- ), s = [L(), ...e.data], c = s.map((a) => ({
80
- [t.SELECT_ITEM.text]: a.name,
81
- [t.SELECT_ITEM.value]: a.sendGridId
82
- }));
83
- this.unsubList = s, this.api.setUIEAttribute(
84
- u,
81
+ ), s = {
82
+ name: this.api.translate("Pixel Tracking Opt-in"),
83
+ sendGridId: C
84
+ }, c = [T(), ...e.data], u = (o) => ({
85
+ [t.SELECT_ITEM.text]: o.name,
86
+ [t.SELECT_ITEM.value]: o.sendGridId
87
+ }), l = (o) => ({
88
+ [t.SELECT_ITEM.text]: o,
89
+ [t.SELECT_ITEM.value]: `header:${o}`,
90
+ [t.SELECT_ITEM.disabled]: !0
91
+ }), d = [
92
+ l(this.api.translate("OPT-IN SELECTION")),
93
+ u(s),
94
+ l(this.api.translate("UNSUBSCRIBE GROUPS")),
95
+ ...c.map(u)
96
+ ];
97
+ this.unsubList = [s, ...c], this.api.setUIEAttribute(
98
+ E,
85
99
  t.SELECTPICKER.items,
86
- c
100
+ d
87
101
  ), this._setFormValues(), this._listenToFormUpdates();
88
102
  }
89
103
  }
90
104
  export {
91
105
  b as CHECKBOX_CONTROL_BLOCK_ID,
92
- I as CheckboxControl
106
+ G as CheckboxControl
93
107
  };
@@ -1,14 +1,14 @@
1
- import { ModificationDescription as L, UIElementType as P, UEAttr as D } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { CommonControl as h } from "../../../common-control.js";
3
- import { ItemsBlockControlId as R, ItemsBlockId as _ } from "../../enums/controlEnums.js";
4
- import { productPairs as I } from "../../enums/productEnums.js";
5
- import { getItemsBlockConfig as d, setItemsBlockConfig as u, escapeReplacement as O } from "../../utils/nodeConfigUtils.js";
6
- const g = R.PRICE_FORMATTED_PRICE, s = {
1
+ import { ModificationDescription as C, UIElementType as _, UEAttr as L } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as D } from "../../../common-control.js";
3
+ import { ItemsBlockControlId as R, ItemsBlockId as I } from "../../enums/controlEnums.js";
4
+ import { productPairs as p } from "../../enums/productEnums.js";
5
+ import { getItemsBlockConfig as l, setItemsBlockConfig as h, escapeReplacement as g } from "../../utils/nodeConfigUtils.js";
6
+ const O = R.PRICE_FORMATTED_PRICE, a = {
7
7
  FORMATTED_PRICE: "formattedPrice"
8
8
  };
9
- class k extends h {
9
+ class k extends D {
10
10
  getId() {
11
- return g;
11
+ return O;
12
12
  }
13
13
  getTemplate() {
14
14
  return `
@@ -18,56 +18,58 @@ class k extends h {
18
18
  `;
19
19
  }
20
20
  onRender() {
21
- const t = d(this.currentNode);
22
- this.api.updateValues({ [s.FORMATTED_PRICE]: (t == null ? void 0 : t.priceFormatted) ?? !0 }), this.api.onValueChanged(s.FORMATTED_PRICE, (e) => {
23
- this._onFormattedPriceChange(e);
21
+ const e = l(this.currentNode);
22
+ this.api.updateValues({ [a.FORMATTED_PRICE]: (e == null ? void 0 : e.priceFormatted) ?? !0 }), this.api.onValueChanged(a.FORMATTED_PRICE, (t) => {
23
+ this._onFormattedPriceChange(t);
24
24
  });
25
25
  }
26
- onTemplateNodeUpdated(t) {
27
- super.onTemplateNodeUpdated(t), this.handleBlockInstanceChange(() => {
28
- const e = d(this.currentNode);
29
- this.api.updateValues({ [s.FORMATTED_PRICE]: (e == null ? void 0 : e.priceFormatted) ?? !0 });
26
+ onTemplateNodeUpdated(e) {
27
+ super.onTemplateNodeUpdated(e), this.handleBlockInstanceChange(() => {
28
+ const t = l(this.currentNode);
29
+ this.api.updateValues({ [a.FORMATTED_PRICE]: (t == null ? void 0 : t.priceFormatted) ?? !0 });
30
30
  });
31
31
  }
32
- _onFormattedPriceChange(t) {
33
- if (console.debug("Formatted price changed to: ", t), u(this.currentNode, this.api, { priceFormatted: t }), !this.currentNode)
32
+ _onFormattedPriceChange(e) {
33
+ if (console.debug("Formatted price changed to: ", e), !this.currentNode)
34
34
  return;
35
- const e = d(this.currentNode), n = (e == null ? void 0 : e.type) ?? "CART_ITEMS", i = (e == null ? void 0 : e.priceSinglePrice) ?? !1, r = I.PAIRS_FOR_EXTENSION.price[n], c = I.PAIRS_FOR_EXTENSION.originalPrice[n], [p, m] = t ? [
36
- i ? r.DEFAULT_SINGLE_PRICE : r.DEFAULT_PRICE,
37
- i ? r.DEFAULT_SINGLE_PRICE_FORMATTED : r.DEFAULT_PRICE_FORMATTED
35
+ const t = l(this.currentNode), n = (t == null ? void 0 : t.type) ?? "CART_ITEMS", o = (t == null ? void 0 : t.priceSinglePrice) ?? !1, r = p.PAIRS_FOR_EXTENSION.price[n], i = p.PAIRS_FOR_EXTENSION.originalPrice[n], [E, m] = e ? [
36
+ o ? r.DEFAULT_SINGLE_PRICE : r.DEFAULT_PRICE,
37
+ o ? r.DEFAULT_SINGLE_PRICE_FORMATTED : r.DEFAULT_PRICE_FORMATTED
38
38
  ] : [
39
- i ? r.DEFAULT_SINGLE_PRICE_FORMATTED : r.DEFAULT_PRICE_FORMATTED,
40
- i ? r.DEFAULT_SINGLE_PRICE : r.DEFAULT_PRICE
41
- ], l = i ? c.DEFAULT_SINGLE_PRICE : c.DEFAULT_PRICE, T = i ? c.DEFAULT_SINGLE_PRICE_FORMATTED : c.DEFAULT_PRICE_FORMATTED, [F, A] = t ? [l, T] : [T, l], o = this.currentNode.closest(".items-block"), C = (o == null ? void 0 : o.querySelectorAll(
42
- `[esd-extension-block-id="${_.PRICE}"]`
43
- )) || [], E = this.api.getDocumentModifier();
44
- C.forEach((a) => {
45
- this._updatePriceBlock(E, a, p, m);
46
- }), ((o == null ? void 0 : o.querySelectorAll(
47
- `[esd-extension-block-id="${_.ORIGINAL_PRICE}"]`
48
- )) || []).forEach((a) => {
49
- this._updatePriceBlock(E, a, F, A);
50
- }), E.apply(new L(
51
- `Updated price to ${t ? "formatted" : "unformatted"}`
39
+ o ? r.DEFAULT_SINGLE_PRICE_FORMATTED : r.DEFAULT_PRICE_FORMATTED,
40
+ o ? r.DEFAULT_SINGLE_PRICE : r.DEFAULT_PRICE
41
+ ], T = o ? i.DEFAULT_SINGLE_PRICE : i.DEFAULT_PRICE, P = o ? i.DEFAULT_SINGLE_PRICE_FORMATTED : i.DEFAULT_PRICE_FORMATTED, [F, A] = e ? [T, P] : [P, T], s = this.api.getDocumentModifier();
42
+ h(this.currentNode, this.api, { priceFormatted: e }, s);
43
+ const c = this.currentNode.closest(".items-block");
44
+ ((c == null ? void 0 : c.querySelectorAll(
45
+ `[esd-extension-block-id="${I.PRICE}"]`
46
+ )) || []).forEach((d) => {
47
+ this._updatePriceBlock(s, d, E, m, e);
48
+ }), ((c == null ? void 0 : c.querySelectorAll(
49
+ `[esd-extension-block-id="${I.ORIGINAL_PRICE}"]`
50
+ )) || []).forEach((d) => {
51
+ this._updatePriceBlock(s, d, F, A, e);
52
+ }), s.apply(new C(
53
+ `Updated price to ${e ? "formatted" : "unformatted"}`
52
54
  ));
53
55
  }
54
- _updatePriceBlock(t, e, n, i) {
55
- const r = e.getInnerHTML().trim().replace(n, O(i));
56
- t.modifyHtml(e).setInnerHtml(r);
56
+ _updatePriceBlock(e, t, n, o, r) {
57
+ const i = `data-formated="${r ? "true" : "false"}"`, E = t.getInnerHTML().trim().replace(n, g(o)).replace(/data-formated=(?:"[^"]*"|'[^']*')/g, i);
58
+ e.modifyHtml(t).setInnerHtml(E);
57
59
  }
58
60
  _getFormattedPrice() {
59
61
  return `
60
62
  <div class="display-flex align-items-center justify-content-between">
61
- <${P.LABEL}
62
- ${D.LABEL.text}="${this.api.translate("Formatted Price (e.g. $9.90)")}"
63
+ <${_.LABEL}
64
+ ${L.LABEL.text}="${this.api.translate("Formatted Price (e.g. $9.90)")}"
63
65
  >
64
- </${P.LABEL}>
65
- ${this._GuToggle(s.FORMATTED_PRICE)}
66
+ </${_.LABEL}>
67
+ ${this._GuToggle(a.FORMATTED_PRICE)}
66
68
  </div>
67
69
  `;
68
70
  }
69
71
  }
70
72
  export {
71
- g as CONTROL_BLOCK_ID,
73
+ O as CONTROL_BLOCK_ID,
72
74
  k as PriceFormattedPriceControl
73
75
  };
@@ -1,7 +1,7 @@
1
- import { Block as t, BlockCompositionType as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { getDefaultTemplate as e } from "./template.js";
1
+ import { Block as t, BlockCompositionType as e } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { getDefaultTemplate as o } from "./template.js";
3
3
  const r = "radio-button-block";
4
- class l extends t {
4
+ class i extends t {
5
5
  constructor() {
6
6
  super();
7
7
  }
@@ -12,16 +12,18 @@ class l extends t {
12
12
  return "radio-button-icon";
13
13
  }
14
14
  getBlockCompositionType() {
15
- return o.CONTAINER;
15
+ return e.CONTAINER;
16
16
  }
17
17
  getName() {
18
18
  return this.api.translate("Radio Button Block");
19
19
  }
20
20
  getDescription() {
21
- return this.api.translate("Radio Button Block Description");
21
+ return this.api.translate(
22
+ "Radio button lets you select Unsubscribe and Preference Type for users to manage their opt-in or opt-out preferences."
23
+ );
22
24
  }
23
25
  getTemplate() {
24
- return e();
26
+ return o();
25
27
  }
26
28
  allowInnerBlocksDND() {
27
29
  return !1;
@@ -29,5 +31,5 @@ class l extends t {
29
31
  }
30
32
  export {
31
33
  r as BLOCK_ID,
32
- l as RadioButtonCustomBlock
34
+ i as RadioButtonCustomBlock
33
35
  };
@@ -1,93 +1,107 @@
1
- var E = Object.defineProperty;
2
- var d = (r, n, t) => n in r ? E(r, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[n] = t;
3
- var o = (r, n, t) => d(r, typeof n != "symbol" ? n + "" : n, t);
4
- import { useHttp as l } from "../../../composables/useHttp.js";
5
- import { getDefaultUnsubscribeGroup as L, DEFAULT_UNSUBSCRIBE_GROUP_SEND_GRID_ID as p } from "../../../enums/unsubscribe.js";
6
- import { Control as h, UIElementType as i, UEAttr as e, ModificationDescription as m } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
- const b = "ui-elements-radio-button", u = "select", { get: $ } = l();
8
- class I extends h {
1
+ var p = Object.defineProperty;
2
+ var L = (i, n, e) => n in i ? p(i, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[n] = e;
3
+ var a = (i, n, e) => L(i, typeof n != "symbol" ? n + "" : n, e);
4
+ import { useHttp as T } from "../../../composables/useHttp.js";
5
+ import { getDefaultUnsubscribeGroup as h, PIXEL_TRACKING_SEND_GRID_ID as I, UNSUBSCRIBE_SENTINEL_SEND_GRID_IDS as m } from "../../../enums/unsubscribe.js";
6
+ import { Control as C, UIElementType as r, UEAttr as t, ModificationDescription as S } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
+ const b = "ui-elements-radio-button", E = "select", { get: _ } = T();
8
+ class G extends C {
9
9
  constructor() {
10
10
  super(...arguments);
11
- o(this, "currentNode");
12
- o(this, "selectedUnsubGroup");
13
- o(this, "unsubList", []);
11
+ a(this, "currentNode");
12
+ a(this, "selectedUnsubGroup");
13
+ a(this, "unsubList", []);
14
14
  }
15
15
  getId() {
16
16
  return b;
17
17
  }
18
18
  _setFormValues() {
19
19
  if (this.selectedUnsubGroup = "", this.currentNode && "getAttribute" in this.currentNode) {
20
- const t = this.currentNode.getAttribute("id");
21
- if (t) {
22
- const s = t === p ? t : Number(t);
20
+ const e = this.currentNode.getAttribute("id");
21
+ if (e) {
22
+ const s = m.includes(e) ? e : Number(e);
23
23
  s && (this.selectedUnsubGroup = s);
24
24
  }
25
25
  }
26
26
  this.api.updateValues({
27
- [u]: this.selectedUnsubGroup
27
+ [E]: this.selectedUnsubGroup
28
28
  });
29
29
  }
30
- _getLabel(t, s = `${Math.random()}`) {
30
+ _getLabel(e, s = `${Math.random()}`) {
31
31
  return `
32
- <${i.LABEL}
33
- ${e.LABEL.text}="${t}"
34
- ${e.LABEL.name}="${s}">
35
- </${i.LABEL}>
32
+ <${r.LABEL}
33
+ ${t.LABEL.text}="${e}"
34
+ ${t.LABEL.name}="${s}">
35
+ </${r.LABEL}>
36
36
  `;
37
37
  }
38
- _getSelectItem(t, s) {
38
+ _getSelectItem(e, s) {
39
39
  return `
40
- <${i.SELECT_ITEM}
41
- ${e.SELECT_ITEM.text}="${t}"
42
- ${e.SELECT_ITEM.value}="${s}">
43
- </${i.SELECT_ITEM}>`;
40
+ <${r.SELECT_ITEM}
41
+ ${t.SELECT_ITEM.text}="${e}"
42
+ ${t.SELECT_ITEM.value}="${s}">
43
+ </${r.SELECT_ITEM}>`;
44
44
  }
45
45
  _getSelect() {
46
- return this.unsubList.map((t) => this._getSelectItem(t.name, t.sendGridId)).join("");
46
+ return this.unsubList.map((e) => this._getSelectItem(e.name, e.sendGridId)).join("");
47
47
  }
48
48
  getTemplate() {
49
+ const e = this.api.translate("Unsubscribe & Preference Center Type"), s = this.api.translate("Select Unsubscribe and Preference Type");
49
50
  return `
50
51
  <div class="checkbox-controls-container">
51
- <div class="checkbox-select-container container two-columns stretch">
52
- <${i.LABEL}
53
- ${e.LABEL.text}="${this.api.translate("Unsubscribe Group")}"
54
- ${e.LABEL.name}="${Math.random()}">
55
- </${i.LABEL}>
52
+ <div class="checkbox-select-container container one-column stretch">
53
+ <${r.LABEL}
54
+ ${t.LABEL.text}="${e}"
55
+ ${t.LABEL.name}="${Math.random()}">
56
+ </${r.LABEL}>
56
57
 
57
- <${i.SELECTPICKER}
58
- ${e.SELECTPICKER.name}="${u}"
59
- ${e.SELECTPICKER.placeholder}="${this.api.translate("Select Unsubscribe Group")}">
58
+ <${r.SELECTPICKER}
59
+ ${t.SELECTPICKER.name}="${E}"
60
+ ${t.SELECTPICKER.searchable}="true"
61
+ ${t.SELECTPICKER.placeholder}="${s}">
60
62
  ${this._getSelect()}
61
- </${i.SELECTPICKER}>
63
+ </${r.SELECTPICKER}>
62
64
  </div>
63
65
  </div>
64
66
  `;
65
67
  }
66
- _onSelectChange(t) {
67
- this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute("id", t.toString()).apply(new m(`Updated text to ${t}`));
68
+ _onSelectChange(e) {
69
+ this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute("id", e.toString()).apply(new S(`Updated text to ${e}`));
68
70
  }
69
71
  _listenToFormUpdates() {
70
- this.api.onValueChanged(u, (t) => this._onSelectChange(t));
72
+ this.api.onValueChanged(E, (e) => this._onSelectChange(e));
71
73
  }
72
- onTemplateNodeUpdated(t) {
73
- this.currentNode = t, this._setFormValues();
74
+ onTemplateNodeUpdated(e) {
75
+ this.currentNode = e, this._setFormValues();
74
76
  }
75
77
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
76
78
  async onRender() {
77
- const t = await $(
79
+ const e = await _(
78
80
  "/unsubscribe-groups/unsubscribe-list"
79
- ), s = [L(), ...t.data], c = s.map((a) => ({
80
- [e.SELECT_ITEM.text]: a.name,
81
- [e.SELECT_ITEM.value]: a.sendGridId
82
- }));
83
- this.unsubList = s, this.api.setUIEAttribute(
84
- u,
85
- e.SELECTPICKER.items,
86
- c
81
+ ), s = {
82
+ name: this.api.translate("Pixel Tracking Opt-in"),
83
+ sendGridId: I
84
+ }, u = [h(), ...e.data], c = (o) => ({
85
+ [t.SELECT_ITEM.text]: o.name,
86
+ [t.SELECT_ITEM.value]: o.sendGridId
87
+ }), d = (o) => ({
88
+ [t.SELECT_ITEM.text]: o,
89
+ [t.SELECT_ITEM.value]: `header:${o}`,
90
+ [t.SELECT_ITEM.disabled]: !0
91
+ }), l = [
92
+ d(this.api.translate("OPT-IN SELECTION")),
93
+ c(s),
94
+ d(this.api.translate("UNSUBSCRIBE GROUPS")),
95
+ ...u.map(c)
96
+ ];
97
+ this.unsubList = [s, ...u], this.api.setUIEAttribute(
98
+ E,
99
+ t.SELECTPICKER.items,
100
+ l
87
101
  ), this._setFormValues(), this._listenToFormUpdates();
88
102
  }
89
103
  }
90
104
  export {
91
105
  b as CONTROL_BLOCK_ID,
92
- I as RadioButtonControl
106
+ G as RadioButtonControl
93
107
  };
@@ -1,16 +1,16 @@
1
- import { useToaster as r } from "../../../composables/useToaster.js";
1
+ import { useToaster as n } from "../../../composables/useToaster.js";
2
2
  import { useTranslations as s } from "../../../composables/useTranslations.js";
3
- import { ToasterTypeOptions as n } from "../../../enums/toaster.js";
3
+ import { ToasterTypeOptions as r } from "../../../enums/toaster.js";
4
4
  import { countLiveRecommendationBlocks as i } from "./utils/recommendationBlockCount.js";
5
- const a = "newsletter.multiple-reco-blocks-warning", f = () => {
6
- const { showToaster: o } = r(), t = s();
5
+ const c = "newsletter.multiple-reco-blocks-warning", u = () => {
6
+ const { showToaster: o } = n(), t = s();
7
7
  return { warnIfMultipleBlocks: (e) => {
8
8
  i(e) > 1 && o({
9
- type: n.Dark,
10
- message: t(a)
9
+ type: r.Info,
10
+ message: t(c)
11
11
  });
12
12
  } };
13
13
  };
14
14
  export {
15
- f as useRecommendationBlockWarning
15
+ u as useRecommendationBlockWarning
16
16
  };
@@ -12,6 +12,8 @@ function r(e) {
12
12
  return "mostValuableOfPartner";
13
13
  case "topSellers":
14
14
  return "mostPurchased";
15
+ case "mostViewed":
16
+ return "mostPopular";
15
17
  default:
16
18
  return e;
17
19
  }
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .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-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__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-82128f7d]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-669fe7cf]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-669fe7cf]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-669fe7cf]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-669fe7cf]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-669fe7cf]{object-fit:cover;transform:scale(1)}[data-v-7a305bb2] .guido__verion-history-view-option-selection-desktop svg,[data-v-7a305bb2] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-7a305bb2] .in-segments-wrapper__button_selected,[data-v-7a305bb2] .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-06afaecb]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-06afaecb]{min-height:504px}.iframe-wrapper[data-v-cbafc185]{width:258px}.iframe-scaled[data-v-cbafc185]{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-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}
1
+ .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .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-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__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-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__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-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{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-06afaecb]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-06afaecb]{min-height:504px}.iframe-wrapper[data-v-cbafc185]{width:258px}.iframe-scaled[data-v-cbafc185]{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-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}
@@ -1,4 +1,4 @@
1
- const o = { stripo: { version: "2.68.0" } }, s = {
1
+ const o = { stripo: { version: "2.69.1" } }, s = {
2
2
  guido: o
3
3
  };
4
4
  export {
@@ -26,7 +26,7 @@ const u = (e) => new Promise((t) => {
26
26
  } catch (o) {
27
27
  console.error(`Failed to fetch blank template (attempt ${r}/${a}):`, o), r < a && await u(r * f);
28
28
  }
29
- return e({ type: p.Alert, message: t("errors-pages.undefined-response") }), { html: "", css: "" };
29
+ return e({ type: p.Error, message: t("errors-pages.undefined-response") }), { html: "", css: "" };
30
30
  } };
31
31
  };
32
32
  export {
@@ -4,11 +4,12 @@ import { useToaster as C } from "../composables/useToaster.js";
4
4
  import { useTranslations as h } from "../composables/useTranslations.js";
5
5
  import { useLiquidValidator as S } from "../composables/validators/useLiquidValidator.js";
6
6
  import { EditorType as v } from "../enums/defaults.js";
7
- import { useRecommendationExtensionStore as N } from "../extensions/Blocks/Recommendation/store/recommendation.js";
8
- import { useSaveAsTemplateStore as x } from "../stores/save-as-template.js";
7
+ import { ToasterTypeOptions as N } from "../enums/toaster.js";
8
+ import { useRecommendationExtensionStore as x } from "../extensions/Blocks/Recommendation/store/recommendation.js";
9
+ import { useSaveAsTemplateStore as E } from "../stores/save-as-template.js";
9
10
  import { base64EncodeWithSpecialChars as r } from "../utils/base64.js";
10
11
  import { useTemplatePreparation as A } from "../utils/templatePreparation.js";
11
- const $ = () => {
12
+ const j = () => {
12
13
  const { get: n, post: m } = b(), { handleError: o, showToaster: l } = C(), { config: c, isFeatureEnabled: p } = w(), { validateLiquidSyntax: g } = S(), u = h();
13
14
  return {
14
15
  getCategories: async () => {
@@ -39,7 +40,7 @@ const $ = () => {
39
40
  createTemplate: async () => {
40
41
  var e, t, d, y;
41
42
  try {
42
- const { prepareTemplateDetails: i } = A(), s = x(), a = await i();
43
+ const { prepareTemplateDetails: i } = A(), s = E(), a = await i();
43
44
  if (p("liquidSyntax") && !await g(a.compiledHtml))
44
45
  return !1;
45
46
  const f = {
@@ -53,7 +54,7 @@ const $ = () => {
53
54
  unsubscriptionPreferencePageStatus: !1,
54
55
  unsubscriptionPreferencePages: [],
55
56
  recommendationCampaignUrls: r(
56
- N().recommendationCampaignUrls
57
+ x().recommendationCampaignUrls
57
58
  ),
58
59
  recommendationConfigs: r({}),
59
60
  isGuido: !0,
@@ -74,7 +75,7 @@ const $ = () => {
74
75
  "newsletter.template-library-save-alert",
75
76
  { templateName: s.getTemplateName }
76
77
  ),
77
- type: "alert"
78
+ type: N.Error
78
79
  }), !1) : (l({
79
80
  message: u(
80
81
  "newsletter.template-library-save-success",
@@ -89,5 +90,5 @@ const $ = () => {
89
90
  };
90
91
  };
91
92
  export {
92
- $ as useTemplateLibraryApi
93
+ j as useTemplateLibraryApi
93
94
  };
@@ -0,0 +1,10 @@
1
+ import type { StripoNotifications } from '@@/Types/stripo';
2
+ /**
3
+ * Adapter that routes Stripo's in-editor notifications through Guido's own
4
+ * InToasts-based toaster, so the editor only ever shows one toaster style.
5
+ * Passed to `initEditor` as the `notifications` config (Stripo then delegates
6
+ * rendering to us instead of drawing its native <ue-notifications-container>).
7
+ */
8
+ export declare const useStripoNotifications: () => {
9
+ getStripoNotifications: () => StripoNotifications;
10
+ };
@@ -1,6 +1,6 @@
1
1
  export declare enum ToasterTypeOptions {
2
2
  Success = "success",
3
3
  Warning = "warning",
4
- Alert = "alert",
5
- Dark = "dark"
4
+ Error = "error",
5
+ Info = "information"
6
6
  }
@@ -19,6 +19,8 @@ export declare const PRODUCT_TYPE_URL_SEGMENTS: {
19
19
  };
20
20
  export declare const INSIDER_ID = "iid";
21
21
  export declare const DEFAULT_UNSUBSCRIBE_GROUP_SEND_GRID_ID = "G";
22
+ export declare const PIXEL_TRACKING_SEND_GRID_ID = "P";
23
+ export declare const UNSUBSCRIBE_SENTINEL_SEND_GRID_IDS: string[];
22
24
  /**
23
25
  * Get the default unsubscribe group lazily so the translated name resolves at access time.
24
26
  * Must be called within a Vue component context or after Pinia is initialized.
@@ -8,6 +8,7 @@
8
8
  * - `trending` → `trendingProducts` (id 40, path `trending`)
9
9
  * - `mostValuable` → `mostValuableOfPartner` (id 46, path `most-valuable`)
10
10
  * - `topSellers` → `mostPurchased` (id 62, path `top-sellers`)
11
+ * - `mostViewed` → `mostPopular` (id 61, path `most-popular`)
11
12
  *
12
13
  * Used at two boundaries:
13
14
  * 1. The migrator (`settingsMapper`), so freshly migrated node configs carry
@@ -4,15 +4,14 @@ export declare const useToasterStore: import("pinia").StoreDefinition<"guidoToas
4
4
  status: boolean;
5
5
  type: import("@@/Types/toaster").ToasterType;
6
6
  text: string;
7
- icon: string;
8
- withIcon: boolean;
9
7
  withoutLeftMargin: boolean;
8
+ autoHide: boolean;
10
9
  actionButton?: {
11
10
  text: string;
12
11
  onClick: () => void;
13
12
  } | undefined;
14
13
  } & import("pinia").PiniaCustomStateProperties<ToasterState>) => boolean;
15
14
  }, {
16
- showToaster(this: ToasterState, { type, message, actionButton }: ToasterOptions): void;
15
+ showToaster(this: ToasterState, { type, message, actionButton, autoHide }: ToasterOptions): void;
17
16
  hideToaster(this: ToasterState): void;
18
17
  }>;
@@ -1,5 +1,8 @@
1
+ /** Production default — pony-express builds unsubscribe links on mail.useinsider.com. */
2
+ export declare const DEFAULT_ENVIRONMENT_PREFIX = "useinsider";
1
3
  /**
2
- * Gets the appropriate environment prefix by parsing from current hostname
3
- * Extracts environment prefix from domains by splitting hostname
4
+ * Gets the environment prefix by parsing the current hostname (third segment),
5
+ * falling back to the production default when that segment is absent or empty —
6
+ * so unsubscribe links never compile to `https://mail.undefined.com/...` (SD-145225).
4
7
  */
5
8
  export declare const getEnvironmentPrefix: () => string;