@useinsider/guido 3.12.0-beta.0c5c36f → 3.12.0-beta.19da4fb

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 (72) hide show
  1. package/dist/@types/config/schemas.js +9 -4
  2. package/dist/components/Guido.vue.js +8 -8
  3. package/dist/components/Guido.vue2.js +58 -56
  4. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.js +38 -0
  5. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue2.js +271 -0
  6. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue.js +20 -0
  7. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue2.js +16 -0
  8. package/dist/components/organisms/extensions/recommendation/StrategyPicker.vue.js +20 -0
  9. package/dist/components/organisms/extensions/recommendation/StrategyPicker.vue2.js +80 -0
  10. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.js +18 -0
  11. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue2.js +42 -0
  12. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.js +20 -0
  13. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue2.js +18 -0
  14. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.js +20 -0
  15. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue2.js +60 -0
  16. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.js +19 -0
  17. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue2.js +19 -0
  18. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.js +22 -0
  19. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue2.js +29 -0
  20. package/dist/composables/useRecommendation.js +82 -51
  21. package/dist/composables/useStrategyFilters.js +16 -0
  22. package/dist/config/migrator/recommendationMigrator.js +7 -4
  23. package/dist/enums/date.js +4 -3
  24. package/dist/enums/extensions/filteringV2.js +1024 -0
  25. package/dist/enums/extensions/recommendationBlock.js +43 -29
  26. package/dist/enums/extensions/strategyDetail.js +148 -0
  27. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +12 -11
  28. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +137 -119
  29. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +57 -0
  30. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +392 -112
  31. package/dist/extensions/Blocks/Recommendation/utils/strategyHumanizer.js +97 -0
  32. package/dist/extensions/Blocks/Recommendation/utils/strategyInfoBox.js +24 -0
  33. package/dist/extensions/Blocks/Recommendation/utils/strategyNavigation.js +8 -0
  34. package/dist/extensions/Blocks/Recommendation/utils/strategySummary.js +95 -0
  35. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +24 -10
  36. package/dist/guido.css +1 -1
  37. package/dist/node_modules/@vueuse/core/index.js +48 -0
  38. package/dist/node_modules/@vueuse/shared/index.js +57 -27
  39. package/dist/services/recommendationApi.js +86 -29
  40. package/dist/src/@types/config/schemas.d.ts +10 -0
  41. package/dist/src/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.d.ts +2 -0
  42. package/dist/src/components/organisms/extensions/recommendation/StrategyInfoBox.vue.d.ts +26 -0
  43. package/dist/src/components/organisms/extensions/recommendation/StrategyPicker.vue.d.ts +2 -0
  44. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.d.ts +43 -0
  45. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.d.ts +29 -0
  46. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.d.ts +40 -0
  47. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.d.ts +38 -0
  48. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.d.ts +51 -0
  49. package/dist/src/composables/useConfig.d.ts +2 -0
  50. package/dist/src/composables/useRecommendation.d.ts +2 -0
  51. package/dist/src/composables/useStrategyFilters.d.ts +24 -0
  52. package/dist/src/enums/extensions/filteringV2.d.ts +72 -0
  53. package/dist/src/enums/extensions/recommendationBlock.d.ts +21 -0
  54. package/dist/src/enums/extensions/strategyDetail.d.ts +90 -0
  55. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +10 -4
  56. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +16 -0
  57. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +894 -1
  58. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +7 -0
  59. package/dist/src/extensions/Blocks/Recommendation/utils/strategyHumanizer.d.ts +50 -0
  60. package/dist/src/extensions/Blocks/Recommendation/utils/strategyInfoBox.d.ts +33 -0
  61. package/dist/src/extensions/Blocks/Recommendation/utils/strategyNavigation.d.ts +10 -0
  62. package/dist/src/extensions/Blocks/Recommendation/utils/strategySummary.d.ts +34 -0
  63. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +8 -1
  64. package/dist/src/mock/api/recommendation-strategies.d.ts +2 -0
  65. package/dist/src/services/recommendationApi.d.ts +8 -1
  66. package/dist/src/stores/config.d.ts +18 -0
  67. package/dist/src/utils/genericUtil.d.ts +9 -0
  68. package/dist/static/styles/base.css.js +25 -0
  69. package/dist/utils/dateUtil.js +23 -10
  70. package/dist/utils/genericUtil.js +10 -1
  71. package/dist/utils/templatePreparation.js +70 -57
  72. package/package.json +1 -1
