@useinsider/guido 2.1.0-beta.786853a → 2.1.0-beta.7ae6573

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 (136) hide show
  1. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +15 -14
  2. package/dist/composables/useHtmlValidator.js +114 -104
  3. package/dist/composables/useRecommendation.js +54 -21
  4. package/dist/config/compiler/recommendationCompilerRules.js +45 -39
  5. package/dist/config/compiler/utils/recommendationCompilerUtils.js +116 -0
  6. package/dist/config/migrator/recommendationMigrator.js +2 -2
  7. package/dist/enums/extensions/recommendationBlock.js +1 -1
  8. package/dist/enums/recommendation.js +16 -15
  9. package/dist/extensions/Blocks/Recommendation/block.js +132 -9
  10. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +4 -0
  11. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +4 -0
  12. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +65 -0
  13. package/dist/extensions/Blocks/Recommendation/constants/layout.js +20 -0
  14. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +19 -0
  15. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +64 -0
  16. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +80 -0
  17. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +232 -0
  18. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +19 -0
  19. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +92 -0
  20. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +102 -0
  21. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +209 -0
  22. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +52 -0
  23. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +249 -0
  24. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +70 -0
  25. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +110 -0
  26. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +67 -0
  27. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +286 -0
  28. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +46 -0
  29. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +108 -0
  30. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +44 -0
  31. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +48 -0
  32. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.js → omnibusDiscount/textAfter.js} +16 -14
  33. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.js → omnibusDiscount/textBefore.js} +16 -14
  34. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +48 -0
  35. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.js → omnibusPrice/textAfter.js} +16 -14
  36. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.js → omnibusPrice/textBefore.js} +14 -12
  37. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +44 -0
  38. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +222 -0
  39. package/dist/extensions/Blocks/Recommendation/extension.js +40 -17
  40. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +19 -3
  41. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +13 -4
  42. package/dist/extensions/Blocks/Recommendation/services/configService.js +240 -0
  43. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +21 -10
  44. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +254 -207
  45. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +233 -0
  46. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +251 -0
  47. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +69 -0
  48. package/dist/extensions/Blocks/Recommendation/templates/index.js +12 -0
  49. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +174 -0
  50. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +73 -0
  51. package/dist/extensions/Blocks/Recommendation/templates/utils.js +118 -0
  52. package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +6 -0
  53. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +9 -9
  54. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +26 -15
  55. package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +29 -0
  56. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +46 -0
  57. package/dist/extensions/Blocks/controlFactories.js +125 -93
  58. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +223 -169
  59. package/dist/services/recommendationApi.js +11 -8
  60. package/dist/services/stripoApi.js +17 -20
  61. package/dist/services/templateLibraryApi.js +16 -13
  62. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
  63. package/dist/src/composables/useRecommendation.d.ts +1 -0
  64. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +17 -0
  65. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +67 -0
  66. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +13 -0
  67. package/dist/src/extensions/Blocks/Recommendation/{constants.d.ts → constants/controlIds.d.ts} +0 -24
  68. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +49 -0
  69. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +13 -0
  70. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +35 -0
  71. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +31 -0
  72. package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +143 -0
  73. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackground/index.d.ts +31 -0
  74. package/dist/src/extensions/Blocks/Recommendation/{cardCompositionControl.d.ts → controls/cardComposition/index.d.ts} +23 -3
  75. package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +35 -0
  76. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +21 -589
  77. package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +37 -0
  78. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +29 -0
  79. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +52 -0
  80. package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +22 -0
  81. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +79 -0
  82. package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +24 -0
  83. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +42 -0
  84. package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +23 -0
  85. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +214 -0
  86. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +97 -0
  87. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +34 -0
  88. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +95 -0
  89. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +100 -0
  90. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.d.ts +15 -0
  91. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.d.ts +15 -0
  92. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +100 -0
  93. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.d.ts +15 -0
  94. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.d.ts +15 -0
  95. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +95 -0
  96. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +83 -0
  97. package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +9 -0
  98. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +151 -0
  99. package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +6 -0
  100. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +138 -468
  101. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +20 -0
  102. package/dist/src/extensions/Blocks/Recommendation/templates/{migrationTemplate.d.ts → grid/migration.d.ts} +11 -4
  103. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +33 -0
  104. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +39 -0
  105. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +8 -0
  106. package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +25 -0
  107. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +18 -0
  108. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +57 -0
  109. package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +7 -0
  110. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +160 -0
  111. package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +33 -0
  112. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +113 -0
  113. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +77 -0
  114. package/dist/static/styles/components/notification.css.js +1 -0
  115. package/dist/static/styles/components/version-history.css.js +10 -2
  116. package/dist/static/styles/components/wide-panel.css.js +18 -2
  117. package/dist/static/styles/customEditorStyle.css.js +25 -2
  118. package/dist/utils/pairProductVariables.js +57 -56
  119. package/dist/utils/templatePreparation.js +15 -14
  120. package/package.json +1 -1
  121. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +0 -187
  122. package/dist/extensions/Blocks/Recommendation/constants.js +0 -13
  123. package/dist/extensions/Blocks/Recommendation/control.js +0 -336
  124. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +0 -68
  125. package/dist/extensions/Blocks/Recommendation/controls/index.js +0 -245
  126. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +0 -74
  127. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +0 -188
  128. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +0 -181
  129. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +0 -189
  130. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +0 -209
  131. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +0 -38
  132. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
  133. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +0 -16
  134. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +0 -52
  135. package/dist/static/templates/empty/index.html.js +0 -74
  136. package/dist/static/templates/empty/style.css.js +0 -779
