@useinsider/guido 3.18.2-beta.32d291d → 3.18.2-beta.345283a

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 (45) hide show
  1. package/README.md +3 -21
  2. package/dist/@types/config/schemas.js +51 -59
  3. package/dist/components/Guido.vue.js +4 -4
  4. package/dist/components/Guido.vue2.js +53 -55
  5. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +7 -7
  6. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +57 -82
  7. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +22 -24
  8. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +24 -28
  9. package/dist/composables/useCustomInterfaceAppearance.js +42 -46
  10. package/dist/enums/extensions/recommendationBlock.js +31 -40
  11. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +76 -77
  12. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +28 -72
  13. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +44 -45
  14. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +46 -110
  15. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +7 -7
  16. package/dist/guido.css +1 -1
  17. package/dist/services/recommendationApi.js +37 -46
  18. package/dist/src/@types/config/schemas.d.ts +0 -16
  19. package/dist/src/composables/useConfig.d.ts +0 -4
  20. package/dist/src/enums/extensions/recommendationBlock.d.ts +1 -5
  21. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +0 -2
  22. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +0 -4
  23. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +1 -70
  24. package/dist/src/services/recommendationApi.d.ts +1 -2
  25. package/dist/src/stores/config.d.ts +0 -322
  26. package/dist/src/stores/onboarding.d.ts +10 -808
  27. package/dist/static/styles/components/recommendation-strategy.css.js +5 -70
  28. package/dist/stores/config.js +60 -74
  29. package/dist/stores/onboarding.js +36 -46
  30. package/package.json +2 -2
  31. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js +0 -18
  32. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue2.js +0 -25
  33. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.js +0 -21
  34. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue2.js +0 -46
  35. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +0 -21
  36. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +0 -46
  37. package/dist/composables/useLegacyStrategyConversion.js +0 -61
  38. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +0 -42
  39. package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts +0 -2
  40. package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts +0 -2
  41. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +0 -2
  42. package/dist/src/composables/useLegacyStrategyConversion.d.ts +0 -3
  43. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +0 -32
  44. package/dist/static/assets/icons/filled-arrow-rising.svg.js +0 -5
  45. package/dist/static/assets/icons/line-info.svg.js +0 -5