@@ -0,0 +1,97 @@
1
+ import { FilterTypeNames as f, OperatorAbbreviations as N, UserEvents as y, UserEventKeys as d } from "../../../../enums/extensions/strategyDetail.js";
2
+ import { formatShortDate as p } from "../../../../utils/dateUtil.js";
3
+ const L = /* @__PURE__ */ new Set([
4
+ d.CURRENTLY_VIEWED_ITEM,
5
+ d.LEGACY_CURRENTLY_VIEWED_ITEM
6
+ ]), g = /^(\d+)([whd])$/, h = (t) => t ? t.charAt(0).toUpperCase() + t.slice(1) : "", v = (t, e) => {
7
+ const r = y.find((n) => n.value === t);
8
+ return r ? e(r.text) : t;
9
+ }, C = (t, e) => {
10
+ if (t.userAttribute)
11
+ return t.userAttribute;
12
+ if (!t.userEvent)
13
+ return "";
14
+ const r = v(t.userEvent, e);
15
+ if (L.has(t.userEvent))
16
+ return r;
17
+ const n = t.userEventCount ?? 0;
18
+ if (n <= 0)
19
+ return r;
20
+ const a = e(
21
+ n === 1 ? "discovery-strategy-filtering.item" : "discovery-strategy-filtering.items"
22
+ );
23
+ return `${r} ${n} ${a}`;
24
+ }, O = [
25
+ f.USER_ATTRIBUTE_FILTER,
26
+ f.USER_EVENT_FILTER,
27
+ f.USER_CONTEXT_FILTER
28
+ ], V = (t) => O.includes(t ?? ""), S = (t, e, r) => {
29
+ if (!t)
30
+ return "";
31
+ const n = g.exec(t);
32
+ if (!n)
33
+ return "";
34
+ const [, a, c] = n, s = e.find((T) => T.value === c), $ = s ? s.text.toLowerCase() : c;
35
+ return ` ${r("purchase-history.in-last")} ${a} ${$}`;
36
+ }, R = (t, e) => t.map((r) => `[${r}]`).join(` ${e} `), b = (t) => {
37
+ let e;
38
+ try {
39
+ e = JSON.parse(t);
40
+ } catch {
41
+ return t.split(",");
42
+ }
43
+ return Array.isArray(e) ? e.map((r) => String(r)) : [String(e)];
44
+ };
45
+ function w(t) {
46
+ const {
47
+ condition: e,
48
+ selectedOperator: r,
49
+ filterValue: n,
50
+ timeUnit: a,
51
+ inBetweenValues: c,
52
+ timeUnitOptions: s,
53
+ isDateAttribute: $,
54
+ isMultiSelect: T,
55
+ isInOrNotInOperator: U,
56
+ trans: E
57
+ } = t, { IN_LAST: A, IN_BETWEEN: _ } = N.OPERATOR, l = E("action-builder.and");
58
+ if (V(e.type)) {
59
+ const i = C(e, E);
60
+ if (i)
61
+ return `${i}${S(e.duration, s, E)}`;
62
+ }
63
+ const u = e.type === f.EVENT_BASED_FILTER ? S(e.duration, s, E) : "";
64
+ if (e.time && r !== _)
65
+ return `${p(e.time)}${u}`;
66
+ if (r === A) {
67
+ const [i] = n.match(/\d+/g) || [];
68
+ if (!i)
69
+ return n;
70
+ const o = s.find((m) => m.value === a);
71
+ return `${i} ${h((o == null ? void 0 : o.text) ?? "")}`.trimEnd();
72
+ }
73
+ if (r === _) {
74
+ if ($() && e.time) {
75
+ const [m = "", I = ""] = e.time.split(":");
76
+ return `${p(m)} ${l} ${p(I)}${u}`;
77
+ }
78
+ const [i = "", o = ""] = c ?? [];
79
+ return `${i} ${l} ${o}${u}`;
80
+ }
81
+ if (T())
82
+ return `${R(b(n), l)}${u}`;
83
+ if (U()) {
84
+ const i = n.split(",");
85
+ return `${i.length > 1 ? R(i, l) : n}${u}`;
86
+ }
87
+ return `${n}${u}`;
88
+ }
89
+ export {
90
+ R as bracketJoin,
91
+ h as capitalizeFirstLetter,
92
+ S as getDurationSuffix,
93
+ w as getSuitableValue,
94
+ C as getUserContextValue,
95
+ v as getUserEventLabel,
96
+ b as parseMultiSelectValue
97
+ };
@@ -0,0 +1,24 @@
1
+ import { formatShortDate as o } from "../../../../utils/dateUtil.js";
2
+ const a = "view-more", p = (t, e, i) => ({
3
+ id: `strategy-info-box-${t.strategy_id}`,
4
+ theme: "light",
5
+ variant: "information",
6
+ titleText: t.name,
7
+ descriptionText: e("gpt-app-builder.strategy-last-updated", {
8
+ date: o(t.updated_at)
9
+ }),
10
+ buttonOptions: [{
11
+ id: a,
12
+ type: "text",
13
+ text: e("gpt-app-builder.view-more"),
14
+ value: String(t.strategy_id),
15
+ status: "default",
16
+ icon: "line-info-circle"
17
+ }],
18
+ slot: i,
19
+ slotProps: { strategy: t }
20
+ });
21
+ export {
22
+ a as VIEW_MORE_BUTTON_ID,
23
+ p as buildStrategyInfoBoxProps
24
+ };
@@ -0,0 +1,8 @@
1
+ import { STRATEGY_PAGES as a } from "../../../../enums/extensions/recommendationBlock.js";
2
+ const o = (t) => {
3
+ window.location.assign(t);
4
+ }, e = (t) => a.EDIT.replace("{{id}}", String(t));
5
+ export {
6
+ e as buildStrategyEditPath,
7
+ o as navigateToStrategyPage
8
+ };
@@ -0,0 +1,95 @@
1
+ import { TimeAbbreviations as g, Operators as y, OperatorNames as c, OperatorAbbreviations as I, DataTypes as O, MultiSelectDataTypes as E } from "../../../../enums/extensions/filteringV2.js";
2
+ import { capitalizeFirstLetter as d, bracketJoin as T, parseMultiSelectValue as v } from "./strategyHumanizer.js";
3
+ import { formatShortDate as f } from "../../../../utils/dateUtil.js";
4
+ import { parseJsonField as b } from "../../../../utils/genericUtil.js";
5
+ const S = "CHEF", _ = "MIXED", M = [S, _], N = 2, h = 4, A = (e) => `recommendation-algorithm-names.${(e || "").replaceAll("_", "-").toLowerCase()}`, x = (e) => ({
6
+ [S]: "discovery-strategy.chef",
7
+ [_]: "discovery-strategy.mixed-algorithm"
8
+ })[e] ?? "discovery-strategy.single-algorithm", L = (e, t) => {
9
+ if (!M.includes(e.algorithm))
10
+ return t(A(e.algorithm));
11
+ const o = t(x(e.algorithm)), i = (e.algorithm_used || "").split(",").map((r) => r.trim()).filter(Boolean).map((r) => t(A(r))), n = [...new Set(i)];
12
+ if (n.length > 1) {
13
+ const r = t("strategy-info-box-content.and-more", { count: n.length - 1 });
14
+ return `${o} - ${n[0]} ${r}`;
15
+ }
16
+ return `${o} - ${n.join(", ")}`;
17
+ }, C = (e, t) => {
18
+ const o = [
19
+ e.exclude_view && "viewed",
20
+ e.exclude_purchase && "purchased",
21
+ e.exclude_cart && "cart"
22
+ ].filter(Boolean);
23
+ return o.length ? o.map((n, r) => {
24
+ if (r === 0)
25
+ return t(`recommendation-strategy.recently_${n}`) + (o.length > 2 ? "," : "");
26
+ const s = t(`recommendation-strategy.${n}`);
27
+ return r === o.length - 1 ? `${t("ds-condition.and")} ${s}` : s;
28
+ }).join(" ") : t("recommendation-strategy.none");
29
+ }, D = (e, t) => {
30
+ var n;
31
+ const i = (y[((n = e.attribute) == null ? void 0 : n.attributeType) ?? ""] || []).find((r) => r.value === e.selectedOperator);
32
+ return i ? t(i.text) : "";
33
+ }, w = ({ attribute: e }) => (e == null ? void 0 : e.attributeType) === O.DATE, R = (e) => {
34
+ var r;
35
+ const t = ((r = e.attribute) == null ? void 0 : r.attributeType) ?? "", o = e.selectedOperator ?? "";
36
+ if (!E.includes(t) || [c.CONTAINS, c.NOT_CONTAINS].includes(o))
37
+ return !1;
38
+ const i = [c.IS_EXACTLY, c.IS_NOT_EXACTLY].includes(o);
39
+ return !((e.isHierarchyCategory || t === O.STRING) && i);
40
+ }, j = (e, t, o) => {
41
+ const i = e.value ?? "", n = t("action-builder.and"), { IN_LAST: r, IN_BETWEEN: s } = I.OPERATOR;
42
+ if (e.time && e.selectedOperator !== s)
43
+ return f(e.time);
44
+ if (e.selectedOperator === r) {
45
+ const [a] = i.match(/\d+/g) || [], l = o[e.timeUnit ?? ""];
46
+ return a && l ? `${a} ${l}` : i;
47
+ }
48
+ if (e.selectedOperator === s) {
49
+ if (w(e)) {
50
+ const [m = "", u = ""] = (e.time ?? "").split(":");
51
+ return `${f(m)} ${n} ${f(u)}`;
52
+ }
53
+ const [a = "", l = ""] = e.inBetweenValues ?? [];
54
+ return `${a} ${n} ${l}`;
55
+ }
56
+ if (R(e))
57
+ return T(v(i), n);
58
+ if ([c.IN, c.NOT_IN].includes(e.selectedOperator)) {
59
+ const a = i.split(",");
60
+ return a.length > 1 ? T(a, n) : i;
61
+ }
62
+ return i;
63
+ }, F = (e, t) => {
64
+ var $;
65
+ const o = b(e.filters, {}), n = Object.values(o).slice(0, N).flatMap((p) => (p == null ? void 0 : p.conditionList) ?? []), [r] = n;
66
+ if (!r)
67
+ return t("recommendation-strategy.none");
68
+ const s = {
69
+ [g.WEEK]: d(t("journey-builder.weeks")),
70
+ [g.DAY]: d(t("settings.day-s")),
71
+ [g.HOUR]: d(t("settings.hour-s"))
72
+ }, a = d((($ = r.attribute) == null ? void 0 : $.text) ?? ""), l = D(r, t), m = j(r, t, s), u = `${a} ${t("input.value")} ${l} ${m}`;
73
+ return n.length > 1 ? `${u} ${t("strategy-info-box-content.and-more", { count: n.length - 1 })}` : u;
74
+ }, H = (e, t) => {
75
+ const o = b(e.manual_merchandising_products, []), i = b(e.mixed_strategies, []), n = (Array.isArray(i) ? i : []).map((s) => s == null ? void 0 : s.productId).filter(Boolean), r = [.../* @__PURE__ */ new Set([...Array.isArray(o) ? o : [], ...n])];
76
+ if (!r.length)
77
+ return t("recommendation-strategy.none");
78
+ if (r.length > h) {
79
+ const s = t("strategy-info-box-content.and-more", {
80
+ count: r.length - h
81
+ });
82
+ return `${r.slice(0, h).join(", ")} ${s}`;
83
+ }
84
+ return r.join(", ");
85
+ }, V = (e, t) => [
86
+ { title: t("gpt-app-builder.algorithms-and-method"), value: L(e, t) },
87
+ { title: t("gpt-app-builder.exclusions"), value: C(e, t) },
88
+ { title: t("gpt-app-builder.filters"), value: F(e, t) },
89
+ { title: t("gpt-app-builder.manual-merchandising"), value: H(e, t) }
90
+ ];
91
+ export {
92
+ V as buildStrategySummary,
93
+ A as getAlgorithmTranslationKey,
94
+ x as getMethodTranslationKey
95
+ };
@@ -1,4 +1,4 @@
1
- const l = [
1
+ const u = [
2
2
  {
3
3
  key: "locale",
4
4
  getValue: (e) => e.language,
@@ -9,25 +9,39 @@ const l = [
9
9
  getValue: (e) => e.currencySettings.value,
10
10
  getAvailableOptions: (e) => e.currencyList.map((n) => n.text),
11
11
  canBeEmpty: !0
12
+ },
13
+ {
14
+ // Only a *deleted* strategy blocks the save (SD-145578 AC-4). An empty
15
+ // strategyId is legitimate: blocks saved before RRS keep running on their
16
+ // algorithm URL, and with the flag on by default those templates must stay
17
+ // saveable.
18
+ //
19
+ // `canValidateStrategy` gates the whole check — mid-fetch the listing is
20
+ // empty and every assigned id would look deleted.
21
+ key: "strategy",
22
+ optional: !0,
23
+ getValue: (e) => e.strategyId,
24
+ getAvailableOptions: (e) => e.strategyIds,
25
+ condition: (e, n) => n.isRrsEnabled && n.canValidateStrategy
12
26
  }
13
27
  ], o = "newsletter.recommendation-fill-required-fields";
14
- function c(e, n, i = l) {
15
- return i.filter((t) => {
16
- var u;
17
- if (t.condition && !t.condition(e))
28
+ function c(e, n, l = u) {
29
+ return l.filter((t) => {
30
+ var i;
31
+ if (t.condition && !t.condition(e, n))
18
32
  return !1;
19
- const r = (u = t.getAvailableOptions) == null ? void 0 : u.call(t, n);
20
- if (t.canBeEmpty && (r == null ? void 0 : r.length) === 0)
33
+ const a = (i = t.getAvailableOptions) == null ? void 0 : i.call(t, n);
34
+ if (t.canBeEmpty && (a == null ? void 0 : a.length) === 0)
21
35
  return !1;
22
- const a = t.getValue(e);
23
- return a ? r !== void 0 && !r.includes(a) : !0;
36
+ const r = t.getValue(e);
37
+ return r ? a !== void 0 && !a.includes(r) : !t.optional;
24
38
  }).map((t) => t.key);
25
39
  }
26
40
  function s(e, n) {
27
41
  return c(e, n).length === 0;
28
42
  }
29
43
  export {
30
- l as REQUIRED_RECOMMENDATION_FIELDS,
44
+ u as REQUIRED_RECOMMENDATION_FIELDS,
31
45
  o as RecommendationRequiredFieldsKey,
32
46
  c as getInvalidFields,
33
47
  s as isConfigValid
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-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}
1
+ .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-3ff1b2a9] .in-ag-filter-header{display:none}.condition-data[data-v-ef803818]{gap:4px}.filter-humanizer[data-v-3ecb7de4]{margin:0 -32px}[data-v-6e572ff5] .in-tooltip-wrapper__box{max-width:inherit}[data-v-30363cc2] .in-drawer__content{padding:0}.other-details div[data-v-30363cc2]:first-child{margin-top:0}.strategy-shared-notice[data-v-30363cc2]{margin:0;padding-left:18px}.strategy-shared-notice li+li[data-v-30363cc2]{margin-top:4px}.strategy-info-box__row+.strategy-info-box__row[data-v-0cfc2679]{margin-top:12px}.strategy-info-box__title[data-v-0cfc2679]{margin:0;font-size:12px;line-height:16px}.strategy-info-box__value[data-v-0cfc2679]{margin:0;font-size:13px;line-height:18px;word-break:break-word}.strategy-picker[data-v-4d69210f]{position:fixed;display:flex;align-items:center;gap:8px;z-index:20}.strategy-picker__select[data-v-4d69210f]{flex:1;min-width:0}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-b42dde02]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-b42dde02]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-b42dde02]{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}
@@ -0,0 +1,48 @@
1
+ import { noop as y, toValue as f, isObject as v, tryOnScopeDispose as A, isClient as E } from "../shared/index.js";
2
+ import { createFilterWrapper as g, debounceFilter as j, throttleFilter as M, useDebounceFn as S, useThrottleFn as T } from "../shared/index.js";
3
+ import "../../vue-demi/lib/index.js";
4
+ import { watch as F } from "vue";
5
+ const w = E ? window : void 0;
6
+ function b(n) {
7
+ var t;
8
+ const e = f(n);
9
+ return (t = e == null ? void 0 : e.$el) != null ? t : e;
10
+ }
11
+ function C(...n) {
12
+ let t, e, o, u;
13
+ if (typeof n[0] == "string" || Array.isArray(n[0]) ? ([e, o, u] = n, t = w) : [t, e, o, u] = n, !t)
14
+ return y;
15
+ Array.isArray(e) || (e = [e]), Array.isArray(o) || (o = [o]);
16
+ const a = [], c = () => {
17
+ a.forEach((r) => r()), a.length = 0;
18
+ }, m = (r, i, s, l) => (r.addEventListener(i, s, l), () => r.removeEventListener(i, s, l)), d = F(
19
+ () => [b(t), f(u)],
20
+ ([r, i]) => {
21
+ if (c(), !r)
22
+ return;
23
+ const s = v(i) ? { ...i } : i;
24
+ a.push(
25
+ ...e.flatMap((l) => o.map((h) => m(r, l, h, s)))
26
+ );
27
+ },
28
+ { immediate: !0, flush: "post" }
29
+ ), p = () => {
30
+ d(), c();
31
+ };
32
+ return A(p), p;
33
+ }
34
+ export {
35
+ g as createFilterWrapper,
36
+ j as debounceFilter,
37
+ w as defaultWindow,
38
+ E as isClient,
39
+ v as isObject,
40
+ y as noop,
41
+ M as throttleFilter,
42
+ f as toValue,
43
+ A as tryOnScopeDispose,
44
+ b as unrefElement,
45
+ S as useDebounceFn,
46
+ C as useEventListener,
47
+ T as useThrottleFn
48
+ };
@@ -1,45 +1,75 @@
1
1
  import "../../vue-demi/lib/index.js";
2
- import { unref as p } from "vue";
3
- function f(t) {
4
- return typeof t == "function" ? t() : p(t);
2
+ import { isRef as D, unref as S, getCurrentScope as x, onScopeDispose as O } from "vue";
3
+ function R(e) {
4
+ return x() ? (O(e), !0) : !1;
5
5
  }
6
+ function d(e) {
7
+ return typeof e == "function" ? e() : S(e);
8
+ }
9
+ const G = typeof window < "u" && typeof document < "u";
6
10
  typeof WorkerGlobalScope < "u" && globalThis instanceof WorkerGlobalScope;
7
- const m = () => {
11
+ const F = Object.prototype.toString, V = (e) => F.call(e) === "[object Object]", m = () => {
8
12
  };
9
- function h(t, n) {
10
- function r(...e) {
11
- return new Promise((i, o) => {
12
- Promise.resolve(t(() => n.apply(this, e), { fn: n, thisArg: this, args: e })).then(i).catch(o);
13
+ function h(e, r) {
14
+ function n(...t) {
15
+ return new Promise((o, i) => {
16
+ Promise.resolve(e(() => r.apply(this, t), { fn: r, thisArg: this, args: t })).then(o).catch(i);
13
17
  });
14
18
  }
15
- return r;
19
+ return n;
16
20
  }
17
- function T(t, n = {}) {
18
- let r, e, i = m;
19
- const o = (u) => {
20
- clearTimeout(u), i(), i = m;
21
+ function P(e, r = {}) {
22
+ let n, t, o = m;
23
+ const i = (l) => {
24
+ clearTimeout(l), o(), o = m;
21
25
  };
22
- return (u) => {
23
- const a = f(t), l = f(n.maxWait);
24
- return r && o(r), a <= 0 || l !== void 0 && l <= 0 ? (e && (o(e), e = null), Promise.resolve(u())) : new Promise((c, s) => {
25
- i = n.rejectOnCancel ? s : c, l && !e && (e = setTimeout(() => {
26
- r && o(r), e = null, c(u());
27
- }, l)), r = setTimeout(() => {
28
- e && o(e), e = null, c(u());
29
- }, a);
26
+ return (l) => {
27
+ const c = d(e), u = d(r.maxWait);
28
+ return n && i(n), c <= 0 || u !== void 0 && u <= 0 ? (t && (i(t), t = null), Promise.resolve(l())) : new Promise((s, b) => {
29
+ o = r.rejectOnCancel ? b : s, u && !t && (t = setTimeout(() => {
30
+ n && i(n), t = null, s(l());
31
+ }, u)), n = setTimeout(() => {
32
+ t && i(t), t = null, s(l());
33
+ }, c);
30
34
  });
31
35
  };
32
36
  }
33
- function P(t, n = 200, r = {}) {
37
+ function g(...e) {
38
+ let r = 0, n, t = !0, o = m, i, f, l, c, u;
39
+ !D(e[0]) && typeof e[0] == "object" ? { delay: f, trailing: l = !0, leading: c = !0, rejectOnCancel: u = !1 } = e[0] : [f, l = !0, c = !0, u = !1] = e;
40
+ const s = () => {
41
+ n && (clearTimeout(n), n = void 0, o(), o = m);
42
+ };
43
+ return (j) => {
44
+ const a = d(f), w = Date.now() - r, p = () => i = j();
45
+ return s(), a <= 0 ? (r = Date.now(), p()) : (w > a && (c || !t) ? (r = Date.now(), p()) : l && (i = new Promise((T, y) => {
46
+ o = u ? y : T, n = setTimeout(() => {
47
+ r = Date.now(), t = !0, T(p()), s();
48
+ }, Math.max(0, a - w));
49
+ })), !c && !n && (n = setTimeout(() => t = !0, a)), t = !1, i);
50
+ };
51
+ }
52
+ function k(e, r = 200, n = {}) {
53
+ return h(
54
+ P(r, n),
55
+ e
56
+ );
57
+ }
58
+ function A(e, r = 200, n = !1, t = !0, o = !1) {
34
59
  return h(
35
- T(n, r),
36
- t
60
+ g(r, n, t, o),
61
+ e
37
62
  );
38
63
  }
39
64
  export {
40
65
  h as createFilterWrapper,
41
- T as debounceFilter,
66
+ P as debounceFilter,
67
+ G as isClient,
68
+ V as isObject,
42
69
  m as noop,
43
- f as toValue,
44
- P as useDebounceFn
70
+ g as throttleFilter,
71
+ d as toValue,
72
+ R as tryOnScopeDispose,
73
+ k as useDebounceFn,
74
+ A as useThrottleFn
45
75
  };
@@ -1,52 +1,109 @@
1
1
  import { useHttp as d } from "../composables/useHttp.js";
2
- import { QUERY_PARAMS as l, URLS as u } from "../enums/extensions/recommendationBlock.js";
3
- const R = (o) => o.reduce(
4
- (a, t, s) => (a[s] = {
5
- attributeName: t.attributeName,
6
- attributeJs: t.attributeJs,
7
- attributeType: t.attributeType,
8
- type: t.type,
9
- displayName: t.displayName,
10
- isFilterable: t.isFilterable
11
- }, a),
2
+ import { QUERY_PARAMS as m, URLS as s, RRS_EMAIL_ACTIVE_FILTER as A } from "../enums/extensions/recommendationBlock.js";
3
+ const h = (t) => {
4
+ if (Array.isArray(t))
5
+ return t;
6
+ const c = !!t && typeof t == "object" && "data" in t, o = t == null ? void 0 : t.data;
7
+ return Array.isArray(o) ? o : (t && (!c || o != null) && console.error("[Guido] Unexpected RRS payload shape, falling back to empty:", Object.keys(t)), []);
8
+ }, l = (t) => !t || typeof t != "object" ? null : "data" in t ? t.data ?? null : Object.keys(t).length ? t : null, f = (t) => t.reduce(
9
+ (c, o, i) => (c[i] = {
10
+ attributeName: o.attributeName,
11
+ attributeJs: o.attributeJs,
12
+ attributeType: o.attributeType,
13
+ type: o.type,
14
+ displayName: o.displayName,
15
+ isFilterable: o.isFilterable
16
+ }, c),
12
17
  {}
13
- ), f = () => {
14
- const { get: o } = d(), { get: a } = d({ headers: {} }), t = "6KcLM9TwheVB1mgK";
18
+ ), _ = () => {
19
+ const { get: t, post: c } = d(), { get: o } = d({ headers: {} }), i = "6KcLM9TwheVB1mgK";
15
20
  return {
21
+ duplicateStrategy: async (e) => {
22
+ try {
23
+ const { data: r } = await c(
24
+ s.STRATEGY_DUPLICATE_PATH.replace("{{id}}", e)
25
+ ), n = l(r) ?? r;
26
+ return !(n != null && n.strategyId) || n.status === !1 ? null : String(n.strategyId);
27
+ } catch (r) {
28
+ return console.error("duplicateStrategy error:", r), null;
29
+ }
30
+ },
16
31
  fetchRecommendationCreateData: async () => {
17
32
  try {
18
- return (await o("/newsletter/recommendations/create-data")).data;
33
+ return (await t("/newsletter/recommendations/create-data")).data;
19
34
  } catch (e) {
20
- throw console.error("fetchUserModalState error:", e), e;
35
+ throw console.error("fetchRecommendationCreateData error:", e), e;
21
36
  }
22
37
  },
23
38
  fetchRecommendationFilters: async () => {
24
39
  try {
25
- const { data: e } = await o(
26
- u.PRODUCT_ATTRIBUTES_PATH
27
- ), n = Array.isArray(e) ? e : (e == null ? void 0 : e.data) ?? [];
28
- return R(n);
40
+ const { data: e } = await t(
41
+ s.PRODUCT_ATTRIBUTES_PATH
42
+ ), r = Array.isArray(e) ? e : (e == null ? void 0 : e.data) ?? [];
43
+ return f(r);
29
44
  } catch (e) {
30
45
  throw console.error("fetchRecommendationFilters error:", e), e;
31
46
  }
32
47
  },
33
- fetchRecommendationProducts: async (e, n) => {
34
- var i;
48
+ fetchRecommendationProducts: async (e, r) => {
49
+ var n;
50
+ try {
51
+ const a = new URLSearchParams(Object.entries(r));
52
+ a.set(m.CLIENT_ID, i);
53
+ const R = decodeURIComponent(a.toString());
54
+ console.debug("🏁 Recommendation API Query:", R);
55
+ const u = await o(
56
+ `${s.RECOMMENDATION_API_URL}/v2/${e}?${R}`
57
+ );
58
+ return ((n = u == null ? void 0 : u.data) == null ? void 0 : n.data) ?? [];
59
+ } catch (a) {
60
+ throw console.error("fetchRecommendationProducts error:", a), a;
61
+ }
62
+ },
63
+ fetchRecommendationStrategies: async () => {
64
+ try {
65
+ const e = new URLSearchParams({ [m.FILTERS]: A }), { data: r } = await t(
66
+ `${s.RECOMMENDATION_STRATEGIES_PATH}/?${e.toString()}`
67
+ );
68
+ return h(r);
69
+ } catch (e) {
70
+ throw console.error("fetchRecommendationStrategies error:", e), e;
71
+ }
72
+ },
73
+ fetchStrategyCampaigns: async (e, r) => {
74
+ try {
75
+ const { data: n } = await t(
76
+ `${s.RECOMMENDATION_STRATEGIES_PATH}/${e}/campaigns`
77
+ );
78
+ return h(n).map((a) => ({
79
+ id: a.id,
80
+ name: a.name,
81
+ status: a.status,
82
+ variants: a.variants ?? [],
83
+ channel: r(`products.${a.productAlias}`),
84
+ productAlias: a.productAlias,
85
+ isPreventing: a.isPreventing
86
+ }));
87
+ } catch (n) {
88
+ return console.error("fetchStrategyCampaigns error:", n), [];
89
+ }
90
+ },
91
+ fetchStrategyRecommendationUrl: async (e) => {
35
92
  try {
36
- const r = new URLSearchParams(Object.entries(n));
37
- r.set(l.CLIENT_ID, t);
38
- const m = decodeURIComponent(r.toString());
39
- console.debug("🏁 Recommendation API Query:", m);
40
- const c = await a(
41
- `${u.RECOMMENDATION_API_URL}/v2/${e}?${m}`
93
+ const r = new URLSearchParams({ [m.STRATEGY_ID]: e }), { data: n } = await t(
94
+ `${s.STRATEGY_RECOMMENDATION_URL_PATH}?${r.toString()}`
42
95
  );
43
- return ((i = c == null ? void 0 : c.data) == null ? void 0 : i.data) ?? [];
96
+ return l(n);
44
97
  } catch (r) {
45
- throw console.error("fetchRecommendationProducts error:", r), r;
98
+ console.error("fetchStrategyRecommendationUrl error:", r);
99
+ const n = r == null ? void 0 : r.status;
100
+ if (typeof n == "number" && n >= 400 && n < 500)
101
+ return null;
102
+ throw r;
46
103
  }
47
104
  }
48
105
  };
49
106
  };
50
107
  export {
51
- f as useRecommendationApi
108
+ _ as useRecommendationApi
52
109
  };
@@ -377,6 +377,11 @@ export declare const FeaturesSchema: v.ObjectSchema<{
377
377
  readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
378
378
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
379
379
  readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
380
+ /**
381
+ * Select a Reusable Recommendation Strategy (RRS) instead of a per-block algorithm.
382
+ * Replaces the algorithm dropdown with a strategy dropdown fed from Smart Recommender.
383
+ */
384
+ readonly reusableRecommendationStrategy: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
380
385
  }, undefined>;
381
386
  /**
382
387
  * Default block types available in Stripo
@@ -764,6 +769,11 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
764
769
  readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
765
770
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
766
771
  readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
772
+ /**
773
+ * Select a Reusable Recommendation Strategy (RRS) instead of a per-block algorithm.
774
+ * Replaces the algorithm dropdown with a strategy dropdown fed from Smart Recommender.
775
+ */
776
+ readonly reusableRecommendationStrategy: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
767
777
  }, undefined>, {}>;
768
778
  /** Block configuration */
769
779
  readonly blocks: v.OptionalSchema<v.ObjectSchema<{
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
+ export default _default;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Body of the hover card shown beside an option in the strategy dropdown.
3
+ *
4
+ * `InSelect` renders this through an option's `infoBoxProps.slot`, so the card
5
+ * frame — title, "last updated", the View More button — comes from the design
6
+ * system and only these four rows are ours.
7
+ *
8
+ * Port of discovery-strategies-fe's `StrategyInfoBoxContent.composition.vue`; the
9
+ * row logic already lives in `buildStrategySummary`, which the detail drawer's
10
+ * algorithm/method helpers share.
11
+ */
12
+ import type { RrsStrategy } from '@@/Types/recommendation';
13
+ type __VLS_Props = {
14
+ strategy: RrsStrategy;
15
+ };
16
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
17
+ export default _default;
18
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
19
+ type __VLS_TypePropsToOption<T> = {
20
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
21
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
22
+ } : {
23
+ type: import('vue').PropType<T[K]>;
24
+ required: true;
25
+ };
26
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
+ export default _default;