@useinsider/guido 2.1.0-beta.aa05b06 → 2.1.0-beta.abc38f2

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 (200) hide show
  1. package/dist/@types/config/schemas.js +1 -1
  2. package/dist/components/organisms/base/Toaster.vue.js +4 -4
  3. package/dist/components/organisms/base/Toaster.vue2.js +12 -9
  4. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +5 -5
  5. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue2.js +2 -2
  6. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +11 -13
  7. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +54 -23
  8. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue.js +7 -5
  9. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +37 -23
  10. package/dist/components/organisms/extensions/recommendation/Filters.vue.js +11 -11
  11. package/dist/components/organisms/extensions/recommendation/Filters.vue2.js +48 -36
  12. package/dist/components/organisms/extensions/recommendation/LogicAdapter.vue2.js +11 -9
  13. package/dist/components/organisms/header/EditorActions.vue.js +10 -8
  14. package/dist/components/organisms/header/EditorActions.vue2.js +40 -30
  15. package/dist/components/organisms/header/MigrationConfirmModal.vue.js +17 -0
  16. package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +39 -0
  17. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  18. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  19. package/dist/composables/useBlocksConfig.js +21 -20
  20. package/dist/composables/useHtmlValidator.js +114 -104
  21. package/dist/composables/useRecommendation.js +54 -21
  22. package/dist/composables/useStripo.js +25 -23
  23. package/dist/composables/useVersionHistoryApi.js +1 -1
  24. package/dist/config/compiler/recommendationCompilerRules.js +45 -39
  25. package/dist/config/compiler/utils/recommendationCompilerUtils.js +121 -0
  26. package/dist/config/i18n/en/index.js +11 -0
  27. package/dist/config/i18n/en/labels.json.js +12 -0
  28. package/dist/config/i18n/en/toasters.json.js +56 -0
  29. package/dist/config/i18n/en/tooltips.json.js +82 -0
  30. package/dist/config/i18n/index.js +7 -0
  31. package/dist/config/migrator/itemsBlockMigrator.js +129 -120
  32. package/dist/config/migrator/recommendationMigrator.js +58 -54
  33. package/dist/enums/block.js +4 -0
  34. package/dist/enums/extensions/recommendationBlock.js +1 -1
  35. package/dist/enums/recommendation.js +16 -15
  36. package/dist/extensions/Blocks/Items/block.js +30 -21
  37. package/dist/extensions/Blocks/Items/iconsRegistry.js +7 -6
  38. package/dist/extensions/Blocks/Items/items.css.js +48 -0
  39. package/dist/extensions/Blocks/Recommendation/block.js +142 -9
  40. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +4 -0
  41. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +4 -0
  42. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +66 -0
  43. package/dist/extensions/Blocks/Recommendation/constants/layout.js +22 -0
  44. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +21 -0
  45. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +64 -0
  46. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +80 -0
  47. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +232 -0
  48. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +19 -0
  49. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +92 -0
  50. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +102 -0
  51. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +209 -0
  52. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +52 -0
  53. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +269 -0
  54. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +70 -0
  55. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +160 -0
  56. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +67 -0
  57. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +307 -0
  58. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +21 -0
  59. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +46 -0
  60. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +108 -0
  61. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +44 -0
  62. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +48 -0
  63. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.js → omnibusDiscount/textAfter.js} +16 -14
  64. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.js → omnibusDiscount/textBefore.js} +16 -14
  65. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +48 -0
  66. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.js → omnibusPrice/textAfter.js} +16 -14
  67. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.js → omnibusPrice/textBefore.js} +14 -12
  68. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +44 -0
  69. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +222 -0
  70. package/dist/extensions/Blocks/Recommendation/extension.js +40 -17
  71. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +21 -4
  72. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +61 -4
  73. package/dist/extensions/Blocks/Recommendation/services/configService.js +240 -0
  74. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +21 -10
  75. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +311 -218
  76. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +228 -0
  77. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +251 -0
  78. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +66 -0
  79. package/dist/extensions/Blocks/Recommendation/templates/index.js +12 -0
  80. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +169 -0
  81. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +73 -0
  82. package/dist/extensions/Blocks/Recommendation/templates/utils.js +134 -0
  83. package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +6 -0
  84. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +12 -12
  85. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +26 -15
  86. package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +29 -0
  87. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +46 -0
  88. package/dist/extensions/Blocks/Recommendation/validation/filterSchema.js +29 -0
  89. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  90. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  91. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  92. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  93. package/dist/extensions/Blocks/common-control.js +12 -4
  94. package/dist/extensions/Blocks/controlFactories.js +125 -93
  95. package/dist/extensions/ModulesTabIcons/extension.js +3 -3
  96. package/dist/guido.css +1 -1
  97. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +242 -186
  98. package/dist/services/recommendationApi.js +11 -8
  99. package/dist/services/stripoApi.js +20 -17
  100. package/dist/services/templateLibraryApi.js +16 -13
  101. package/dist/src/@types/extensions/block.d.ts +2 -0
  102. package/dist/src/components/Guido.vue.d.ts +1 -1
  103. package/dist/src/components/organisms/extensions/recommendation/FilterItem.vue.d.ts +1 -0
  104. package/dist/src/components/organisms/extensions/recommendation/Filters.vue.d.ts +17 -1
  105. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  106. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  107. package/dist/src/components/organisms/header/MigrationConfirmModal.vue.d.ts +6 -0
  108. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  109. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
  110. package/dist/src/components/wrappers/WpModal.vue.d.ts +2 -2
  111. package/dist/src/composables/useRecommendation.d.ts +1 -0
  112. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +17 -0
  113. package/dist/src/config/i18n/en/index.d.ts +1 -0
  114. package/dist/src/config/i18n/index.d.ts +16 -0
  115. package/dist/src/enums/block.d.ts +4 -0
  116. package/dist/src/extensions/Blocks/Items/block.d.ts +3 -1
  117. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +70 -1
  118. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +13 -0
  119. package/dist/src/extensions/Blocks/Recommendation/{constants.d.ts → constants/controlIds.d.ts} +0 -24
  120. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +49 -0
  121. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +13 -0
  122. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +41 -0
  123. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +35 -0
  124. package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +143 -0
  125. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackground/index.d.ts +31 -0
  126. package/dist/src/extensions/Blocks/Recommendation/{cardCompositionControl.d.ts → controls/cardComposition/index.d.ts} +23 -3
  127. package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +35 -0
  128. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +21 -589
  129. package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +37 -0
  130. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +29 -0
  131. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +52 -0
  132. package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +22 -0
  133. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +84 -0
  134. package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +24 -0
  135. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +60 -0
  136. package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +23 -0
  137. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +221 -0
  138. package/dist/src/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.d.ts +29 -0
  139. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +97 -0
  140. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +34 -0
  141. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +95 -0
  142. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +100 -0
  143. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.d.ts +15 -0
  144. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.d.ts +15 -0
  145. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +100 -0
  146. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.d.ts +15 -0
  147. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.d.ts +15 -0
  148. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +95 -0
  149. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +83 -0
  150. package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +9 -0
  151. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +151 -0
  152. package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +6 -0
  153. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +154 -468
  154. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +20 -0
  155. package/dist/src/extensions/Blocks/Recommendation/templates/{migrationTemplate.d.ts → grid/migration.d.ts} +11 -4
  156. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +33 -0
  157. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +41 -0
  158. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +8 -0
  159. package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +25 -0
  160. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +18 -0
  161. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +66 -0
  162. package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +7 -0
  163. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +166 -0
  164. package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +33 -0
  165. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +113 -0
  166. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +77 -0
  167. package/dist/src/extensions/Blocks/Recommendation/validation/filterSchema.d.ts +15 -0
  168. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  169. package/dist/src/extensions/Blocks/common-control.d.ts +5 -0
  170. package/dist/src/stores/template.d.ts +29 -0
  171. package/dist/src/utils/migrationBannerHtml.d.ts +2 -0
  172. package/dist/static/assets/info.svg.js +5 -0
  173. package/dist/static/styles/components/notification.css.js +19 -0
  174. package/dist/static/styles/components/tools.css.js +6 -2
  175. package/dist/static/styles/components/version-history.css.js +10 -2
  176. package/dist/static/styles/components/wide-panel.css.js +18 -2
  177. package/dist/static/styles/customEditorStyle.css.js +35 -11
  178. package/dist/static/styles/variables.css.js +2 -0
  179. package/dist/static/templates/empty/index.html.js +74 -0
  180. package/dist/static/templates/empty/style.css.js +779 -0
  181. package/dist/stores/template.js +15 -0
  182. package/dist/stores/unsubscribe.js +37 -34
  183. package/dist/utils/migrationBannerHtml.js +21 -0
  184. package/dist/utils/pairProductVariables.js +57 -56
  185. package/dist/utils/templatePreparation.js +15 -14
  186. package/package.json +2 -2
  187. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +0 -187
  188. package/dist/extensions/Blocks/Recommendation/constants.js +0 -13
  189. package/dist/extensions/Blocks/Recommendation/control.js +0 -336
  190. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +0 -68
  191. package/dist/extensions/Blocks/Recommendation/controls/index.js +0 -245
  192. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +0 -74
  193. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +0 -188
  194. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +0 -181
  195. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +0 -189
  196. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +0 -209
  197. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +0 -38
  198. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
  199. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +0 -16
  200. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +0 -52
