@useinsider/guido 2.1.0-beta.f8696fd → 2.1.0-beta.f9ab899

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 (74) hide show
  1. package/dist/components/organisms/base/Toaster.vue.js +4 -4
  2. package/dist/components/organisms/base/Toaster.vue2.js +12 -9
  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 -12
  6. package/dist/components/organisms/header/EditorActions.vue2.js +31 -41
  7. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  8. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  9. package/dist/composables/useRecommendation.js +9 -9
  10. package/dist/config/i18n/en/labels.json.js +3 -8
  11. package/dist/config/migrator/itemsBlockMigrator.js +134 -136
  12. package/dist/config/migrator/recommendationMigrator.js +40 -42
  13. package/dist/extensions/Blocks/Items/block.js +25 -45
  14. package/dist/extensions/Blocks/Items/iconsRegistry.js +5 -40
  15. package/dist/extensions/Blocks/Items/items.css.js +0 -48
  16. package/dist/extensions/Blocks/Recommendation/block.js +29 -49
  17. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +36 -33
  18. package/dist/extensions/Blocks/Recommendation/constants/layout.js +16 -14
  19. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +13 -12
  20. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +9 -9
  21. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +1 -1
  22. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +37 -27
  23. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +16 -16
  24. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +30 -32
  25. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +173 -102
  26. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +9 -9
  27. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +46 -38
  28. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +16 -16
  29. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +269 -215
  30. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +10 -10
  31. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +5 -5
  32. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +14 -14
  33. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +9 -9
  34. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.js +3 -3
  35. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.js +1 -1
  36. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +9 -9
  37. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.js +3 -3
  38. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.js +3 -3
  39. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +3 -3
  40. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +225 -102
  41. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +2 -37
  42. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +0 -48
  43. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +94 -53
  44. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  45. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  46. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  47. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  48. package/dist/extensions/Blocks/common-control.js +4 -12
  49. package/dist/guido.css +1 -1
  50. package/dist/src/components/Guido.vue.d.ts +1 -1
  51. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  52. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  53. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  54. package/dist/src/components/wrappers/WpModal.vue.d.ts +2 -2
  55. package/dist/src/extensions/Blocks/Items/block.d.ts +0 -1
  56. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -1
  57. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +6 -0
  58. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +3 -3
  59. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +6 -2
  60. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +6 -1
  61. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +33 -10
  62. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +24 -14
  63. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +49 -17
  64. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +1 -0
  65. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +8 -0
  66. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  67. package/dist/src/extensions/Blocks/common-control.d.ts +0 -5
  68. package/dist/stores/unsubscribe.js +37 -34
  69. package/package.json +1 -1
  70. package/dist/components/organisms/header/MigrationConfirmModal.vue.js +0 -21
  71. package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +0 -38
  72. package/dist/src/components/organisms/header/MigrationConfirmModal.vue.d.ts +0 -5
  73. package/dist/src/stores/template.d.ts +0 -3
  74. package/dist/stores/template.js +0 -9
