@useinsider/guido 2.0.0-beta.a4f9fa2 → 2.0.0-beta.a7d687e

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 (296) hide show
  1. package/dist/@types/config/schemas.js +53 -39
  2. package/dist/components/organisms/email-preview/PreviewContainer.vue.js +3 -3
  3. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue.js +6 -6
  4. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue2.js +17 -13
  5. package/dist/components/organisms/email-preview/amp/AmpToggle.vue.js +6 -6
  6. package/dist/components/organisms/email-preview/amp/AmpToggle.vue2.js +14 -12
  7. package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.js +18 -0
  8. package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue2.js +15 -0
  9. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +10 -14
  10. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +14 -22
  11. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +3 -3
  12. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +12 -11
  13. package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue.js +12 -10
  14. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue.js +11 -10
  15. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue2.js +15 -14
  16. package/dist/components/organisms/header/EditorActions.vue.js +21 -0
  17. package/dist/components/organisms/header/EditorActions.vue2.js +41 -0
  18. package/dist/components/organisms/header/EditorToolbar.vue.js +18 -0
  19. package/dist/components/organisms/header/EditorToolbar.vue2.js +17 -0
  20. package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -5
  21. package/dist/components/organisms/header/LeftSlot.vue.js +9 -9
  22. package/dist/components/organisms/header/LeftSlot.vue2.js +13 -14
  23. package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
  24. package/dist/components/organisms/header/MiddleSlot.vue2.js +11 -15
  25. package/dist/components/organisms/header/RightSlot.vue.js +11 -14
  26. package/dist/components/organisms/header/RightSlot.vue2.js +13 -30
  27. package/dist/components/organisms/header/version-history/VersionHistory.vue.js +5 -5
  28. package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +15 -15
  29. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +1 -1
  30. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +20 -19
  31. package/dist/composables/useActionsApi.js +33 -30
  32. package/dist/composables/useConfig.js +29 -27
  33. package/dist/composables/useSave.js +13 -11
  34. package/dist/config/migrator/index.js +8 -9
  35. package/dist/config/migrator/recommendationMigrator.js +2 -2
  36. package/dist/enums/academy.js +8 -0
  37. package/dist/enums/onboarding.js +1 -2
  38. package/dist/enums/unsubscribe.js +20 -21
  39. package/dist/extensions/Blocks/Items/block.js +40 -39
  40. package/dist/extensions/Blocks/Items/controls/button/link.js +29 -22
  41. package/dist/extensions/Blocks/Items/controls/cardComposition.js +59 -70
  42. package/dist/extensions/Blocks/Items/controls/image/link.js +30 -23
  43. package/dist/extensions/Blocks/Items/controls/name/trimming.js +25 -25
  44. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +17 -19
  45. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +29 -31
  46. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +36 -36
  47. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +19 -21
  48. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +27 -29
  49. package/dist/extensions/Blocks/Items/controls/settingsControl.js +143 -152
  50. package/dist/extensions/Blocks/Items/enums/controlEnums.js +2 -2
  51. package/dist/extensions/Blocks/Items/enums/productEnums.js +45 -43
  52. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +3 -4
  53. package/dist/extensions/Blocks/Items/extension.js +6 -7
  54. package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +49 -58
  55. package/dist/extensions/Blocks/Items/layouts/vertical.html.js +59 -48
  56. package/dist/extensions/Blocks/Items/settingsPanel.js +26 -27
  57. package/dist/extensions/Blocks/Items/store/items-block.js +7 -11
  58. package/dist/extensions/Blocks/Items/template.js +129 -366
  59. package/dist/extensions/Blocks/Items/utils/configBlockUtils.js +17 -0
  60. package/dist/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.js +28 -0
  61. package/dist/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.js +76 -0
  62. package/dist/extensions/Blocks/Items/utils/updateAttributes.js +46 -0
  63. package/dist/extensions/Blocks/Recommendation/block.js +40 -6
  64. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +4 -0
  65. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +4 -0
  66. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +64 -0
  67. package/dist/extensions/Blocks/Recommendation/constants/layout.js +20 -0
  68. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +19 -0
  69. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +64 -0
  70. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +80 -0
  71. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +232 -0
  72. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +19 -0
  73. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +94 -0
  74. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +110 -0
  75. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +204 -0
  76. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +54 -0
  77. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +201 -0
  78. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +74 -0
  79. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +118 -0
  80. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +71 -0
  81. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +282 -0
  82. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +46 -0
  83. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +76 -0
  84. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +44 -0
  85. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +48 -0
  86. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.js +73 -0
  87. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.js +73 -0
  88. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +48 -0
  89. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.js +73 -0
  90. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.js +73 -0
  91. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +44 -0
  92. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +222 -0
  93. package/dist/extensions/Blocks/Recommendation/extension.js +40 -43
  94. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +13 -4
  95. package/dist/extensions/Blocks/Recommendation/services/configService.js +239 -0
  96. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +128 -72
  97. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +40 -35
  98. package/dist/extensions/Blocks/Recommendation/templates/horizontal/elementRenderer.js +174 -0
  99. package/dist/extensions/Blocks/Recommendation/templates/horizontal/template.js +73 -0
  100. package/dist/extensions/Blocks/Recommendation/templates/index.js +12 -0
  101. package/dist/extensions/Blocks/Recommendation/templates/utils.js +121 -0
  102. package/dist/extensions/Blocks/Recommendation/templates/vertical/elementRenderer.js +233 -0
  103. package/dist/extensions/Blocks/Recommendation/templates/vertical/migration.js +251 -0
  104. package/dist/extensions/Blocks/Recommendation/templates/vertical/template.js +69 -0
  105. package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +6 -0
  106. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +9 -9
  107. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +36 -0
  108. package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +29 -0
  109. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +46 -0
  110. package/dist/extensions/Blocks/Unsubscribe/extension.js +9 -9
  111. package/dist/extensions/Blocks/common-control.js +28 -28
  112. package/dist/extensions/Blocks/controlFactories.js +130 -106
  113. package/dist/guido.css +1 -1
  114. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +221 -173
  115. package/dist/services/recommendationApi.js +10 -9
  116. package/dist/src/@types/config/index.d.ts +2 -2
  117. package/dist/src/@types/config/schemas.d.ts +26 -0
  118. package/dist/src/@types/config/types.d.ts +7 -1
  119. package/dist/src/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.d.ts +2 -0
  120. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +4 -0
  121. package/dist/src/components/organisms/header/EditorToolbar.vue.d.ts +2 -0
  122. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  123. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
  124. package/dist/src/composables/useActionsApi.d.ts +1 -0
  125. package/dist/src/composables/useConfig.d.ts +6 -0
  126. package/dist/src/enums/academy.d.ts +12 -0
  127. package/dist/src/enums/onboarding.d.ts +0 -1
  128. package/dist/src/enums/unsubscribe.d.ts +0 -1
  129. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +2 -0
  130. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +0 -9
  131. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +2 -0
  132. package/dist/src/extensions/Blocks/Items/controls/price/priceOrientation.d.ts +1 -1
  133. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +4 -0
  134. package/dist/src/extensions/Blocks/Items/enums/controlEnums.d.ts +0 -1
  135. package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +26 -24
  136. package/dist/src/extensions/Blocks/Items/enums/settingsEnums.d.ts +0 -1
  137. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +0 -2
  138. package/dist/src/extensions/Blocks/Items/template.d.ts +1 -22
  139. package/dist/src/extensions/Blocks/Items/utils/configBlockUtils.d.ts +23 -0
  140. package/dist/src/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.d.ts +32 -0
  141. package/dist/src/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.d.ts +50 -0
  142. package/dist/src/extensions/Blocks/Items/utils/updateAttributes.d.ts +8 -0
  143. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +34 -0
  144. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +13 -0
  145. package/dist/src/extensions/Blocks/Recommendation/{constants.d.ts → constants/controlIds.d.ts} +19 -11
  146. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +49 -0
  147. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +13 -0
  148. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +35 -0
  149. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +31 -0
  150. package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +143 -0
  151. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackground/index.d.ts +31 -0
  152. package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +95 -0
  153. package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +35 -0
  154. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +24 -0
  155. package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +36 -0
  156. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +29 -0
  157. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +45 -0
  158. package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +22 -0
  159. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +56 -0
  160. package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +24 -0
  161. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +42 -0
  162. package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +23 -0
  163. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +209 -0
  164. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +97 -0
  165. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +16 -0
  166. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +95 -0
  167. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +100 -0
  168. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.d.ts +15 -0
  169. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.d.ts +15 -0
  170. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +100 -0
  171. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.d.ts +15 -0
  172. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.d.ts +15 -0
  173. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +95 -0
  174. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +83 -0
  175. package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +9 -0
  176. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +151 -0
  177. package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +6 -0
  178. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +17 -16
  179. package/dist/src/extensions/Blocks/Recommendation/templates/horizontal/elementRenderer.d.ts +8 -0
  180. package/dist/src/extensions/Blocks/Recommendation/templates/horizontal/migration.d.ts +25 -0
  181. package/dist/src/extensions/Blocks/Recommendation/templates/horizontal/template.d.ts +18 -0
  182. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +39 -0
  183. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +54 -0
  184. package/dist/src/extensions/Blocks/Recommendation/templates/vertical/elementRenderer.d.ts +20 -0
  185. package/dist/src/extensions/Blocks/Recommendation/templates/{migrationTemplate.d.ts → vertical/migration.d.ts} +11 -4
  186. package/dist/src/extensions/Blocks/Recommendation/templates/vertical/template.d.ts +33 -0
  187. package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +7 -0
  188. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +154 -0
  189. package/dist/src/extensions/Blocks/Recommendation/utils/preserveTextStyles.d.ts +19 -0
  190. package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +33 -0
  191. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +113 -0
  192. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +77 -0
  193. package/dist/src/extensions/Blocks/common-control.d.ts +11 -10
  194. package/dist/src/stores/config.d.ts +147 -1
  195. package/dist/src/stores/editor.d.ts +21 -0
  196. package/dist/static/assets/desktop/desktop-mockup-center.svg.js +4 -0
  197. package/dist/static/assets/desktop/desktop-mockup-left.svg.js +4 -0
  198. package/dist/static/assets/desktop/desktop-mockup-right.svg.js +4 -0
  199. package/dist/static/assets/mobile/email-mockup.svg.js +4 -0
  200. package/dist/static/assets/mobile/inbox-mockup.svg.js +4 -0
  201. package/dist/static/styles/components/button.css.js +1 -1
  202. package/dist/static/styles/components/wide-panel.css.js +1 -5
  203. package/dist/static/styles/customEditorStyle.css.js +38 -2
  204. package/dist/stores/config.js +7 -0
  205. package/dist/stores/editor.js +1 -0
  206. package/dist/utils/pairProductVariables.js +58 -61
  207. package/dist/utils/templatePreparation.js +17 -17
  208. package/package.json +1 -1
  209. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue.js +0 -17
  210. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue2.js +0 -20
  211. package/dist/config/migrator/itemsBlockMigrator.js +0 -342
  212. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +0 -93
  213. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +0 -184
  214. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +0 -103
  215. package/dist/extensions/Blocks/Recommendation/constants.js +0 -5
  216. package/dist/extensions/Blocks/Recommendation/control.js +0 -306
  217. package/dist/extensions/Blocks/Recommendation/controls/button/align.js +0 -13
  218. package/dist/extensions/Blocks/Recommendation/controls/button/border.js +0 -13
  219. package/dist/extensions/Blocks/Recommendation/controls/button/borderRadius.js +0 -13
  220. package/dist/extensions/Blocks/Recommendation/controls/button/color.js +0 -13
  221. package/dist/extensions/Blocks/Recommendation/controls/button/fitToContent.js +0 -13
  222. package/dist/extensions/Blocks/Recommendation/controls/button/fontFamily.js +0 -13
  223. package/dist/extensions/Blocks/Recommendation/controls/button/margins.js +0 -13
  224. package/dist/extensions/Blocks/Recommendation/controls/button/paddings.js +0 -13
  225. package/dist/extensions/Blocks/Recommendation/controls/button/text.js +0 -13
  226. package/dist/extensions/Blocks/Recommendation/controls/button/textSize.js +0 -13
  227. package/dist/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.js +0 -13
  228. package/dist/extensions/Blocks/Recommendation/controls/image/margins.js +0 -13
  229. package/dist/extensions/Blocks/Recommendation/controls/image/size.js +0 -13
  230. package/dist/extensions/Blocks/Recommendation/controls/name/align.js +0 -13
  231. package/dist/extensions/Blocks/Recommendation/controls/name/background.js +0 -13
  232. package/dist/extensions/Blocks/Recommendation/controls/name/color.js +0 -13
  233. package/dist/extensions/Blocks/Recommendation/controls/name/fontFamily.js +0 -13
  234. package/dist/extensions/Blocks/Recommendation/controls/name/paddings.js +0 -13
  235. package/dist/extensions/Blocks/Recommendation/controls/name/size.js +0 -13
  236. package/dist/extensions/Blocks/Recommendation/controls/name/style.js +0 -13
  237. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/align.js +0 -13
  238. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/background.js +0 -13
  239. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/color.js +0 -13
  240. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.js +0 -13
  241. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/paddings.js +0 -13
  242. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/size.js +0 -13
  243. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/style.js +0 -13
  244. package/dist/extensions/Blocks/Recommendation/controls/price/align.js +0 -13
  245. package/dist/extensions/Blocks/Recommendation/controls/price/background.js +0 -13
  246. package/dist/extensions/Blocks/Recommendation/controls/price/color.js +0 -13
  247. package/dist/extensions/Blocks/Recommendation/controls/price/fontFamily.js +0 -13
  248. package/dist/extensions/Blocks/Recommendation/controls/price/paddings.js +0 -13
  249. package/dist/extensions/Blocks/Recommendation/controls/price/size.js +0 -13
  250. package/dist/extensions/Blocks/Recommendation/controls/price/style.js +0 -13
  251. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +0 -160
  252. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +0 -152
  253. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +0 -180
  254. package/dist/src/config/migrator/itemsBlockMigrator.d.ts +0 -6
  255. package/dist/src/extensions/Blocks/Items/controls/price/singlePrice.d.ts +0 -18
  256. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +0 -73
  257. package/dist/src/extensions/Blocks/Recommendation/cardCompositionControl.d.ts +0 -28
  258. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +0 -35
  259. package/dist/src/extensions/Blocks/Recommendation/controls/button/align.d.ts +0 -5
  260. package/dist/src/extensions/Blocks/Recommendation/controls/button/border.d.ts +0 -5
  261. package/dist/src/extensions/Blocks/Recommendation/controls/button/borderRadius.d.ts +0 -5
  262. package/dist/src/extensions/Blocks/Recommendation/controls/button/color.d.ts +0 -5
  263. package/dist/src/extensions/Blocks/Recommendation/controls/button/fitToContent.d.ts +0 -5
  264. package/dist/src/extensions/Blocks/Recommendation/controls/button/fontFamily.d.ts +0 -5
  265. package/dist/src/extensions/Blocks/Recommendation/controls/button/margins.d.ts +0 -5
  266. package/dist/src/extensions/Blocks/Recommendation/controls/button/paddings.d.ts +0 -5
  267. package/dist/src/extensions/Blocks/Recommendation/controls/button/text.d.ts +0 -5
  268. package/dist/src/extensions/Blocks/Recommendation/controls/button/textSize.d.ts +0 -5
  269. package/dist/src/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.d.ts +0 -5
  270. package/dist/src/extensions/Blocks/Recommendation/controls/image/margins.d.ts +0 -5
  271. package/dist/src/extensions/Blocks/Recommendation/controls/image/size.d.ts +0 -5
  272. package/dist/src/extensions/Blocks/Recommendation/controls/name/align.d.ts +0 -5
  273. package/dist/src/extensions/Blocks/Recommendation/controls/name/background.d.ts +0 -5
  274. package/dist/src/extensions/Blocks/Recommendation/controls/name/color.d.ts +0 -5
  275. package/dist/src/extensions/Blocks/Recommendation/controls/name/fontFamily.d.ts +0 -5
  276. package/dist/src/extensions/Blocks/Recommendation/controls/name/paddings.d.ts +0 -5
  277. package/dist/src/extensions/Blocks/Recommendation/controls/name/size.d.ts +0 -5
  278. package/dist/src/extensions/Blocks/Recommendation/controls/name/style.d.ts +0 -5
  279. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/align.d.ts +0 -5
  280. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/background.d.ts +0 -5
  281. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/color.d.ts +0 -5
  282. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.d.ts +0 -5
  283. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/paddings.d.ts +0 -5
  284. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/size.d.ts +0 -5
  285. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/style.d.ts +0 -5
  286. package/dist/src/extensions/Blocks/Recommendation/controls/price/align.d.ts +0 -5
  287. package/dist/src/extensions/Blocks/Recommendation/controls/price/background.d.ts +0 -5
  288. package/dist/src/extensions/Blocks/Recommendation/controls/price/color.d.ts +0 -5
  289. package/dist/src/extensions/Blocks/Recommendation/controls/price/fontFamily.d.ts +0 -5
  290. package/dist/src/extensions/Blocks/Recommendation/controls/price/paddings.d.ts +0 -5
  291. package/dist/src/extensions/Blocks/Recommendation/controls/price/size.d.ts +0 -5
  292. package/dist/src/extensions/Blocks/Recommendation/controls/price/style.d.ts +0 -5
  293. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +0 -16
  294. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +0 -44
  295. package/dist/static/assets/inbox-mockup.svg.js +0 -4
  296. package/dist/static/assets/phone-mockup.svg.js +0 -4