@@ -1,8 +1,8 @@
1
1
  var h = Object.defineProperty;
2
2
  var T = (A, e, t) => e in A ? h(A, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : A[e] = t;
3
3
  var m = (A, e, t) => T(A, typeof e != "symbol" ? e + "" : e, t);
4
- import P, { prepareProductRows as S } from "../../extensions/Blocks/Recommendation/templates/migrationTemplate.js";
5
- import { getDefaultProducts as q } from "../../extensions/Blocks/Recommendation/templates/templateUtils.js";
4
+ import P, { prepareProductRows as S } from "../../extensions/Blocks/Recommendation/templates/grid/migration.js";
5
+ import { getDefaultProducts as q } from "../../extensions/Blocks/Recommendation/templates/utils.js";
6
6
  class w {
7
7
  constructor() {
8
8
  m(this, "parser");
@@ -1,5 +1,5 @@
1
1
  const s = {
2
- RECOMMENDATION_API_URL: "http://recommendationv2.api.useinsider.com"
2
+ RECOMMENDATION_API_URL: "https://recommendationv2.api.useinsider.com"
3
3
  }, i = [
4
4
  { id: 11, key: "similarViewed", name: "Viewed Together", path: "viewed-together" },
5
5
  { id: 12, key: "similarBought", name: "Purchased Together", path: "purchased-together" },
@@ -1,4 +1,4 @@
1
- const s = 20, e = 320, t = {
1
+ const e = 20, s = 320, t = "vertical", m = {
2
2
  CART_ABANDONMENT: {
3
3
  ins_apr_img_1: "https://s3-eu-west-1.amazonaws.com/web-image.useinsider.com/email-assets/dummyImages/ins_apr_img_1.png",
4
4
  ins_apr_img_2: "https://s3-eu-west-1.amazonaws.com/web-image.useinsider.com/email-assets/dummyImages/ins_apr_img_2.png",
@@ -15,7 +15,7 @@ const s = 20, e = 320, t = {
15
15
  DISCOUNT: "discount",
16
16
  OMNIBUS_DISCOUNT: "omnibus_discount",
17
17
  OMNIBUS_PRICE: "omnibus_price"
18
- }, m = {
18
+ }, _ = {
19
19
  IF: {
20
20
  discount: `{% if {${i.DISCOUNT}} != "0%" and {${i.DISCOUNT}} != "" %}`,
21
21
  omnibus_discount: `{% if {${i.DISCOUNT}} != "0%" and {${i.DISCOUNT}} != "" and {${i.OMNIBUS_DISCOUNT}} != "0%" and {${i.OMNIBUS_DISCOUNT}} != "" %}`,
@@ -23,17 +23,17 @@ const s = 20, e = 320, t = {
23
23
  },
24
24
  ELSE: "{% else %}",
25
25
  END_IF: "{% endif %}"
26
- }, _ = {
27
- ID: /ins-recommendation-v3-campaign-id="(.*?)"/gi,
28
- ATTRIBUTE_PARAGRAPH: /<p[^>]*?product-attr="(discount|omnibus_discount|omnibus_price)">[\S\s]*?<\/p>/gm,
29
- ATTRIBUTE_PARAGRAPH_START_TAG: /<p[^>]*?product-attr="(discount|omnibus_discount|omnibus_price)">/gm,
26
+ }, a = {
27
+ ID: /recommendation-id="(.*?)"/gi,
28
+ ATTRIBUTE_PARAGRAPH: /<p[^>]*?product-attr="(discount|omnibus_discount|omnibus_price)"[^>]*>[\S\s]*?<\/p>/gm,
29
+ ATTRIBUTE_PARAGRAPH_START_TAG: /<p[^>]*?product-attr="(discount|omnibus_discount|omnibus_price)"[^>]*>/gm,
30
30
  COMPOSITION: /composition="true"/gm,
31
31
  CUSTOM_FIELD: /{{[0-9]+_[0-8]_(discount|omnibus_discount|omnibus_price)}}/gm,
32
32
  CUSTOM_FIELD_INDEXES_PART: /{{[0-9]+_[0-8]_/gm,
33
33
  CUSTOM_FIELD_NAME_PART: /_(discount|omnibus_discount|omnibus_price)}}/gm
34
- }, a = {
35
- PARAGRAPH_END_TAG: "</p>"
36
34
  }, n = {
35
+ PARAGRAPH_END_TAG: "</p>"
36
+ }, o = {
37
37
  REGULAR_NAME_HEIGHT: ".ext-product-name.ins-vertical p { height:90px!important;",
38
38
  TRIMMED_NAME_HEIGHT: ".ext-product-name.ins-vertical p { height:18px!important;",
39
39
  ELLIPSIS: "text-overflow:ellipsis!important; white-space:nowrap!important;",
@@ -46,11 +46,12 @@ const s = 20, e = 320, t = {
46
46
  };
47
47
  export {
48
48
  i as ATTRIBUTES,
49
- m as CONDITIONS,
50
- n as CSS,
51
- t as DUMMY_IMAGE_MAPPINGS,
52
- s as DefaultPadding,
53
- a as HTML,
54
- e as MinDeviceViewport,
55
- _ as REGEX
49
+ _ as CONDITIONS,
50
+ o as CSS,
51
+ m as DUMMY_IMAGE_MAPPINGS,
52
+ e as DefaultPadding,
53
+ n as HTML,
54
+ s as MinDeviceViewport,
55
+ a as REGEX,
56
+ t as VerticalOrientation
56
57
  };
@@ -1,18 +1,28 @@
1
- import { Block as e, BlockCompositionType as t } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { getDefaultTemplate as o } from "./templates/blockTemplate.js";
3
- const n = "recommendation-block";
4
- class m extends e {
1
+ var u = Object.defineProperty;
2
+ var p = (r, o, t) => o in r ? u(r, o, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[o] = t;
3
+ var g = (r, o, t) => p(r, typeof o != "symbol" ? o + "" : o, t);
4
+ import { Block as f, BlockCompositionType as I, ModificationDescription as h } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ import { RecommendationConfigService as c } from "./services/configService.js";
6
+ import { useRecommendationExtensionStore as d } from "./store/recommendation.js";
7
+ import { getDefaultTemplate as _ } from "./templates/grid/template.js";
8
+ const k = "recommendation-block", s = "ins-recommendation-v3-block-v2", a = "recommendation-id";
9
+ class b extends f {
5
10
  constructor() {
6
11
  super();
12
+ /**
13
+ * Stores the ID generated in getTemplate() so onCreated() can reuse it.
14
+ * This avoids generating a new (different) ID in onCreated().
15
+ */
16
+ g(this, "_pendingBlockId", null);
7
17
  }
8
18
  getId() {
9
- return n;
19
+ return k;
10
20
  }
11
21
  getIcon() {
12
22
  return "recommendation-icon";
13
23
  }
14
24
  getBlockCompositionType() {
15
- return t.CONTAINER;
25
+ return I.CONTAINER;
16
26
  }
17
27
  getName() {
18
28
  return this.api.translate("Recommendation Block");
@@ -20,11 +30,124 @@ class m extends e {
20
30
  getDescription() {
21
31
  return this.api.translate("Recommendation Block Title Description");
22
32
  }
33
+ /**
34
+ * Returns the template HTML for a new recommendation block.
35
+ * Generates a unique recommendation ID and embeds the instance class
36
+ * (ins-recommendation-v3-block-{id}) directly in the template HTML.
37
+ * This is necessary because Stripo's Angular rendering manages the class
38
+ * attribute and overwrites dynamically added classes via setAttribute.
39
+ */
23
40
  getTemplate() {
24
- return o();
41
+ const t = this._generateNextId();
42
+ return this._pendingBlockId = t, _(t);
43
+ }
44
+ /**
45
+ * Called when a new block is dropped into the template
46
+ *
47
+ * Uses the ID from getTemplate() (which already embedded the instance class)
48
+ * and assigns the recommendation-id attribute + initializes configuration.
49
+ * @param node - The newly created block node
50
+ */
51
+ onCreated(t) {
52
+ const e = this._pendingBlockId ?? this._generateNextId();
53
+ this._pendingBlockId = null, this._assignRecommendationId(t, e);
54
+ const n = c.initializeConfig(this.api, t, { recommendationId: e }), i = d();
55
+ i.setCurrentBlock(e), i.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 });
56
+ }
57
+ /**
58
+ * Called when the document changes or template is loaded
59
+ *
60
+ * Handles migration from legacy templates that don't have node config
61
+ * and assigns recommendation-id to legacy blocks that lack one.
62
+ * @param node - The block node that may need migration
63
+ */
64
+ onDocumentChanged(t) {
65
+ if (!(!t || !("getNodeConfig" in t))) {
66
+ if (!this._getRecommendationId(t)) {
67
+ const e = this._generateNextId();
68
+ this._assignRecommendationId(t, e), c.hasConfig(t) && c.updateConfig(
69
+ this.api,
70
+ t,
71
+ { recommendationId: e },
72
+ "Assign recommendation ID to legacy block"
73
+ );
74
+ }
75
+ c.needsMigration(t) && this._migrateFromLegacy(t);
76
+ }
77
+ }
78
+ /**
79
+ * Called when a block is deleted from the template
80
+ *
81
+ * Cleans up the per-block state from the Pinia store.
82
+ * @param node - The block node being deleted
83
+ */
84
+ onDelete(t) {
85
+ const e = this._getRecommendationId(t);
86
+ e && d().removeBlockState(e);
87
+ }
88
+ /**
89
+ * Generates the next unique recommendation ID by scanning all existing blocks
90
+ * in the document and finding the maximum existing ID + 1.
91
+ */
92
+ _generateNextId() {
93
+ let t = 0;
94
+ try {
95
+ const e = this.api.getDocumentRoot();
96
+ e && "querySelectorAll" in e && e.querySelectorAll(`.${s}`).forEach((i) => {
97
+ if ("getAttribute" in i) {
98
+ const m = i.getAttribute(a), l = m ? parseInt(m) : 0;
99
+ l > t && (t = l);
100
+ }
101
+ });
102
+ } catch {
103
+ }
104
+ return t + 1;
105
+ }
106
+ /**
107
+ * Assigns a recommendation-id attribute to the block element.
108
+ * The instance class (ins-recommendation-v3-block-{id}) is embedded in the template
109
+ * HTML by getTemplate(), since Stripo's Angular rendering overwrites dynamically
110
+ * added classes via setAttribute.
111
+ */
112
+ _assignRecommendationId(t, e) {
113
+ const n = this._getBlockElement(t);
114
+ if (!n)
115
+ return;
116
+ const i = this.api.getDocumentModifier();
117
+ i.modifyHtml(n).setAttribute(a, e.toString()), i.apply(new h(`Assign recommendation ID ${e}`));
118
+ }
119
+ /**
120
+ * Gets the recommendation-id from a block node
121
+ */
122
+ _getRecommendationId(t) {
123
+ const e = this._getBlockElement(t);
124
+ if (!e || !("getAttribute" in e))
125
+ return null;
126
+ const n = e.getAttribute(a);
127
+ if (!n)
128
+ return null;
129
+ const i = parseInt(n);
130
+ return Number.isNaN(i) ? null : i;
131
+ }
132
+ /**
133
+ * Gets the block element (the element with BLOCK_CLASS)
134
+ */
135
+ _getBlockElement(t) {
136
+ if ("getAttribute" in t) {
137
+ const e = t.getAttribute("class");
138
+ if (e && e.includes(s))
139
+ return t;
140
+ }
141
+ return "querySelector" in t ? t.querySelector(`.${s}`) : null;
142
+ }
143
+ /**
144
+ * Migrate configuration from legacy format
145
+ */
146
+ _migrateFromLegacy(t) {
147
+ c.migrateFromDataAttributes(this.api, t);
25
148
  }
26
149
  }
27
150
  export {
28
- n as BLOCK_ID,
29
- m as RecommendationBlock
151
+ k as BLOCK_ID,
152
+ b as RecommendationBlock
30
153
  };
@@ -0,0 +1,4 @@
1
+ var b = /* @__PURE__ */ ((r) => (r.BUTTON = "recommendation-block-button", r.NAME = "recommendation-block-name", r.PRICE = "recommendation-block-price", r.OLD_PRICE = "recommendation-block-old-price", r.OMNIBUS_PRICE = "recommendation-block-omnibus-price", r.OMNIBUS_DISCOUNT = "recommendation-block-omnibus-discount", r.IMAGE = "recommendation-block-image", r))(b || {});
2
+ export {
3
+ b as RecommendationBlockId
4
+ };
@@ -0,0 +1,4 @@
1
+ var o = /* @__PURE__ */ ((c) => (c.BUTTON_ALIGN = "recommendation-block-button-align-control", c.BUTTON_BORDER = "recommendation-block-button-border-control", c.BUTTON_BORDER_RADIUS = "recommendation-block-button-border-radius-control", c.BUTTON_COLOR = "recommendation-block-button-color-control", c.BUTTON_FIT_TO_CONTENT = "recommendation-block-button-fit-to-content-control", c.BUTTON_FONT_FAMILY = "recommendation-block-button-font-family-control", c.BUTTON_MARGINS = "recommendation-block-button-margins-control", c.BUTTON_PADDINGS = "recommendation-block-button-paddings-control", c.BUTTON_TEXT = "recommendation-block-button-text-control", c.BUTTON_TEXT_SIZE = "recommendation-block-button-text-size-control", c.BUTTON_TEXT_STYLE_AND_FONT_COLOR = "recommendation-block-button-text-style-and-font-color-control", c.NAME_ALIGN = "recommendation-block-name-align-control", c.NAME_BACKGROUND = "recommendation-block-name-background-control", c.NAME_COLOR = "recommendation-block-name-color-control", c.NAME_FONT_FAMILY = "recommendation-block-name-font-family-control", c.NAME_PADDINGS = "recommendation-block-name-paddings-control", c.NAME_SIZE = "recommendation-block-name-size-control", c.NAME_STYLE = "recommendation-block-name-style-control", c.NAME_TEXT_TRIM = "recommendation-block-name-text-trim-control", c.PRICE_ALIGN = "recommendation-block-price-align-control", c.PRICE_BACKGROUND = "recommendation-block-price-background-control", c.PRICE_COLOR = "recommendation-block-price-color-control", c.PRICE_FONT_FAMILY = "recommendation-block-price-font-family-control", c.PRICE_PADDINGS = "recommendation-block-price-paddings-control", c.PRICE_SIZE = "recommendation-block-price-size-control", c.PRICE_STYLE = "recommendation-block-price-style-control", c.OLD_PRICE_ALIGN = "recommendation-block-old-price-align-control", c.OLD_PRICE_BACKGROUND = "recommendation-block-old-price-background-control", c.OLD_PRICE_COLOR = "recommendation-block-old-price-color-control", c.OLD_PRICE_FONT_FAMILY = "recommendation-block-old-price-font-family-control", c.OLD_PRICE_PADDINGS = "recommendation-block-old-price-paddings-control", c.OLD_PRICE_SIZE = "recommendation-block-old-price-size-control", c.OLD_PRICE_STYLE = "recommendation-block-old-price-style-control", c.OMNIBUS_PRICE_ALIGN = "recommendation-block-omnibus-price-align-control", c.OMNIBUS_PRICE_BACKGROUND = "recommendation-block-omnibus-price-background-control", c.OMNIBUS_PRICE_COLOR = "recommendation-block-omnibus-price-color-control", c.OMNIBUS_PRICE_FONT_FAMILY = "recommendation-block-omnibus-price-font-family-control", c.OMNIBUS_PRICE_PADDINGS = "recommendation-block-omnibus-price-paddings-control", c.OMNIBUS_PRICE_SIZE = "recommendation-block-omnibus-price-size-control", c.OMNIBUS_PRICE_STYLE = "recommendation-block-omnibus-price-style-control", c.OMNIBUS_PRICE_TEXT_BEFORE = "recommendation-block-omnibus-price-text-before-control", c.OMNIBUS_PRICE_TEXT_AFTER = "recommendation-block-omnibus-price-text-after-control", c.OMNIBUS_DISCOUNT_ALIGN = "recommendation-block-omnibus-discount-align-control", c.OMNIBUS_DISCOUNT_BACKGROUND = "recommendation-block-omnibus-discount-background-control", c.OMNIBUS_DISCOUNT_COLOR = "recommendation-block-omnibus-discount-color-control", c.OMNIBUS_DISCOUNT_FONT_FAMILY = "recommendation-block-omnibus-discount-font-family-control", c.OMNIBUS_DISCOUNT_PADDINGS = "recommendation-block-omnibus-discount-paddings-control", c.OMNIBUS_DISCOUNT_SIZE = "recommendation-block-omnibus-discount-size-control", c.OMNIBUS_DISCOUNT_STYLE = "recommendation-block-omnibus-discount-style-control", c.OMNIBUS_DISCOUNT_TEXT_BEFORE = "recommendation-block-omnibus-discount-text-before-control", c.OMNIBUS_DISCOUNT_TEXT_AFTER = "recommendation-block-omnibus-discount-text-after-control", c.IMAGE_SIZE = "recommendation-block-image-size-control", c.IMAGE_MARGINS = "recommendation-block-image-margins-control", c))(o || {});
2
+ export {
3
+ o as RecommendationControlId
4
+ };
@@ -0,0 +1,65 @@
1
+ import { DEFAULT_ROW_SPACING as n, DEFAULT_COLUMN_SPACING as s, DEFAULT_CARDS_IN_ROW as R } from "./layout.js";
2
+ import { ATTR_PRODUCT_IMAGE as t, ATTR_PRODUCT_NAME as e, ATTR_PRODUCT_OLD_PRICE as o, ATTR_PRODUCT_PRICE as T, ATTR_PRODUCT_OMNIBUS_PRICE as _, ATTR_PRODUCT_OMNIBUS_DISCOUNT as r, ATTR_PRODUCT_BUTTON as U } from "./selectors.js";
3
+ const I = {
4
+ code: "USD",
5
+ symbol: "USD",
6
+ alignment: "after",
7
+ decimalCount: 2,
8
+ decimalSeparator: ".",
9
+ thousandSeparator: ","
10
+ }, i = {
11
+ textBefore: "",
12
+ textAfter: ""
13
+ }, O = {
14
+ textBefore: "",
15
+ textAfter: ""
16
+ }, C = [
17
+ t,
18
+ e,
19
+ o,
20
+ T,
21
+ _,
22
+ r,
23
+ U
24
+ ], D = {
25
+ [t]: !0,
26
+ [e]: !0,
27
+ [T]: !0,
28
+ [o]: !0,
29
+ [_]: !1,
30
+ [r]: !1,
31
+ [U]: !0
32
+ }, a = {
33
+ // Settings
34
+ strategy: "mostPopular",
35
+ productIds: [],
36
+ size: "6",
37
+ shuffleProducts: !1,
38
+ language: "en_US",
39
+ currency: I,
40
+ filters: [],
41
+ // Layout
42
+ layout: "grid",
43
+ cardsInRow: R,
44
+ columnSpacing: s,
45
+ rowSpacing: n,
46
+ // Composition
47
+ composition: C,
48
+ visibility: D,
49
+ // Element settings
50
+ omnibusPrice: i,
51
+ omnibusDiscount: O,
52
+ textTrimming: !1,
53
+ // Meta
54
+ configVersion: 1,
55
+ recommendationId: 0
56
+ }, E = 1;
57
+ export {
58
+ E as CURRENT_CONFIG_VERSION,
59
+ C as DEFAULT_COMPOSITION,
60
+ I as DEFAULT_CURRENCY,
61
+ a as DEFAULT_NODE_CONFIG,
62
+ O as DEFAULT_OMNIBUS_DISCOUNT,
63
+ i as DEFAULT_OMNIBUS_PRICE,
64
+ D as DEFAULT_VISIBILITY
65
+ };
@@ -0,0 +1,20 @@
1
+ const _ = {
2
+ GRID: "grid",
3
+ LIST: "list"
4
+ }, o = [
5
+ { icon: "grid-orientation", value: _.GRID },
6
+ { icon: "list-orientation", value: _.LIST }
7
+ ], t = 3, n = 3, A = 9, T = 4, c = 10, s = 20, O = 0, S = 50, I = 5;
8
+ export {
9
+ n as DEFAULT_CARDS_IN_ROW,
10
+ c as DEFAULT_COLUMN_SPACING,
11
+ t as DEFAULT_PRODUCTS_PER_ROW,
12
+ s as DEFAULT_ROW_SPACING,
13
+ o as LAYOUT_OPTIONS,
14
+ _ as LAYOUT_VALUES,
15
+ T as MAX_PRODUCTS_PER_ROW,
16
+ A as MAX_PRODUCT_COUNT,
17
+ S as MAX_SPACING,
18
+ O as MIN_SPACING,
19
+ I as SPACING_STEP
20
+ };
@@ -0,0 +1,19 @@
1
+ const c = ".ins-recommendation-product-container", T = {
2
+ CURRENCY: "currency",
3
+ SYMBOL: "currency-symbol",
4
+ ALIGNMENT: "currency-alignment",
5
+ THOUSAND_SEPARATOR: "currency-thousand-separator",
6
+ DECIMAL_SEPARATOR: "currency-decimal-separator",
7
+ DECIMAL_COUNT: "currency-decimal-count"
8
+ }, r = "productImage", n = "productName", o = "productPrice", t = "productOldPrice", R = "productOmnibusPrice", O = "productOmnibusDiscount", _ = "productButton";
9
+ export {
10
+ _ as ATTR_PRODUCT_BUTTON,
11
+ r as ATTR_PRODUCT_IMAGE,
12
+ n as ATTR_PRODUCT_NAME,
13
+ t as ATTR_PRODUCT_OLD_PRICE,
14
+ O as ATTR_PRODUCT_OMNIBUS_DISCOUNT,
15
+ R as ATTR_PRODUCT_OMNIBUS_PRICE,
16
+ o as ATTR_PRODUCT_PRICE,
17
+ c as CONTAINER_SELECTOR,
18
+ T as CURRENCY_ATTR
19
+ };
@@ -0,0 +1,64 @@
1
+ import { createButtonFitToContainerControl as T, createButtonTextStyleAndFontColorControl as r, createButtonTextSizeControl as e, createButtonTextControl as B, createButtonPaddingsControl as l, createButtonMarginsControl as C, createButtonFontFamilyControl as O, createButtonColorControl as N, createButtonBorderRadiusControl as i, createButtonBorderControl as a, createButtonAlignControl as c } from "../../../controlFactories.js";
2
+ import { RecommendationBlockId as o } from "../../constants/blockIds.js";
3
+ import { RecommendationControlId as t } from "../../constants/controlIds.js";
4
+ import { CONTAINER_SELECTOR as n } from "../../constants/selectors.js";
5
+ const U = c(
6
+ t.BUTTON_ALIGN,
7
+ o.BUTTON,
8
+ n
9
+ ), d = a(
10
+ t.BUTTON_BORDER,
11
+ o.BUTTON,
12
+ n
13
+ ), s = i(
14
+ t.BUTTON_BORDER_RADIUS,
15
+ o.BUTTON,
16
+ n
17
+ ), _ = N(
18
+ t.BUTTON_COLOR,
19
+ o.BUTTON,
20
+ n
21
+ ), m = O(
22
+ t.BUTTON_FONT_FAMILY,
23
+ o.BUTTON,
24
+ n
25
+ ), u = C(
26
+ t.BUTTON_MARGINS,
27
+ o.BUTTON,
28
+ n
29
+ ), R = l(
30
+ t.BUTTON_PADDINGS,
31
+ o.BUTTON,
32
+ n
33
+ ), F = B(
34
+ t.BUTTON_TEXT,
35
+ o.BUTTON,
36
+ n
37
+ ), A = e(
38
+ t.BUTTON_TEXT_SIZE,
39
+ o.BUTTON,
40
+ n
41
+ ), S = r(
42
+ t.BUTTON_TEXT_STYLE_AND_FONT_COLOR,
43
+ o.BUTTON,
44
+ n
45
+ ), E = T(
46
+ t.BUTTON_FIT_TO_CONTENT,
47
+ o.BUTTON,
48
+ n
49
+ ), p = {
50
+ align: U,
51
+ border: d,
52
+ borderRadius: s,
53
+ color: _,
54
+ fontFamily: m,
55
+ margins: u,
56
+ paddings: R,
57
+ text: F,
58
+ textSize: A,
59
+ textStyleAndFontColor: S,
60
+ fitToContent: E
61
+ };
62
+ export {
63
+ p as ButtonControls
64
+ };
@@ -0,0 +1,80 @@
1
+ import { ModificationDescription as d } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as s } from "../../../common-control.js";
3
+ import { getCurrentLayout as l } from "../main/utils.js";
4
+ const u = "recommendation-card-background-color-control", e = {
5
+ CARD_BACKGROUND_COLOR: "cardBackgroundColor"
6
+ }, a = {
7
+ GRID: ".product-card-segment",
8
+ LIST: ".product-card-wrapper"
9
+ };
10
+ class _ extends s {
11
+ getId() {
12
+ return u;
13
+ }
14
+ getTemplate() {
15
+ return `
16
+ <div class="card-bg-control-container">
17
+ ${this._GuTwoColumns([
18
+ this._GuLabel({ text: "Card Background Color" }),
19
+ this._GuColorPicker(e.CARD_BACKGROUND_COLOR)
20
+ ])}
21
+ </div>
22
+ `;
23
+ }
24
+ onRender() {
25
+ this._setFormValues(), this._listenToFormUpdates();
26
+ }
27
+ onTemplateNodeUpdated(r) {
28
+ super.onTemplateNodeUpdated(r), this._setFormValues();
29
+ }
30
+ _setFormValues() {
31
+ const r = this._getCurrentCardBackgroundColor();
32
+ this.api.updateValues({
33
+ [e.CARD_BACKGROUND_COLOR]: r
34
+ });
35
+ }
36
+ /**
37
+ * Gets the appropriate selector based on layout
38
+ * Grid: .product-card-segment (inner table per product cell)
39
+ * List: .product-card-wrapper (table per product row)
40
+ */
41
+ _getCardSelector() {
42
+ return l(this.currentNode) === "grid" ? a.GRID : a.LIST;
43
+ }
44
+ /**
45
+ * Reads the current background color from the first product card element
46
+ * @returns The background color value or 'transparent' if not found
47
+ */
48
+ _getCurrentCardBackgroundColor() {
49
+ if (!this.currentNode || !("querySelectorAll" in this.currentNode))
50
+ return "transparent";
51
+ const r = this._getCardSelector(), t = this.currentNode.querySelector(r);
52
+ return !t || !("getStyle" in t) ? "transparent" : t.getStyle("background-color") || "transparent";
53
+ }
54
+ /**
55
+ * Handles card background color changes
56
+ * Applies the color to all product card elements based on layout
57
+ */
58
+ _onCardBackgroundColorChange(r) {
59
+ if (!this.currentNode || !("querySelectorAll" in this.currentNode))
60
+ return;
61
+ const t = this._getCardSelector(), o = Array.from(
62
+ this.currentNode.querySelectorAll(t)
63
+ );
64
+ if (o.length === 0)
65
+ return;
66
+ const n = this.api.getDocumentModifier();
67
+ o.forEach((c) => {
68
+ n.modifyHtml(c).setStyle("background-color", r);
69
+ }), n.apply(new d("Update card background color"));
70
+ }
71
+ _listenToFormUpdates() {
72
+ this.api.onValueChanged(e.CARD_BACKGROUND_COLOR, (r) => {
73
+ this._onCardBackgroundColorChange(r);
74
+ });
75
+ }
76
+ }
77
+ export {
78
+ u as CARD_BACKGROUND_COLOR_CONTROL_ID,
79
+ _ as CardBackgroundColorControl
80
+ };