@athoscommerce/snap-preact 1.11.0 → 1.12.0

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 (275) hide show
  1. package/dist/cjs/components/src/components/Atoms/Dropdown/Dropdown.js +18 -10
  2. package/dist/cjs/components/src/components/Atoms/Image/Image.js +10 -2
  3. package/dist/cjs/components/src/components/Atoms/ProductDetail/ProductDetail.js +98 -0
  4. package/dist/cjs/components/src/components/Atoms/ProductDetail/index.js +7 -0
  5. package/dist/cjs/components/src/components/Atoms/TemplateSelect/TemplateSelect.js +13 -4
  6. package/dist/cjs/components/src/components/Molecules/CalloutBadge/CalloutBadge.js +4 -1
  7. package/dist/cjs/components/src/components/Molecules/Gallery/Gallery.js +298 -0
  8. package/dist/cjs/components/src/components/Molecules/Gallery/index.js +17 -0
  9. package/dist/cjs/components/src/components/Molecules/Modal/Modal.js +21 -2
  10. package/dist/cjs/components/src/components/Molecules/OverlayBadge/OverlayBadge.js +1 -1
  11. package/dist/cjs/components/src/components/Molecules/ProductDetailTable/ProductDetailTable.js +115 -0
  12. package/dist/cjs/components/src/components/Molecules/ProductDetailTable/index.js +17 -0
  13. package/dist/cjs/components/src/components/Molecules/QuantityPicker/QuantityPicker.js +136 -0
  14. package/dist/cjs/components/src/components/Molecules/QuantityPicker/index.js +17 -0
  15. package/dist/cjs/components/src/components/Molecules/Result/Result.js +43 -4
  16. package/dist/cjs/components/src/components/Molecules/Slideout/Slideout.js +5 -2
  17. package/dist/cjs/components/src/components/Molecules/Slideshow/Slideshow.js +38 -5
  18. package/dist/cjs/components/src/components/Molecules/Swatches/Swatches.js +1 -1
  19. package/dist/cjs/components/src/components/Molecules/VariantSelection/VariantSelection.js +7 -1
  20. package/dist/cjs/components/src/components/Organisms/AutocompleteLayout/AutocompleteLayout.js +8 -8
  21. package/dist/cjs/components/src/components/Organisms/Facet/Facet.js +1 -5
  22. package/dist/cjs/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.js +612 -0
  23. package/dist/cjs/components/src/components/Organisms/QuickviewLayout/index.js +17 -0
  24. package/dist/cjs/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.js +3 -3
  25. package/dist/cjs/components/src/components/Templates/AutocompleteModal/AutocompleteModal.js +3 -3
  26. package/dist/cjs/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.js +2 -2
  27. package/dist/cjs/components/src/components/Templates/QuickviewModal/QuickviewModal.js +153 -0
  28. package/dist/cjs/components/src/components/Templates/QuickviewModal/index.js +17 -0
  29. package/dist/cjs/components/src/components/Templates/QuickviewSlideout/QuickviewSlideout.js +124 -0
  30. package/dist/cjs/components/src/components/Templates/QuickviewSlideout/index.js +17 -0
  31. package/dist/cjs/components/src/components/Templates/Recommendation/Recommendation.js +2 -1
  32. package/dist/cjs/components/src/components/Templates/RecommendationBundle/RecommendationBundle.js +2 -1
  33. package/dist/cjs/components/src/components/Templates/RecommendationGrid/RecommendationGrid.js +2 -1
  34. package/dist/cjs/components/src/hooks/useA11y.js +3 -1
  35. package/dist/cjs/components/src/hooks/useAcRenderedInput.js +1 -1
  36. package/dist/cjs/components/src/hooks/useClickOutside.js +6 -3
  37. package/dist/cjs/components/src/hooks/useTracking.js +14 -8
  38. package/dist/cjs/components/src/index.js +6 -0
  39. package/dist/cjs/components/src/providers/themeComponents.js +4 -0
  40. package/dist/cjs/components/src/setupTests.js +10 -0
  41. package/dist/cjs/components/src/utilities/createImpressionObserver.js +1 -1
  42. package/dist/cjs/components/src/utilities/index.js +1 -0
  43. package/dist/cjs/components/src/utilities/lazyRenderMinSize.js +10 -0
  44. package/dist/cjs/src/Instantiators/RecommendationInstantiator.js +2 -1
  45. package/dist/cjs/src/Snap.js +41 -0
  46. package/dist/cjs/src/Templates/SnapTemplates.js +51 -0
  47. package/dist/cjs/src/Templates/Stores/LibraryStore.js +77 -9
  48. package/dist/cjs/src/Templates/Stores/TemplateEditor/TemplateEditorStore.js +6 -1
  49. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.js +2 -5
  50. package/dist/cjs/src/Templates/Stores/TemplateStore.js +26 -10
  51. package/dist/cjs/src/Templates/Stores/library/components/QuickviewModal.js +5 -0
  52. package/dist/cjs/src/Templates/Stores/library/components/QuickviewSlideout.js +5 -0
  53. package/dist/cjs/src/Templates/Stores/library/currencies/currencies.js +1433 -0
  54. package/dist/cjs/src/Templates/Stores/library/languages/ar.js +487 -0
  55. package/dist/cjs/src/Templates/Stores/library/languages/de.js +487 -0
  56. package/dist/cjs/src/Templates/Stores/library/languages/en.js +1 -0
  57. package/dist/cjs/src/Templates/Stores/library/languages/es.js +84 -41
  58. package/dist/cjs/src/Templates/Stores/library/languages/fr.js +85 -40
  59. package/dist/cjs/src/Templates/Stores/library/languages/hi.js +487 -0
  60. package/dist/cjs/src/Templates/Stores/library/languages/it.js +487 -0
  61. package/dist/cjs/src/Templates/Stores/library/languages/ja.js +487 -0
  62. package/dist/cjs/src/Templates/Stores/library/languages/ko.js +487 -0
  63. package/dist/cjs/src/Templates/Stores/library/languages/nl.js +487 -0
  64. package/dist/cjs/src/Templates/Stores/library/languages/pt.js +487 -0
  65. package/dist/cjs/src/Templates/Stores/library/languages/ru.js +487 -0
  66. package/dist/cjs/src/Templates/Stores/library/languages/tr.js +487 -0
  67. package/dist/cjs/src/Templates/Stores/library/languages/vi.js +487 -0
  68. package/dist/cjs/src/Templates/Stores/library/languages/zh.js +487 -0
  69. package/dist/cjs/src/Templates/index.js +3 -1
  70. package/dist/cjs/src/create/createAutocompleteController.js +1 -0
  71. package/dist/cjs/src/create/createRecommendationController.js +1 -0
  72. package/dist/cjs/src/create/createSearchController.js +1 -0
  73. package/dist/cjs/src/index.js +3 -1
  74. package/dist/esm/components/src/components/Atoms/Button/Button.d.ts +1 -1
  75. package/dist/esm/components/src/components/Atoms/Button/Button.d.ts.map +1 -1
  76. package/dist/esm/components/src/components/Atoms/Dropdown/Dropdown.d.ts.map +1 -1
  77. package/dist/esm/components/src/components/Atoms/Dropdown/Dropdown.js +19 -11
  78. package/dist/esm/components/src/components/Atoms/Image/Image.d.ts +5 -0
  79. package/dist/esm/components/src/components/Atoms/Image/Image.d.ts.map +1 -1
  80. package/dist/esm/components/src/components/Atoms/Image/Image.js +10 -2
  81. package/dist/esm/components/src/components/Atoms/ProductDetail/ProductDetail.d.ts +18 -0
  82. package/dist/esm/components/src/components/Atoms/ProductDetail/ProductDetail.d.ts.map +1 -0
  83. package/dist/esm/components/src/components/Atoms/ProductDetail/ProductDetail.js +89 -0
  84. package/dist/esm/components/src/components/Atoms/ProductDetail/index.d.ts +3 -0
  85. package/dist/esm/components/src/components/Atoms/ProductDetail/index.d.ts.map +1 -0
  86. package/dist/esm/components/src/components/Atoms/ProductDetail/index.js +3 -0
  87. package/dist/esm/components/src/components/Atoms/TemplateSelect/TemplateSelect.d.ts +1 -1
  88. package/dist/esm/components/src/components/Atoms/TemplateSelect/TemplateSelect.d.ts.map +1 -1
  89. package/dist/esm/components/src/components/Atoms/TemplateSelect/TemplateSelect.js +13 -4
  90. package/dist/esm/components/src/components/Molecules/CalloutBadge/CalloutBadge.d.ts.map +1 -1
  91. package/dist/esm/components/src/components/Molecules/CalloutBadge/CalloutBadge.js +4 -1
  92. package/dist/esm/components/src/components/Molecules/Gallery/Gallery.d.ts +28 -0
  93. package/dist/esm/components/src/components/Molecules/Gallery/Gallery.d.ts.map +1 -0
  94. package/dist/esm/components/src/components/Molecules/Gallery/Gallery.js +292 -0
  95. package/dist/esm/components/src/components/Molecules/Gallery/index.d.ts +2 -0
  96. package/dist/esm/components/src/components/Molecules/Gallery/index.d.ts.map +1 -0
  97. package/dist/esm/components/src/components/Molecules/Gallery/index.js +1 -0
  98. package/dist/esm/components/src/components/Molecules/Modal/Modal.d.ts.map +1 -1
  99. package/dist/esm/components/src/components/Molecules/Modal/Modal.js +22 -3
  100. package/dist/esm/components/src/components/Molecules/OverlayBadge/OverlayBadge.d.ts.map +1 -1
  101. package/dist/esm/components/src/components/Molecules/OverlayBadge/OverlayBadge.js +1 -1
  102. package/dist/esm/components/src/components/Molecules/ProductDetailTable/ProductDetailTable.d.ts +14 -0
  103. package/dist/esm/components/src/components/Molecules/ProductDetailTable/ProductDetailTable.d.ts.map +1 -0
  104. package/dist/esm/components/src/components/Molecules/ProductDetailTable/ProductDetailTable.js +109 -0
  105. package/dist/esm/components/src/components/Molecules/ProductDetailTable/index.d.ts +2 -0
  106. package/dist/esm/components/src/components/Molecules/ProductDetailTable/index.d.ts.map +1 -0
  107. package/dist/esm/components/src/components/Molecules/ProductDetailTable/index.js +1 -0
  108. package/dist/esm/components/src/components/Molecules/QuantityPicker/QuantityPicker.d.ts +43 -0
  109. package/dist/esm/components/src/components/Molecules/QuantityPicker/QuantityPicker.d.ts.map +1 -0
  110. package/dist/esm/components/src/components/Molecules/QuantityPicker/QuantityPicker.js +130 -0
  111. package/dist/esm/components/src/components/Molecules/QuantityPicker/index.d.ts +2 -0
  112. package/dist/esm/components/src/components/Molecules/QuantityPicker/index.d.ts.map +1 -0
  113. package/dist/esm/components/src/components/Molecules/QuantityPicker/index.js +1 -0
  114. package/dist/esm/components/src/components/Molecules/Result/Result.d.ts +3 -0
  115. package/dist/esm/components/src/components/Molecules/Result/Result.d.ts.map +1 -1
  116. package/dist/esm/components/src/components/Molecules/Result/Result.js +43 -4
  117. package/dist/esm/components/src/components/Molecules/Slideout/Slideout.d.ts.map +1 -1
  118. package/dist/esm/components/src/components/Molecules/Slideout/Slideout.js +6 -3
  119. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.d.ts +1 -0
  120. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.d.ts.map +1 -1
  121. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.js +38 -5
  122. package/dist/esm/components/src/components/Molecules/Swatches/Swatches.js +1 -1
  123. package/dist/esm/components/src/components/Molecules/VariantSelection/VariantSelection.d.ts.map +1 -1
  124. package/dist/esm/components/src/components/Molecules/VariantSelection/VariantSelection.js +7 -1
  125. package/dist/esm/components/src/components/Organisms/AutocompleteLayout/AutocompleteLayout.js +8 -8
  126. package/dist/esm/components/src/components/Organisms/Facet/Facet.d.ts.map +1 -1
  127. package/dist/esm/components/src/components/Organisms/Facet/Facet.js +1 -5
  128. package/dist/esm/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.d.ts +53 -0
  129. package/dist/esm/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.d.ts.map +1 -0
  130. package/dist/esm/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.js +605 -0
  131. package/dist/esm/components/src/components/Organisms/QuickviewLayout/index.d.ts +2 -0
  132. package/dist/esm/components/src/components/Organisms/QuickviewLayout/index.d.ts.map +1 -0
  133. package/dist/esm/components/src/components/Organisms/QuickviewLayout/index.js +1 -0
  134. package/dist/esm/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.js +3 -3
  135. package/dist/esm/components/src/components/Templates/AutocompleteModal/AutocompleteModal.js +3 -3
  136. package/dist/esm/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.js +2 -2
  137. package/dist/esm/components/src/components/Templates/QuickviewModal/QuickviewModal.d.ts +12 -0
  138. package/dist/esm/components/src/components/Templates/QuickviewModal/QuickviewModal.d.ts.map +1 -0
  139. package/dist/esm/components/src/components/Templates/QuickviewModal/QuickviewModal.js +147 -0
  140. package/dist/esm/components/src/components/Templates/QuickviewModal/index.d.ts +2 -0
  141. package/dist/esm/components/src/components/Templates/QuickviewModal/index.d.ts.map +1 -0
  142. package/dist/esm/components/src/components/Templates/QuickviewModal/index.js +1 -0
  143. package/dist/esm/components/src/components/Templates/QuickviewSlideout/QuickviewSlideout.d.ts +16 -0
  144. package/dist/esm/components/src/components/Templates/QuickviewSlideout/QuickviewSlideout.d.ts.map +1 -0
  145. package/dist/esm/components/src/components/Templates/QuickviewSlideout/QuickviewSlideout.js +118 -0
  146. package/dist/esm/components/src/components/Templates/QuickviewSlideout/index.d.ts +2 -0
  147. package/dist/esm/components/src/components/Templates/QuickviewSlideout/index.d.ts.map +1 -0
  148. package/dist/esm/components/src/components/Templates/QuickviewSlideout/index.js +1 -0
  149. package/dist/esm/components/src/components/Templates/Recommendation/Recommendation.d.ts.map +1 -1
  150. package/dist/esm/components/src/components/Templates/Recommendation/Recommendation.js +3 -2
  151. package/dist/esm/components/src/components/Templates/RecommendationBundle/RecommendationBundle.d.ts.map +1 -1
  152. package/dist/esm/components/src/components/Templates/RecommendationBundle/RecommendationBundle.js +3 -2
  153. package/dist/esm/components/src/components/Templates/RecommendationGrid/RecommendationGrid.d.ts.map +1 -1
  154. package/dist/esm/components/src/components/Templates/RecommendationGrid/RecommendationGrid.js +3 -2
  155. package/dist/esm/components/src/hooks/useA11y.d.ts.map +1 -1
  156. package/dist/esm/components/src/hooks/useA11y.js +3 -1
  157. package/dist/esm/components/src/hooks/useAcRenderedInput.js +1 -1
  158. package/dist/esm/components/src/hooks/useClickOutside.d.ts +1 -1
  159. package/dist/esm/components/src/hooks/useClickOutside.d.ts.map +1 -1
  160. package/dist/esm/components/src/hooks/useClickOutside.js +6 -3
  161. package/dist/esm/components/src/hooks/useTracking.d.ts +9 -3
  162. package/dist/esm/components/src/hooks/useTracking.d.ts.map +1 -1
  163. package/dist/esm/components/src/hooks/useTracking.js +14 -8
  164. package/dist/esm/components/src/index.d.ts +6 -0
  165. package/dist/esm/components/src/index.d.ts.map +1 -1
  166. package/dist/esm/components/src/index.js +6 -0
  167. package/dist/esm/components/src/providers/langComponents.d.ts +6 -0
  168. package/dist/esm/components/src/providers/langComponents.d.ts.map +1 -1
  169. package/dist/esm/components/src/providers/themeComponents.d.ts +104 -57
  170. package/dist/esm/components/src/providers/themeComponents.d.ts.map +1 -1
  171. package/dist/esm/components/src/providers/themeComponents.js +4 -0
  172. package/dist/esm/components/src/setupTests.js +10 -0
  173. package/dist/esm/components/src/utilities/createImpressionObserver.js +1 -1
  174. package/dist/esm/components/src/utilities/index.d.ts +1 -0
  175. package/dist/esm/components/src/utilities/index.d.ts.map +1 -1
  176. package/dist/esm/components/src/utilities/index.js +1 -0
  177. package/dist/esm/components/src/utilities/lazyRenderMinSize.d.ts +5 -0
  178. package/dist/esm/components/src/utilities/lazyRenderMinSize.d.ts.map +1 -0
  179. package/dist/esm/components/src/utilities/lazyRenderMinSize.js +7 -0
  180. package/dist/esm/src/Instantiators/RecommendationInstantiator.d.ts +4 -2
  181. package/dist/esm/src/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  182. package/dist/esm/src/Instantiators/RecommendationInstantiator.js +2 -1
  183. package/dist/esm/src/Snap.d.ts +7 -0
  184. package/dist/esm/src/Snap.d.ts.map +1 -1
  185. package/dist/esm/src/Snap.js +43 -2
  186. package/dist/esm/src/Templates/SnapTemplates.d.ts +25 -0
  187. package/dist/esm/src/Templates/SnapTemplates.d.ts.map +1 -1
  188. package/dist/esm/src/Templates/SnapTemplates.js +48 -0
  189. package/dist/esm/src/Templates/Stores/LibraryStore.d.ts +22 -2
  190. package/dist/esm/src/Templates/Stores/LibraryStore.d.ts.map +1 -1
  191. package/dist/esm/src/Templates/Stores/LibraryStore.js +76 -8
  192. package/dist/esm/src/Templates/Stores/TemplateEditor/TemplateEditorStore.d.ts.map +1 -1
  193. package/dist/esm/src/Templates/Stores/TemplateEditor/TemplateEditorStore.js +6 -1
  194. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.d.ts.map +1 -1
  195. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.js +2 -5
  196. package/dist/esm/src/Templates/Stores/TemplateStore.d.ts +14 -6
  197. package/dist/esm/src/Templates/Stores/TemplateStore.d.ts.map +1 -1
  198. package/dist/esm/src/Templates/Stores/TemplateStore.js +26 -10
  199. package/dist/esm/src/Templates/Stores/library/components/QuickviewModal.d.ts +2 -0
  200. package/dist/esm/src/Templates/Stores/library/components/QuickviewModal.d.ts.map +1 -0
  201. package/dist/esm/src/Templates/Stores/library/components/QuickviewModal.js +1 -0
  202. package/dist/esm/src/Templates/Stores/library/components/QuickviewSlideout.d.ts +2 -0
  203. package/dist/esm/src/Templates/Stores/library/components/QuickviewSlideout.d.ts.map +1 -0
  204. package/dist/esm/src/Templates/Stores/library/components/QuickviewSlideout.js +1 -0
  205. package/dist/esm/src/Templates/Stores/library/currencies/currencies.d.ts +1270 -0
  206. package/dist/esm/src/Templates/Stores/library/currencies/currencies.d.ts.map +1 -0
  207. package/dist/esm/src/Templates/Stores/library/currencies/currencies.js +1430 -0
  208. package/dist/esm/src/Templates/Stores/library/languages/ar.d.ts +3 -0
  209. package/dist/esm/src/Templates/Stores/library/languages/ar.d.ts.map +1 -0
  210. package/dist/esm/src/Templates/Stores/library/languages/ar.js +484 -0
  211. package/dist/esm/src/Templates/Stores/library/languages/de.d.ts +3 -0
  212. package/dist/esm/src/Templates/Stores/library/languages/de.d.ts.map +1 -0
  213. package/dist/esm/src/Templates/Stores/library/languages/de.js +484 -0
  214. package/dist/esm/src/Templates/Stores/library/languages/en.d.ts.map +1 -1
  215. package/dist/esm/src/Templates/Stores/library/languages/en.js +1 -0
  216. package/dist/esm/src/Templates/Stores/library/languages/es.d.ts.map +1 -1
  217. package/dist/esm/src/Templates/Stores/library/languages/es.js +84 -41
  218. package/dist/esm/src/Templates/Stores/library/languages/fr.d.ts.map +1 -1
  219. package/dist/esm/src/Templates/Stores/library/languages/fr.js +85 -40
  220. package/dist/esm/src/Templates/Stores/library/languages/hi.d.ts +3 -0
  221. package/dist/esm/src/Templates/Stores/library/languages/hi.d.ts.map +1 -0
  222. package/dist/esm/src/Templates/Stores/library/languages/hi.js +484 -0
  223. package/dist/esm/src/Templates/Stores/library/languages/it.d.ts +3 -0
  224. package/dist/esm/src/Templates/Stores/library/languages/it.d.ts.map +1 -0
  225. package/dist/esm/src/Templates/Stores/library/languages/it.js +484 -0
  226. package/dist/esm/src/Templates/Stores/library/languages/ja.d.ts +3 -0
  227. package/dist/esm/src/Templates/Stores/library/languages/ja.d.ts.map +1 -0
  228. package/dist/esm/src/Templates/Stores/library/languages/ja.js +484 -0
  229. package/dist/esm/src/Templates/Stores/library/languages/ko.d.ts +3 -0
  230. package/dist/esm/src/Templates/Stores/library/languages/ko.d.ts.map +1 -0
  231. package/dist/esm/src/Templates/Stores/library/languages/ko.js +484 -0
  232. package/dist/esm/src/Templates/Stores/library/languages/nl.d.ts +3 -0
  233. package/dist/esm/src/Templates/Stores/library/languages/nl.d.ts.map +1 -0
  234. package/dist/esm/src/Templates/Stores/library/languages/nl.js +484 -0
  235. package/dist/esm/src/Templates/Stores/library/languages/pt.d.ts +3 -0
  236. package/dist/esm/src/Templates/Stores/library/languages/pt.d.ts.map +1 -0
  237. package/dist/esm/src/Templates/Stores/library/languages/pt.js +484 -0
  238. package/dist/esm/src/Templates/Stores/library/languages/ru.d.ts +3 -0
  239. package/dist/esm/src/Templates/Stores/library/languages/ru.d.ts.map +1 -0
  240. package/dist/esm/src/Templates/Stores/library/languages/ru.js +484 -0
  241. package/dist/esm/src/Templates/Stores/library/languages/tr.d.ts +3 -0
  242. package/dist/esm/src/Templates/Stores/library/languages/tr.d.ts.map +1 -0
  243. package/dist/esm/src/Templates/Stores/library/languages/tr.js +484 -0
  244. package/dist/esm/src/Templates/Stores/library/languages/vi.d.ts +3 -0
  245. package/dist/esm/src/Templates/Stores/library/languages/vi.d.ts.map +1 -0
  246. package/dist/esm/src/Templates/Stores/library/languages/vi.js +484 -0
  247. package/dist/esm/src/Templates/Stores/library/languages/zh.d.ts +3 -0
  248. package/dist/esm/src/Templates/Stores/library/languages/zh.d.ts.map +1 -0
  249. package/dist/esm/src/Templates/Stores/library/languages/zh.js +484 -0
  250. package/dist/esm/src/Templates/index.d.ts +1 -1
  251. package/dist/esm/src/Templates/index.d.ts.map +1 -1
  252. package/dist/esm/src/Templates/index.js +1 -1
  253. package/dist/esm/src/create/createAutocompleteController.js +1 -0
  254. package/dist/esm/src/create/createRecommendationController.js +1 -0
  255. package/dist/esm/src/create/createSearchController.js +1 -0
  256. package/dist/esm/src/index.d.ts +1 -1
  257. package/dist/esm/src/index.d.ts.map +1 -1
  258. package/dist/esm/src/index.js +1 -1
  259. package/dist/esm/src/types.d.ts +2 -1
  260. package/dist/esm/src/types.d.ts.map +1 -1
  261. package/eslint/src/index.cjs +5 -0
  262. package/eslint/src/validate-config.cjs +473 -0
  263. package/package.json +16 -14
  264. package/dist/cjs/src/Templates/Stores/library/currencies/aud.js +0 -10
  265. package/dist/cjs/src/Templates/Stores/library/currencies/eur.js +0 -10
  266. package/dist/cjs/src/Templates/Stores/library/currencies/usd.js +0 -10
  267. package/dist/esm/src/Templates/Stores/library/currencies/aud.d.ts +0 -8
  268. package/dist/esm/src/Templates/Stores/library/currencies/aud.d.ts.map +0 -1
  269. package/dist/esm/src/Templates/Stores/library/currencies/aud.js +0 -7
  270. package/dist/esm/src/Templates/Stores/library/currencies/eur.d.ts +0 -8
  271. package/dist/esm/src/Templates/Stores/library/currencies/eur.d.ts.map +0 -1
  272. package/dist/esm/src/Templates/Stores/library/currencies/eur.js +0 -7
  273. package/dist/esm/src/Templates/Stores/library/currencies/usd.d.ts +0 -8
  274. package/dist/esm/src/Templates/Stores/library/currencies/usd.d.ts.map +0 -1
  275. package/dist/esm/src/Templates/Stores/library/currencies/usd.js +0 -7
