@useinsider/guido 3.17.0-beta.e6704da → 3.17.0-beta.ec0523a

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 (41) hide show
  1. package/README.md +0 -1
  2. package/dist/@types/config/schemas.js +6 -12
  3. package/dist/components/Guido.vue.js +6 -6
  4. package/dist/components/Guido.vue2.js +61 -63
  5. package/dist/composables/useCustomInterfaceAppearance.js +16 -19
  6. package/dist/composables/useRecommendation.js +34 -41
  7. package/dist/config/migrator/recommendationMigrator.js +4 -6
  8. package/dist/enums/academy.js +1 -2
  9. package/dist/enums/date.js +3 -4
  10. package/dist/enums/extensions/recommendationBlock.js +23 -25
  11. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +11 -13
  12. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +95 -96
  13. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +154 -156
  14. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +68 -216
  15. package/dist/extensions/Blocks/common-control.js +19 -22
  16. package/dist/guido.css +1 -1
  17. package/dist/services/recommendationApi.js +29 -78
  18. package/dist/src/@types/config/schemas.d.ts +0 -12
  19. package/dist/src/composables/useConfig.d.ts +0 -2
  20. package/dist/src/composables/useRecommendation.d.ts +0 -1
  21. package/dist/src/enums/academy.d.ts +0 -1
  22. package/dist/src/enums/extensions/recommendationBlock.d.ts +0 -2
  23. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +3 -14
  24. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +10 -214
  25. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +0 -6
  26. package/dist/src/extensions/Blocks/common-control.d.ts +1 -4
  27. package/dist/src/services/recommendationApi.d.ts +1 -4
  28. package/dist/src/stores/config.d.ts +0 -18
  29. package/dist/utils/dateUtil.js +10 -23
  30. package/dist/utils/templatePreparation.js +34 -37
  31. package/package.json +1 -2
  32. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +0 -18
  33. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +0 -70
  34. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue.js +0 -20
  35. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue2.js +0 -55
  36. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +0 -141
  37. package/dist/src/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.d.ts +0 -3
  38. package/dist/src/components/organisms/extensions/recommendation/StrategyInfoBox.vue.d.ts +0 -24
  39. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +0 -29
  40. package/dist/src/mock/api/recommendation-strategies.d.ts +0 -43
  41. package/dist/static/styles/components/recommendation-strategy.css.js +0 -171
package/README.md CHANGED
@@ -162,7 +162,6 @@ const config: GuidoConfigInput = {
162
162
  liquidSyntax?: boolean, // Default: false - Enable Liquid template syntax
163
163
  autosave?: boolean, // Default: false - Show the Auto Save toggle in the header. See wiki/AUTOSAVE.md.
164
164
  allowlistEnabled?: boolean, // Default: false - Pre-save domain-allowlist check (opt-in). Guido self-serves the block toaster (role lookup, deep-link, copy from window.trans).
165
- reusableRecommendationStrategy?: boolean, // Default: false - Assign an RRS strategy to recommendation blocks instead of per-block algorithm/filters/shuffle/product-count settings.
166
165
  },
167
166
 
168
167
  // Optional: Callbacks
@@ -1,5 +1,5 @@
1
1
  import { ModuleFolderDefaults as f } from "../../enums/defaults.js";