@@ -94,9 +94,9 @@ function j(e, t = {}) {
94
94
  const u = s ?? P(n), l = y.getConfig(n);
95
95
  if (u === "list" || !l.mobileLayoutEnabled)
96
96
  return te({ currentNode: n, documentModifier: o });
97
- const c = A(), f = $(r, c.recommendationProducts), a = i ?? U(n, c.filterList), p = `<td><table class="ins-recommendation-product-container ins-recommendation-mobile-container" width="100%" cellpadding="0" cellspacing="0" border="0">${k(f, u, {
97
+ const c = A(), a = $(r, c.recommendationProducts), f = i ?? U(n, c.filterList), p = `<td><table class="ins-recommendation-product-container ins-recommendation-mobile-container" width="100%" cellpadding="0" cellspacing="0" border="0">${k(a, u, {
98
98
  productsPerRow: l.mobileCardsInRow,
99
- composition: a,
99
+ composition: f,
100
100
  filterList: c.filterList,
101
101
  priceInline: !l.priceMovedToNextLine,
102
102
  // Match the initial render's gutter so a regeneration never changes block height (SD-143023, #386).
@@ -122,9 +122,9 @@ function ie(e, t = {}) {
122
122
  const u = n.querySelector(L) ?? n.querySelector(W);
123
123
  if (!u)
124
124
  return !1;
125
- const l = A(), c = $(r, l.recommendationProducts), { cardsInRow: f } = y.getConfig(n), a = i ?? U(n, l.filterList), d = s ?? P(n), p = y.getConfig(n), E = k(c, d, {
126
- productsPerRow: f,
127
- composition: a,
125
+ const l = A(), c = $(r, l.recommendationProducts), { cardsInRow: a } = y.getConfig(n), f = i ?? U(n, l.filterList), d = s ?? P(n), p = y.getConfig(n), E = k(c, d, {
126
+ productsPerRow: a,
127
+ composition: f,
128
128
  filterList: l.filterList,
129
129
  priceInline: !p.priceMovedToNextLine,
130
130
  // Match the initial render's gutter so a regeneration never changes block height (SD-143023, #386).
@@ -153,10 +153,10 @@ function ce(e, t, n) {
153
153
  return !1;
154
154
  const s = A(), i = r.split(",").filter(Boolean), u = D(i, o, s.filterList), l = [], c = u.join(",") !== i.join(",");
155
155
  c && l.push([R, u.join(",")]);
156
- const f = le(
156
+ const a = le(
157
157
  o.getAttribute(q)
158
- ), a = f && z(f, o, s.filterList);
159
- if (f && a && a.join(",") !== f.join(",") && l.push([q, JSON.stringify(a)]), l.length === 0)
158
+ ), f = a && z(a, o, s.filterList);
159
+ if (a && f && f.join(",") !== a.join(",") && l.push([q, JSON.stringify(f)]), l.length === 0)
160
160
  return !1;
161
161
  if (l.forEach(([d, p]) => {
162
162
  t.modifyHtml(o).setAttribute(d, p);
@@ -177,20 +177,19 @@ function Te(e) {
177
177
  products: r,
178
178
  layout: s,
179
179
  composition: i,
180
- skipStylePreservation: u,
181
- forceApply: l = !1
180
+ skipStylePreservation: u
182
181
  } = e;
183
182
  if (!t)
184
183
  return;
185
- const c = u ? {} : x(t), f = {
184
+ const l = u ? {} : x(t), c = {
186
185
  currentNode: t,
187
186
  documentModifier: n,
188
187
  products: r,
189
188
  layout: s,
190
189
  composition: i
191
190
  };
192
- let a = ie(f, c);
193
- a = j(f, c) || a, a && ce(t, n, i), (a || l) && n.apply(new S("Regenerate products with styles")), o == null || o();
191
+ let a = ie(c, l);
192
+ a = j(c, l) || a, a && (ce(t, n, i), n.apply(new S("Regenerate products with styles"))), o == null || o();
194
193
  }
195
194
  function Re(e, t) {
196
195
  return e.length === t ? e : e.length > t ? e.slice(0, t) : [...e, ...H(t - e.length)];
@@ -251,16 +250,16 @@ function se(e) {
251
250
  omnibusDiscountEl: l,
252
251
  buttonEl: c
253
252
  } = e;
254
- let f = !1;
253
+ let a = !1;
255
254
  if (o && "querySelector" in o) {
256
- const a = o.querySelector("img");
257
- a && (t.modifyHtml(a).setAttribute("src", X(n.image_url)).setAttribute("alt", n.name), f = !0);
255
+ const f = o.querySelector("img");
256
+ f && (t.modifyHtml(f).setAttribute("src", X(n.image_url)).setAttribute("alt", n.name), a = !0);
258
257
  const d = o.querySelector("a");
259
- d && (t.modifyHtml(d).setAttribute("href", n.url), f = !0);
258
+ d && (t.modifyHtml(d).setAttribute("href", n.url), a = !0);
260
259
  }
261
260
  if (r && "querySelector" in r) {
262
- const a = r.querySelector("strong") ?? r.querySelector("p");
263
- b(t, a ?? null, n.name) && (f = !0);
261
+ const f = r.querySelector("strong") ?? r.querySelector("p");
262
+ b(t, f ?? null, n.name) && (a = !0);
264
263
  }
265
264
  if (K({
266
265
  documentModifier: t,
@@ -269,11 +268,11 @@ function se(e) {
269
268
  oldPriceEl: i,
270
269
  omnibusPriceEl: u,
271
270
  omnibusDiscountEl: l
272
- }) && (f = !0), c && "querySelector" in c) {
273
- const a = c.querySelector("a.es-button") || c.querySelector("a");
274
- a && (t.modifyHtml(a).setAttribute("href", n.url), f = !0);
271
+ }) && (a = !0), c && "querySelector" in c) {
272
+ const f = c.querySelector("a.es-button") || c.querySelector("a");
273
+ f && (t.modifyHtml(f).setAttribute("href", n.url), a = !0);
275
274
  }
276
- return f;
275
+ return a;
277
276
  }
278
277
  function V(e) {
279
278
  return "querySelector" in e ? e.querySelector(L) ?? e : e;
@@ -309,14 +308,14 @@ function fe(e, t, n) {
309
308
  let s = !1;
310
309
  return r.forEach((i, u) => {
311
310
  const l = Math.min(i.length, n.length);
312
- i.slice(0, l).forEach((c, f) => {
311
+ i.slice(0, l).forEach((c, a) => {
313
312
  if (!("querySelector" in c))
314
313
  return;
315
- const a = ae(u, n[f]);
316
- if (a === null)
314
+ const f = ae(u, n[a]);
315
+ if (f === null)
317
316
  return;
318
317
  const d = c.querySelector("p") ?? null;
319
- b(t, d, a) && (s = !0);
318
+ b(t, d, f) && (s = !0);
320
319
  });
321
320
  }), s;
322
321
  }
@@ -337,9 +336,9 @@ function O(e, t, n) {
337
336
  `[esd-extension-block-id="${m.OMNIBUS_DISCOUNT}"]`
338
337
  ), c = e.querySelectorAll(
339
338
  `[esd-extension-block-id="${m.BUTTON}"]`
340
- ), f = Math.min(o.length, n.length);
341
- let a = !1;
342
- for (let d = 0; d < f; d++) {
339
+ ), a = Math.min(o.length, n.length);
340
+ let f = !1;
341
+ for (let d = 0; d < a; d++) {
343
342
  const p = se({
344
343
  documentModifier: t,
345
344
  product: n[d],
@@ -351,33 +350,33 @@ function O(e, t, n) {
351
350
  omnibusDiscountEl: l[d] ?? null,
352
351
  buttonEl: c[d] ?? null
353
352
  });
354
- a = a || p;
353
+ f = f || p;
355
354
  }
356
- return fe(e, t, n) && (a = !0), a;
355
+ return fe(e, t, n) && (f = !0), f;
357
356
  }
358
357
  function qe(e) {
359
- const { currentNode: t, documentModifier: n, products: o, forceApply: r = !1 } = e;
358
+ const { currentNode: t, documentModifier: n, products: o } = e;
360
359
  if (!t || !("querySelectorAll" in t))
361
360
  return !1;
362
- const s = V(t);
363
- if (!("querySelectorAll" in s) || s.querySelectorAll(
361
+ const r = V(t);
362
+ if (!("querySelectorAll" in r) || r.querySelectorAll(
364
363
  `[esd-extension-block-id="${m.IMAGE}"]`
365
364
  ).length !== o.length)
366
365
  return !1;
367
- let u = O(s, n, o);
368
- const l = P(t), c = y.getConfig(t);
369
- if (l !== "list" && c.mobileLayoutEnabled && "querySelector" in t) {
370
- const f = t.querySelector(N);
371
- if (f) {
366
+ let i = O(r, n, o);
367
+ const u = P(t), l = y.getConfig(t);
368
+ if (u !== "list" && l.mobileLayoutEnabled && "querySelector" in t) {
369
+ const c = t.querySelector(N);
370
+ if (c) {
372
371
  const a = O(
373
- f,
372
+ c,
374
373
  n,
375
374
  o
376
375
  );
377
- u = u || a;
376
+ i = i || a;
378
377
  }
379
378
  }
380
- return (u || r) && n.apply(new S("Updated product content in-place")), !0;
379
+ return i && n.apply(new S("Updated product content in-place")), !0;
381
380
  }
382
381
  function _(e, t, n) {
383
382
  if (!("querySelectorAll" in e))
@@ -418,8 +417,8 @@ function Me(e) {
418
417
  if (u !== "list" && l.mobileLayoutEnabled && "querySelector" in t) {
419
418
  const c = t.querySelector(N);
420
419
  if (c) {
421
- const f = _(c, n, r);
422
- i = i || f;
420
+ const a = _(c, n, r);
421
+ i = i || a;
423
422
  }
424
423
  }
425
424
  return i && n.apply(new S("Updated price formatting in-place")), i;
@@ -1,23 +1,22 @@
1
- import { getRecommendationFeedSourceMaps as R, getOperatorOptions as F, PriceAttributes as P } from "../../../../enums/extensions/recommendationBlock.js";
1
+ import { getRecommendationFeedSourceMaps as b, getOperatorOptions as G, PriceAttributes as v } from "../../../../enums/extensions/recommendationBlock.js";
2
2
  import { useRecommendationApi as D } from "../../../../services/recommendationApi.js";
3
- import { useConfigStore as k } from "../../../../stores/config.js";
4
- import { defineStore as L } from "pinia";
3
+ import { useConfigStore as F } from "../../../../stores/config.js";
4
+ import { defineStore as P } from "pinia";
5
5
  import "../constants/selectors.js";
6
- import { DEFAULT_MOBILE_CARDS_IN_ROW as U, DEFAULT_CARDS_IN_ROW as _ } from "../constants/layout.js";
7
- import { CURRENT_CONFIG_VERSION as y, DEFAULT_NODE_CONFIG as N, EXCLUDED_ALGORITHM_IDS as M } from "../constants/defaultConfig.js";
8
- import { getDefaultProducts as C } from "../templates/utils.js";
9
- import { generateCompleteFilterQuery as v } from "../utils/filterUtil.js";
10
- import { isLegacyStrategyConfig as x } from "../utils/legacyStrategyMigration.js";
11
- import { getPartnerRecommendationParams as B } from "../utils/partnerCustomizations.js";
12
- import { sanitizeProductIds as z } from "../utils/productIds.js";
13
- import { isFilterValid as A } from "../validation/filterSchema.js";
14
- import { isConfigValid as O } from "../validation/requiredFields.js";
15
- const m = D();
6
+ import { DEFAULT_MOBILE_CARDS_IN_ROW as _, DEFAULT_CARDS_IN_ROW as U } from "../constants/layout.js";
7
+ import { DEFAULT_NODE_CONFIG as N, EXCLUDED_ALGORITHM_IDS as L } from "../constants/defaultConfig.js";
8
+ import { getDefaultProducts as R } from "../templates/utils.js";
9
+ import { generateCompleteFilterQuery as k } from "../utils/filterUtil.js";
10
+ import { getPartnerRecommendationParams as x } from "../utils/partnerCustomizations.js";
11
+ import { sanitizeProductIds as A } from "../utils/productIds.js";
12
+ import { isFilterValid as B } from "../validation/filterSchema.js";
13
+ import { isConfigValid as M } from "../validation/requiredFields.js";
14
+ const u = D();
16
15
  let f = null, g = null, h = null, S = null;
17
16
  const p = /* @__PURE__ */ new Map();
18
- function G() {
17
+ function w() {
19
18
  return {
20
- cardsInRow: _,
19
+ cardsInRow: U,
21
20
  currencySettings: {
22
21
  name: "USD",
23
22
  value: "USD",
@@ -31,7 +30,7 @@ function G() {
31
30
  productIds: [],
32
31
  id: 1,
33
32
  language: "en_US",
34
- mobileCardsInRow: U,
33
+ mobileCardsInRow: _,
35
34
  mobileLayoutEnabled: !1,
36
35
  orientation: "grid",
37
36
  recommendedProducts: [],
@@ -39,7 +38,6 @@ function G() {
39
38
  shuffleProducts: !1,
40
39
  strategy: "mostPopular",
41
40
  strategyId: "",
42
- nodeConfigVersion: y,
43
41
  textTrimming: !0,
44
42
  unresponsive: !1,
45
43
  size: "6",
@@ -48,23 +46,21 @@ function G() {
48
46
  priceHideIfSameAsDiscounted: !1
49
47
  };
50
48
  }
51
- function w() {
49
+ function C() {
52
50
  return {
53
- recommendationConfigs: G(),
51
+ recommendationConfigs: w(),
54
52
  recommendationProducts: [],
55
53
  filterStatus: !1,
56
54
  filterSelectionDrawerStatus: !1,
57
55
  assignStrategyDrawerStatus: !1,
58
56
  removeStrategyModalStatus: !1,
59
- legacyStrategyUpdatedModalStatus: !1,
60
57
  filterGroup: 1,
61
58
  isInitialized: !1,
62
59
  filterSnapshot: null,
63
- syncedConfigFingerprint: null,
64
- legacyConversionLoading: !1
60
+ syncedConfigFingerprint: null
65
61
  };
66
62
  }
67
- const E = () => ({
63
+ const z = () => ({
68
64
  recommendationCampaignUrls: {},
69
65
  activePredictiveAlgorithms: [],
70
66
  languages: {},
@@ -76,8 +72,8 @@ const E = () => ({
76
72
  blockStates: {},
77
73
  currentRecommendationId: null,
78
74
  configVersion: 0
79
- }), et = L("guidoRecommendationExtension", {
80
- state: () => E(),
75
+ }), Y = P("guidoRecommendationExtension", {
76
+ state: () => z(),
81
77
  getters: {
82
78
  // ====================================================================
83
79
  // Proxy Getters — Backward Compatible Access to Current Block State
@@ -87,7 +83,7 @@ const E = () => ({
87
83
  * This allows all existing code that reads `store.recommendationConfigs` to work unchanged.
88
84
  */
89
85
  recommendationConfigs(t) {
90
- return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs : G();
86
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs : w();
91
87
  },
92
88
  /**
93
89
  * Proxy getter: delegates to blockStates[currentRecommendationId].recommendationProducts
@@ -107,15 +103,6 @@ const E = () => ({
107
103
  removeStrategyModalStatus(t) {
108
104
  return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].removeStrategyModalStatus : !1;
109
105
  },
110
- isLegacyStrategyBlock() {
111
- return k().isFeatureEnabled("reusableRecommendationStrategy") && x(this.recommendationConfigs);
112
- },
113
- legacyConversionLoading(t) {
114
- return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].legacyConversionLoading : !1;
115
- },
116
- legacyStrategyUpdatedModalStatus(t) {
117
- return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].legacyStrategyUpdatedModalStatus : !1;
118
- },
119
106
  assignedStrategy(t) {
120
107
  const { strategyId: e } = this.recommendationConfigs;
121
108
  return e ? t.strategies.find((r) => String(r.strategy_id) === e) ?? null : null;
@@ -151,8 +138,8 @@ const E = () => ({
151
138
  return [...new Set(t.map((e) => e.filterGroup))].sort((e, r) => e - r);
152
139
  },
153
140
  getActivePredictiveAlgorithms: (t) => {
154
- const e = R(), r = [];
155
- return t.activePredictiveAlgorithms.filter((n) => !M.includes(n)).forEach((n) => {
141
+ const e = b(), r = [];
142
+ return t.activePredictiveAlgorithms.filter((n) => !L.includes(n)).forEach((n) => {
156
143
  r.push(...e.filter((s) => s.id === n));
157
144
  }), r.map((n) => ({
158
145
  text: n.name,
@@ -170,7 +157,7 @@ const E = () => ({
170
157
  getFilterList() {
171
158
  return Object.values(this.filterList).filter((t) => t.isFilterable !== 0 && t.isFilterable !== !1).map((t) => {
172
159
  let e;
173
- return t.type === "productAttribute" ? e = `product_attributes.${t.attributeName}` : P.includes(t.attributeName) ? e = `${t.attributeName}.${this.recommendationConfigs.currencySettings.value}` : e = t.attributeName, {
160
+ return t.type === "productAttribute" ? e = `product_attributes.${t.attributeName}` : v.includes(t.attributeName) ? e = `${t.attributeName}.${this.recommendationConfigs.currencySettings.value}` : e = t.attributeName, {
174
161
  text: t.displayName,
175
162
  value: e,
176
163
  type: t.attributeType
@@ -192,7 +179,7 @@ const E = () => ({
192
179
  setCurrentBlock(t) {
193
180
  this.blockStates[t] || (this.blockStates = {
194
181
  ...this.blockStates,
195
- [t]: w()
182
+ [t]: C()
196
183
  }), this.currentRecommendationId = t;
197
184
  },
198
185
  /**
@@ -260,7 +247,7 @@ const E = () => ({
260
247
  decimalCount: String(e.currencyDecimalCount),
261
248
  decimalSeparator: r(e.currencyDecimalSeparator, ","),
262
249
  thousandSeparator: r(e.currencyThousandSeparator, ".")
263
- }, s = !this.blockStates[t], i = s ? w() : this.blockStates[t];
250
+ }, s = !this.blockStates[t], i = s ? C() : this.blockStates[t];
264
251
  i.recommendationConfigs = {
265
252
  ...i.recommendationConfigs,
266
253
  strategy: e.strategy,
@@ -299,7 +286,7 @@ const E = () => ({
299
286
  * Creates a filter with the first available attribute and operator pre-selected.
300
287
  */
301
288
  createDefaultFilter(t, e) {
302
- const [r] = this.getFilterList, [n] = F(r == null ? void 0 : r.type);
289
+ const [r] = this.getFilterList, [n] = G(r == null ? void 0 : r.type);
303
290
  return {
304
291
  type: "standardFilter",
305
292
  attribute: (r == null ? void 0 : r.value) ?? "",
@@ -352,12 +339,6 @@ const E = () => ({
352
339
  closeAssignStrategyDrawer() {
353
340
  this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].assignStrategyDrawerStatus = !1);
354
341
  },
355
- openLegacyStrategyUpdatedModal() {
356
- this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].legacyStrategyUpdatedModalStatus = !0);
357
- },
358
- closeLegacyStrategyUpdatedModal() {
359
- this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].legacyStrategyUpdatedModalStatus = !1);
360
- },
361
342
  openRemoveStrategyModal() {
362
343
  this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].removeStrategyModalStatus = !0);
363
344
  },
@@ -372,7 +353,7 @@ const E = () => ({
372
353
  S = (async () => {
373
354
  this.strategiesLoading = !0;
374
355
  try {
375
- this.strategies = await m.fetchRecommendationStrategies();
356
+ this.strategies = await u.fetchRecommendationStrategies();
376
357
  } finally {
377
358
  this.strategiesLoading = !1;
378
359
  }
@@ -387,7 +368,7 @@ const E = () => ({
387
368
  const r = typeof t.updated_at == "string" ? t.updated_at : "", n = r ? `${t.strategy_id}:${r}:${e}` : "", s = n ? this.strategyUrlTemplates[n] : void 0;
388
369
  if (s)
389
370
  return s;
390
- const { full_path: i = "" } = await m.generateStrategyEndpoint(t, e) ?? {};
371
+ const { full_path: i = "" } = await u.generateStrategyEndpoint(t, e) ?? {};
391
372
  return n && i && (this.strategyUrlTemplates = {
392
373
  ...this.strategyUrlTemplates,
393
374
  [n]: i
@@ -399,44 +380,8 @@ const E = () => ({
399
380
  ...t.size !== void 0 ? { size: String(t.size) } : {}
400
381
  });
401
382
  },
402
- async convertLegacyStrategy(t, e = { scope: "campaign" }) {
403
- const r = this.currentRecommendationId;
404
- if (r === null || !this.blockStates[r])
405
- throw new Error("[Guido] convertLegacyStrategy called without an active block");
406
- this.blockStates[r].legacyConversionLoading = !0;
407
- try {
408
- const n = await m.migrateLegacyStrategy(t, e);
409
- try {
410
- await this.fetchStrategies();
411
- } catch (o) {
412
- console.error("[Guido] strategy listing refresh after conversion failed", o);
413
- }
414
- const s = this.strategies.find((o) => String(o.strategy_id) === n), i = this.blockStates[r];
415
- return i && (i.recommendationConfigs = {
416
- ...i.recommendationConfigs,
417
- strategyId: n,
418
- nodeConfigVersion: y,
419
- ...(s == null ? void 0 : s.size) !== void 0 ? { size: String(s.size) } : {}
420
- }), this.currentRecommendationId === r && this.configVersion++, n;
421
- } finally {
422
- this.blockStates[r] && (this.blockStates[r].legacyConversionLoading = !1);
423
- }
424
- },
425
- /**
426
- * Undoes the config half of a conversion whose document write never landed, so the
427
- * panel and the drawer fall back to "Legacy Strategy" instead of showing an assignment
428
- * the document never received.
429
- */
430
- revertLegacyConversion(t, e) {
431
- const r = this.blockStates[t];
432
- r && (r.recommendationConfigs = { ...r.recommendationConfigs, ...e }, this.currentRecommendationId === t && this.configVersion++);
433
- },
434
383
  removeStrategy() {
435
- this.patchCurrentBlockConfig({
436
- strategyId: "",
437
- size: N.size,
438
- nodeConfigVersion: y
439
- });
384
+ this.patchCurrentBlockConfig({ strategyId: "", size: N.size });
440
385
  },
441
386
  // ====================================================================
442
387
  // Shared Data Fetching (fetched once, used by all blocks)
@@ -452,7 +397,7 @@ const E = () => ({
452
397
  activePredictiveAlgorithms: t,
453
398
  languages: e,
454
399
  currencies: r
455
- } = await m.fetchRecommendationCreateData();
400
+ } = await u.fetchRecommendationCreateData();
456
401
  if (this.activePredictiveAlgorithms = t, this.languages = e, this.currentRecommendationId !== null && this.blockStates[this.currentRecommendationId]) {
457
402
  const n = this.blockStates[this.currentRecommendationId];
458
403
  n.filterStatus = !!n.recommendationConfigs.filters.length;
@@ -473,7 +418,7 @@ const E = () => ({
473
418
  return;
474
419
  }
475
420
  g = (async () => {
476
- const t = await m.fetchRecommendationFilters();
421
+ const t = await u.fetchRecommendationFilters();
477
422
  this.filterList = t;
478
423
  })();
479
424
  try {
@@ -508,7 +453,7 @@ const E = () => ({
508
453
  const n = [...e.recommendationConfigs.filters];
509
454
  n[r] = {
510
455
  ...t,
511
- isValid: A(t)
456
+ isValid: B(t)
512
457
  }, e.recommendationConfigs.filters = n;
513
458
  }
514
459
  },
@@ -546,7 +491,7 @@ const E = () => ({
546
491
  }), e.recommendationConfigs.filters = r;
547
492
  },
548
493
  generateFilterQuery() {
549
- return v(this.recommendationConfigs.filters);
494
+ return k(this.recommendationConfigs.filters);
550
495
  },
551
496
  /**
552
497
  * Validation-only check invoked at save-CTA time. Defined as an action
@@ -554,7 +499,7 @@ const E = () => ({
554
499
  * every block's recommendationConfigs across user edits.
555
500
  */
556
501
  hasInvalidBlock() {
557
- return Object.values(this.blockStates).some((t) => !O(t.recommendationConfigs, this));
502
+ return Object.values(this.blockStates).some((t) => !M(t.recommendationConfigs, this));
558
503
  },
559
504
  // ====================================================================
560
505
  // Per-Block Product Fetching
@@ -575,12 +520,12 @@ const E = () => ({
575
520
  },
576
521
  async _doFetchProducts() {
577
522
  var d;
578
- const t = this.currentRecommendationId, e = this.blockStates[t], { recommendationConfigs: r } = e, n = k();
523
+ const t = this.currentRecommendationId, e = this.blockStates[t], { recommendationConfigs: r } = e, n = F();
579
524
  if (r.strategyId && n.isFeatureEnabled("reusableRecommendationStrategy")) {
580
525
  await this._doFetchStrategyProducts(t);
581
526
  return;
582
527
  }
583
- const s = r.filters.filter((u) => u.isValid), i = v(s), o = ((d = R().find((u) => u.key === r.strategy)) == null ? void 0 : d.path) || "", c = parseInt(r.size) || 6, a = {
528
+ const s = r.filters.filter((m) => m.isValid), i = k(s), o = ((d = b().find((m) => m.key === r.strategy)) == null ? void 0 : d.path) || "", c = parseInt(r.size) || 6, a = {
584
529
  locale: r.language,
585
530
  currency: r.currencySettings.value,
586
531
  partnerName: n.partnerName,
@@ -588,27 +533,18 @@ const E = () => ({
588
533
  details: !0,
589
534
  campaignId: n.variationId
590
535
  };
591
- r.strategy === "manualMerchandising" ? a.productId = z(r.productIds) : r.strategy === "similarViewed" && (a.productId = "{itemId}"), r.strategy === "userBased" && (a.userId = "{user_id}"), i && (a.filter = i), r.shuffleProducts && (a.shuffle = !0), Object.assign(
536
+ r.strategy === "manualMerchandising" ? a.productId = A(r.productIds) : r.strategy === "similarViewed" && (a.productId = "{itemId}"), r.strategy === "userBased" && (a.userId = "{user_id}"), i && (a.filter = i), r.shuffleProducts && (a.shuffle = !0), Object.assign(
592
537
  a,
593
- B(n.partnerName, r.strategy)
538
+ x(n.partnerName, r.strategy)
594
539
  );
595
540
  let l;
596
541
  try {
597
- l = await m.fetchRecommendationProducts(o, a);
542
+ l = await u.fetchRecommendationProducts(o, a);
598
543
  } catch {
599
544
  l = [];
600
545
  }
601
546
  this._setBlockProducts(t, l, c);
602
547
  },
603
- /**
604
- * Block-scoped counterpart of `fetchRecommendationProducts`, which only ever serves the
605
- * selected block. The legacy conversion must refresh the products of the block that
606
- * started it even after the user selected another one.
607
- */
608
- async fetchStrategyProductsForBlock(t) {
609
- var e;
610
- (e = this.blockStates[t]) != null && e.recommendationConfigs.strategyId && await this._doFetchStrategyProducts(t);
611
- },
612
548
  async _doFetchStrategyProducts(t) {
613
549
  const e = (p.get(t) ?? 0) + 1;
614
550
  p.set(t, e);
@@ -621,8 +557,8 @@ const E = () => ({
621
557
  );
622
558
  if (i) {
623
559
  s = parseInt(String(i.size ?? "")) || s;
624
- const o = r.currencySettings.value, a = (await this.resolveStrategyUrlTemplate(i, o)).replaceAll("{locale}", r.language).replaceAll("{currency}", o), l = a.indexOf("?"), d = l === -1 ? a : a.slice(0, l), u = (l === -1 ? "" : a.slice(l + 1)).split("&").filter((I) => I && !I.startsWith("user_id=")), b = u.length ? `${d}?${u.join("&")}` : d;
625
- b && (n = await m.fetchRecommendationProductsByUrl(b));
560
+ const o = r.currencySettings.value, a = (await this.resolveStrategyUrlTemplate(i, o)).replaceAll("{locale}", r.language).replaceAll("{currency}", o), l = a.indexOf("?"), d = l === -1 ? a : a.slice(0, l), m = (l === -1 ? "" : a.slice(l + 1)).split("&").filter((I) => I && !I.startsWith("user_id=")), y = m.length ? `${d}?${m.join("&")}` : d;
561
+ y && (n = await u.fetchRecommendationProductsByUrl(y));
626
562
  }
627
563
  } catch {
628
564
  n = [];
@@ -632,14 +568,14 @@ const E = () => ({
632
568
  _setBlockProducts(t, e, r) {
633
569
  if (!this.blockStates[t])
634
570
  return;
635
- const n = e.length > 0 ? e : C(r);
571
+ const n = e.length > 0 ? e : R(r);
636
572
  this.blockStates[t].recommendationProducts = [
637
573
  ...n.slice(0, r),
638
- ...C(Math.max(0, r - n.length))
574
+ ...R(Math.max(0, r - n.length))
639
575
  ];
640
576
  }
641
577
  }
642
578
  });
643
579
  export {
644
- et as useRecommendationExtensionStore
580
+ Y as useRecommendationExtensionStore
645
581
  };
@@ -1,12 +1,12 @@
1
1
  import { ModificationDescription as f } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
2
  import { RECOMMENDATION_ID_ATTR as m } from "../constants/selectors.js";
3
- import { isPartnerManagedBlock as l, updateProductContentInPlace as a, regenerateProductRowsWithStyles as d } from "../controls/main/utils.js";
4
- import { RecommendationConfigService as p } from "../services/configService.js";
3
+ import { isPartnerManagedBlock as a, updateProductContentInPlace as d, regenerateProductRowsWithStyles as l } from "../controls/main/utils.js";
4
+ import { RecommendationConfigService as s } from "../services/configService.js";
5
5
  let e = null;
6
- function M(r) {
6
+ function N(r) {
7
7
  e = r;
8
8
  }
9
- function N(r, c, i, u) {
9
+ function D(r, c, i, u) {
10
10
  const n = e == null ? void 0 : e.getDocumentRootHtmlNode();
11
11
  if (!e || !n || !("querySelector" in n))
12
12
  return !1;
@@ -14,9 +14,9 @@ function N(r, c, i, u) {
14
14
  if (!t)
15
15
  return !1;
16
16
  const o = e.getDocumentModifier();
17
- return p.stageConfig(o, t, c), l(t) ? (o.apply(new f(u)), !0) : (a({ currentNode: t, documentModifier: o, products: i, forceApply: !0 }) || d({ currentNode: t, documentModifier: o, products: i, forceApply: !0 }), !0);
17
+ return s.stageConfig(o, t, c), a(t) ? (o.apply(new f(u)), !0) : (d({ currentNode: t, documentModifier: o, products: i }) || l({ currentNode: t, documentModifier: o, products: i }), !0);
18
18
  }
19
19
  export {
20
- N as commitBlockChangeOutsidePanel,
21
- M as registerNodeConfigWriter
20
+ D as commitBlockChangeOutsidePanel,
21
+ N as registerNodeConfigWriter
22
22
  };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.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-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__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-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__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-1ca6baf0]{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-17b3c665]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-17b3c665]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-17b3c665]{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-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{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-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-19d8cb42] .vueperslides__bullets,[data-v-1f4a4044] .vueperslides__bullets,[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-4019dc4d]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-4019dc4d] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}.legacy-strategy-updated-modal[data-v-da2225a1]{position:relative;z-index:145}
1
+ @charset "UTF-8";.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-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__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-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__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-1ca6baf0]{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-050dfa52]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-050dfa52]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-050dfa52]{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-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{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-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-2580a7d9]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-2580a7d9] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}