@@ -132,7 +132,7 @@ exports.AutocompleteModal = (0, mobx_react_lite_1.observer)((properties) => {
132
132
  },
133
133
  modal: {
134
134
  // default props
135
- internalClassName: 'autocomplete-modal__modal',
135
+ internalClassName: 'ss__autocomplete-modal__modal',
136
136
  buttonSelector: buttonSelector,
137
137
  onOverlayClick: reset,
138
138
  overlayColor: overlayColor,
@@ -147,8 +147,8 @@ exports.AutocompleteModal = (0, mobx_react_lite_1.observer)((properties) => {
147
147
  },
148
148
  searchInput: {
149
149
  // default props
150
- // autocomplete__search-input is required for useAcRenderedInput hook.
151
- internalClassName: 'autocomplete-modal__search-input autocomplete__search-input',
150
+ // ss__autocomplete__search-input is required for useAcRenderedInput hook.
151
+ internalClassName: 'ss__autocomplete-modal__search-input ss__autocomplete__search-input',
152
152
  submitSearchButton: {
153
153
  onClick: () => {
154
154
  () => reset();
@@ -97,8 +97,8 @@ exports.AutocompleteSlideout = (0, mobx_react_lite_1.observer)((properties) => {
97
97
  },
98
98
  searchInput: {
99
99
  // default props
100
- // autocomplete__search-input is required for useAcRenderedInput hook.
101
- internalClassName: 'autocomplete-slideout__search-input autocomplete__search-input',
100
+ // ss__autocomplete__search-input is required for useAcRenderedInput hook.
101
+ internalClassName: 'ss__autocomplete-slideout__search-input ss__autocomplete__search-input',
102
102
  inputName: inputName,
103
103
  submitSearchButton: {
104
104
  onClick: () => {
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QuickviewModal = void 0;
7
+ const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
8
+ const hooks_1 = require("preact/hooks");
9
+ const mobx_react_lite_1 = require("mobx-react-lite");
10
+ const react_1 = require("@emotion/react");
11
+ const classnames_1 = __importDefault(require("classnames"));
12
+ const providers_1 = require("../../../providers");
13
+ const utilities_1 = require("../../../utilities");
14
+ const Modal_1 = require("../../Molecules/Modal");
15
+ const QuickviewLayout_1 = require("../../Organisms/QuickviewLayout");
16
+ const defaultStyles = () => {
17
+ return (0, react_1.css)({
18
+ // Take the wrapper out of normal flow. The modal is injected into its own container at the
19
+ // end of `<body>`, but a consumer may still render it inside a grid (e.g. as a sibling of a
20
+ // result `<article>`), where in-flow it would occupy a cell and shift the layout when opened.
21
+ // The modal's content and overlay are both `position: fixed`, so an absolute, zero-size
22
+ // wrapper has no visual effect while keeping it out of any grid.
23
+ position: 'absolute',
24
+ width: 0,
25
+ height: 0,
26
+ // Override the underlying Modal's `.ss__modal__content` positioning so the quickview
27
+ // is centered in the viewport rather than positioned relative to the source Result tile.
28
+ // Modal's default is `position: absolute` inside its (relative) wrapper, which lives
29
+ // inside the Results grid cell — that's why the modal was being clipped to a tile.
30
+ // We compound the wrapper class (`&.ss__quickview-modal`) into the selector to beat
31
+ // Modal's same-specificity rule (which would otherwise win on source-order since
32
+ // Modal's styles are emitted after ours), and use !important on the positioning
33
+ // properties so theme overrides can't accidentally re-anchor the modal to its tile.
34
+ '&.ss__quickview-modal .ss__modal__content': {
35
+ position: 'fixed !important',
36
+ top: '50% !important',
37
+ left: '50% !important',
38
+ transform: 'translate(-50%, -50%) !important',
39
+ minWidth: 'auto',
40
+ maxWidth: '90vw',
41
+ maxHeight: '90vh',
42
+ width: 'auto',
43
+ overflow: 'auto',
44
+ zIndex: 10006,
45
+ boxShadow: '0 4px 24px rgba(0, 0, 0, 0.2)',
46
+ borderRadius: '4px',
47
+ },
48
+ // Lower the Modal's Overlay backdrop too so it stays below both the modal content
49
+ // (10006) and the dropdown portal (10007) but above page content and autocomplete.
50
+ '&.ss__quickview-modal .ss__modal__overlay': {
51
+ zIndex: '10005 !important',
52
+ },
53
+ // Below the desktop breakpoint (where QuickviewLayout stacks to a single column) the
54
+ // modal spans the full viewport width instead of shrink-wrapping its content. The
55
+ // wrapper class is compounded into the content selector so this beats QuickviewLayout's
56
+ // same-specificity min/max width rule on the content div.
57
+ '@media (max-width: 767px)': {
58
+ '&.ss__quickview-modal .ss__modal__content': {
59
+ width: '100vw',
60
+ maxWidth: '100vw',
61
+ borderRadius: 0,
62
+ },
63
+ '&.ss__quickview-modal .ss__quickview__content': {
64
+ minWidth: 'auto',
65
+ maxWidth: '100%',
66
+ },
67
+ },
68
+ });
69
+ };
70
+ exports.QuickviewModal = (0, mobx_react_lite_1.observer)((properties) => {
71
+ const globalTheme = (0, providers_1.useTheme)();
72
+ const globalTreePath = (0, providers_1.useTreePath)();
73
+ const defaultProps = {
74
+ treePath: globalTreePath,
75
+ hideBadge: false,
76
+ layout: [['c1', 'c2']],
77
+ column1: {
78
+ layout: ['slideshow'],
79
+ width: '45%',
80
+ },
81
+ column2: {
82
+ layout: [
83
+ ['productDetail.mappings.core.name'],
84
+ ['calloutBadge'],
85
+ ['variantSelections'],
86
+ ['quantityPicker'],
87
+ ['button.add-to-cart'],
88
+ ['productDetail.mappings.core.description'],
89
+ ['productDetailTable'],
90
+ ['button.more-info'],
91
+ ],
92
+ width: 'auto',
93
+ },
94
+ };
95
+ const props = (0, utilities_1.mergeProps)('quickviewModal', globalTheme, defaultProps, properties);
96
+ const { quickviewManager, className, internalClassName, disableStyles, treePath, layout, hideBadge, column1, column2, column3, column4, recommendation, lang, } = props;
97
+ // Dialog focus management: remember what had focus before the modal opened, move focus to
98
+ // the close button on open, and restore on close. This lives in the container (not the
99
+ // layout) because the layout unmounts when the Modal closes — only the always-mounted
100
+ // container can run the restore-focus branch on the open→close transition.
101
+ const wrapperRef = (0, hooks_1.useRef)(null);
102
+ const previousFocusRef = (0, hooks_1.useRef)(null);
103
+ const wasOpenRef = (0, hooks_1.useRef)(false);
104
+ (0, hooks_1.useEffect)(() => {
105
+ const isOpenNow = Boolean(quickviewManager?.store?.isOpen);
106
+ if (isOpenNow && !wasOpenRef.current) {
107
+ previousFocusRef.current = document.activeElement || null;
108
+ const closeEl = wrapperRef.current?.querySelector('.ss__quickview__close');
109
+ closeEl?.focus();
110
+ }
111
+ else if (!isOpenNow && wasOpenRef.current) {
112
+ previousFocusRef.current?.focus?.();
113
+ previousFocusRef.current = null;
114
+ }
115
+ wasOpenRef.current = isOpenNow;
116
+ });
117
+ const styling = (0, utilities_1.mergeStyles)(props, defaultStyles);
118
+ if (!quickviewManager) {
119
+ console.warn(`[QuickviewModal] No quickviewManager provided; quickview cannot function without a QuickviewManager instance.`);
120
+ return null;
121
+ }
122
+ const store = quickviewManager.store;
123
+ const product = store.product;
124
+ const isOpen = Boolean(store.isOpen);
125
+ const onClose = () => quickviewManager.close();
126
+ const subProps = {
127
+ quickviewLayout: {
128
+ // default props
129
+ onClose,
130
+ ...(0, utilities_1.defined)({ hideBadge, column1, column2, column3, column4, recommendation, lang }),
131
+ // inherited props
132
+ ...(0, utilities_1.defined)({
133
+ disableStyles,
134
+ }),
135
+ // component theme overrides
136
+ theme: props?.theme,
137
+ treePath,
138
+ },
139
+ modal: {
140
+ onOverlayClick: onClose,
141
+ // inherited props
142
+ ...(0, utilities_1.defined)({
143
+ disableStyles,
144
+ }),
145
+ // component theme overrides
146
+ theme: props?.theme,
147
+ treePath,
148
+ },
149
+ };
150
+ // non-null: defaultProps always supplies a layout
151
+ const layoutContent = (0, jsx_runtime_1.jsx)(QuickviewLayout_1.QuickviewLayout, { quickviewManager: quickviewManager, ...subProps.quickviewLayout, layout: layout });
152
+ return ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, ref: wrapperRef, className: (0, classnames_1.default)('ss__quickview-modal', className, internalClassName), onClick: (e) => e.stopPropagation(), children: (0, jsx_runtime_1.jsx)(Modal_1.Modal, { ...subProps.modal, open: isOpen, children: product ? ((0, jsx_runtime_1.jsx)(QuickviewLayout_1.QuickviewTracker, { quickviewManager: quickviewManager, product: product, children: layoutContent }, `${product.responseId}-${product.id}`)) : (layoutContent) }) }) }));
153
+ });
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./QuickviewModal"), exports);
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QuickviewSlideout = void 0;
7
+ const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
8
+ const hooks_1 = require("preact/hooks");
9
+ const mobx_react_lite_1 = require("mobx-react-lite");
10
+ const react_1 = require("@emotion/react");
11
+ const classnames_1 = __importDefault(require("classnames"));
12
+ const providers_1 = require("../../../providers");
13
+ const utilities_1 = require("../../../utilities");
14
+ const Slideout_1 = require("../../Molecules/Slideout");
15
+ const QuickviewLayout_1 = require("../../Organisms/QuickviewLayout");
16
+ const defaultStyles = () => {
17
+ return (0, react_1.css)({
18
+ // The wrapper sits out of flow; the Slideout itself is `position: fixed`. Keep its panel
19
+ // and overlay above autocomplete (10002) like the Modal variant does.
20
+ '& .ss__slideout': {
21
+ zIndex: 10006,
22
+ },
23
+ '& .ss__slideout__overlay': {
24
+ zIndex: '10005 !important',
25
+ },
26
+ // Inside a single-column panel the content shouldn't be width-capped to the desktop modal size.
27
+ '& .ss__quickview__content': {
28
+ minWidth: 'auto',
29
+ maxWidth: '100%',
30
+ },
31
+ });
32
+ };
33
+ exports.QuickviewSlideout = (0, mobx_react_lite_1.observer)((properties) => {
34
+ const globalTheme = (0, providers_1.useTheme)();
35
+ const globalTreePath = (0, providers_1.useTreePath)();
36
+ const defaultProps = {
37
+ treePath: globalTreePath,
38
+ slideDirection: 'right',
39
+ width: '500px',
40
+ overlayColor: 'rgba(0,0,0,0.8)',
41
+ hideBadge: false,
42
+ layout: [
43
+ ['slideshow'],
44
+ ['productDetail.mappings.core.name'],
45
+ ['calloutBadge'],
46
+ ['variantSelections'],
47
+ ['quantityPicker'],
48
+ ['button.add-to-cart'],
49
+ ['productDetail.mappings.core.description'],
50
+ ['productDetailTable'],
51
+ ['button.more-info'],
52
+ ],
53
+ };
54
+ const props = (0, utilities_1.mergeProps)('quickviewSlideout', globalTheme, defaultProps, properties);
55
+ const { quickviewManager, className, internalClassName, disableStyles, treePath, layout, hideBadge, column1, column2, column3, column4, recommendation, slideDirection, width, overlayColor, lang, } = props;
56
+ // painted state used to ensure transition works with dynamic loading
57
+ const [painted, setPainted] = (0, hooks_1.useState)(false);
58
+ (0, hooks_1.useEffect)(() => {
59
+ setPainted(true);
60
+ }, []);
61
+ // Dialog focus management — see QuickviewModal for the rationale (effect lives in the
62
+ // always-mounted container so the restore-focus branch survives the open→close transition).
63
+ const wrapperRef = (0, hooks_1.useRef)(null);
64
+ const previousFocusRef = (0, hooks_1.useRef)(null);
65
+ const wasOpenRef = (0, hooks_1.useRef)(false);
66
+ (0, hooks_1.useEffect)(() => {
67
+ const isOpenNow = Boolean(quickviewManager?.store?.isOpen) && painted;
68
+ if (isOpenNow && !wasOpenRef.current) {
69
+ previousFocusRef.current = document.activeElement || null;
70
+ const closeEl = wrapperRef.current?.querySelector('.ss__quickview__close');
71
+ closeEl?.focus();
72
+ }
73
+ else if (!isOpenNow && wasOpenRef.current) {
74
+ previousFocusRef.current?.focus?.();
75
+ previousFocusRef.current = null;
76
+ }
77
+ wasOpenRef.current = isOpenNow;
78
+ });
79
+ const styling = (0, utilities_1.mergeStyles)(props, defaultStyles);
80
+ if (!quickviewManager) {
81
+ console.warn(`[QuickviewSlideout] No quickviewManager provided; quickview cannot function without a QuickviewManager instance.`);
82
+ return null;
83
+ }
84
+ const store = quickviewManager.store;
85
+ const product = store.product;
86
+ const isOpen = Boolean(store.isOpen) && painted;
87
+ const onClose = () => quickviewManager.close();
88
+ const subProps = {
89
+ quickviewLayout: {
90
+ // default props
91
+ onClose,
92
+ ...(0, utilities_1.defined)({ hideBadge, column1, column2, column3, column4, recommendation, lang }),
93
+ // inherited props
94
+ ...(0, utilities_1.defined)({
95
+ disableStyles,
96
+ }),
97
+ // component theme overrides
98
+ theme: props?.theme,
99
+ treePath,
100
+ },
101
+ slideout: {
102
+ // default props
103
+ rerender: false,
104
+ slideDirection: slideDirection,
105
+ width: width,
106
+ overlayColor: overlayColor,
107
+ // Sync an overlay dismiss back to the store so `store.isOpen` stays the single source of truth.
108
+ onChange: (active) => {
109
+ if (!active)
110
+ onClose();
111
+ },
112
+ // inherited props
113
+ ...(0, utilities_1.defined)({
114
+ disableStyles,
115
+ }),
116
+ // component theme overrides
117
+ theme: props?.theme,
118
+ treePath,
119
+ },
120
+ };
121
+ // non-null: defaultProps always supplies a layout
122
+ const layoutContent = (0, jsx_runtime_1.jsx)(QuickviewLayout_1.QuickviewLayout, { quickviewManager: quickviewManager, ...subProps.quickviewLayout, layout: layout });
123
+ return ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, ref: wrapperRef, className: (0, classnames_1.default)('ss__quickview-slideout', className, internalClassName), onClick: (e) => e.stopPropagation(), children: (0, jsx_runtime_1.jsx)(Slideout_1.Slideout, { ...subProps.slideout, active: isOpen, children: product ? ((0, jsx_runtime_1.jsx)(QuickviewLayout_1.QuickviewTracker, { quickviewManager: quickviewManager, product: product, children: layoutContent }, `${product.responseId}-${product.id}`)) : (layoutContent) }) }) }));
124
+ });
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./QuickviewSlideout"), exports);
@@ -21,6 +21,7 @@ const hooks_3 = require("../../../hooks");
21
21
  const ResultTracker_1 = require("../../Trackers/ResultTracker");