@@ -1,5 +1,6 @@
1
1
  import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationProduct } from '@@/Types/recommendation';
2
2
  interface StoreState {
3
+ /** Maps campaign URLs for recommendation blocks. Used by templateLibraryApi when saving templates. */
3
4
  recommendationCampaignUrls: Record<string, string>;
4
5
  recommendationConfigs: {
5
6
  cardsInRow: number;
@@ -18,8 +19,8 @@ interface StoreState {
18
19
  orientation: Orientation;
19
20
  productIds: string[];
20
21
  recommendedProducts: [];
21
- sendProductRequestFlag: false;
22
- shuffleProducts: false;
22
+ sendProductRequestFlag: boolean;
23
+ shuffleProducts: boolean;
23
24
  strategy: string;
24
25
  textTrimming: boolean;
25
26
  unresponsive: boolean;
@@ -65,8 +66,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
65
66
  orientation: Orientation;
66
67
  productIds: string[];
67
68
  recommendedProducts: [];
68
- sendProductRequestFlag: false;
69
- shuffleProducts: false;
69
+ sendProductRequestFlag: boolean;
70
+ shuffleProducts: boolean;
70
71
  strategy: string;
71
72
  textTrimming: boolean;
72
73
  unresponsive: boolean;
@@ -134,8 +135,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
134
135
  orientation: Orientation;
135
136
  productIds: string[];
136
137
  recommendedProducts: [];
137
- sendProductRequestFlag: false;
138
- shuffleProducts: false;
138
+ sendProductRequestFlag: boolean;
139
+ shuffleProducts: boolean;
139
140
  strategy: string;
140
141
  textTrimming: boolean;
141
142
  unresponsive: boolean;
@@ -203,8 +204,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
203
204
  orientation: Orientation;
204
205
  productIds: string[];
205
206
  recommendedProducts: [];
206
- sendProductRequestFlag: false;
207
- shuffleProducts: false;
207
+ sendProductRequestFlag: boolean;
208
+ shuffleProducts: boolean;
208
209
  strategy: string;
209
210
  textTrimming: boolean;
210
211
  unresponsive: boolean;
@@ -275,8 +276,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
275
276
  orientation: Orientation;
276
277
  productIds: string[];
277
278
  recommendedProducts: [];
278
- sendProductRequestFlag: false;
279
- shuffleProducts: false;
279
+ sendProductRequestFlag: boolean;
280
+ shuffleProducts: boolean;
280
281
  strategy: string;
281
282
  textTrimming: boolean;
282
283
  unresponsive: boolean;
@@ -347,8 +348,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
347
348
  orientation: Orientation;
348
349
  productIds: string[];
349
350
  recommendedProducts: [];
350
- sendProductRequestFlag: false;
351
- shuffleProducts: false;
351
+ sendProductRequestFlag: boolean;
352
+ shuffleProducts: boolean;
352
353
  strategy: string;
353
354
  textTrimming: boolean;
354
355
  unresponsive: boolean;
@@ -419,8 +420,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
419
420
  orientation: Orientation;
420
421
  productIds: string[];
421
422
  recommendedProducts: [];
422
- sendProductRequestFlag: false;
423
- shuffleProducts: false;
423
+ sendProductRequestFlag: boolean;
424
+ shuffleProducts: boolean;
424
425
  strategy: string;
425
426
  textTrimming: boolean;
426
427
  unresponsive: boolean;
@@ -492,8 +493,8 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
492
493
  orientation: Orientation;
493
494
  productIds: string[];
494
495
  recommendedProducts: [];
495
- sendProductRequestFlag: false;
496
- shuffleProducts: false;
496
+ sendProductRequestFlag: boolean;
497
+ shuffleProducts: boolean;
497
498
  strategy: string;
498
499
  textTrimming: boolean;
499
500
  unresponsive: boolean;
@@ -0,0 +1,8 @@
1
+ import type { ElementRenderer } from '../utils';
2
+ /**
3
+ * Horizontal element renderer
4
+ * - Image and Button return `<td>` cells for the 3-column layout
5
+ * - Name and Prices return `<tr><td>` rows for the info cell table
6
+ * All elements have esd-block-* classes for Stripo selection
7
+ */
8
+ export declare const horizontalElementRenderer: ElementRenderer;
@@ -0,0 +1,25 @@
1
+ import type { RecommendationProduct } from '@@/Types/recommendation';
2
+ import { DEFAULTS, getDefaultProducts } from '../utils';
3
+ /**
4
+ * Migration template for horizontal layout
5
+ * Used when migrating old recommendation blocks to horizontal format
6
+ */
7
+ declare const migrationTemplate = "\n <td\n align=\"left\"\n esd-extension-block-id=\"recommendation-block\"\n esd-handler-name=\"esd-extension-RecommendationBlock\"\n class=\"ins-recommendation-v3-block-v2 esd-block-recommendation-v3-block esd-extension-block es-p20\"\n data-layout=\"horizontal\"\n >\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td align=\"center\">\n <table\n class=\"container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n <td>\n <table\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n {-{-TITLE-}-}\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n <tr>\n <td class=\"spacer\" style=\"height: 20px;\"></td>\n </tr>\n <tr>\n <td>\n <table\n class=\"ins-recommendation-product-container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\"\n >\n {-{-PRODUCT_ROWS-}-}\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n </td>\n";
8
+ export declare function getMigrationTemplate(): string;
9
+ /**
10
+ * Generates a custom horizontal migration template with specified products
11
+ * @param products - Array of products to display
12
+ * @param title - Optional title for the block
13
+ * @param composition - Optional array defining order of card elements
14
+ * @returns Complete HTML template
15
+ */
16
+ export declare function generateMigrationTemplate(products: RecommendationProduct[], title?: string, composition?: string[]): string;
17
+ /**
18
+ * Prepares horizontal product rows for migration
19
+ * @param products - Array of products to display
20
+ * @param composition - Optional array defining order of card elements
21
+ * @returns HTML string for product rows
22
+ */
23
+ export declare function prepareProductRows(products: RecommendationProduct[], composition?: string[]): string;
24
+ export { DEFAULTS, getDefaultProducts };
25
+ export default migrationTemplate;
@@ -0,0 +1,18 @@
1
+ import type { RecommendationProduct } from '@@/Types/recommendation';
2
+ /**
3
+ * Generates a horizontal product card with 3-column layout
4
+ * Uses horizontalElementRenderer to render Image, Info content, and Button
5
+ * Layout: [Image (120px)] [Info table (flexible)] [Button (100px)]
6
+ * @param product - The product data
7
+ * @returns HTML string for a single product card row
8
+ */
9
+ export declare function getHorizontalProductCard(product: RecommendationProduct): string;
10
+ /**
11
+ * Prepares horizontal product rows
12
+ * Each product is a full-width row with 3-column layout
13
+ * @param products - Array of products to display
14
+ * @returns HTML string for product rows
15
+ */
16
+ export declare function prepareProductRows(products: RecommendationProduct[]): string;
17
+ export declare function getDefaultTemplate(): string;
18
+ export declare function generateBlockTemplate(products: RecommendationProduct[], title?: string): string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Unified Template API for Recommendation Block
3
+ *
4
+ * This module provides a single entry point for working with recommendation
5
+ * block templates, abstracting away the layout-specific implementations.
6
+ */
7
+ import type { RecommendationProduct } from '@@/Types/recommendation';
8
+ import { type Orientation, type PrepareProductRowsOptions } from './utils';
9
+ export { DEFAULTS, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY, getDefaultProducts, spacer, sanitizeImageUrl, createBlockTemplate, type Orientation, type PrepareProductRowsOptions, type ElementRenderer, type ProductCardGetter, } from './utils';
10
+ /**
11
+ * Unified function to prepare product rows for any layout.
12
+ * Delegates to the appropriate layout-specific implementation.
13
+ * @example
14
+ * // Horizontal layout (full-width rows)
15
+ * prepareProductRows(products, 'horizontal');
16
+ * @example
17
+ * // Vertical layout (grid)
18
+ * prepareProductRows(products, 'vertical', { productsPerRow: 3 });
19
+ * @param products - Array of products to display
20
+ * @param layout - The layout orientation ('horizontal' or 'vertical')
21
+ * @param options - Layout-specific options
22
+ * @returns HTML string for product rows
23
+ */
24
+ export declare function prepareProductRows(products: RecommendationProduct[], layout: Orientation, options?: PrepareProductRowsOptions): string;
25
+ /**
26
+ * Generates the default template for a given layout.
27
+ * @param layout - The layout orientation ('horizontal' or 'vertical')
28
+ * @returns Complete HTML template with default products
29
+ */
30
+ export declare function getDefaultTemplate(layout?: Orientation): string;
31
+ /**
32
+ * Generates a complete block template with custom products.
33
+ * @param products - Array of products to display
34
+ * @param layout - The layout orientation ('horizontal' or 'vertical')
35
+ * @param title - Title for the block
36
+ * @param options - Layout-specific options
37
+ * @returns Complete HTML template
38
+ */
39
+ export declare function generateBlockTemplate(products: RecommendationProduct[], layout: Orientation, title?: string, options?: PrepareProductRowsOptions): string;
@@ -0,0 +1,54 @@
1
+ import type { RecommendationProduct } from '@@/Types/recommendation';
2
+ import { ATTR_PRODUCT_IMAGE, ATTR_PRODUCT_NAME, ATTR_PRODUCT_PRICE, ATTR_PRODUCT_OLD_PRICE, ATTR_PRODUCT_OMNIBUS_PRICE, ATTR_PRODUCT_OMNIBUS_DISCOUNT, ATTR_PRODUCT_BUTTON } from '../constants';
3
+ export type Orientation = 'horizontal' | 'vertical';
4
+ /**
5
+ * Options for prepareProductRows unified function
6
+ */
7
+ export interface PrepareProductRowsOptions {
8
+ /** Number of products per row (only for vertical layout, defaults to 3) */
9
+ productsPerRow?: number;
10
+ /** Array defining order of card elements */
11
+ composition?: string[];
12
+ }
13
+ /**
14
+ * Element renderer interface for product card elements
15
+ * Keys are ATTR_PRODUCT_* constants for consistent naming
16
+ */
17
+ export interface ElementRenderer {
18
+ [ATTR_PRODUCT_IMAGE]: (product: RecommendationProduct) => string;
19
+ [ATTR_PRODUCT_NAME]: (product: RecommendationProduct) => string;
20
+ [ATTR_PRODUCT_PRICE]: (product: RecommendationProduct) => string;
21
+ [ATTR_PRODUCT_OLD_PRICE]: (product: RecommendationProduct) => string;
22
+ [ATTR_PRODUCT_OMNIBUS_PRICE]: (product: RecommendationProduct) => string;
23
+ [ATTR_PRODUCT_OMNIBUS_DISCOUNT]: (product: RecommendationProduct) => string;
24
+ [ATTR_PRODUCT_BUTTON]: (product: RecommendationProduct) => string;
25
+ }
26
+ /**
27
+ * Product card getter function type
28
+ * Used by prepareProductRows to generate individual product cards
29
+ */
30
+ export type ProductCardGetter = (product: RecommendationProduct, composition?: string[]) => string;
31
+ export declare const DEFAULTS: {
32
+ TITLE: string;
33
+ DESCRIPTION: string;
34
+ };
35
+ export declare const DEFAULT_CARD_COMPOSITION: string[];
36
+ export declare const DEFAULT_CARD_VISIBILITY: Record<string, boolean>;
37
+ export declare const spacer = "\n <tr>\n <td class=\"spacer\" style=\"height: 10px;\"></td>\n </tr>\n";
38
+ export declare const PLACEHOLDER_IMAGE = "https://email-static.useinsider.com/stripo/modules/email-recommendation-v3/assets/images/image-placeholder.png";
39
+ /**
40
+ * Sanitizes product image URLs for consistent rendering
41
+ * - Converts http:// to https:// to avoid mixed content issues
42
+ * - Returns placeholder for invalid/empty URLs
43
+ * @param url - The image URL to sanitize
44
+ * @returns Sanitized HTTPS URL or placeholder
45
+ */
46
+ export declare function sanitizeImageUrl(url: string | undefined | null): string;
47
+ export declare function getDefaultProducts(): RecommendationProduct[];
48
+ /**
49
+ * Creates the block template wrapper HTML for recommendation blocks.
50
+ * The template includes title placeholder and product container.
51
+ * @param layout - The layout orientation ('horizontal' or 'vertical')
52
+ * @returns HTML template string with {-{-TITLE-}-} and {-{-PRODUCT_ROWS-}-} placeholders
53
+ */
54
+ export declare function createBlockTemplate(layout?: Orientation): string;
@@ -0,0 +1,20 @@
1
+ import type { ElementRenderer } from '../utils';
2
+ /**
3
+ * Vertical element renderer
4
+ * Each element returns a `<td>` containing a nested table structure:
5
+ * - Outer `<td>` has padding for column spacing
6
+ * - Inner `<table class="product-card-segment">` supports background color
7
+ * - Content is inside the inner table
8
+ *
9
+ * This structure allows:
10
+ * 1. Row-based alignment (all same attributes in one row)
11
+ * 2. Per-card background color via inner table
12
+ * 3. Column spacing via outer cell padding
13
+ */
14
+ export declare const DEFAULT_CELL_PADDING = "0 5px";
15
+ /**
16
+ * Class name for outer cells in attribute rows
17
+ * Used by controls to reliably select direct children for spacing adjustments
18
+ */
19
+ export declare const ATTRIBUTE_CELL_CLASS = "attribute-cell";
20
+ export declare const verticalElementRenderer: ElementRenderer;
@@ -1,9 +1,17 @@
1
1
  import type { RecommendationProduct } from '@@/Types/recommendation';
2
- import { DEFAULTS, getDefaultProducts } from './templateUtils';
2
+ import { DEFAULTS, getDefaultProducts, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY } from '../utils';
3
3
  declare const migrationTemplate = "\n <td\n align=\"left\"\n esd-extension-block-id=\"recommendation-block\"\n esd-handler-name=\"esd-extension-RecommendationBlock\"\n class=\"ins-recommendation-v3-block-v2 esd-block-recommendation-v3-block esd-extension-block es-p20\"\n >\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td align=\"center\">\n <table\n class=\"container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n <td>\n <table\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n {-{-TITLE-}-}\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n <tr>\n <td class=\"spacer\" style=\"height: 20px;\"></td>\n </tr>\n <tr>\n <td>\n <table\n class=\"ins-recommendation-product-container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\"\n >\n {-{-PRODUCT_ROWS-}-}\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n </td>\n";
4
+ /**
5
+ * Prepares migration product rows with attribute-aligned structure.
6
+ * @param products - Array of products to display
7
+ * @param productsPerRow - Number of products per row
8
+ * @param composition - Array defining element order
9
+ * @returns HTML string for product rows
10
+ */
11
+ export declare function prepareProductRows(products: RecommendationProduct[], productsPerRow: number, composition?: string[]): string;
4
12
  export declare function getMigrationTemplate(): string;
5
13
  /**
6
- * Generates a custom migration template with specified products and layout
14
+ * Generates a custom migration template with specified products and layout.
7
15
  * @param products - Array of products to display
8
16
  * @param productsPerRow - Number of products per row
9
17
  * @param title - Optional title for the block
@@ -11,6 +19,5 @@ export declare function getMigrationTemplate(): string;
11
19
  * @returns Complete HTML template
12
20
  */
13
21
  export declare function generateMigrationTemplate(products: RecommendationProduct[], productsPerRow: number, title?: string, composition?: string[]): string;
14
- export declare function prepareProductRows(products: RecommendationProduct[], productsPerRow: number, composition?: string[]): string;
15
- export { DEFAULTS, getDefaultProducts };
22
+ export { DEFAULTS, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY, getDefaultProducts, };
16
23
  export default migrationTemplate;
@@ -0,0 +1,33 @@
1
+ import type { RecommendationProduct } from '@@/Types/recommendation';
2
+ import { type ElementRenderer } from '../utils';
3
+ /**
4
+ * Generates attribute-aligned product rows for vertical layout.
5
+ * Creates rows where each row contains one attribute type from all products.
6
+ * @param products - Array of products in this row group
7
+ * @param productsPerRow - Number of products per row (for column width calculation)
8
+ * @param elementRenderer - Object mapping attribute types to render functions
9
+ * @param composition - Array defining order of card elements
10
+ * @returns HTML string for attribute-aligned rows
11
+ */
12
+ export declare function prepareVerticalAttributeRows(products: RecommendationProduct[], productsPerRow: number, elementRenderer: ElementRenderer, composition?: string[]): string;
13
+ /**
14
+ * Prepares vertical product rows with attribute-aligned structure
15
+ * Groups products into rows, then generates attribute-aligned HTML for each group
16
+ * @param products - Array of products to display
17
+ * @param productsPerRow - Number of products per row
18
+ * @param elementRenderer - Object mapping attribute types to render functions
19
+ * @param composition - Array defining order of card elements
20
+ * @returns HTML string for all product rows
21
+ */
22
+ export declare function prepareVerticalProductRows(products: RecommendationProduct[], productsPerRow: number, elementRenderer: ElementRenderer, composition?: string[]): string;
23
+ /**
24
+ * Prepares vertical product rows with attribute-aligned structure.
25
+ * Uses row-based rendering where each attribute type forms a single row across all products.
26
+ * @param products - Array of products to display
27
+ * @param productsPerRow - Number of products per row
28
+ * @param composition - Array defining element order
29
+ * @returns HTML string for product rows
30
+ */
31
+ export declare function prepareProductRows(products: RecommendationProduct[], productsPerRow: number, composition?: string[]): string;
32
+ export declare function getDefaultTemplate(): string;
33
+ export declare function generateBlockTemplate(products: RecommendationProduct[], productsPerRow: number, title?: string, composition?: string[]): string;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Recommendation Extension Types
3
+ *
4
+ * This module re-exports all type definitions for the Recommendation extension.
5
+ */
6
+ export type { RecommendationNodeConfig, CurrencyConfig, OmnibusTextConfig, PartialNodeConfig, DeepPartialNodeConfig, } from './nodeConfig';
7
+ export { isValidNodeConfig, hasMinimalConfig, } from './nodeConfig';
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Node Configuration Types for Recommendation Block
3
+ *
4
+ * This module defines the TypeScript interfaces for configuration data
5
+ * stored via Stripo's `setNodeConfig`/`getNodeConfig` APIs.
6
+ *
7
+ * The configuration persists with the template HTML, solving:
8
+ * - Configuration loss on save/reload
9
+ * - Multi-block independence
10
+ * - Undo/redo integration
11
+ * @see https://plugin.stripo.email/extensions/reference/blocks/Block
12
+ */
13
+ import type { Filter } from '@@/Types/recommendation';
14
+ /**
15
+ * Currency display and formatting settings
16
+ */
17
+ export interface CurrencyConfig {
18
+ /** Currency code (e.g., 'USD', 'EUR', 'TRY') */
19
+ code: string;
20
+ /** Currency symbol (e.g., '$', '€', '₺') */
21
+ symbol: string;
22
+ /** Symbol position relative to price */
23
+ alignment: 'before' | 'after';
24
+ /** Number of decimal places (-1 for no formatting) */
25
+ decimalCount: number;
26
+ /** Character used for decimal separation */
27
+ decimalSeparator: '.' | ',';
28
+ /** Character used for thousands separation */
29
+ thousandSeparator: '.' | ',' | ' ' | '';
30
+ }
31
+ /**
32
+ * Configuration for omnibus price/discount text wrappers
33
+ * Used to display EU Omnibus Directive compliant pricing
34
+ */
35
+ export interface OmnibusTextConfig {
36
+ /** Text to prepend (e.g., 'Lowest 30-day price: ') */
37
+ textBefore: string;
38
+ /** Text to append */
39
+ textAfter: string;
40
+ }
41
+ /**
42
+ * Complete configuration schema for Recommendation Block
43
+ *
44
+ * This interface combines:
45
+ * - Legacy `esd-dev-product-config` structure patterns
46
+ * - Current data-attribute based settings
47
+ * - Campaign data that was previously in Pinia store
48
+ *
49
+ * All properties are persisted with the template via `setNodeConfig`.
50
+ */
51
+ export interface RecommendationNodeConfig {
52
+ /**
53
+ * Recommendation algorithm/strategy
54
+ * @example 'mostPopular', 'complementaryItems', 'manualMerchandising'
55
+ */
56
+ strategy: string;
57
+ /**
58
+ * Product IDs for manual merchandising strategy
59
+ * Only used when strategy === 'manualMerchandising'
60
+ */
61
+ productIds: string[];
62
+ /**
63
+ * Number of products to fetch from API
64
+ * Stored as string for consistency with API params
65
+ */
66
+ size: string;
67
+ /**
68
+ * Whether to randomize product order on each load
69
+ */
70
+ shuffleProducts: boolean;
71
+ /**
72
+ * Locale/language for product data
73
+ * @example 'en_US', 'tr_TR', 'de_DE'
74
+ */
75
+ language: string;
76
+ /**
77
+ * Currency display and formatting configuration
78
+ */
79
+ currency: CurrencyConfig;
80
+ /**
81
+ * Product filters for narrowing recommendations
82
+ * Uses existing Filter interface from recommendation types
83
+ */
84
+ filters: Filter[];
85
+ /**
86
+ * Layout orientation
87
+ * - 'vertical': Products in a grid, attributes aligned across products
88
+ * - 'horizontal': Products in rows, each product is a full-width card
89
+ */
90
+ layout: 'vertical' | 'horizontal';
91
+ /**
92
+ * Number of products per row (vertical layout only)
93
+ */
94
+ cardsInRow: number;
95
+ /**
96
+ * Horizontal spacing between product cards in pixels (vertical layout only)
97
+ */
98
+ columnSpacing: number;
99
+ /**
100
+ * Vertical spacing between product rows in pixels
101
+ */
102
+ rowSpacing: number;
103
+ /**
104
+ * Order of card elements from top to bottom
105
+ * Array of ATTR_PRODUCT_* constants
106
+ * @example ['productImage', 'productName', 'productPrice', 'productButton']
107
+ */
108
+ composition: string[];
109
+ /**
110
+ * Visibility flags for each card element
111
+ * Keys are ATTR_PRODUCT_* constants
112
+ */
113
+ visibility: Record<string, boolean>;
114
+ /**
115
+ * Omnibus price text configuration
116
+ * For EU Omnibus Directive compliance
117
+ */
118
+ omnibusPrice: OmnibusTextConfig;
119
+ /**
120
+ * Omnibus discount text configuration
121
+ * For EU Omnibus Directive compliance
122
+ */
123
+ omnibusDiscount: OmnibusTextConfig;
124
+ /**
125
+ * Whether to trim long product names with ellipsis
126
+ */
127
+ textTrimming: boolean;
128
+ /**
129
+ * Configuration version for future migrations
130
+ * Increment when making breaking changes to schema
131
+ */
132
+ configVersion: number;
133
+ }
134
+ /**
135
+ * Partial configuration for updates
136
+ * All fields are optional to support partial updates via `updateConfig`
137
+ */
138
+ export type PartialNodeConfig = Partial<RecommendationNodeConfig>;
139
+ /**
140
+ * Deep partial for nested objects
141
+ */
142
+ export type DeepPartialNodeConfig = {
143
+ [K in keyof RecommendationNodeConfig]?: RecommendationNodeConfig[K] extends object ? Partial<RecommendationNodeConfig[K]> : RecommendationNodeConfig[K];
144
+ };
145
+ /**
146
+ * Check if an object is a valid RecommendationNodeConfig
147
+ * Used for migration detection and validation
148
+ */
149
+ export declare function isValidNodeConfig(obj: unknown): obj is RecommendationNodeConfig;
150
+ /**
151
+ * Check if a node config has the minimum required fields
152
+ * Used to detect legacy templates that need migration
153
+ */
154
+ export declare function hasMinimalConfig(obj: unknown): boolean;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Utility for preserving text styling when updating innerHTML
3
+ */
4
+ import type { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
5
+ /**
6
+ * Preserves existing style tags when updating text content
7
+ *
8
+ * When users apply text styles (bold, italic, etc.) in Stripo, the editor wraps
9
+ * content in tags like <strong>, <em>, <u>, <s>. This function extracts those
10
+ * style tags from the original HTML and re-applies them to the new text content.
11
+ * @example
12
+ * // Original: <span class="omnibus-text-before"><strong>Lowest price: </strong></span>
13
+ * // After calling preserveTextStyles(element, 'Best price: ')
14
+ * // Result: <strong>Best price: </strong>
15
+ * @param element - The DOM element or ImmutableHtmlNode containing the styled text
16
+ * @param newText - The new text content to insert
17
+ * @returns The new text wrapped in the original style tags
18
+ */
19
+ export declare function preserveTextStyles(element: ImmutableHtmlNode | Element, newText: string): string;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Price Formatting Utilities
3
+ *
4
+ * Provides functions for formatting prices according to currency settings.
5
+ * Used to format prices displayed in recommendation product cards.
6
+ */
7
+ import type { CurrencyConfig } from '../types/nodeConfig';
8
+ /**
9
+ * Options for formatting a price
10
+ */
11
+ export interface FormatPriceOptions {
12
+ /** The numeric price value */
13
+ price: number;
14
+ /** Currency configuration */
15
+ currency: CurrencyConfig;
16
+ }
17
+ /**
18
+ * Formats a numeric price according to currency settings
19
+ * @example
20
+ * // Returns: "$ 1,999.99"
21
+ * formatPrice({ price: 1999.99, currency: currencyConfig })
22
+ * @param options - Formatting options
23
+ * @returns Formatted price string
24
+ */
25
+ export declare function formatPrice(options: FormatPriceOptions): string;
26
+ /**
27
+ * Parses a formatted price string back to a number
28
+ * Useful for extracting numeric values from formatted price displays
29
+ * @param formattedPrice - The formatted price string
30
+ * @param currency - Currency configuration for parsing
31
+ * @returns Parsed numeric value or NaN if parsing fails
32
+ */
33
+ export declare function parseFormattedPrice(formattedPrice: string, currency: CurrencyConfig): number;
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Style Preserver Utility
3
+ *
4
+ * Captures and restores element styles during block regeneration.
5
+ * This ensures user styling is preserved when:
6
+ * - Layout changes (vertical <-> horizontal)
7
+ * - Cards per row changes
8
+ * - Composition order changes
9
+ *
10
+ * Works with the node config system to provide complete style persistence.
11
+ */
12
+ import type { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
13
+ import { ModificationDescription } from '@stripoinc/ui-editor-extensions';
14
+ /**
15
+ * Style properties that can be captured for text elements
16
+ */
17
+ export interface TextElementStyles {
18
+ fontSize?: string;
19
+ fontFamily?: string;
20
+ fontWeight?: string;
21
+ fontStyle?: string;
22
+ color?: string;
23
+ textAlign?: string;
24
+ lineHeight?: string;
25
+ textDecoration?: string;
26
+ }
27
+ /**
28
+ * Style properties for button elements
29
+ */
30
+ export interface ButtonElementStyles extends TextElementStyles {
31
+ backgroundColor?: string;
32
+ borderRadius?: string;
33
+ border?: string;
34
+ padding?: string;
35
+ }
36
+ /**
37
+ * Style properties for image elements
38
+ */
39
+ export interface ImageElementStyles {
40
+ width?: string;
41
+ height?: string;
42
+ maxWidth?: string;
43
+ }
44
+ /**
45
+ * Complete captured styles for a recommendation block
46
+ */
47
+ export interface CapturedStyles {
48
+ /** Product name text styles */
49
+ name: TextElementStyles;
50
+ /** Current price text styles */
51
+ price: TextElementStyles;
52
+ /** Original/old price text styles */
53
+ oldPrice: TextElementStyles;
54
+ /** Omnibus price text styles */
55
+ omnibusPrice: TextElementStyles;
56
+ /** Omnibus discount text styles */
57
+ omnibusDiscount: TextElementStyles;
58
+ /** CTA button styles */
59
+ button: ButtonElementStyles;
60
+ /** Product image styles */
61
+ image: ImageElementStyles;
62
+ /** Card background color */
63
+ cardBackgroundColor: string | null;
64
+ /** Column spacing in pixels */
65
+ columnSpacing: number;
66
+ /** Row spacing in pixels */
67
+ rowSpacing: number;
68
+ /** Element composition order */
69
+ composition: string[];
70
+ /** Element visibility flags */
71
+ visibility: Record<string, boolean>;
72
+ }
73
+ type DocumentModifier = {
74
+ modifyHtml: (node: ImmutableHtmlNode) => {
75
+ setStyle: (prop: string, value: string) => DocumentModifier;
76
+ };
77
+ apply: (description: ModificationDescription) => void;
78
+ };
79
+ /**
80
+ * Capture all styles from a recommendation block
81
+ *
82
+ * Call this BEFORE any operation that regenerates the block HTML.
83
+ * The captured styles can then be restored after regeneration.
84
+ * @example
85
+ * // Before layout change
86
+ * const styles = captureStyles(this.currentNode);
87
+ *
88
+ * // ... regenerate block HTML ...
89
+ *
90
+ * // After regeneration
91
+ * restoreStyles(this.currentNode, this.api.getDocumentModifier(), styles);
92
+ * @param node - The block node to capture styles from
93
+ * @returns Complete captured styles object
94
+ */
95
+ export declare function captureStyles(node: ImmutableHtmlNode | null | undefined): CapturedStyles;
96
+ /**
97
+ * Restore captured styles to a regenerated block
98
+ *
99
+ * Call this AFTER regenerating block HTML to reapply user styling.
100
+ * @example
101
+ * restoreStyles(this.currentNode, this.api.getDocumentModifier(), capturedStyles);
102
+ * @param node - The block node to restore styles to
103
+ * @param modifier - Document modifier for applying changes
104
+ * @param styles - Previously captured styles
105
+ */
106
+ export declare function restoreStyles(node: ImmutableHtmlNode | null | undefined, modifier: DocumentModifier, styles: CapturedStyles): void;
107
+ /**
108
+ * Check if styles have meaningful content worth restoring
109
+ * @param styles - Captured styles to check
110
+ * @returns True if styles contain restorable content
111
+ */
112
+ export declare function hasRestorableStyles(styles: CapturedStyles): boolean;
113
+ export {};