@@ -1,14 +1,16 @@
1
- import { RecommendationFeedSourceMaps as d, PriceAttributes as S } from "../../../../enums/extensions/recommendationBlock.js";
2
- import { useRecommendationApi as p } from "../../../../services/recommendationApi.js";
3
- import { useConfigStore as b } from "../../../../stores/config.js";
4
- import { defineStore as I } from "pinia";
5
- import { DEFAULT_CARDS_IN_ROW as R } from "../constants/layout.js";
6
- import { getDefaultProducts as k } from "../templates/utils.js";
7
- import { generateCompleteFilterQuery as f } from "../utils/filterUtil.js";
8
- const m = p();
9
- function h() {
1
+ import { RecommendationFeedSourceMaps as S, PriceAttributes as R } from "../../../../enums/extensions/recommendationBlock.js";
2
+ import { useRecommendationApi as k } from "../../../../services/recommendationApi.js";
3
+ import { useConfigStore as y } from "../../../../stores/config.js";
4
+ import { defineStore as C } from "pinia";
5
+ import { DEFAULT_CARDS_IN_ROW as G } from "../constants/layout.js";
6
+ import { EXCLUDED_ALGORITHM_IDS as P } from "../constants/defaultConfig.js";
7
+ import { getDefaultProducts as p } from "../templates/utils.js";
8
+ import { generateCompleteFilterQuery as b } from "../utils/filterUtil.js";
9
+ const h = k();
10
+ let a = null, l = null, u = null;
11
+ function I() {
10
12
  return {
11
- cardsInRow: R,
13
+ cardsInRow: G,
12
14
  currencySettings: {
13
15
  name: "USD",
14
16
  value: "USD",
@@ -32,9 +34,9 @@ function h() {
32
34
  size: "6"
33
35
  };
34
36
  }
35
- function C() {
37
+ function v() {
36
38
  return {
37
- recommendationConfigs: h(),
39
+ recommendationConfigs: I(),
38
40
  recommendationProducts: [],
39
41
  filterStatus: !1,
40
42
  filterSelectionDrawerStatus: !1,
@@ -42,7 +44,7 @@ function C() {
42
44
  isInitialized: !1
43
45
  };
44
46
  }
45
- const y = () => ({
47
+ const D = () => ({
46
48
  recommendationCampaignUrls: {},
47
49
  activePredictiveAlgorithms: [],
48
50
  languages: {},
@@ -51,8 +53,8 @@ const y = () => ({
51
53
  blockStates: {},
52
54
  currentRecommendationId: null,
53
55
  configVersion: 0
54
- }), A = I("guidoRecommendationExtension", {
55
- state: () => y(),
56
+ }), _ = C("guidoRecommendationExtension", {
57
+ state: () => D(),
56
58
  getters: {
57
59
  // ====================================================================
58
60
  // Proxy Getters — Backward Compatible Access to Current Block State
@@ -62,7 +64,7 @@ const y = () => ({
62
64
  * This allows all existing code that reads `store.recommendationConfigs` to work unchanged.
63
65
  */
64
66
  recommendationConfigs(t) {
65
- return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs : h();
67
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs : I();
66
68
  },
67
69
  /**
68
70
  * Proxy getter: delegates to blockStates[currentRecommendationId].recommendationProducts
@@ -100,8 +102,8 @@ const y = () => ({
100
102
  },
101
103
  getActivePredictiveAlgorithms: (t) => {
102
104
  const r = [];
103
- return t.activePredictiveAlgorithms.forEach((e) => {
104
- r.push(...d.filter((n) => n.id === e));
105
+ return t.activePredictiveAlgorithms.filter((e) => !P.includes(e)).forEach((e) => {
106
+ r.push(...S.filter((n) => n.id === e));
105
107
  }), r.map((e) => ({
106
108
  text: e.name,
107
109
  value: e.key
@@ -117,7 +119,7 @@ const y = () => ({
117
119
  })),
118
120
  getFilterList() {
119
121
  return Object.values(this.filterList).map((t) => {
120
- const r = t.type === "defaultAttribute", e = S.includes(t.attributeName);
122
+ const r = t.type === "defaultAttribute", e = R.includes(t.attributeName);
121
123
  let n = r ? t.attributeName : `product_attributes.${t.attributeName}`;
122
124
  return n = e ? `${n}.${this.recommendationConfigs.currencySettings.value}` : n, {
123
125
  text: t.displayName,
@@ -141,7 +143,7 @@ const y = () => ({
141
143
  setCurrentBlock(t) {
142
144
  this.blockStates[t] || (this.blockStates = {
143
145
  ...this.blockStates,
144
- [t]: C()
146
+ [t]: v()
145
147
  }), this.currentRecommendationId = t;
146
148
  },
147
149
  /**
@@ -213,22 +215,46 @@ const y = () => ({
213
215
  // Shared Data Fetching (fetched once, used by all blocks)
214
216
  // ====================================================================
215
217
  async fetchRecommendationCreateData() {
216
- if (this.activePredictiveAlgorithms.length)
217
- return;
218
- const {
219
- activePredictiveAlgorithms: t,
220
- languages: r,
221
- currencies: e
222
- } = await m.fetchRecommendationCreateData();
223
- if (this.activePredictiveAlgorithms = t, this.languages = r, this.currentRecommendationId !== null && this.blockStates[this.currentRecommendationId]) {
224
- const n = this.blockStates[this.currentRecommendationId];
225
- n.filterStatus = !!n.recommendationConfigs.filters.length;
218
+ if (!this.activePredictiveAlgorithms.length) {
219
+ if (a) {
220
+ await a;
221
+ return;
222
+ }
223
+ a = (async () => {
224
+ const {
225
+ activePredictiveAlgorithms: t,
226
+ languages: r,
227
+ currencies: e
228
+ } = await h.fetchRecommendationCreateData();
229
+ if (this.activePredictiveAlgorithms = t, this.languages = r, this.currentRecommendationId !== null && this.blockStates[this.currentRecommendationId]) {
230
+ const n = this.blockStates[this.currentRecommendationId];
231
+ n.filterStatus = !!n.recommendationConfigs.filters.length;
232
+ }
233
+ this.currencyList = e;
234
+ })();
235
+ try {
236
+ await a;
237
+ } finally {
238
+ a = null;
239
+ }
226
240
  }
227
- this.currencyList = e;
228
241
  },
229
242
  async fetchRecommendationFilters() {
230
- const t = await m.fetchRecommendationFilters();
231
- this.filterList = t;
243
+ if (!Object.keys(this.filterList).length) {
244
+ if (l) {
245
+ await l;
246
+ return;
247
+ }
248
+ l = (async () => {
249
+ const t = await h.fetchRecommendationFilters();
250
+ this.filterList = t;
251
+ })();
252
+ try {
253
+ await l;
254
+ } finally {
255
+ l = null;
256
+ }
257
+ }
232
258
  },
233
259
  // ====================================================================
234
260
  // Per-Block Filter Actions
@@ -268,47 +294,62 @@ const y = () => ({
268
294
  addFilter(t) {
269
295
  if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
270
296
  return;
271
- const r = this.blockStates[this.currentRecommendationId], e = [...r.recommendationConfigs.filters], o = e.filter(
272
- (i) => i.filterGroup === t.filterGroup
273
- ).length + 1, s = e.findLastIndex((i) => i.filterGroup === t.filterGroup);
274
- s !== -1 ? e.splice(s + 1, 0, {
297
+ const r = this.blockStates[this.currentRecommendationId], e = [...r.recommendationConfigs.filters], s = e.filter(
298
+ (o) => o.filterGroup === t.filterGroup
299
+ ).length + 1, m = e.findLastIndex((o) => o.filterGroup === t.filterGroup);
300
+ m !== -1 ? e.splice(m + 1, 0, {
275
301
  ...t,
276
- filterNumber: o
302
+ filterNumber: s
277
303
  }) : e.push({
278
304
  ...t,
279
- filterNumber: o
305
+ filterNumber: s
280
306
  }), r.recommendationConfigs.filters = e;
281
307
  },
282
308
  generateFilterQuery() {
283
- return f(this.recommendationConfigs.filters);
309
+ return b(this.recommendationConfigs.filters);
284
310
  },
285
311
  // ====================================================================
286
312
  // Per-Block Product Fetching
287
313
  // ====================================================================
288
314
  async fetchRecommendationProducts() {
289
- var u;
290
- if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
291
- return;
292
- const t = this.currentRecommendationId, r = this.blockStates[t], { recommendationConfigs: e } = r, n = e.filters.filter((l) => l.isValid), o = f(n), s = ((u = d.find((l) => l.key === e.strategy)) == null ? void 0 : u.path) || "", i = b(), c = {
315
+ if (!(this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])) {
316
+ if (u) {
317
+ await u;
318
+ return;
319
+ }
320
+ u = this._doFetchProducts();
321
+ try {
322
+ await u;
323
+ } finally {
324
+ u = null;
325
+ }
326
+ }
327
+ },
328
+ async _doFetchProducts() {
329
+ var g;
330
+ const t = this.currentRecommendationId, r = this.blockStates[t], { recommendationConfigs: e } = r, n = e.filters.filter((i) => i.isValid), s = b(n), m = ((g = S.find((i) => i.key === e.strategy)) == null ? void 0 : g.path) || "", o = y(), c = {
293
331
  locale: e.language,
294
332
  currency: e.currencySettings.value,
295
- partnerName: i.partnerName,
333
+ partnerName: o.partnerName,
296
334
  size: e.size,
297
335
  details: !0,
298
- campaignId: i.variationId
336
+ campaignId: o.variationId
299
337
  };
300
- e.strategy === "manualMerchandising" ? c.productId = e.productIds.join(",") : e.strategy === "similarViewed" && (c.productId = "{itemId}"), o && (c.filter = o), e.shuffleProducts && (c.shuffle = !0);
301
- const g = parseInt(e.size) || 6;
302
- let a;
338
+ e.strategy === "manualMerchandising" ? c.productId = e.productIds.join(",") : e.strategy === "similarViewed" && (c.productId = "{itemId}"), e.strategy === "userBased" && (c.userId = "{user_id}"), s && (c.filter = s), e.shuffleProducts && (c.shuffle = !0);
339
+ const f = parseInt(e.size) || 6;
340
+ let d;
303
341
  try {
304
- a = await m.fetchRecommendationProducts(s, c);
342
+ d = await h.fetchRecommendationProducts(m, c);
305
343
  } catch {
306
- a = [];
344
+ d = [];
345
+ }
346
+ if (this.blockStates[t]) {
347
+ const i = d.length > 0 ? d : p(f);
348
+ this.blockStates[t].recommendationProducts = i.length < f ? [...i, ...p(f - i.length)] : i;
307
349
  }
308
- this.blockStates[t] && (this.blockStates[t].recommendationProducts = a.length > 0 ? a : k(g));
309
350
  }
310
351
  }
311
352
  });
312
353
  export {
313
- A as useRecommendationExtensionStore
354
+ _ as useRecommendationExtensionStore
314
355
  };
@@ -1,17 +1,17 @@
1
1
  var d = Object.defineProperty;
2
- var _ = (n, i, e) => i in n ? d(n, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[i] = e;
3
- var u = (n, i, e) => _(n, typeof i != "symbol" ? i + "" : i, e);
2
+ var h = (n, i, e) => i in n ? d(n, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[i] = e;
3
+ var u = (n, i, e) => h(n, typeof i != "symbol" ? i + "" : i, e);
4
4
  import { PAGE_TYPES as E } from "../../../enums/unsubscribe.js";
5
5
  import { useUnsubscribeStore as c } from "../../../stores/unsubscribe.js";
6
- import { Block as h, BlockCompositionType as S, ModificationDescription as b } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
+ import { Block as _, BlockCompositionType as S, ModificationDescription as b } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
7
  import { getDefaultTemplate as L } from "./template.js";
8
8
  import { UNSUBSCRIBE_EVENTS as a, DATA_ATTRIBUTES as o } from "./utils/constants.js";
9
9
  import { parsePageList as p } from "./utils/utils.js";
10
- const g = "unsubscribe-block", v = 'a[data-unsubscribe-link="true"]', f = ".unsubscribe-block-v2", B = "{{ins-unsubscribe-link}}", T = {
10
+ const v = "unsubscribe-block", g = 'a[data-unsubscribe-link="true"]', f = ".unsubscribe-block-v2", T = "{{ins-unsubscribe-link}}", B = {
11
11
  [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
12
12
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
13
13
  };
14
- class R extends h {
14
+ class R extends _ {
15
15
  constructor() {
16
16
  super();
17
17
  u(this, "selectEventListener", null);
@@ -19,7 +19,7 @@ class R extends h {
19
19
  u(this, "currentNode");
20
20
  }
21
21
  getId() {
22
- return g;
22
+ return v;
23
23
  }
24
24
  getIcon() {
25
25
  return "unsubscribe-icon";
@@ -47,8 +47,8 @@ class R extends h {
47
47
  }
48
48
  _setupSelectEventListener() {
49
49
  this._removeSelectEventListener(), this.selectEventListener = (e) => {
50
- const s = e, { collectionType: t, selectedPages: r } = s.detail;
51
- this._updateBlock(t, r.join(","));
50
+ const r = e, { collectionType: s, selectedPages: t } = r.detail;
51
+ this._updateBlock(s, t.join(","));
52
52
  }, document.addEventListener(a.SELECT, this.selectEventListener);
53
53
  }
54
54
  _removeSelectEventListener() {
@@ -74,17 +74,17 @@ class R extends h {
74
74
  _removeEventListeners() {
75
75
  this._removeSelectEventListener(), this._removeCancelEventListener();
76
76
  }
77
- _updateBlock(e, s) {
77
+ _updateBlock(e, r) {
78
78
  if (!this.currentNode || !("querySelector" in this.currentNode))
79
79
  return;
80
- const t = this.currentNode.querySelector(v);
81
- if (!t)
80
+ const s = this.currentNode.querySelector(g);
81
+ if (!s)
82
82
  return;
83
- const r = this._getMergeTag(e);
84
- this.api.getDocumentModifier().modifyHtml(t).setAttribute("href", r).apply(new b(`Updated unsubscribe link to ${r}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(o.PAGE_TYPE, e.toString()).setAttribute(o.PAGE_LIST, s).apply(new b("Updated unsubscribe block metadata"));
83
+ const t = this._getMergeTag(e);
84
+ this.api.getDocumentModifier().modifyHtml(s).setAttribute("href", t).apply(new b(`Updated unsubscribe link to ${t}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(o.PAGE_TYPE, e.toString()).setAttribute(o.PAGE_LIST, r).apply(new b("Updated unsubscribe block metadata"));
85
85
  }
86
86
  _getMergeTag(e) {
87
- return T[e] ?? B;
87
+ return B[e] ?? T;
88
88
  }
89
89
  _openDrawer() {
90
90
  if (!(this.currentNode && this.currentNode.getAttribute("data-unsubscribe-page-type")))
@@ -97,24 +97,24 @@ class R extends h {
97
97
  }
98
98
  _checkExistingBlocks() {
99
99
  const e = c();
100
- e.isGlobalUnsubscribeDisabled = !1, e.isSubscriptionPreferencesCenterDisabled = !1, this.api.getDocumentRoot().querySelectorAll(f).forEach((t) => {
101
- if ("getAttribute" in t) {
102
- const r = t.getAttribute(o.PAGE_TYPE);
103
- if (r) {
104
- const l = Number(r);
100
+ e.isGlobalUnsubscribeDisabled = !1, e.isSubscriptionPreferencesCenterDisabled = !1, this.api.getDocumentRoot().querySelectorAll(f).forEach((s) => {
101
+ if ("getAttribute" in s) {
102
+ const t = s.getAttribute(o.PAGE_TYPE);
103
+ if (t) {
104
+ const l = Number(t);
105
105
  l === E.GLOBAL_UNSUBSCRIBE ? e.isGlobalUnsubscribeDisabled = !0 : l === E.SUBSCRIPTION_PREFERENCE_CENTER && (e.isSubscriptionPreferencesCenterDisabled = !0);
106
106
  }
107
107
  }
108
108
  });
109
109
  }
110
- _loadBlockState(e) {
110
+ async _loadBlockState(e) {
111
111
  if (!("getAttribute" in e))
112
112
  return;
113
- const s = e.getAttribute(o.PAGE_TYPE), t = e.getAttribute(o.PAGE_LIST);
114
- if (!s || !t)
113
+ const r = e.getAttribute(o.PAGE_TYPE), s = e.getAttribute(o.PAGE_LIST);
114
+ if (!r || !s)
115
115
  return;
116
- const r = c(), l = Number(s), m = p(t);
117
- r.setCollectionWithoutAutoSelection(l), r.loadSelectedTemplates(m);
116
+ const t = c(), l = Number(r), m = p(s);
117
+ await t.fetchTemplates(), t.setCollectionWithoutAutoSelection(l), t.loadSelectedTemplates(m);
118
118
  }
119
119
  _resetStoreState() {
120
120
  c().$reset();
@@ -122,14 +122,14 @@ class R extends h {
122
122
  _removeBlockTemplatesFromStore(e) {
123
123
  if (!("getAttribute" in e))
124
124
  return;
125
- const s = e.getAttribute(o.PAGE_LIST);
126
- if (!s)
125
+ const r = e.getAttribute(o.PAGE_LIST);
126
+ if (!r)
127
127
  return;
128
- const t = c(), r = p(s);
129
- t.removeUnsubscribePages(r);
128
+ const s = c(), t = p(r);
129
+ s.removeUnsubscribePages(t);
130
130
  }
131
131
  }
132
132
  export {
133
- g as UNSUBSCRIBE_BLOCK_ID,
133
+ v as UNSUBSCRIBE_BLOCK_ID,
134
134
  R as UnsubscribeBlock
135
135
  };
@@ -1,18 +1,18 @@
1
- var h = Object.defineProperty;
2
- var d = (a, s, e) => s in a ? h(a, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[s] = e;
3
- var u = (a, s, e) => d(a, typeof s != "symbol" ? s + "" : s, e);
1
+ var d = Object.defineProperty;
2
+ var h = (a, s, e) => s in a ? d(a, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[s] = e;
3
+ var u = (a, s, e) => h(a, typeof s != "symbol" ? s + "" : s, e);
4
4
  import { useUnsubscribeStore as l } from "../../../stores/unsubscribe.js";
5
5
  import { Control as T, UEAttr as i, UIElementType as n } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
6
  import { DATA_ATTRIBUTES as p } from "./utils/constants.js";
7
7
  import { parsePageList as _ } from "./utils/utils.js";
8
- const g = "ui-elements-unsubscribe", r = {
8
+ const v = "ui-elements-unsubscribe", r = {
9
9
  SELECT_BUTTON: "selectTemplateButton",
10
10
  PREV_BUTTON: "prevButton",
11
11
  NEXT_BUTTON: "nextButton",
12
12
  COUNTER_TEXT: "counterText",
13
13
  PREVIEW_IMAGE: "previewImage"
14
14
  };
15
- class N extends T {
15
+ class B extends T {
16
16
  constructor() {
17
17
  super(...arguments);
18
18
  u(this, "currentPreviewIndex", 0);
@@ -22,7 +22,7 @@ class N extends T {
22
22
  u(this, "lastParsedAttribute");
23
23
  }
24
24
  getId() {
25
- return g;
25
+ return v;
26
26
  }
27
27
  getTemplate() {
28
28
  return `
@@ -35,7 +35,7 @@ class N extends T {
35
35
  onTemplateNodeUpdated(e) {
36
36
  if (this.currentNode = e, "getAttribute" in this.currentNode) {
37
37
  const t = this.currentNode.getAttribute(p.PAGE_LIST);
38
- t && (t !== this.lastParsedAttribute && (this.currentPages = _(t), this.lastParsedAttribute = t, this.currentPreviewIndex = 0), this._updatePreview(), this._updateCounter());
38
+ t && (t !== this.lastParsedAttribute && (this.currentPages = _(t), this.lastParsedAttribute = t, this.currentPreviewIndex = 0), this._updateCounter(), this._loadAndUpdatePreview());
39
39
  }
40
40
  }
41
41
  onRender() {
@@ -73,6 +73,9 @@ class N extends T {
73
73
  _onNextClick() {
74
74
  this.currentPreviewIndex < this.totalTemplates - 1 && (this.currentPreviewIndex++, this._updatePreview(), this._updateCounter());
75
75
  }
76
+ async _loadAndUpdatePreview() {
77
+ await l().fetchTemplates(), this._updatePreview(), this._updateCounter();
78
+ }
76
79
  _updatePreview() {
77
80
  var e;
78
81
  if ((e = this.currentPages) != null && e.length)
@@ -162,6 +165,6 @@ class N extends T {
162
165
  }
163
166
  }
164
167
  export {
165
- g as UNSUBSCRIBE_CONTROL_ID,
166
- N as UnsubscribeControl
168
+ v as UNSUBSCRIBE_CONTROL_ID,
169
+ B as UnsubscribeControl
167
170
  };
@@ -1,12 +1,12 @@
1
- var r = Object.defineProperty;
2
- var n = (i, t, e) => t in i ? r(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
3
- var s = (i, t, e) => n(i, typeof t != "symbol" ? t + "" : t, e);
4
- import { UIElement as m } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
- const E = "unsubscribe-preview", l = "img", c = "Unsubscribe page preview";
6
- class o extends m {
1
+ var n = Object.defineProperty;
2
+ var m = (s, i, e) => i in s ? n(s, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[i] = e;
3
+ var r = (s, i, e) => m(s, typeof i != "symbol" ? i + "" : i, e);
4
+ import { UIElement as l } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ const E = "unsubscribe-preview", c = "img", a = "Unsubscribe page preview", g = "is-loaded";
6
+ class d extends l {
7
7
  constructor() {
8
8
  super(...arguments);
9
- s(this, "imgElement");
9
+ r(this, "imgElement");
10
10
  }
11
11
  getId() {
12
12
  return E;
@@ -14,19 +14,21 @@ class o extends m {
14
14
  getTemplate() {
15
15
  return `
16
16
  <div class="unsubscribe-preview-image-container">
17
+ <div class="unsubscribe-preview-loader"></div>
17
18
  <img
18
19
  src=""
19
- alt="${c}"
20
+ alt="${a}"
20
21
  class="unsubscribe-preview-image"
21
22
  />
22
23
  </div>
23
24
  `;
24
25
  }
25
26
  onRender(e) {
26
- this.imgElement = e.querySelector(l);
27
+ this.imgElement = e.querySelector(c);
27
28
  }
28
29
  setValue(e) {
29
- this.imgElement && (this.imgElement.src = e);
30
+ var t;
31
+ this.imgElement && (this.imgElement.src = e, (t = this.imgElement.parentElement) == null || t.classList.add(g));
30
32
  }
31
33
  getValue() {
32
34
  var e;
@@ -38,5 +40,5 @@ class o extends m {
38
40
  }
39
41
  export {
40
42
  E as PREVIEW_UI_ELEMENT_ID,
41
- o as PreviewUIElement
43
+ d as PreviewUIElement
42
44
  };
@@ -29,12 +29,42 @@ const n = `/* Unsubscribe Extension Styles */
29
29
  display: flex;
30
30
  align-items: center;
31
31
  justify-content: center;
32
+ position: relative;
32
33
  }
33
34
 
34
- .unsubscribe-preview-image {
35
+ .unsubscribe-preview-image-container .unsubscribe-preview-image {
35
36
  object-fit: cover;
36
37
  width: 100%;
37
38
  height: auto;
39
+ display: none;
40
+ }
41
+
42
+ .unsubscribe-preview-image-container.is-loaded .unsubscribe-preview-image {
43
+ display: block;
44
+ }
45
+
46
+ .unsubscribe-preview-image-container.is-loaded .unsubscribe-preview-loader {
47
+ display: none;
48
+ }
49
+
50
+ /* Loading shimmer */
51
+ .unsubscribe-preview-loader {
52
+ width: 100%;
53
+ height: 200px;
54
+ border-radius: 4px;
55
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
56
+ background-size: 200% 100%;
57
+ animation: unsubscribe-shimmer 1.5s infinite;
58
+ }
59
+
60
+ @keyframes unsubscribe-shimmer {
61
+ 0% {
62
+ background-position: 200% 0;
63
+ }
64
+
65
+ 100% {
66
+ background-position: -200% 0;
67
+ }
38
68
  }
39
69
  `;
40
70
  export {
@@ -1,5 +1,5 @@
1
- var l = Object.defineProperty;
2
- var O = (T, r, e) => r in T ? l(T, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : T[r] = e;
1
+ var I = Object.defineProperty;
2
+ var O = (T, r, e) => r in T ? I(T, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : T[r] = e;
3
3
  var u = (T, r, e) => O(T, typeof r != "symbol" ? r + "" : r, e);
4
4
  import { Control as c, UIElementType as n, UEAttr as $ } from "../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
5
  class _ extends c {
@@ -129,14 +129,6 @@ class _ extends c {
129
129
  </${n.BUTTON}>
130
130
  `;
131
131
  }
132
- _GuIcon({ src: e, className: t = "" }) {
133
- return `
134
- <${n.ICON}
135
- ${$.ICON.src}="${e}"
136
- ${t ? `class="${t}"` : ""}>
137
- </${n.ICON}>
138
- `;
139
- }
140
132
  /**
141
133
  *
142
134
  * @param param0
@@ -175,9 +167,9 @@ class _ extends c {
175
167
  _GuOrderable(e, t) {
176
168
  let E = "";
177
169
  t.forEach((a) => {
178
- const I = $.ORDERABLE_ITEM && "name" in $.ORDERABLE_ITEM ? $.ORDERABLE_ITEM.name : "name";
170
+ const l = $.ORDERABLE_ITEM && "name" in $.ORDERABLE_ITEM ? $.ORDERABLE_ITEM.name : "name";
179
171
  E += `
180
- <${n.ORDERABLE_ITEM} ${I}="${a.key}">
172
+ <${n.ORDERABLE_ITEM} ${l}="${a.key}">
181
173
  ${a.content}
182
174
  </${n.ORDERABLE_ITEM}>
183
175
  `;
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-6562e38c],.gap-16[data-v-1ccb6d4a]{gap:16px}[data-v-cd76c125] .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-913a3417] .in-progress-wrapper__progress p span:last-child{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}.editor-actions[data-v-92b1be6c]{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-16abb398]{position:relative;width:100%;height:calc(100vh - 128px)}.guido-editor__container[data-v-16abb398]{width:100%;height:calc(100vh - 128px)}.guido-editor__no-header[data-v-16abb398]{height:calc(100vh - 75px)}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-a86fc486]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-a86fc486]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-a86fc486]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-a86fc486]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-a86fc486]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .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-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{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-d3c52b44] .vueperslides__bullets,[data-v-dd1a237a] .vueperslides__bullets{pointer-events:none!important}[data-v-dd1a237a] .vueperslides__parallax-wrapper{height:110px!important}[data-v-a408dcea] .vueperslides__bullets{pointer-events:none!important}[data-v-a408dcea] .vueperslides__parallax-wrapper{height:110px!important}
1
+ .gap-16[data-v-6562e38c],.gap-16[data-v-1ccb6d4a]{gap:16px}[data-v-cd76c125] .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-079d2bf7] .in-progress-wrapper__progress p span:last-child{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}.editor-actions[data-v-17dd4d8b]{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-16abb398]{position:relative;width:100%;height:calc(100vh - 128px)}.guido-editor__container[data-v-16abb398]{width:100%;height:calc(100vh - 128px)}.guido-editor__no-header[data-v-16abb398]{height:calc(100vh - 75px)}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-df672485]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-df672485]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-df672485]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-df672485]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-df672485]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .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-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{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-d3c52b44] .vueperslides__bullets,[data-v-dd1a237a] .vueperslides__bullets{pointer-events:none!important}[data-v-dd1a237a] .vueperslides__parallax-wrapper{height:110px!important}[data-v-a408dcea] .vueperslides__bullets{pointer-events:none!important}[data-v-a408dcea] .vueperslides__parallax-wrapper{height:110px!important}
@@ -11,7 +11,7 @@ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__
11
11
  close: () => void;
12
12
  };
13
13
  hasChanges: import("vue").ComputedRef<boolean>;
14
- saveSilent: () => void | undefined;
14
+ saveSilent: () => Promise<SavedTemplateDetails | undefined> | undefined;
15
15
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
16
16
  "dynamic-content:open": (detail: {
17
17
  text: string;
@@ -1,4 +1,4 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- handleSave: (isSilent: boolean) => void;
2
+ handleSave: (isSilent: boolean) => Promise<import("../../../@types/stripo").SavedTemplateDetails | undefined>;
3
3
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
4
4
  export default _default;
@@ -1,4 +1,4 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- handleSave: (isSilent: boolean) => void | undefined;
2
+ handleSave: (isSilent: boolean) => Promise<import("../../../@types/stripo.js").SavedTemplateDetails | undefined> | undefined;
3
3
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
4
4
  export default _default;
@@ -1,4 +1,4 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- handleSave: (isSilent: boolean) => void | undefined;
2
+ handleSave: (isSilent: boolean) => Promise<import("../../../@types/stripo.js").SavedTemplateDetails | undefined> | undefined;
3
3
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
4
4
  export default _default;
@@ -3,7 +3,7 @@ type __VLS_Props = {
3
3
  id: string;
4
4
  title: string;
5
5
  description?: string;
6
- size?: 'X-small' | 'small' | 'medium' | 'large';
6
+ size?: 'small' | 'medium' | 'large';
7
7
  footerButtonOptions?: FooterButtonGroup;
8
8
  closeButtonStatus?: boolean;
9
9
  closeOnOutsideClick?: boolean;
@@ -33,7 +33,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_WithDefaults<
33
33
  footerStatus: boolean;
34
34
  }>>>, {
35
35
  description: string;
36
- size: "X-small" | "small" | "medium" | "large";
36
+ size: "small" | "medium" | "large";
37
37
  closeOnOutsideClick: boolean;
38
38
  footerButtonOptions: FooterButtonGroup;
39
39
  closeButtonStatus: boolean;
@@ -20,7 +20,6 @@ export declare class ItemsBlock extends Block {
20
20
  getBlockCompositionType(): BlockCompositionType;
21
21
  getName(): string;
22
22
  getDescription(): string;
23
- getSettingsPanelTitleHtml(): string;
24
23
  getTemplate(): string;
25
24
  allowInnerBlocksDND(): boolean;
26
25
  onCreated(node: ImmutableHtmlNode): void;
@@ -20,7 +20,6 @@ export declare class RecommendationBlock extends Block {
20
20
  getBlockCompositionType(): BlockCompositionType;
21
21
  getName(): string;
22
22
  getDescription(): string;
23
- getSettingsPanelTitleHtml(): string;
24
23
  /**
25
24
  * Returns the template HTML for a new recommendation block.
26
25
  * Generates a unique recommendation ID and embeds the instance class