22
22
  const defaultStyles = ({ vertical }) => {
23
23
  return (0, react_1.css)({
24
+ ...utilities_1.lazyRenderMinSize,
24
25
  height: vertical ? '100%' : undefined,
25
26
  '.ss__result__image-wrapper': {
26
27
  height: vertical ? '85%' : undefined,
@@ -121,7 +122,7 @@ exports.Recommendation = (0, mobx_react_lite_1.observer)((properties) => {
121
122
  //deep merge with props.lang
122
123
  const lang = (0, deepmerge_1.default)(defaultLang, props.lang || {});
123
124
  const mergedLang = (0, hooks_3.useLang)(lang, {}, { activeBreakpoint: globalTheme?.activeBreakpoint });
124
- return (Array.isArray(children) && children.length) || resultsToRender?.length ? ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, className: (0, classnames_1.default)('ss__recommendation', className, internalClassName), ref: recsRef, children: isVisible ? ((0, jsx_runtime_1.jsxs)(ProfileTracker_1.RecommendationProfileTracker, { controller: controller, children: [title && !hideTitle && ((0, jsx_runtime_1.jsx)("h3", { className: "ss__recommendation__title", ...mergedLang.titleText?.all, children: title })), description && (0, jsx_runtime_1.jsx)("p", { className: "ss__recommendation__description", children: description }), (0, jsx_runtime_1.jsx)(Carousel_1.Carousel, { prevButton: prevButton, nextButton: nextButton, hideButtons: hideButtons, loop: loop, pagination: pagination, ...subProps.carousel, ...additionalProps, children: Array.isArray(children) && children.length
125
+ return (Array.isArray(children) && children.length) || resultsToRender?.length ? ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, style: disableStyles ? utilities_1.lazyRenderMinSize : undefined, className: (0, classnames_1.default)('ss__recommendation', className, internalClassName), ref: recsRef, children: isVisible ? ((0, jsx_runtime_1.jsxs)(ProfileTracker_1.RecommendationProfileTracker, { controller: controller, children: [title && !hideTitle && ((0, jsx_runtime_1.jsx)("h3", { className: "ss__recommendation__title", ...mergedLang.titleText?.all, children: title })), description && (0, jsx_runtime_1.jsx)("p", { className: "ss__recommendation__description", children: description }), (0, jsx_runtime_1.jsx)(Carousel_1.Carousel, { prevButton: prevButton, nextButton: nextButton, hideButtons: hideButtons, loop: loop, pagination: pagination, ...subProps.carousel, ...additionalProps, children: Array.isArray(children) && children.length
125
126
  ? children.map((child, idx) => ((0, jsx_runtime_1.jsx)(ResultTracker_1.ResultTracker, { controller: controller, result: resultsToRender[idx], children: child })))
126
127
  : resultsToRender.map((result) => ((0, jsx_runtime_1.jsx)(ResultTracker_1.ResultTracker, { controller: controller, result: result, children: (() => {
127
128
  if (resolvedResultComponent && controller) {
@@ -28,6 +28,7 @@ const defaultStyles = ({ vertical, separatorIcon, carousel, ctaInline, hasSeed,
28
28
  }
29
29
  const slidesPerView = carousel?.slidesPerView;
30
30
  return (0, react_1.css)({
31
+ ...utilities_1.lazyRenderMinSize,
31
32
  [`.${classNamePrefix}__wrapper`]: {
32
33
  display: 'flex',
33
34
  maxWidth: '100%',
@@ -434,7 +435,7 @@ exports.RecommendationBundle = (0, mobx_react_lite_1.observer)((properties) => {
434
435
  if (hideSeedText) {
435
436
  delete lang.seedText.value;
436
437
  }
437
- return resultsToRender?.length ? ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, ref: recsRef, className: (0, classnames_1.default)(classNamePrefix, { [`${classNamePrefix}--stacked`]: !ctaInline }, className, internalClassName), children: isVisible ? ((0, jsx_runtime_1.jsxs)(ProfileTracker_1.RecommendationProfileTracker, { controller: controller, children: [title && ((0, jsx_runtime_1.jsx)("h3", { className: `${classNamePrefix}__title`, children: (0, jsx_runtime_1.jsx)("span", { children: title }) })), description && ((0, jsx_runtime_1.jsx)("p", { className: "ss__recommendation-bundle__description", children: (0, jsx_runtime_1.jsx)("span", { children: description }) })), (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(`${classNamePrefix}__wrapper`, {
438
+ return resultsToRender?.length ? ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, style: disableStyles ? utilities_1.lazyRenderMinSize : undefined, ref: recsRef, className: (0, classnames_1.default)(classNamePrefix, { [`${classNamePrefix}--stacked`]: !ctaInline }, className, internalClassName), children: isVisible ? ((0, jsx_runtime_1.jsxs)(ProfileTracker_1.RecommendationProfileTracker, { controller: controller, children: [title && ((0, jsx_runtime_1.jsx)("h3", { className: `${classNamePrefix}__title`, children: (0, jsx_runtime_1.jsx)("span", { children: title }) })), description && ((0, jsx_runtime_1.jsx)("p", { className: "ss__recommendation-bundle__description", children: (0, jsx_runtime_1.jsx)("span", { children: description }) })), (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(`${classNamePrefix}__wrapper`, {
438
439
  [`${classNamePrefix}__wrapper--seed-in-carousel`]: seedInCarousel,
439
440
  [`${classNamePrefix}__wrapper--vertical`]: vertical,
440
441
  }), children: [carouselEnabled ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [!seedInCarousel && !hideSeed && seed && ((0, jsx_runtime_1.jsx)("div", { className: `${classNamePrefix}__wrapper__seed-container`, children: (0, jsx_runtime_1.jsx)(ResultTracker_1.ResultTracker, { controller: controller, result: seed, track: { impression: false }, children: (0, jsx_runtime_1.jsx)(BundleSelector_1.BundleSelector, { seedText: seedText, seed: true, title: seed.display.mappings.core?.name, onCheck: (e) => {
@@ -20,6 +20,7 @@ const hooks_1 = require("preact/hooks");
20
20
  const hooks_2 = require("../../../hooks");
21
21
  const defaultStyles = ({ gapSize, columns }) => {
22
22
  return (0, react_1.css)({
23
+ ...utilities_1.lazyRenderMinSize,
23
24
  maxWidth: '100%',
24
25
  maxHeight: '100%',
25
26
  '.ss__recommendation-grid__results': {
@@ -114,7 +115,7 @@ exports.RecommendationGrid = (0, mobx_react_lite_1.observer)((properties) => {
114
115
  if (inView) {
115
116
  setIsVisible(true);
116
117
  }
117
- return results?.length ? ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, ref: recsRef, className: (0, classnames_1.default)('ss__recommendation-grid', className, internalClassName), children: isVisible ? ((0, jsx_runtime_1.jsxs)(ProfileTracker_1.RecommendationProfileTracker, { controller: controller, children: [title && (0, jsx_runtime_1.jsx)("h3", { className: "ss__recommendation-grid__title", children: title }), (0, jsx_runtime_1.jsx)("div", { className: "ss__recommendation-grid__results", children: results.map((result) => (() => {
118
+ return results?.length ? ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { ...styling, style: disableStyles ? utilities_1.lazyRenderMinSize : undefined, ref: recsRef, className: (0, classnames_1.default)('ss__recommendation-grid', className, internalClassName), children: isVisible ? ((0, jsx_runtime_1.jsxs)(ProfileTracker_1.RecommendationProfileTracker, { controller: controller, children: [title && (0, jsx_runtime_1.jsx)("h3", { className: "ss__recommendation-grid__title", children: title }), (0, jsx_runtime_1.jsx)("div", { className: "ss__recommendation-grid__results", children: results.map((result) => (() => {
118
119
  if (resolvedResultComponent && controller) {
119
120
  return (0, utilities_1.cloneWithProps)(resolvedResultComponent, {
120
121
  controller,
@@ -21,7 +21,9 @@ function useA11y(elem, tabIndex, trapFocus, escCallback) {
21
21
  //tab index 0 is default and used for actionable elements.
22
22
  elem.setAttribute('tabIndex', `${tabIndex || 0}`);
23
23
  elem.addEventListener('keydown', (event) => {
24
- if (event.code === 'Space' || event.code === 'Enter') {
24
+ // only synthesize a click when the element itself is focused — a bubbled Enter/Space from
25
+ // an inner control must not click the container (e.g. Gallery's backdrop-close onClick)
26
+ if ((event.code === 'Space' || event.code === 'Enter') && event.target === elem) {
25
27
  elem.click();
26
28
  }
27
29
  });
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useAcRenderedInput = useAcRenderedInput;
4
4
  const hooks_1 = require("preact/hooks");
5
- const RENDERED_INPUT_SELECTOR = '.autocomplete__search-input input';
5
+ const RENDERED_INPUT_SELECTOR = '.ss__autocomplete__search-input input';
6
6
  function useAcRenderedInput({ input, controllers, renderInput, buttonSelector, renderedInputRef, setActive, }) {
7
7
  const [_input, setInput] = (0, hooks_1.useState)(input);
8
8
  const [renderedInputInitialized, setRenderedInputInitialized] = (0, hooks_1.useState)(false);
@@ -2,15 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useClickOutside = useClickOutside;
4
4
  const hooks_1 = require("preact/hooks");
5
- function useClickOutside(callback) {
5
+ function useClickOutside(callback, capture = false) {
6
6
  const callbackRef = (0, hooks_1.useRef)();
7
7
  const innerRef = (0, hooks_1.useRef)();
8
8
  (0, hooks_1.useEffect)(() => {
9
9
  callbackRef.current = callback;
10
10
  });
11
11
  (0, hooks_1.useEffect)(() => {
12
- document.addEventListener('click', handleClick);
13
- return () => document.removeEventListener('click', handleClick);
12
+ // capture phase (opt-in) sees the outside click even when an element between the target and
13
+ // document stops propagation (e.g. the quickview wrapper shielding autocomplete's document handler).
14
+ // Default stays bubble phase so inner/portaled content can keep a container open via stopPropagation().
15
+ document.addEventListener('click', handleClick, capture);
16
+ return () => document.removeEventListener('click', handleClick, capture);
14
17
  function handleClick(e) {
15
18
  if (innerRef.current && callbackRef.current && !innerRef.current.contains(e.target))
16
19
  callbackRef.current(e);
@@ -4,7 +4,7 @@ exports.useTracking = useTracking;
4
4
  const hooks_1 = require("preact/hooks");
5
5
  const utilities_1 = require("../utilities");
6
6
  const withTracking_1 = require("../providers/withTracking");
7
- function useTracking({ controller, result, banner, type, content }) {
7
+ function useTracking({ controller, result, banner, type, content, track }) {
8
8
  if (!controller) {
9
9
  console.warn('Warning: No controller provided to useTracking');
10
10
  }
@@ -14,27 +14,33 @@ function useTracking({ controller, result, banner, type, content }) {
14
14
  if (!result && !banner && (!type || !content)) {
15
15
  console.warn('Warning: No result or banner provided to withTracking');
16
16
  }
17
- const { ref, inViewport } = (0, utilities_1.createImpressionObserver)();
17
+ const mergedTrack = {
18
+ impression: true,
19
+ click: true,
20
+ ...track,
21
+ };
22
+ const { ref, inViewport } = (0, utilities_1.createImpressionObserver)(track?.options);
18
23
  (0, hooks_1.useEffect)(() => {
19
- if (inViewport) {
20
- // TODO: add support for disabling tracking events via config like in ResultTracker
24
+ if (inViewport && mergedTrack.impression) {
21
25
  if (type && content && !result && ['search', 'autocomplete'].includes(controller?.type || '')) {
22
26
  controller?.track.banner.impression(content[type][0]);
23
27
  }
24
28
  else if (!result?.bundleSeed) {
25
- controller?.track.product.impression((result || banner));
29
+ controller?.track.product.impression(result || banner);
26
30
  }
27
31
  }
28
32
  }, [inViewport]);
29
33
  (0, hooks_1.useEffect)(() => {
30
34
  const currentRef = ref.current;
31
- if (currentRef) {
35
+ // TRACKING_ATTRIBUTE marks a click-tracked boundary (see isClickWithinBannerLink),
36
+ // so it is only set when click tracking is enabled
37
+ if (currentRef && mergedTrack.click) {
32
38
  const handleClick = (e) => {
33
39
  if (type && content && !result && ['search', 'autocomplete'].includes(controller?.type || '')) {
34
40
  controller?.track.banner.click(e, content[type][0]);
35
41
  }
36
42
  else {
37
- controller?.track.product.click(e, (result || banner));
43
+ controller?.track.product.click(e, result || banner);
38
44
  }
39
45
  };
40
46
  currentRef.setAttribute(withTracking_1.TRACKING_ATTRIBUTE, 'true');
@@ -43,6 +49,6 @@ function useTracking({ controller, result, banner, type, content }) {
43
49
  currentRef.removeEventListener('click', handleClick);
44
50
  };
45
51
  }
46
- }, [controller, result, banner, type, content]);
52
+ }, [controller, result, banner, type, content, mergedTrack.click, mergedTrack.impression]);
47
53
  return { trackingRef: ref };
48
54
  }
@@ -32,6 +32,7 @@ __exportStar(require("./components/Atoms/LoadingBar"), exports);
32
32
  __exportStar(require("./components/Atoms/Overlay"), exports);
33
33
  __exportStar(require("./components/Atoms/PaginationInfo"), exports);
34
34
  __exportStar(require("./components/Atoms/Price"), exports);
35
+ __exportStar(require("./components/Atoms/ProductDetail"), exports);
35
36
  __exportStar(require("./components/Atoms/SearchHeader"), exports);
36
37
  __exportStar(require("./components/Atoms/Skeleton"), exports);
37
38
  // MOLECULES
@@ -55,6 +56,9 @@ __exportStar(require("./components/Molecules/Modal"), exports);
55
56
  __exportStar(require("./components/Molecules/OverlayBadge"), exports);
56
57
  __exportStar(require("./components/Molecules/Pagination"), exports);
57
58
  __exportStar(require("./components/Molecules/PerPage"), exports);
59
+ __exportStar(require("./components/Molecules/ProductDetailTable"), exports);
60
+ __exportStar(require("./components/Molecules/Gallery"), exports);
61
+ __exportStar(require("./components/Molecules/QuantityPicker"), exports);
58
62
  __exportStar(require("./components/Molecules/Radio"), exports);
59
63
  __exportStar(require("./components/Molecules/RadioList"), exports);
60
64
  __exportStar(require("./components/Molecules/Rating"), exports);
@@ -82,6 +86,8 @@ __exportStar(require("./components/Organisms/Toolbar"), exports);
82
86
  __exportStar(require("./components/Organisms/Autocomplete"), exports);
83
87
  __exportStar(require("./components/Organisms/TermsList"), exports);
84
88
  // TEMPLATES
89
+ __exportStar(require("./components/Templates/QuickviewModal"), exports);
90
+ __exportStar(require("./components/Templates/QuickviewSlideout"), exports);
85
91
  __exportStar(require("./components/Templates/Recommendation"), exports);
86
92
  __exportStar(require("./components/Templates/RecommendationBundle"), exports);
87
93
  __exportStar(require("./components/Templates/RecommendationBundleEasyAdd"), exports);
@@ -22,6 +22,7 @@ exports.ALL_CUSTOM_COMPONENT_TYPES = [
22
22
  'paginationInfo',
23
23
  'slideshow',
24
24
  'price',
25
+ 'productDetail',
25
26
  'skeleton',
26
27
  /* molecules */
27
28
  'modal',
@@ -39,10 +40,12 @@ exports.ALL_CUSTOM_COMPONENT_TYPES = [
39
40
  'facetPaletteOptions',
40
41
  'facetSlider',
41
42
  'filter',
43
+ 'gallery',
42
44
  'loadMore',
43
45
  'overlayBadge',
44
46
  'pagination',
45
47
  'perPage',
48
+ 'quantityPicker',
46
49
  'overlayResult',
47
50
  'radioList',
48
51
  'rating',
@@ -53,6 +56,7 @@ exports.ALL_CUSTOM_COMPONENT_TYPES = [
53
56
  'swatches',
54
57
  'tabSelection',
55
58
  'variantSelection',
59
+ 'productDetailTable',
56
60
  'terms',
57
61
  /* organisms */
58
62
  'branchOverride',
@@ -1,3 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  require("@testing-library/jest-dom");
4
+ if (typeof globalThis.ResizeObserver === 'undefined') {
5
+ globalThis.ResizeObserver = class ResizeObserver {
6
+ // eslint-disable-next-line @typescript-eslint/no-empty-function --- IGNORE ---
7
+ observe() { }
8
+ // eslint-disable-next-line @typescript-eslint/no-empty-function --- IGNORE ---
9
+ unobserve() { }
10
+ // eslint-disable-next-line @typescript-eslint/no-empty-function --- IGNORE ---
11
+ disconnect() { }
12
+ };
13
+ }
@@ -8,10 +8,10 @@ const IMPRESSION_MIN_VISIBLE_TIME = 1000;
8
8
  function createImpressionObserver(options) {
9
9
  const ref = (0, hooks_1.useRef)(null);
10
10
  const { inViewport, updateRef } = (0, hooks_2.useIntersectionAdvanced)(ref, {
11
- ...options,
12
11
  fireOnce: true,
13
12
  threshold: IMPRESSION_VISIBILITY_THRESHOLD,
14
13
  minVisibleTime: IMPRESSION_MIN_VISIBLE_TIME,
14
+ ...options,
15
15
  });
16
16
  return {
17
17
  ref,
@@ -28,3 +28,4 @@ __exportStar(require("./selectionKey"), exports);
28
28
  __exportStar(require("./storybook"), exports);
29
29
  __exportStar(require("./defaultBadgeComponentMap"), exports);
30
30
  __exportStar(require("./createImpressionObserver"), exports);
31
+ __exportStar(require("./lazyRenderMinSize"), exports);
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lazyRenderMinSize = void 0;
4
+ // A 0x0 root wrapper can prevent IntersectionObserver from ever reporting `isIntersecting`
5
+ // in some browsers, so lazyRender needs a non-zero min size on the root element at all times,
6
+ // even when disableStyles is set and the rest of defaultStyles is skipped.
7
+ exports.lazyRenderMinSize = {
8
+ minWidth: '1px',
9
+ minHeight: '1px',
10
+ };
@@ -47,6 +47,7 @@ class RecommendationInstantiator {
47
47
  this.client = services?.client || new snap_client_1.Client(this.config.client.globals, this.config.client.config);
48
48
  this.tracker = services?.tracker || new snap_tracker_1.Tracker(this.config.client.globals);
49
49
  this.logger = services?.logger || new snap_logger_1.Logger({ prefix: 'RecommendationInstantiator ', mode: this.mode });
50
+ this.quickviewManager = services?.quickviewManager;
50
51
  const profileCount = {};
51
52
  // script block targeter for "grouped" and "legacy" blocks
52
53
  this.targeter = new snap_toolbox_1.DomTargeter([
@@ -255,7 +256,7 @@ async function readyTheController(instance, services, targetElem, context, profi
255
256
  controller: controllerConfig,
256
257
  context,
257
258
  mode: instance.config.mode,
258
- }, { client: instance.client, tracker: instance.tracker });
259
+ }, { client: instance.client, tracker: instance.tracker, quickviewManager: instance.quickviewManager });
259
260
  // mark element with controller id so cleanupStaleControllers knows it's active
260
261
  if (targetElem) {
261
262
  targetElem.setAttribute('ss-controller-id', controller.id);