2
- import { object as a, number as n, optional as e, string as t, picklist as i, pipe as m, minLength as b, custom as y, boolean as o, array as c, transform as C, record as k, fallback as R, literal as u, looseObject as g, variant as T, union as h, unknown as r, lazy as I } from "../../node_modules/valibot/dist/index.js";
2
+ import { object as a, number as n, optional as e, string as t, picklist as i, pipe as m, minLength as b, custom as k, boolean as o, array as c, transform as C, record as y, fallback as R, literal as u, looseObject as g, variant as T, union as h, unknown as r, lazy as I } from "../../node_modules/valibot/dist/index.js";
3
3
  const p = {
4
4
  /** Promotional/marketing emails */
5
5
  PROMOTIONAL: 1,
@@ -76,7 +76,7 @@ const p = {
76
76
  children: e(c(S)),
77
77
  // eslint-disable-next-line camelcase -- backend field name
78
78
  select_items: e(c(S))
79
- })), N = k(
79
+ })), N = y(
80
80
  t(),
81
81
  R(c(S), [])
82
82
  ), P = g({
@@ -132,7 +132,7 @@ const p = {
132
132
  * strategy, currency, locale, and layout data.
133
133
  */
134
134
  recommendationConfigs: e(
135
- k(t(), P),
135
+ y(t(), P),
136
136
  {}
137
137
  )
138
138
  }), x = a({
@@ -219,13 +219,7 @@ const p = {
219
219
  /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
220
220
  allowlistEnabled: e(o(), !1),
221
221
  /** Enable persistent link tracking-id assignment for the click heatmap (opt-in) */
222
- linkTrackingIds: e(o(), !1),
223
- /**
224
- * Assign a Reusable Recommendation Strategy (RRS) to recommendation blocks instead of
225
- * per-block algorithm settings. Hides Algorithm, Filters, Shuffle and Number of Products
226
- * (they live on the strategy) and adds the Assign Strategy flow.
227
- */
228
- reusableRecommendationStrategy: e(o(), !1)
222
+ linkTrackingIds: e(o(), !1)
229
223
  }), B = i([
230
224
  "amp-accordion",
231
225
  "amp-carousel",
@@ -293,7 +287,7 @@ const p = {
293
287
  ...d.entries,
294
288
  type: u("custom"),
295
289
  /** Custom processor function */
296
- processor: y(
290
+ processor: k(
297
291
  (s) => typeof s == "function",
298
292
  "processor must be a function"
299
293
  )
@@ -313,7 +307,7 @@ const p = {
313
307
  * Return false to cancel the save operation.
314
308
  */
315
309
  externalValidation: e(
316
- y(
310
+ k(
317
311
  (s) => typeof s == "function",
318
312
  "externalValidation must be a function"
319
313
  )
@@ -1,18 +1,18 @@
1
- import a from "./Guido.vue2.js";
1
+ import i from "./Guido.vue2.js";
2
2
  /* empty css */
3
- import i from "../_virtual/_plugin-vue2_normalizer.js";
3
+ import a from "../_virtual/_plugin-vue2_normalizer.js";
4
4
  var t = function() {
5
5
  var o = this, r = o._self._c, e = o._self._setupProxy;
6
- return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : o._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.FilterSelectionDrawer), e.configStore.isFeatureEnabled("reusableRecommendationStrategy") ? r(e.AssignStrategyDrawer) : o._e(), r(e.SaveAsTemplateDrawer), e.isTestPartner() ? o._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(p) {
6
+ return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : o._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.FilterSelectionDrawer), r(e.SaveAsTemplateDrawer), e.isTestPartner() ? o._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(p) {
7
7
  return e.emit("onboarding:finished");
8
8
  } } }), r(e.UnsubscribeWrapper), r(e.LoadingWrapper)], 1);
9
- }, n = [], s = /* @__PURE__ */ i(
10
- a,
9
+ }, n = [], s = /* @__PURE__ */ a(
10
+ i,
11
11
  t,
12
12
  n,
13
13
  !1,
14
14
  null,
15
- "f258bc9e"
15
+ "b0d3b445"
16
16
  );
17
17
  const l = s.exports;
18
18
  export {
@@ -1,30 +1,30 @@
1
- import { defineComponent as J, defineAsyncComponent as g, ref as B, computed as U, watch as _, onMounted as Q, onUnmounted as X } from "vue";
2
- import { useCortexBlueprintBridge as Y } from "../composables/useCortexBlueprintBridge.js";
3
- import { provideGuidoActions as Z } from "../composables/useGuidoActions.js";
4
- import { useGuidoStateBridge as ee } from "../composables/useGuidoStateBridge.js";
5
- import { usePartner as te } from "../composables/usePartner.js";
6
- import { useStripo as oe } from "../composables/useStripo.js";
7
- import { useTimerClone as ne } from "../composables/useTimerClone.js";
8
- import { migrate as A } from "../config/migrator/index.js";
9
- import { ModuleFolderDefaults as N } from "../enums/defaults.js";
10
- import { RIBBON_SELECTOR as re } from "../enums/onboarding.js";
11
- import { useRecommendationExtensionStore as se } from "../extensions/Blocks/Recommendation/store/recommendation.js";
12
- import ae from "./organisms/AutoSaveController.vue.js";
13
- import ie from "./organisms/base/Toaster.vue.js";
14
- import ce from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
15
- import de from "./organisms/header/HeaderWrapper.vue.js";
16
- import me from "./organisms/LoadingWrapper.vue.js";
17
- import le from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
18
- import ue from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
19
- import { useStripoApi as pe } from "../services/stripoApi.js";
20
- import { useConfigStore as fe } from "../stores/config.js";
21
- import { useDynamicContentStore as ye } from "../stores/dynamic-content.js";
22
- import { useEditorStore as O } from "../stores/editor.js";
23
- import { usePreviewStore as ve } from "../stores/preview.js";
24
- import { useTemplateStore as ge } from "../stores/template.js";
25
- import { useUnsubscribeStore as Se } from "../stores/unsubscribe.js";
26
- import { readTrackFloor as P } from "../utils/linkTrackingIds.js";
27
- const qe = /* @__PURE__ */ J({
1
+ import { defineComponent as j, defineAsyncComponent as R, ref as B, computed as U, watch as _, onMounted as J, onUnmounted as Q } from "vue";
2
+ import { useCortexBlueprintBridge as X } from "../composables/useCortexBlueprintBridge.js";
3
+ import { provideGuidoActions as Y } from "../composables/useGuidoActions.js";
4
+ import { useGuidoStateBridge as Z } from "../composables/useGuidoStateBridge.js";
5
+ import { usePartner as ee } from "../composables/usePartner.js";
6
+ import { useStripo as te } from "../composables/useStripo.js";
7
+ import { useTimerClone as oe } from "../composables/useTimerClone.js";
8
+ import { migrate as N } from "../config/migrator/index.js";
9
+ import { ModuleFolderDefaults as O } from "../enums/defaults.js";
10
+ import { RIBBON_SELECTOR as ne } from "../enums/onboarding.js";
11
+ import { useRecommendationExtensionStore as re } from "../extensions/Blocks/Recommendation/store/recommendation.js";
12
+ import se from "./organisms/AutoSaveController.vue.js";
13
+ import ae from "./organisms/base/Toaster.vue.js";
14
+ import ie from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
15
+ import ce from "./organisms/header/HeaderWrapper.vue.js";
16
+ import de from "./organisms/LoadingWrapper.vue.js";
17
+ import me from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
18
+ import le from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
19
+ import { useStripoApi as ue } from "../services/stripoApi.js";
20
+ import { useConfigStore as pe } from "../stores/config.js";
21
+ import { useDynamicContentStore as fe } from "../stores/dynamic-content.js";
22
+ import { useEditorStore as P } from "../stores/editor.js";
23
+ import { usePreviewStore as ye } from "../stores/preview.js";
24
+ import { useTemplateStore as ve } from "../stores/template.js";
25
+ import { useUnsubscribeStore as he } from "../stores/unsubscribe.js";
26
+ import { readTrackFloor as A } from "../utils/linkTrackingIds.js";
27
+ const ze = /* @__PURE__ */ j({
28
28
  __name: "Guido",
29
29
  props: {
30
30
  config: null,
@@ -32,21 +32,19 @@ const qe = /* @__PURE__ */ J({
32
32
  },
33
33
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
34
34
  setup(W, { expose: x, emit: r }) {
35
- const a = W, G = g(
35
+ const a = W, G = R(
36
36
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
37
- ), H = g(
37
+ ), H = R(
38
38
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
39
- ), $ = g(
40
- () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
41
- ), S = B(), l = B(), u = ye(), h = Se(), o = fe();
39
+ ), h = B(), l = B(), u = fe(), S = he(), o = pe();
42
40
  a.ready && o.init(a.config);
43
- const c = O(), z = ve(), m = U(() => c.hasChanges), { isTestPartner: q } = te(), b = () => {
41
+ const c = P(), $ = ye(), m = U(() => c.hasChanges), { isTestPartner: z } = ee(), g = () => {
44
42
  var t;
45
- return (t = S.value) == null ? void 0 : t.handleSave(!0);
46
- }, E = (t) => {
43
+ return (t = h.value) == null ? void 0 : t.handleSave(!0);
44
+ }, b = (t) => {
47
45
  c.loadingStatus = t;
48
46
  };
49
- Y(), ee();
47
+ X(), Z();
50
48
  const p = () => {
51
49
  var t, e;
52
50
  return {
@@ -54,14 +52,14 @@ const qe = /* @__PURE__ */ J({
54
52
  userId: o.userId,
55
53
  username: o.username,
56
54
  partnerName: o.partnerName,
57
- savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || N.SAVED_MODULES,
58
- defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || N.DEFAULT_MODULES
55
+ savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || O.SAVED_MODULES,
56
+ defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || O.DEFAULT_MODULES
59
57
  };
60
- }, { initPlugin: w, preloadRuntime: D } = oe(), { getDefaultTemplate: C } = pe(), { cloneTimersOnSave: k, hasTimerBlocks: T } = ne(), K = U(() => {
58
+ }, { initPlugin: E, preloadRuntime: w } = te(), { getDefaultTemplate: C } = ue(), { cloneTimersOnSave: D, hasTimerBlocks: k } = oe(), q = U(() => {
61
59
  var t;
62
60
  return !((t = o.ui) != null && t.showHeader);
63
61
  });
64
- Z({
62
+ Y({
65
63
  onBack: () => {
66
64
  console.debug("guido:back"), r("back");
67
65
  },
@@ -76,9 +74,9 @@ const qe = /* @__PURE__ */ J({
76
74
  console.debug("guido:test-email:click"), r("test-email:click");
77
75
  }
78
76
  });
79
- const F = (t) => {
77
+ const T = (t) => {
80
78
  console.debug("dynamic-content:close", t), u.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
81
- }, I = () => {
79
+ }, F = () => {
82
80
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
83
81
  };
84
82
  _(() => m.value, () => {
@@ -91,38 +89,38 @@ const qe = /* @__PURE__ */ J({
91
89
  let i = null;
92
90
  const y = () => {
93
91
  var e;
94
- const t = document.querySelector(re);
92
+ const t = document.querySelector(ne);
95
93
  (e = l.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
96
94
  }, v = async () => {
97
95
  var t;
98
96
  try {
99
97
  o.initialized || o.init(a.config), c.templateId = o.templateId;
100
- const e = o.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", L = (e == null ? void 0 : e.preselectedDynamicContent) || [];
101
- h.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
102
- const M = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, R = o.isFeatureEnabled("linkTrackingIds");
98
+ const e = o.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", I = (e == null ? void 0 : e.preselectedDynamicContent) || [];
99
+ S.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
100
+ const L = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, M = o.isFeatureEnabled("linkTrackingIds");
103
101
  let n = {
104
- html: s && await A(s, M),
102
+ html: s && await N(s, L),
105
103
  css: d
106
104
  };
107
- n.html || (n = await C(), n.html = await A(n.html, M));
108
- const V = R ? P(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
109
- T(n.html) && (n.html = await k(n.html)), R && (c.trackIdSessionFloor = Math.max(V, P(n.html)));
110
- const j = {
111
- preselectedDynamicContentList: L,
105
+ n.html || (n = await C(), n.html = await N(n.html, L));
106
+ const K = M ? A(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
107
+ k(n.html) && (n.html = await D(n.html)), M && (c.trackIdSessionFloor = Math.max(K, A(n.html)));
108
+ const V = {
109
+ preselectedDynamicContentList: I,
112
110
  onReady: () => {
113
111
  console.debug("guido:ready"), r("ready");
114
112
  }
115
113
  };
116
- await w(n, p(), j), u.selectedDynamicContentList = L;
114
+ await E(n, p(), V), u.selectedDynamicContentList = I;
117
115
  } catch (e) {
118
116
  console.error("Failed to initialize Stripo editor:", e);
119
117
  }
120
118
  };
121
- return Q(async () => {
119
+ return J(async () => {
122
120
  var e;
123
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), se().$reset(), O().$reset(), ge().$reset(), y();
121
+ console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), re().$reset(), P().$reset(), ve().$reset(), y();
124
122
  const t = (e = l.value) == null ? void 0 : e.parentElement;
125
- if (t && (i = new ResizeObserver(y), i.observe(t)), D(), a.ready)
123
+ if (t && (i = new ResizeObserver(y), i.observe(t)), w(), a.ready)
126
124
  await v();
127
125
  else {
128
126
  const s = _(() => a.ready, (d) => {
@@ -130,7 +128,7 @@ const qe = /* @__PURE__ */ J({
130
128
  });
131
129
  }
132
130
  document.addEventListener("dynamic-content:open", f);
133
- }), X(() => {
131
+ }), Q(() => {
134
132
  i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", f);
135
133
  try {
136
134
  window.UIEditor.removeEditor();
@@ -140,15 +138,15 @@ const qe = /* @__PURE__ */ J({
140
138
  o.reset();
141
139
  }), x({
142
140
  dynamicContent: {
143
- insert: F,
144
- close: I
141
+ insert: T,
142
+ close: F
145
143
  },
146
144
  hasChanges: m,
147
- saveSilent: b,
148
- setLoading: E
149
- }), { __sfc: !0, PreviewContainer: G, OnboardingWrapper: H, AssignStrategyDrawer: $, headerWrapperRef: S, wrapperRef: l, dynamicContentStore: u, unsubscribeStore: h, props: a, configStore: o, editorStore: c, previewStore: z, hasChanges: m, isTestPartner: q, saveSilent: b, setLoading: E, emit: r, buildMetadata: p, initPlugin: w, preloadRuntime: D, getDefaultTemplate: C, cloneTimersOnSave: k, hasTimerBlocks: T, noHeader: K, insertDynamicContent: F, closeDynamicContent: I, handleDynamicContentOpen: f, ribbonObserver: i, updateRibbonOffset: y, startEditor: v, AutoSaveController: ae, Toaster: ie, FilterSelectionDrawer: ce, HeaderWrapper: de, LoadingWrapper: me, SaveAsTemplateDrawer: le, UnsubscribeWrapper: ue };
145
+ saveSilent: g,
146
+ setLoading: b
147
+ }), { __sfc: !0, PreviewContainer: G, OnboardingWrapper: H, headerWrapperRef: h, wrapperRef: l, dynamicContentStore: u, unsubscribeStore: S, props: a, configStore: o, editorStore: c, previewStore: $, hasChanges: m, isTestPartner: z, saveSilent: g, setLoading: b, emit: r, buildMetadata: p, initPlugin: E, preloadRuntime: w, getDefaultTemplate: C, cloneTimersOnSave: D, hasTimerBlocks: k, noHeader: q, insertDynamicContent: T, closeDynamicContent: F, handleDynamicContentOpen: f, ribbonObserver: i, updateRibbonOffset: y, startEditor: v, AutoSaveController: se, Toaster: ae, FilterSelectionDrawer: ie, HeaderWrapper: ce, LoadingWrapper: de, SaveAsTemplateDrawer: me, UnsubscribeWrapper: le };
150
148
  }
151
149
  });
152
150
  export {
153
- qe as default
151
+ ze as default
154
152
  };
@@ -4,21 +4,20 @@ import e from "../static/styles/components/amp-block.css.js";
4
4
  import i from "../static/styles/components/base-input.css.js";
5
5
  import p from "../static/styles/components/button-group.css.js";
6
6
  import n from "../static/styles/components/button.css.js";
7
- import C from "../static/styles/components/combobox.css.js";
8
- import s from "../static/styles/components/counter.css.js";
7
+ import s from "../static/styles/components/combobox.css.js";
8
+ import C from "../static/styles/components/counter.css.js";
9
9
  import f from "../static/styles/components/dropdown-menu.css.js";
10
10
  import a from "../static/styles/components/loader.css.js";
11
11
  import u from "../static/styles/components/narrow-panel.css.js";
12
12
  import c from "../static/styles/components/popup.css.js";
13
- import d from "../static/styles/components/recommendation-strategy.css.js";
14
- import l from "../static/styles/components/switcher.css.js";
15
- import h from "../static/styles/components/tabs.css.js";
16
- import w from "../static/styles/components/tools.css.js";
17
- import y from "../static/styles/components/version-history.css.js";
18
- import B from "../static/styles/components/wide-panel.css.js";
19
- import b from "../static/styles/variables.css.js";
20
- const A = [
21
- b,
13
+ import d from "../static/styles/components/switcher.css.js";
14
+ import l from "../static/styles/components/tabs.css.js";
15
+ import h from "../static/styles/components/tools.css.js";
16
+ import w from "../static/styles/components/version-history.css.js";
17
+ import y from "../static/styles/components/wide-panel.css.js";
18
+ import B from "../static/styles/variables.css.js";
19
+ const b = [
20
+ B,
22
21
  // Must be on top
23
22
  S,
24
23
  // Must be on top
@@ -27,24 +26,22 @@ const A = [
27
26
  i,
28
27
  p,
29
28
  n,
30
- C,
31
29
  s,
30
+ C,
32
31
  f,
33
32
  a,
34
33
  u,
35
34
  c,
35
+ d,
36
36
  l,
37
37
  h,
38
38
  w,
39
- y,
40
- B,
41
- d
42
- // Last: overrides button.css / wide-panel.css defaults
39
+ y
43
40
  ].join(`
44
41
 
45
- `), F = () => ({ importCss: () => {
42
+ `), v = () => ({ importCss: () => {
46
43
  const o = new CSSStyleSheet();
47
- o.replaceSync(A);
44
+ o.replaceSync(b);
48
45
  const r = document.querySelector("ui-editor");
49
46
  if (!r)
50
47
  return;
@@ -52,5 +49,5 @@ const A = [
52
49
  t && (t.adoptedStyleSheets = [o]);
53
50
  } });
54
51
  export {
55
- F as useCustomInterfaceAppearance
52
+ v as useCustomInterfaceAppearance
56
53
  };
@@ -1,22 +1,22 @@
1
- import { getRecommendationFeedSourceMaps as y, URLS as I } from "../enums/extensions/recommendationBlock.js";
2
- import { MinDeviceViewport as C, DefaultPadding as R } from "../enums/recommendation.js";
1
+ import { getRecommendationFeedSourceMaps as I, URLS as R } from "../enums/extensions/recommendationBlock.js";
2
+ import { MinDeviceViewport as C, DefaultPadding as b } from "../enums/recommendation.js";
3
3
  import { useRecommendationExtensionStore as l } from "../extensions/Blocks/Recommendation/store/recommendation.js";
4
- import { generateCompleteFilterQuery as b } from "../extensions/Blocks/Recommendation/utils/filterUtil.js";
5
- import { getPartnerRecommendationParams as h } from "../extensions/Blocks/Recommendation/utils/partnerCustomizations.js";
4
+ import { generateCompleteFilterQuery as h } from "../extensions/Blocks/Recommendation/utils/filterUtil.js";
5
+ import { getPartnerRecommendationParams as y } from "../extensions/Blocks/Recommendation/utils/partnerCustomizations.js";
6
6
  import { sanitizeProductIds as x } from "../extensions/Blocks/Recommendation/utils/productIds.js";
7
7
  import { useConfigStore as P } from "../stores/config.js";
8
8
  const B = () => ({
9
9
  calculateCardWidth: ({
10
- mobileLeftPadding: i,
11
- mobileRightPadding: c,
12
- cardsInRow: s,
10
+ mobileLeftPadding: a,
11
+ mobileRightPadding: s,
12
+ cardsInRow: c,
13
13
  unresponsive: n
14
14
  }) => {
15
- const o = n ? s : 1, e = i + c + (o - 1) * R;
16
- return (C - e) / o;
15
+ const r = n ? c : 1, e = a + s + (r - 1) * b;
16
+ return (C - e) / r;
17
17
  },
18
- getRecommendationCampaignData: (i) => {
19
- const c = l(), s = Number(i), n = c.blockStates[s];
18
+ getRecommendationCampaignData: (a) => {
19
+ const s = l(), c = Number(a), n = s.blockStates[c];
20
20
  if (!n)
21
21
  return {
22
22
  textTrimming: !1,
@@ -30,54 +30,47 @@ const B = () => ({
30
30
  discountBeforeTextValue: "",
31
31
  discountAfterTextValue: ""
32
32
  };
33
- const { recommendationConfigs: o } = n, e = o.orientation === "grid" ? "vertical" : "horizontal";
33
+ const { recommendationConfigs: r } = n, e = r.orientation === "grid" ? "vertical" : "horizontal";
34
34
  return {
35
- textTrimming: o.textTrimming,
35
+ textTrimming: r.textTrimming,
36
36
  orientation: e,
37
37
  mobileLeftPadding: 0,
38
38
  mobileRightPadding: 0,
39
- cardsInRow: o.cardsInRow,
40
- unresponsive: o.unresponsive,
39
+ cardsInRow: r.cardsInRow,
40
+ unresponsive: r.unresponsive,
41
41
  priceBeforeTextValue: "",
42
42
  priceAfterTextValue: "",
43
43
  discountBeforeTextValue: "",
44
44
  discountAfterTextValue: ""
45
45
  };
46
46
  },
47
- buildCampaignUrl: (i, c) => {
47
+ buildCampaignUrl: (a, s) => {
48
48
  var m;
49
- const s = l(), n = P(), o = Number(i);
49
+ const c = l(), n = P(), r = Number(a);
50
50
  let e;
51
- if (c)
52
- e = c;
51
+ if (s)
52
+ e = s;
53
53
  else {
54
- const a = s.blockStates[o];
55
- if (!a)
54
+ const i = c.blockStates[r];
55
+ if (!i)
56
56
  return "";
57
- const { recommendationConfigs: r } = a;
57
+ const { recommendationConfigs: o } = i;
58
58
  e = {
59
- strategy: r.strategy,
60
- strategyId: r.strategyId,
61
- language: r.language,
62
- currencyCode: r.currencySettings.value,
63
- size: r.size,
64
- productIds: r.productIds,
65
- filters: r.filters,
66
- shuffleProducts: r.shuffleProducts
59
+ strategy: o.strategy,
60
+ language: o.language,
61
+ currencyCode: o.currencySettings.value,
62
+ size: o.size,
63
+ productIds: o.productIds,
64
+ filters: o.filters,
65
+ shuffleProducts: o.shuffleProducts
67
66
  };
68
67
  }
69
- if (n.isFeatureEnabled("reusableRecommendationStrategy") && e.strategyId)
70
- return s.recommendationCampaignUrls[i] = {
71
- strategyId: e.strategyId,
72
- locale: e.language,
73
- currency: e.currencyCode
74
- }, "";
75
- const g = ((m = y().find((a) => a.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
68
+ const f = ((m = I().find((i) => i.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
76
69
  t.set("locale", e.language), t.set("currency", e.currencyCode), t.set("partnerName", n.partnerName), t.set("size", e.size), t.set("details", "true"), t.set("campaignId", n.variationId), e.strategy === "manualMerchandising" ? t.set("productId", x(e.productIds)) : e.strategy === "similarViewed" && t.set("productId", "{itemId}"), e.strategy === "userBased" && t.set("userId", "{user_id}");
77
- const f = e.filters.filter((a) => a.isValid), d = b(f);
78
- d && t.set("filter", d), e.shuffleProducts && t.set("shuffle", "true"), Object.entries(h(n.partnerName, e.strategy)).forEach(([a, r]) => t.set(a, r));
79
- const p = decodeURIComponent(t.toString()), u = `${I.RECOMMENDATION_API_URL}/v2/${g}?${p}`;
80
- return s.recommendationCampaignUrls[i] = u, u;
70
+ const g = e.filters.filter((i) => i.isValid), d = h(g);
71
+ d && t.set("filter", d), e.shuffleProducts && t.set("shuffle", "true"), Object.entries(y(n.partnerName, e.strategy)).forEach(([i, o]) => t.set(i, o));
72
+ const p = decodeURIComponent(t.toString()), u = `${R.RECOMMENDATION_API_URL}/v2/${f}?${p}`;
73
+ return c.recommendationCampaignUrls[a] = u, u;
81
74
  }
82
75
  });
83
76
  export {
@@ -1,6 +1,6 @@
1
1
  import { BlockId as f } from "../../enums/block.js";
2
- import { useTemplateStore as y } from "../../stores/template.js";
3
- import { mapComposition as b } from "./recommendation/compositionMapper.js";
2
+ import { useTemplateStore as b } from "../../stores/template.js";
3
+ import { mapComposition as y } from "./recommendation/compositionMapper.js";
4
4
  import { extractCurrencyFromBlock as v, extractTitleText as C, extractCardBgColor as M, isPartnerManagedBlock as S } from "./recommendation/extractors.js";
5
5
  import { buildBlockHtml as w } from "./recommendation/htmlBuilder.js";
6
6
  import { parseRecommendationId as x, parseLegacyConfig as R } from "./recommendation/parseLegacyConfig.js";
@@ -20,10 +20,8 @@ function B(i, t, a) {
20
20
  ), !1;
21
21
  const n = a[String(o)] ?? {
22
22
  currencySettings: v(t)
23
- }, c = T(n, r, o), e = b((d = r.composition) == null ? void 0 : d.variables), l = C(t), g = M(t), p = {
23
+ }, c = T(n, r, o), e = y((d = r.composition) == null ? void 0 : d.variables), l = C(t), g = M(t), p = {
24
24
  ...c,
25
- // Legacy blocks predate RRS — never strategy-backed.
26
- strategyId: "",
27
25
  composition: e.composition,
28
26
  visibility: e.visibility,
29
27
  textTrimming: e.anyTextTrimming
@@ -58,7 +56,7 @@ function B(i, t, a) {
58
56
  function q(i, t = {}) {
59
57
  const a = new DOMParser(), o = a.parseFromString(i, "text/html"), r = Array.from(o.querySelectorAll(h));
60
58
  try {
61
- y().$patch((e) => {
59
+ b().$patch((e) => {
62
60
  e.migrations = {
63
61
  ...e.migrations,
64
62
  [f.Recommendation]: r.length
@@ -1,8 +1,7 @@
1
1
  const e = "https://academy.insiderone.com", o = {
2
2
  EMAIL_EDITOR: `${e}/docs/email-drag-and-drop-editor`,
3
3
  GLOBAL_UNSUBSCRIBE: `${e}/docs/global-unsubscribe-preference-center`,
4
- AMP_FOR_EMAILS: `${e}/docs/amp-for-emails`,
5
- EMAIL_RECOMMENDATION_BLOCK: `${e}/docs/new-editor-email-recommendation-block`
4
+ AMP_FOR_EMAILS: `${e}/docs/amp-for-emails`
6
5
  };
7
6
  export {
8
7
  o as ACADEMY_LINKS
@@ -1,6 +1,5 @@
1
- const t = "tr-TR", T = "default", L = "UTC";
1
+ const t = "tr-TR", L = "default";
2
2
  export {
3
- T as DEFAULT,
4
- t as DEFAULT_LOCALE,
5
- L as DEFAULT_TZ
3
+ L as DEFAULT,
4
+ t as DEFAULT_LOCALE
6
5
  };
@@ -2,11 +2,10 @@ import { useTranslations as r } from "../../composables/useTranslations.js";
2
2
  const l = {
3
3
  RECOMMENDATION_API_URL: "https://recommendationv2.api.useinsider.com",
4
4
  // Relative path → same-origin as the embedding inone dashboard.
5
- PRODUCT_ATTRIBUTES_PATH: "/product-attributes/get-attributes",
6
- RECOMMENDATION_STRATEGIES_PATH: "/api/recommendation-strategies"
7
- }, c = "[sr_strategies.status][=][active]*[sr_strategies.suitable_channels][~][EMAIL]", d = {
5
+ PRODUCT_ATTRIBUTES_PATH: "/product-attributes/get-attributes"
6
+ }, c = {
8
7
  CLIENT_ID: "clientId"
9
- }, m = () => {
8
+ }, d = () => {
10
9
  const e = r();
11
10
  return [
12
11
  {
@@ -70,14 +69,14 @@ const l = {
70
69
  path: "top-sellers"
71
70
  }
72
71
  ];
73
- }, p = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], v = [
72
+ }, m = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], p = [
74
73
  { text: "before the amount", value: "0" },
75
74
  { text: "after the amount", value: "1" }
76
- ], h = [
75
+ ], v = [
77
76
  { text: "dot(.)", value: "." },
78
77
  { text: "comma(,)", value: "," },
79
78
  { text: "space( )", value: " " }
80
- ], x = [
79
+ ], h = [
81
80
  { text: "0", value: "0" },
82
81
  { text: "1", value: "1" },
83
82
  { text: "2", value: "2" },
@@ -89,55 +88,54 @@ const l = {
89
88
  { text: "contains", value: "~" },
90
89
  { text: "does not contain", value: "!~" },
91
90
  { text: "any of", value: a }
92
- ], s = [
91
+ ], n = [
93
92
  { text: "is exactly", value: "=" },
94
93
  { text: "is not exactly", value: "!==" },
95
94
  { text: "contains", value: "~" },
96
95
  { text: "does not contain", value: "!~" },
97
96
  { text: "any of", value: a }
98
- ], n = [
97
+ ], o = [
99
98
  { text: "is equal to", value: "=" },
100
99
  { text: "is greater than", value: ">" },
101
100
  { text: "is less than", value: "<" }
102
- ], o = [
101
+ ], s = [
103
102
  { text: "is equal to", value: "=" },
104
103
  { text: "after", value: ">" },
105
104
  { text: "before", value: "<" }
106
105
  ], i = [
107
106
  { text: "true", value: "==" },
108
107
  { text: "false", value: "!=" }
109
- ], b = (e) => {
108
+ ], x = (e) => {
110
109
  if (!e)
111
110
  return t;
112
111
  switch (e) {
113
112
  case "Boolean":
114
113
  return i;
115
114
  case "Date":
116
- return o;
115
+ return s;
117
116
  case "Number":
118
- return n;
117
+ return o;
119
118
  case "String":
120
119
  return t;
121
120
  case "Strings":
122
- return s;
121
+ return n;
123
122
  default:
124
123
  return t;
125
124
  }
126
125
  };
127
126
  export {
128
127
  a as OP_ANY_OF,
129
- p as PriceAttributes,
130
- d as QUERY_PARAMS,
131
- c as RRS_ACTIVE_EMAIL_FILTER,
128
+ m as PriceAttributes,
129
+ c as QUERY_PARAMS,
132
130
  l as URLS,
133
- x as currencyDecimalCounts,
134
- v as currencyLocationMaps,
135
- h as currencyOperators,
136
- b as getOperatorOptions,
137
- m as getRecommendationFeedSourceMaps,
138
- s as operatorOptionsForArrayOfStrings,
131
+ h as currencyDecimalCounts,
132
+ p as currencyLocationMaps,
133
+ v as currencyOperators,
134
+ x as getOperatorOptions,
135
+ d as getRecommendationFeedSourceMaps,
136
+ n as operatorOptionsForArrayOfStrings,
139
137
  i as operatorOptionsForBooleans,
140
- o as operatorOptionsForDates,
141
- n as operatorOptionsForNumbers,
138
+ s as operatorOptionsForDates,
139
+ o as operatorOptionsForNumbers,
142
140
  t as operatorOptionsForStrings
143
141
  };