@@ -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,20 @@
1
- import { useOnboardingStore as d } from "../../../stores/onboarding.js";
2
- import { Block as g, BlockCompositionType as f, ModificationDescription as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
3
- import { SETTINGS_ENUMS as c, DefaultConfigValues as i } from "./enums/settingsEnums.js";
4
- import { getDefaultTemplate as p } from "./template.js";
5
- import { getItemsBlockContainer as u, getItemsBlockConfig as C, getDefaultItemsBlockConfig as I } from "./utils/nodeConfigUtils.js";
6
- const y = "items-block";
7
- class B extends g {
1
+ import { BlockId as g } from "../../../enums/block.js";
2
+ import { useOnboardingStore as p } from "../../../stores/onboarding.js";
3
+ import { getMigrationBannerHtml as f } from "../../../utils/migrationBannerHtml.js";
4
+ import { Block as u, BlockCompositionType as I, ModificationDescription as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ import { SETTINGS_ENUMS as a, DefaultConfigValues as i } from "./enums/settingsEnums.js";
6
+ import { getDefaultTemplate as C } from "./template.js";
7
+ import { getItemsBlockContainer as y, getItemsBlockConfig as b, getDefaultItemsBlockConfig as h } from "./utils/nodeConfigUtils.js";
8
+ const c = g.Items;
9
+ class E extends u {
8
10
  getId() {
9
- return y;
11
+ return c;
10
12
  }
11
13
  getIcon() {
12
14
  return "items-icon";
13
15
  }
14
16
  getBlockCompositionType() {
15
- return f.CONTAINER;
17
+ return I.CONTAINER;
16
18
  }
17
19
  getName() {
18
20
  return this.api.translate("Items");
@@ -20,10 +22,17 @@ class B extends g {
20
22
  getDescription() {
21
23
  return this.api.translate("Items lets you display personalized products based on user behavior.");
22
24
  }
25
+ getSettingsPanelTitleHtml() {
26
+ return f(
27
+ c,
28
+ this.api.translate("Items"),
29
+ this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Items block and test your message to ensure it works properly.")
30
+ );
31
+ }
23
32
  getTemplate() {
24
- return p({
25
- orientation: c.ORIENTATION.VERTICAL,
26
- itemsType: c.ITEMS_TYPE.CART_ITEMS,
33
+ return C({
34
+ orientation: a.ORIENTATION.VERTICAL,
35
+ itemsType: a.ITEMS_TYPE.CART_ITEMS,
27
36
  itemId: "{{Abandoned Cart Item (1) Url}}",
28
37
  currencySymbol: i.productPriceCurrencySymbolControlValue,
29
38
  currencyLocation: i.productPriceCurrencyLocationControlValue,
@@ -34,21 +43,21 @@ class B extends g {
34
43
  return !1;
35
44
  }
36
45
  onCreated(n) {
37
- const s = this.api.getDocumentModifier(), r = this.api.getDocumentRootCssNode();
38
- r.querySelector('[product-attr="imageSrc"] img') || s.modifyCss(r).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
39
- const e = u(n);
46
+ const l = this.api.getDocumentModifier(), r = this.api.getDocumentRootCssNode();
47
+ r.querySelector('[product-attr="imageSrc"] img') || l.modifyCss(r).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
48
+ const e = y(n);
40
49
  if (!e)
41
50
  return;
42
- const a = e.getNodeConfig(), l = a && Object.keys(a).length > 0, t = C(n);
51
+ const s = e.getNodeConfig(), m = s && Object.keys(s).length > 0, t = b(n);
43
52
  if (t != null && t.initialized)
44
- l ? t.blockInstanceId || this.api.getDocumentModifier().modifyHtml(e).setNodeConfig({ ...t, blockInstanceId: String(Date.now()) }).apply(new o("Assign block instance ID to block")) : this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(t).apply(new o("Migrate legacy config to nodeConfig"));
53
+ m ? t.blockInstanceId || this.api.getDocumentModifier().modifyHtml(e).setNodeConfig({ ...t, blockInstanceId: String(Date.now()) }).apply(new o("Assign block instance ID to block")) : this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(t).apply(new o("Migrate legacy config to nodeConfig"));
45
54
  else {
46
- const m = I();
47
- this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(m).apply(new o("Initialize Items block with default configuration")), d().startOnboarding("itemsOnboarding");
55
+ const d = h();
56
+ this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(d).apply(new o("Initialize Items block with default configuration")), p().startOnboarding("itemsOnboarding");
48
57
  }
49
58
  }
50
59
  }
51
60
  export {
52
- y as BLOCK_ID,
53
- B as ItemsBlock
61
+ c as BLOCK_ID,
62
+ E as ItemsBlock
54
63
  };
@@ -1,5 +1,6 @@
1
- import { IconsRegistry as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- class i extends o {
1
+ import o from "../../../static/assets/info.svg.js";
2
+ import { IconsRegistry as r } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
3
+ class s extends r {
3
4
  registerIconsSvg(t) {
4
5
  t["items-icon"] = `
5
6
  <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -19,14 +20,14 @@ class i extends o {
19
20
  </svg>
20
21
  `, t["horizontal-orientation"] = `
21
22
  <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
22
- <path d="M10 19H4C3.44772 19 3 18.5523 3 18V2C3 1.44772 3.44772 1 4 1H10V19Z" stroke="currentColor"
23
+ <path d="M10 19H4C3.44772 19 3 18.5523 3 18V2C3 1.44772 3.44772 1 4 1H10V19Z" stroke="currentColor"
23
24
  stroke-width="2" fill="none"/>
24
- <path d="M17 2V18C17 18.5523 16.5523 19 16 19H10V1H16C16.5523 1 17 1.44772 17 2Z" stroke="currentColor"
25
+ <path d="M17 2V18C17 18.5523 16.5523 19 16 19H10V1H16C16.5523 1 17 1.44772 17 2Z" stroke="currentColor"
25
26
  stroke-width="2" fill="none"/>
26
27
  </svg>
27
- `;
28
+ `, t["migration-info-icon"] = o;
28
29
  }
29
30
  }
30
31
  export {
31
- i as ItemsIconsRegistry
32
+ s as ItemsIconsRegistry
32
33
  };
@@ -17,6 +17,54 @@ const n = `/* Utils */
17
17
  .container:has(.items-controls-container) {
18
18
  padding: 0
19
19
  }
20
+
21
+ /* ─── Migration Info Box ─────────────────────────────────────────────── */
22
+ /* Shown in the settings panel title when a block was migrated from legacy */
23
+
24
+ /* Layout variables for positioning the absolutely-placed info box */
25
+ :host {
26
+ --items-migration-padding: 16px;
27
+ --items-migration-title-height: 61px;
28
+ --items-migration-box-height: 98px;
29
+ }
30
+
31
+ /* Push tabs down when info box is present inside the control panel header */
32
+ .control-panel-header:has(.items-block-migration-info) {
33
+ position: relative;
34
+ margin-bottom: calc(2 * var(--items-migration-padding) + var(--items-migration-box-height));
35
+ }
36
+
37
+ /* Info box container */
38
+ .items-block-migration-info {
39
+ display: flex;
40
+ align-items: flex-start;
41
+ gap: 8px;
42
+ padding: 12px;
43
+ background: var(--guido-color-background-onpage-message-info);
44
+ border: 1px solid var(--guido-color-border-onpage-message-info);
45
+ border-radius: 4px;
46
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07);
47
+ position: absolute;
48
+ left: var(--items-migration-padding);
49
+ right: var(--items-migration-padding);
50
+ top: calc(var(--items-migration-padding) + var(--items-migration-title-height));
51
+ }
52
+
53
+ /* Icon — 18x19 icon inside a 24x24 bounding box (matches Figma) */
54
+ .items-block-migration-info__icon {
55
+ flex-shrink: 0;
56
+ width: 24px;
57
+ height: 24px;
58
+ }
59
+
60
+ /* Text content */
61
+ .items-block-migration-info__text {
62
+ margin: 4px 0;
63
+ white-space: normal;
64
+ font-size: 13px;
65
+ font-weight: 400;
66
+ line-height: 16px;
67
+ }
20
68
  `;
21
69
  export {
22
70
  n as default
@@ -1,18 +1,31 @@
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 f = Object.defineProperty;
2
+ var h = (r, o, t) => o in r ? f(r, o, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[o] = t;
3
+ var g = (r, o, t) => h(r, typeof o != "symbol" ? o + "" : o, t);
4
+ import { BlockId as I } from "../../../enums/block.js";
5
+ import { getMigrationBannerHtml as k } from "../../../utils/migrationBannerHtml.js";
6
+ import { Block as B, BlockCompositionType as _, ModificationDescription as R } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
+ import { ensureMobileCssRulesExist as d } from "./controls/mobileLayout/cssRules.js";
8
+ import { RecommendationConfigService as s } from "./services/configService.js";
9
+ import { useRecommendationExtensionStore as u } from "./store/recommendation.js";
10
+ import { getDefaultTemplate as A } from "./templates/grid/template.js";
11
+ const p = I.Recommendation, c = "ins-recommendation-v3-block-v2", a = "recommendation-id";
12
+ class T extends B {
5
13
  constructor() {
6
14
  super();
15
+ /**
16
+ * Stores the ID generated in getTemplate() so onCreated() can reuse it.
17
+ * This avoids generating a new (different) ID in onCreated().
18
+ */
19
+ g(this, "_pendingBlockId", null);
7
20
  }
8
21
  getId() {
9
- return n;
22
+ return p;
10
23
  }
11
24
  getIcon() {
12
25
  return "recommendation-icon";
13
26
  }
14
27
  getBlockCompositionType() {
15
- return t.CONTAINER;
28
+ return _.CONTAINER;
16
29
  }
17
30
  getName() {
18
31
  return this.api.translate("Recommendation Block");
@@ -20,11 +33,131 @@ class m extends e {
20
33
  getDescription() {
21
34
  return this.api.translate("Recommendation Block Title Description");
22
35
  }
36
+ getSettingsPanelTitleHtml() {
37
+ return k(
38
+ p,
39
+ this.api.translate("Recommendation Block"),
40
+ this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.")
41
+ );
42
+ }
43
+ /**
44
+ * Returns the template HTML for a new recommendation block.
45
+ * Generates a unique recommendation ID and embeds the instance class
46
+ * (ins-recommendation-v3-block-{id}) directly in the template HTML.
47
+ * This is necessary because Stripo's Angular rendering manages the class
48
+ * attribute and overwrites dynamically added classes via setAttribute.
49
+ */
23
50
  getTemplate() {
24
- return o();
51
+ const t = this._generateNextId();
52
+ return this._pendingBlockId = t, A(t);
53
+ }
54
+ /**
55
+ * Called when a new block is dropped into the template
56
+ *
57
+ * Uses the ID from getTemplate() (which already embedded the instance class)
58
+ * and assigns the recommendation-id attribute + initializes configuration.
59
+ * @param node - The newly created block node
60
+ */
61
+ onCreated(t) {
62
+ const e = this._pendingBlockId ?? this._generateNextId();
63
+ this._pendingBlockId = null, this._assignRecommendationId(t, e);
64
+ const n = s.initializeConfig(this.api, t, { recommendationId: e }), i = u();
65
+ i.setCurrentBlock(e), d(this.api), i.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 });
66
+ }
67
+ /**
68
+ * Called when the document changes or template is loaded
69
+ *
70
+ * Handles migration from legacy templates that don't have node config
71
+ * and assigns recommendation-id to legacy blocks that lack one.
72
+ * @param node - The block node that may need migration
73
+ */
74
+ onDocumentChanged(t) {
75
+ if (!(!t || !("getNodeConfig" in t))) {
76
+ if (!this._getRecommendationId(t)) {
77
+ const e = this._generateNextId();
78
+ this._assignRecommendationId(t, e), s.hasConfig(t) && s.updateConfig(
79
+ this.api,
80
+ t,
81
+ { recommendationId: e },
82
+ "Assign recommendation ID to legacy block"
83
+ );
84
+ }
85
+ s.needsMigration(t) && this._migrateFromLegacy(t), d(this.api);
86
+ }
87
+ }
88
+ /**
89
+ * Called when a block is deleted from the template
90
+ *
91
+ * Cleans up the per-block state from the Pinia store.
92
+ * @param node - The block node being deleted
93
+ */
94
+ onDelete(t) {
95
+ const e = this._getRecommendationId(t);
96
+ e && u().removeBlockState(e);
97
+ }
98
+ /**
99
+ * Generates the next unique recommendation ID by scanning all existing blocks
100
+ * in the document and finding the maximum existing ID + 1.
101
+ */
102
+ _generateNextId() {
103
+ let t = 0;
104
+ try {
105
+ const e = this.api.getDocumentRoot();
106
+ e && "querySelectorAll" in e && e.querySelectorAll(`.${c}`).forEach((i) => {
107
+ if ("getAttribute" in i) {
108
+ const m = i.getAttribute(a), l = m ? parseInt(m) : 0;
109
+ l > t && (t = l);
110
+ }
111
+ });
112
+ } catch {
113
+ }
114
+ return t + 1;
115
+ }
116
+ /**
117
+ * Assigns a recommendation-id attribute to the block element.
118
+ * The instance class (ins-recommendation-v3-block-{id}) is embedded in the template
119
+ * HTML by getTemplate(), since Stripo's Angular rendering overwrites dynamically
120
+ * added classes via setAttribute.
121
+ */
122
+ _assignRecommendationId(t, e) {
123
+ const n = this._getBlockElement(t);
124
+ if (!n)
125
+ return;
126
+ const i = this.api.getDocumentModifier();
127
+ i.modifyHtml(n).setAttribute(a, e.toString()), i.apply(new R(`Assign recommendation ID ${e}`));
128
+ }
129
+ /**
130
+ * Gets the recommendation-id from a block node
131
+ */
132
+ _getRecommendationId(t) {
133
+ const e = this._getBlockElement(t);
134
+ if (!e || !("getAttribute" in e))
135
+ return null;
136
+ const n = e.getAttribute(a);
137
+ if (!n)
138
+ return null;
139
+ const i = parseInt(n);
140
+ return Number.isNaN(i) ? null : i;
141
+ }
142
+ /**
143
+ * Gets the block element (the element with BLOCK_CLASS)
144
+ */
145
+ _getBlockElement(t) {
146
+ if ("getAttribute" in t) {
147
+ const e = t.getAttribute("class");
148
+ if (e && e.includes(c))
149
+ return t;
150
+ }
151
+ return "querySelector" in t ? t.querySelector(`.${c}`) : null;
152
+ }
153
+ /**
154
+ * Migrate configuration from legacy format
155
+ */
156
+ _migrateFromLegacy(t) {
157
+ s.migrateFromDataAttributes(this.api, t);
25
158
  }
26
159
  }
27
160
  export {
28
- n as BLOCK_ID,
29
- m as RecommendationBlock
161
+ p as BLOCK_ID,
162
+ T as RecommendationBlock
30
163
  };
@@ -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,66 @@
1
+ import { DEFAULT_ROW_SPACING as U, DEFAULT_COLUMN_SPACING as I, DEFAULT_MOBILE_CARDS_IN_ROW as n, DEFAULT_CARDS_IN_ROW as s } 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 _, ATTR_PRODUCT_OMNIBUS_PRICE as T, ATTR_PRODUCT_OMNIBUS_DISCOUNT as r, ATTR_PRODUCT_BUTTON as R } from "./selectors.js";
3
+ const O = {
4
+ code: "USD",
5
+ symbol: "USD",
6
+ alignment: "after",
7
+ decimalCount: 2,
8
+ decimalSeparator: ".",
9
+ thousandSeparator: ","
10
+ }, i = {
11
+ textBefore: "",
12
+ textAfter: ""
13
+ }, C = {
14
+ textBefore: "",
15
+ textAfter: ""
16
+ }, D = [
17
+ t,
18
+ e,
19
+ o,
20
+ _,
21
+ T,
22
+ r,
23
+ R
24
+ ], A = {
25
+ [t]: !0,
26
+ [e]: !0,
27
+ [_]: !0,
28
+ [o]: !0,
29
+ [T]: !1,
30
+ [r]: !1,
31
+ [R]: !0
32
+ }, E = {
33
+ // Settings
34
+ strategy: "mostPopular",
35
+ productIds: [],
36
+ size: "6",
37
+ shuffleProducts: !1,
38
+ language: "en_US",
39
+ currency: O,
40
+ filters: [],
41
+ // Layout
42
+ layout: "grid",
43
+ cardsInRow: s,
44
+ mobileCardsInRow: n,
45
+ columnSpacing: I,
46
+ rowSpacing: U,
47
+ // Composition
48
+ composition: D,
49
+ visibility: A,
50
+ // Element settings
51
+ omnibusPrice: i,
52
+ omnibusDiscount: C,
53
+ textTrimming: !1,
54
+ // Meta
55
+ configVersion: 1,
56
+ recommendationId: 0
57
+ }, N = 1;
58
+ export {
59
+ N as CURRENT_CONFIG_VERSION,
60
+ D as DEFAULT_COMPOSITION,
61
+ O as DEFAULT_CURRENCY,
62
+ E as DEFAULT_NODE_CONFIG,
63
+ C as DEFAULT_OMNIBUS_DISCOUNT,
64
+ i as DEFAULT_OMNIBUS_PRICE,
65
+ A as DEFAULT_VISIBILITY
66
+ };
@@ -0,0 +1,22 @@
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, O = 4, R = 1, T = 2, c = 10, s = 20, I = 0, S = 50, P = 5;
8
+ export {
9
+ n as DEFAULT_CARDS_IN_ROW,
10
+ c as DEFAULT_COLUMN_SPACING,
11
+ R as DEFAULT_MOBILE_CARDS_IN_ROW,
12
+ t as DEFAULT_PRODUCTS_PER_ROW,
13
+ s as DEFAULT_ROW_SPACING,
14
+ o as LAYOUT_OPTIONS,
15
+ _ as LAYOUT_VALUES,
16
+ T as MAX_MOBILE_PRODUCTS_PER_ROW,
17
+ O as MAX_PRODUCTS_PER_ROW,
18
+ A as MAX_PRODUCT_COUNT,
19
+ S as MAX_SPACING,
20
+ I as MIN_SPACING,
21
+ P as SPACING_STEP
22
+ };
@@ -0,0 +1,21 @@
1
+ const c = ".ins-recommendation-product-container", n = ".ins-recommendation-desktop-container", o = ".ins-recommendation-mobile-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
+ }, t = "productImage", r = "productName", R = "productPrice", e = "productOldPrice", O = "productOmnibusPrice", _ = "productOmnibusDiscount", C = "productButton";
9
+ export {
10
+ C as ATTR_PRODUCT_BUTTON,
11
+ t as ATTR_PRODUCT_IMAGE,
12
+ r as ATTR_PRODUCT_NAME,
13
+ e as ATTR_PRODUCT_OLD_PRICE,
14
+ _ as ATTR_PRODUCT_OMNIBUS_DISCOUNT,
15
+ O as ATTR_PRODUCT_OMNIBUS_PRICE,
16
+ R as ATTR_PRODUCT_PRICE,
17
+ c as CONTAINER_SELECTOR,
18
+ T as CURRENCY_ATTR,
19
+ n as DESKTOP_CONTAINER_SELECTOR,
20
+ o as MOBILE_CONTAINER_SELECTOR
21
+ };
@@ -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
+ };