@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
@@ -0,0 +1,18 @@
1
+ import { h } from 'preact';
2
+ import { ComponentProps } from '../../../types';
3
+ import type { Product } from '@athoscommerce/snap-store-mobx';
4
+ export declare const isCorePriceField: (field: string) => boolean;
5
+ export declare const getProductFieldValue: (result: Product | undefined, field: string) => unknown;
6
+ export declare const renderDetailValue: (value: unknown) => string;
7
+ export declare const ProductDetail: ((properties: ProductDetailProps) => import("@emotion/react/jsx-runtime").JSX.Element | h.JSX.Element | null) & {
8
+ displayName: string;
9
+ };
10
+ export type ProductDetailProps = {
11
+ result?: Product;
12
+ field: string;
13
+ } & ProductDetailTemplatesLegalProps & ComponentProps<ProductDetailProps>;
14
+ export type ProductDetailTemplatesLegalProps = {
15
+ html?: boolean;
16
+ tag?: string;
17
+ };
18
+ //# sourceMappingURL=ProductDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductDetail.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Atoms/ProductDetail/ProductDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAQ3B,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAM7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAQ9D,eAAO,MAAM,gBAAgB,UAAW,MAAM,KAAG,OAUhD,CAAC;AAQF,eAAO,MAAM,oBAAoB,WAAY,OAAO,GAAG,SAAS,SAAS,MAAM,KAAG,OAgBjF,CAAC;AAIF,eAAO,MAAM,iBAAiB,UAAW,OAAO,KAAG,MAWlD,CAAC;AAMF,eAAO,MAAM,aAAa,gBAAyB,kBAAkB;;CAmDnE,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACd,GAAG,gCAAgC,GACnC,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAEpC,MAAM,MAAM,gCAAgC,GAAG;IAE9C,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { css } from '@emotion/react';
3
+ import classnames from 'classnames';
4
+ import { observer } from 'mobx-react-lite';
5
+ import { isObservableArray } from 'mobx';
6
+ import { useTheme, CacheProvider, useTreePath } from '../../../providers';
7
+ import { mergeProps, mergeStyles } from '../../../utilities';
8
+ import { useCustomComponentOverride } from '../../../hooks';
9
+ import { fieldNameToComponentName } from '@athoscommerce/snap-toolbox';
10
+ import { Price } from '../Price';
11
+ // Core mapping fields whose values represent monetary amounts and should be formatted by `Price`.
12
+ const CORE_PRICE_FIELDS = ['price', 'msrp'];
13
+ // A field is a core-mapping price when its final segment is a known price field and it resolves
14
+ // from core mappings — either a bare key (which falls back to `mappings.core`) or an explicit
15
+ // `...mappings.core.<priceField>` path. `attributes.price` and the like are excluded.
16
+ export const isCorePriceField = (field) => {
17
+ if (!field)
18
+ return false;
19
+ const segments = field.split('.');
20
+ const last = segments[segments.length - 1];
21
+ if (!CORE_PRICE_FIELDS.includes(last))
22
+ return false;
23
+ if (segments.length === 1)
24
+ return true;
25
+ return segments[segments.length - 2] === 'core' && segments[segments.length - 3] === 'mappings';
26
+ };
27
+ // Resolve a product field value. An explicit dot-path (e.g. `mappings.core.name` or
28
+ // `attributes.brand`) states exactly where to read from and is resolved against the variant-aware
29
+ // `display` view first, then the product itself. A bare field key (no dot) falls back to the
30
+ // legacy lookup — `mappings.core` first, then `attributes` — so config-driven field lists keep
31
+ // working. Returns the raw value (string, number, array, object); formatting is left to
32
+ // `renderDetailValue`.
33
+ export const getProductFieldValue = (result, field) => {
34
+ if (!result || !field)
35
+ return undefined;
36
+ const resolvePath = (root) => field.split('.').reduce((acc, key) => (acc && typeof acc === 'object' ? acc[key] : undefined), root);
37
+ const explicit = resolvePath(result?.display) ?? resolvePath(result);
38
+ if (explicit !== undefined)
39
+ return explicit;
40
+ if (!field.includes('.')) {
41
+ const core = (result?.display?.mappings?.core || result?.mappings?.core);
42
+ const attributes = (result?.display?.attributes || result?.attributes);
43
+ return core?.[field] ?? attributes?.[field];
44
+ }
45
+ return undefined;
46
+ };
47
+ // Coerce a resolved value into a display string: arrays (and MobX observable arrays) are
48
+ // comma-joined, objects fall back to JSON, everything else is stringified.
49
+ export const renderDetailValue = (value) => {
50
+ if (value === null || value === undefined)
51
+ return '';
52
+ if (Array.isArray(value) || isObservableArray(value)) {
53
+ return Array.from(value)
54
+ .map((v) => (typeof v === 'object' ? JSON.stringify(v) : String(v)))
55
+ .join(', ');
56
+ }
57
+ if (typeof value === 'object')
58
+ return JSON.stringify(value);
59
+ return String(value);
60
+ };
61
+ const defaultStyles = () => {
62
+ return css({});
63
+ };
64
+ export const ProductDetail = observer((properties) => {
65
+ const globalTheme = useTheme();
66
+ const globalTreePath = useTreePath();
67
+ const defaultProps = {
68
+ treePath: globalTreePath,
69
+ // the field's final segment names the component (`productDetail.<name>` theme selectors)
70
+ name: properties.field ? fieldNameToComponentName(properties.field.split('.').pop() || '') : undefined,
71
+ };
72
+ const props = mergeProps('productDetail', globalTheme, defaultProps, properties);
73
+ const { result, field, name, html, tag, className, internalClassName } = props;
74
+ const { overrideElement, shouldRenderDefault } = useCustomComponentOverride('productDetail', props);
75
+ if (!shouldRenderDefault) {
76
+ return overrideElement;
77
+ }
78
+ const styling = mergeStyles(props, defaultStyles);
79
+ const rawValue = getProductFieldValue(result, field);
80
+ const value = renderDetailValue(rawValue);
81
+ if (!value)
82
+ return null;
83
+ const isPrice = isCorePriceField(field) && typeof rawValue === 'number';
84
+ // Theme/style modifier: the named selector suffix (`productDetail.<name>`) when present,
85
+ // otherwise the resolved field path's final segment.
86
+ const modifier = name || field.split('.').pop();
87
+ const classNames = classnames('ss__product-detail', modifier && `ss__product-detail--${modifier}`, tag && `ss__product-detail--${tag}`, className, internalClassName);
88
+ return (_jsx(CacheProvider, { children: html ? (_jsx("div", { ...styling, className: classNames, dangerouslySetInnerHTML: { __html: value } })) : (_jsx("div", { ...styling, className: classNames, children: isPrice ? _jsx(Price, { value: rawValue, treePath: props.treePath }) : value })) }));
89
+ });
@@ -0,0 +1,3 @@
1
+ export { ProductDetail } from './ProductDetail';
2
+ export type { ProductDetailProps, ProductDetailTemplatesLegalProps } from './ProductDetail';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Atoms/ProductDetail/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Curated: the field-resolution helpers in ProductDetail.tsx are internal (used by
2
+ // ProductDetailTable and unit tests via direct file imports) and must not reach the package API.
3
+ export { ProductDetail } from './ProductDetail';
@@ -9,7 +9,7 @@ export declare const TemplateSelect: ((properties: TemplateSelectProps) => impor
9
9
  export interface TemplateSelectProps {
10
10
  templatesStore: TemplatesStore;
11
11
  target: TargetStore;
12
- controller: Controllers;
12
+ controller?: Controllers;
13
13
  snap: SnapTemplates;
14
14
  theme?: Theme;
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateSelect.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Atoms/TemplateSelect/TemplateSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAmB,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAmD,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mDAAmD,CAAC;AAC5G,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAE9E,eAAO,MAAM,cAAc,gBAAyB,mBAAmB;;CAyCrE,CAAC;AACH,MAAM,WAAW,mBAAmB;IACnC,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd"}
1
+ {"version":3,"file":"TemplateSelect.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Atoms/TemplateSelect/TemplateSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAmB,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAmD,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mDAAmD,CAAC;AAC5G,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAE9E,eAAO,MAAM,cAAc,gBAAyB,mBAAmB;;CA6CrE,CAAC;AACH,MAAM,WAAW,mBAAmB;IACnC,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd"}
@@ -6,7 +6,9 @@ export const TemplateSelect = observer((properties) => {
6
6
  const { snap, templatesStore, target, controller, ...otherProps } = properties;
7
7
  const { loading } = templatesStore;
8
8
  if (!target) {
9
- controller.log.error(`Target was not provided!`);
9
+ // Quickview targets render without a controller (the quickview manager is not one), so
10
+ // fall back to the console when there is no controller logger to use.
11
+ controller ? controller.log.error(`Target was not provided!`) : console.error(`[TemplateSelect] Target was not provided!`);
10
12
  return null;
11
13
  }
12
14
  const Component = templatesStore.library.getComponent(target.type, target.component);
@@ -15,11 +17,18 @@ export const TemplateSelect = observer((properties) => {
15
17
  const theme = themeStore?.theme;
16
18
  if (!loading && !theme && !templatesStore.settings?.editMode) {
17
19
  const error = `Theme "${target.theme.name}" not found in library for target "${target.selector}"`;
18
- controller.log.error(error);
20
+ controller ? controller.log.error(error) : console.error(`[TemplateSelect] ${error}`);
19
21
  }
20
- const tabManager = controller.type === ControllerTypes.search || controller.type === ControllerTypes.autocomplete
22
+ const tabManager = controller?.type === ControllerTypes.search || controller?.type === ControllerTypes.autocomplete
21
23
  ? templatesStore.getTabManager(controller.type, snap.controllers)
22
24
  : undefined;
25
+ const tabName = tabManager?.active?.id ? tabManager.active.id.toLowerCase() : undefined;
23
26
  // ensuring that theme and component are ready to render
24
- return !loading && theme && Component ? (_jsx(SnapProvider, { snap: snap, children: _jsx(ThemeProvider, { theme: theme, children: _jsx(ControllerProvider, { controller: controller, children: _jsx("div", { className: "ss__template-select", children: _jsx(Component, { controller: controller, tabManager: tabManager, name: tabManager?.active?.id ? tabManager?.active?.id.toLowerCase() : undefined, ...otherProps }) }) }) }) })) : null;
27
+ if (loading || !theme || !Component) {
28
+ return null;
29
+ }
30
+ // Quickview targets render without a controller — the shared quickview manager arrives via
31
+ // `otherProps` instead — so the ControllerProvider is only wrapped when there is one to provide.
32
+ const content = (_jsx("div", { className: "ss__template-select", children: _jsx(Component, { controller: controller, tabManager: tabManager, ...(tabName !== undefined ? { name: tabName } : {}), ...otherProps }) }));
33
+ return (_jsx(SnapProvider, { snap: snap, children: _jsx(ThemeProvider, { theme: theme, children: controller ? _jsx(ControllerProvider, { controller: controller, children: content }) : content }) }));
25
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CalloutBadge.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/CalloutBadge/CalloutBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAO3B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAG3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAqB9D,eAAO,MAAM,YAAY,gBAAyB,iBAAiB;;CA4CjE,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,OAAO,CAAC;CAChB,GAAG,+BAA+B,GAClC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnC,MAAM,MAAM,+BAA+B,GAAG;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
1
+ {"version":3,"file":"CalloutBadge.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/CalloutBadge/CalloutBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAO3B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAI3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAqB9D,eAAO,MAAM,YAAY,gBAAyB,iBAAiB;;CA8CjE,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,OAAO,CAAC;CAChB,GAAG,+BAA+B,GAClC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnC,MAAM,MAAM,+BAA+B,GAAG;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
@@ -4,6 +4,7 @@ import classnames from 'classnames';
4
4
  import { observer } from 'mobx-react-lite';
5
5
  import { useTheme, CacheProvider, useSnap, useTreePath } from '../../../providers';
6
6
  import { defaultBadgeComponentMap, mergeProps, mergeStyles } from '../../../utilities';
7
+ import { fieldNameToComponentName } from '@athoscommerce/snap-toolbox';
7
8
  import { useComponent, useCustomComponentOverride } from '../../../hooks';
8
9
  const defaultStyles = () => {
9
10
  return css({
@@ -26,6 +27,8 @@ export const CalloutBadge = observer((properties) => {
26
27
  const globalTreePath = useTreePath();
27
28
  const defaultProps = {
28
29
  // default props
30
+ // a custom tag names the component (`calloutBadge.<tag>` theme selectors); default usage stays unnamed
31
+ name: properties.tag ? fieldNameToComponentName(properties.tag) : undefined,
29
32
  tag: 'callout',
30
33
  limit: 1,
31
34
  treePath: globalTreePath,
@@ -42,7 +45,7 @@ export const CalloutBadge = observer((properties) => {
42
45
  ...props.componentMap,
43
46
  };
44
47
  const styling = mergeStyles(props, defaultStyles);
45
- const badges = result?.display.badges?.atLocation(tag).slice(0, limit);
48
+ const badges = result?.display?.badges?.atLocation(tag).slice(0, limit);
46
49
  if (renderEmpty || badges?.length) {
47
50
  return (_jsx(CacheProvider, { children: _jsx("div", { ...styling, className: classnames('ss__callout-badge', `ss__callout-badge--${tag?.replace('/', '-')}`, className, internalClassName), children: badges.map((badge, badgeIndex) => (_jsx(BadgeRenderer, { badge: badge, badgeComponentMap: badgeComponentMap, treePath: treePath }, `${badge.component}-${badgeIndex}`))) }) }));
48
51
  }
@@ -0,0 +1,28 @@
1
+ import { ComponentProps } from '../../../types';
2
+ import { Lang } from '../../../hooks';
3
+ export declare const Gallery: ((properties: GalleryProps) => import("preact").VNode<any> | null) & {
4
+ displayName: string;
5
+ };
6
+ export type GalleryProps = {
7
+ images: string[];
8
+ open: boolean;
9
+ startIndex?: number;
10
+ alt?: string;
11
+ lang?: Partial<GalleryLang>;
12
+ } & GalleryTemplatesLegalProps & ComponentProps<GalleryProps>;
13
+ export type GalleryTemplatesLegalProps = {
14
+ onClose?: () => void;
15
+ zoomMin?: number;
16
+ zoomMax?: number;
17
+ zoomStep?: number;
18
+ swipeThreshold?: number;
19
+ };
20
+ export interface GalleryLang {
21
+ gallery: Lang<never>;
22
+ zoomOutButton: Lang<never>;
23
+ zoomInButton: Lang<never>;
24
+ closeButton: Lang<never>;
25
+ prevButton: Lang<never>;
26
+ nextButton: Lang<never>;
27
+ }
28
+ //# sourceMappingURL=Gallery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gallery.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/Gallery/Gallery.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,IAAI,EAAoB,MAAM,gBAAgB,CAAC;AA8FxD,eAAO,MAAM,OAAO,gBAAyB,YAAY;;CAsTvD,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAC5B,GAAG,0BAA0B,GAC7B,cAAc,CAAC,YAAY,CAAC,CAAC;AAE9B,MAAM,MAAM,0BAA0B,GAAG;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;CACxB"}
@@ -0,0 +1,292 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ import { createPortal } from 'preact/compat';
3
+ import { useState, useEffect, useRef } from 'preact/hooks';
4
+ import { observer } from 'mobx-react-lite';
5
+ import { css } from '@emotion/react';
6
+ import classnames from 'classnames';
7
+ import deepmerge from 'deepmerge';
8
+ import { useTheme, CacheProvider, useTreePath } from '../../../providers';
9
+ import { mergeProps, mergeStyles, defined } from '../../../utilities';
10
+ import { useA11y, useLang } from '../../../hooks';
11
+ import { Button } from '../../Atoms/Button';
12
+ import { Image } from '../../Atoms/Image';
13
+ const defaultStyles = () => {
14
+ return css({
15
+ position: 'fixed',
16
+ inset: 0,
17
+ zIndex: 10010, // above the quickview modal content (10006) and the dropdown portal (10007); full ladder in QuickviewModal defaultStyles
18
+ display: 'flex',
19
+ flexDirection: 'column',
20
+ background: 'rgba(0, 0, 0, 0.9)',
21
+ '& .ss__gallery__toolbar': {
22
+ display: 'flex',
23
+ justifyContent: 'flex-end',
24
+ alignItems: 'center',
25
+ gap: '8px',
26
+ padding: '12px 16px',
27
+ },
28
+ // button and icon chrome (color, background, border) comes from Button/Icon props (not CSS)
29
+ // so that theme overrides targeting those components (e.g. `gallery button.zoom-in`) are not
30
+ // out-specified here — these rules stick to layout the sub-components have no props for
31
+ '& .ss__gallery__button': {
32
+ display: 'flex',
33
+ alignItems: 'center',
34
+ justifyContent: 'center',
35
+ padding: 0,
36
+ boxSizing: 'border-box',
37
+ borderRadius: '4px',
38
+ width: '40px',
39
+ height: '40px',
40
+ fontSize: '1.3em',
41
+ lineHeight: 1,
42
+ cursor: 'pointer',
43
+ '&.ss__button--disabled': {
44
+ opacity: 0.4,
45
+ cursor: 'default',
46
+ },
47
+ },
48
+ '& .ss__gallery__counter': {
49
+ color: '#fff',
50
+ marginRight: 'auto',
51
+ padding: '0 8px',
52
+ fontSize: '0.9em',
53
+ },
54
+ '& .ss__gallery__stage': {
55
+ position: 'relative',
56
+ flex: '1 1 auto',
57
+ display: 'flex',
58
+ alignItems: 'center',
59
+ justifyContent: 'center',
60
+ overflow: 'hidden',
61
+ },
62
+ '& .ss__gallery__image': {
63
+ maxWidth: '90vw',
64
+ maxHeight: '80vh',
65
+ objectFit: 'contain',
66
+ userSelect: 'none',
67
+ touchAction: 'none',
68
+ transformOrigin: 'center center',
69
+ transition: 'transform 0.05s linear',
70
+ },
71
+ '& .ss__gallery__nav': {
72
+ position: 'absolute',
73
+ top: 0,
74
+ bottom: 0,
75
+ height: '100%',
76
+ width: '64px',
77
+ display: 'flex',
78
+ alignItems: 'center',
79
+ justifyContent: 'center',
80
+ padding: 0,
81
+ boxSizing: 'border-box',
82
+ borderRadius: 0,
83
+ fontSize: '2em',
84
+ lineHeight: 1,
85
+ cursor: 'pointer',
86
+ zIndex: 1,
87
+ '&:hover': {
88
+ // a wash layered via backgroundImage so it composes with (rather than defeats)
89
+ // a backgroundColor set through Button props or theme overrides
90
+ backgroundImage: 'linear-gradient(rgba(255, 255, 255, 0.085), rgba(255, 255, 255, 0.085))',
91
+ },
92
+ },
93
+ '& .ss__gallery__nav--prev': {
94
+ left: 0,
95
+ },
96
+ '& .ss__gallery__nav--next': {
97
+ right: 0,
98
+ },
99
+ });
100
+ };
101
+ export const Gallery = observer((properties) => {
102
+ const globalTheme = useTheme();
103
+ const globalTreePath = useTreePath();
104
+ const defaultProps = {
105
+ treePath: globalTreePath,
106
+ startIndex: 0,
107
+ zoomMin: 1,
108
+ zoomMax: 4,
109
+ zoomStep: 0.5,
110
+ swipeThreshold: 40,
111
+ };
112
+ const props = mergeProps('gallery', globalTheme, defaultProps, properties);
113
+ const { images, open, startIndex, onClose, alt, className, internalClassName } = props;
114
+ const zoomMin = props.zoomMin;
115
+ const zoomMax = props.zoomMax;
116
+ const zoomStep = props.zoomStep;
117
+ const swipeThreshold = props.swipeThreshold;
118
+ const clampZoom = (value) => Math.min(zoomMax, Math.max(zoomMin, value));
119
+ const [index, setIndex] = useState(startIndex || 0);
120
+ const [zoom, setZoom] = useState(zoomMin);
121
+ const [pan, setPan] = useState({ x: 0, y: 0 });
122
+ const dragRef = useRef(null);
123
+ const touchRef = useRef(null);
124
+ const count = images?.length || 0;
125
+ //initialize lang
126
+ const defaultLang = {
127
+ gallery: {
128
+ attributes: {
129
+ 'aria-label': 'Image gallery',
130
+ },
131
+ },
132
+ zoomOutButton: {
133
+ attributes: {
134
+ 'aria-label': 'Zoom out',
135
+ },
136
+ },
137
+ zoomInButton: {
138
+ attributes: {
139
+ 'aria-label': 'Zoom in',
140
+ },
141
+ },
142
+ closeButton: {
143
+ attributes: {
144
+ 'aria-label': 'Close gallery',
145
+ },
146
+ },
147
+ prevButton: {
148
+ attributes: {
149
+ 'aria-label': 'Previous image',
150
+ },
151
+ },
152
+ nextButton: {
153
+ attributes: {
154
+ 'aria-label': 'Next image',
155
+ },
156
+ },
157
+ };
158
+ //deep merge with props.lang
159
+ const lang = deepmerge(defaultLang, props.lang || {});
160
+ const mergedLang = useLang(lang, {});
161
+ // Reset to the clicked image (and clear zoom/pan) whenever the gallery opens or the start changes.
162
+ useEffect(() => {
163
+ if (open) {
164
+ setIndex(Math.min(Math.max(startIndex || 0, 0), Math.max(count - 1, 0)));
165
+ setZoom(zoomMin);
166
+ setPan({ x: 0, y: 0 });
167
+ }
168
+ }, [open, startIndex, count]);
169
+ const goTo = (next) => {
170
+ if (count === 0)
171
+ return;
172
+ const wrapped = (next + count) % count;
173
+ setIndex(wrapped);
174
+ setZoom(zoomMin);
175
+ setPan({ x: 0, y: 0 });
176
+ };
177
+ const showPrev = () => goTo(index - 1);
178
+ const showNext = () => goTo(index + 1);
179
+ const zoomIn = () => setZoom((z) => clampZoom(z + zoomStep));
180
+ const zoomOut = () => setZoom((z) => {
181
+ const next = clampZoom(z - zoomStep);
182
+ if (next === zoomMin)
183
+ setPan({ x: 0, y: 0 });
184
+ return next;
185
+ });
186
+ // Keyboard controls while open.
187
+ useEffect(() => {
188
+ if (!open)
189
+ return;
190
+ const onKey = (e) => {
191
+ switch (e.key) {
192
+ case 'Escape':
193
+ onClose && onClose();
194
+ break;
195
+ case 'ArrowRight':
196
+ showNext();
197
+ break;
198
+ case 'ArrowLeft':
199
+ showPrev();
200
+ break;
201
+ case '+':
202
+ case '=':
203
+ zoomIn();
204
+ break;
205
+ case '-':
206
+ case '_':
207
+ zoomOut();
208
+ break;
209
+ }
210
+ };
211
+ window.addEventListener('keydown', onKey);
212
+ return () => window.removeEventListener('keydown', onKey);
213
+ }, [open, index, count]);
214
+ // Dialog focus management — same pattern as QuickviewModal/QuickviewSlideout:
215
+ // remember what had focus before the gallery opened (the gallery portals to document.body,
216
+ // outside any surrounding focus trap), move focus into the gallery on open, restore on close.
217
+ const rootRef = useRef(null);
218
+ const previousFocusRef = useRef(null);
219
+ const wasOpenRef = useRef(false);
220
+ useEffect(() => {
221
+ const isOpenNow = Boolean(open && count > 0);
222
+ if (isOpenNow && !wasOpenRef.current) {
223
+ previousFocusRef.current = document.activeElement || null;
224
+ const closeEl = rootRef.current?.querySelector('.ss__gallery__close');
225
+ (closeEl || rootRef.current)?.focus();
226
+ }
227
+ else if (!isOpenNow && wasOpenRef.current) {
228
+ previousFocusRef.current?.focus?.();
229
+ previousFocusRef.current = null;
230
+ }
231
+ wasOpenRef.current = isOpenNow;
232
+ });
233
+ const styling = mergeStyles(props, defaultStyles);
234
+ if (!open || count === 0)
235
+ return null;
236
+ // Drag-to-pan when zoomed in.
237
+ const onPointerDown = (e) => {
238
+ if (zoom <= zoomMin)
239
+ return;
240
+ // Block the browser defaults (native image drag, text selection) that would cancel the
241
+ // pointermove stream, and capture the pointer so the drag survives leaving the image bounds.
242
+ e.preventDefault();
243
+ e.currentTarget?.setPointerCapture?.(e.pointerId);
244
+ dragRef.current = { startX: e.clientX, startY: e.clientY, baseX: pan.x, baseY: pan.y };
245
+ };
246
+ const onPointerMove = (e) => {
247
+ if (!dragRef.current)
248
+ return;
249
+ setPan({ x: dragRef.current.baseX + (e.clientX - dragRef.current.startX), y: dragRef.current.baseY + (e.clientY - dragRef.current.startY) });
250
+ };
251
+ const endDrag = () => {
252
+ dragRef.current = null;
253
+ };
254
+ // Dismiss when the dark backdrop itself is clicked (not the image or a control). Works on
255
+ // the overlay root and the stage, both of which are `e.currentTarget` only for backdrop hits.
256
+ const onBackdropClick = (e) => {
257
+ if (e.target === e.currentTarget)
258
+ onClose && onClose();
259
+ };
260
+ // Mobile: horizontal touch-swipe paginates (only when not zoomed — zoom uses drag-to-pan).
261
+ const onTouchStart = (e) => {
262
+ if (e.touches && e.touches.length === 1) {
263
+ touchRef.current = { x: e.touches[0].clientX, y: e.touches[0].clientY };
264
+ }
265
+ };
266
+ const onTouchEnd = (e) => {
267
+ const start = touchRef.current;
268
+ touchRef.current = null;
269
+ if (!start || zoom > zoomMin || count <= 1)
270
+ return;
271
+ const touch = e.changedTouches && e.changedTouches[0];
272
+ if (!touch)
273
+ return;
274
+ const dx = touch.clientX - start.x;
275
+ const dy = touch.clientY - start.y;
276
+ // Require a dominantly-horizontal swipe past the threshold.
277
+ if (Math.abs(dx) > swipeThreshold && Math.abs(dx) > Math.abs(dy)) {
278
+ if (dx < 0)
279
+ showNext();
280
+ else
281
+ showPrev();
282
+ }
283
+ };
284
+ const currentSrc = images[index];
285
+ return createPortal(_jsx(CacheProvider, { children: _jsxs("div", { ...styling, className: classnames('ss__gallery', className, internalClassName), role: "dialog", "aria-modal": "true", ...mergedLang.gallery?.attributes, ref: (e) => {
286
+ rootRef.current = e;
287
+ useA11y(e, 0, true, () => onClose && onClose());
288
+ }, onClick: onBackdropClick, children: [_jsxs("div", { className: "ss__gallery__toolbar", children: [count > 1 && (_jsxs("span", { className: "ss__gallery__counter", children: [index + 1, " / ", count] })), _jsx(Button, { name: "zoom-out", internalClassName: "ss__gallery__button ss__gallery__zoom-out", color: "#fff", backgroundColor: "rgba(255, 255, 255, 0.12)", borderColor: "transparent", icon: { icon: 'minus', color: 'currentColor' }, lang: { button: lang.zoomOutButton }, disabled: zoom <= zoomMin, onClick: zoomOut, theme: props.theme, treePath: props.treePath, ...defined({ disableStyles: props.disableStyles }) }), _jsx(Button, { name: "zoom-in", internalClassName: "ss__gallery__button ss__gallery__zoom-in", color: "#fff", backgroundColor: "rgba(255, 255, 255, 0.12)", borderColor: "transparent", icon: { icon: 'plus', color: 'currentColor' }, lang: { button: lang.zoomInButton }, disabled: zoom >= zoomMax, onClick: zoomIn, theme: props.theme, treePath: props.treePath, ...defined({ disableStyles: props.disableStyles }) }), _jsx(Button, { name: "close", internalClassName: "ss__gallery__button ss__gallery__close", color: "#fff", backgroundColor: "rgba(255, 255, 255, 0.12)", borderColor: "transparent", icon: { icon: 'close', color: 'currentColor' }, lang: { button: lang.closeButton }, onClick: () => onClose && onClose(), theme: props.theme, treePath: props.treePath, ...defined({ disableStyles: props.disableStyles }) })] }), _jsxs("div", { className: "ss__gallery__stage", onClick: onBackdropClick, onTouchStart: onTouchStart, onTouchEnd: onTouchEnd, children: [count > 1 && (_jsx(Button, { name: "prev", internalClassName: "ss__gallery__nav ss__gallery__nav--prev", color: "#fff", backgroundColor: "rgba(255, 255, 255, 0.06)", borderColor: "transparent", icon: { icon: 'angle-left', color: 'currentColor' }, lang: { button: lang.prevButton }, onClick: showPrev, theme: props.theme, treePath: props.treePath, ...defined({ disableStyles: props.disableStyles }) })), _jsx(Image, { internalClassName: "ss__gallery__image", src: currentSrc, alt: alt || '', draggable: false, style: {
289
+ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`,
290
+ cursor: zoom > zoomMin ? (dragRef.current ? 'grabbing' : 'grab') : 'default',
291
+ }, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: endDrag, onPointerLeave: endDrag, theme: props.theme, treePath: props.treePath, ...defined({ disableStyles: props.disableStyles }) }), count > 1 && (_jsx(Button, { name: "next", internalClassName: "ss__gallery__nav ss__gallery__nav--next", color: "#fff", backgroundColor: "rgba(255, 255, 255, 0.06)", borderColor: "transparent", icon: { icon: 'angle-right', color: 'currentColor' }, lang: { button: lang.nextButton }, onClick: showNext, theme: props.theme, treePath: props.treePath, ...defined({ disableStyles: props.disableStyles }) }))] })] }) }), document.body);
292
+ });
@@ -0,0 +1,2 @@
1
+ export * from './Gallery';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/Gallery/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './Gallery';
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAO9C,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAuC7D,eAAO,MAAM,KAAK,gBAAyB,UAAU;;CA2KnD,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,wBAAwB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAE/E,MAAM,MAAM,wBAAwB,GAAG;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;CAC1E,CAAC"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAO9C,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAuC7D,eAAO,MAAM,KAAK,gBAAyB,UAAU;;CA8LnD,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,wBAAwB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAE/E,MAAM,MAAM,wBAAwB,GAAG;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;CAC1E,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
- import { useState, useEffect } from 'preact/hooks';
2
+ import { useState, useEffect, useRef } from 'preact/hooks';
3
3
  import { css } from '@emotion/react';
4
4
  import classnames from 'classnames';
5
5
  import { observer } from 'mobx-react-lite';
@@ -112,11 +112,28 @@ export const Modal = observer((properties) => {
112
112
  document.body.style.overflow = '';
113
113
  };
114
114
  }, [showContent, lockScroll]);
115
+ // The resize listener below is registered once (on mount), so it must read the open/lock state
116
+ // through refs — capturing `showContent` directly would freeze its mount-time value in the
117
+ // listener closure. The quickview modal mounts open, so that stale `true` would re-lock the
118
+ // page on any resize after the modal was closed.
119
+ const showContentRef = useRef(showContent);
120
+ const lockScrollRef = useRef(lockScroll);
121
+ showContentRef.current = showContent;
122
+ lockScrollRef.current = lockScroll;
115
123
  useEffect(() => {
116
124
  const existingButton = buttonSelector ? (typeof buttonSelector === 'string' ? document.querySelector(buttonSelector) : buttonSelector) : null;
125
+ // Re-asserts the scroll lock after a resize: other components (e.g. Slideout) write
126
+ // `document.body.style.overflow` on render and can clobber the lock while the modal is open.
127
+ // The delay lets those renders settle first; `unmounted` keeps a pending re-lock from firing
128
+ // after cleanup has already released the body.
129
+ let unmounted = false;
130
+ let overflowTimeout;
117
131
  const debouncedHandleResize = debounce(() => {
118
- setTimeout(() => {
119
- if (showContent && lockScroll) {
132
+ clearTimeout(overflowTimeout);
133
+ overflowTimeout = setTimeout(() => {
134
+ if (unmounted)
135
+ return;
136
+ if (showContentRef.current && lockScrollRef.current) {
120
137
  document.body.style.overflow = 'hidden';
121
138
  }
122
139
  else {
@@ -135,6 +152,8 @@ export const Modal = observer((properties) => {
135
152
  }
136
153
  window.addEventListener('resize', debouncedHandleResize);
137
154
  return () => {
155
+ unmounted = true;
156
+ clearTimeout(overflowTimeout);
138
157
  window.removeEventListener('resize', debouncedHandleResize);
139
158
  if (existingButton) {
140
159
  existingButton.removeEventListener('click', clickListener);
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayBadge.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/OverlayBadge/OverlayBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAO9C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAG3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACzH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAgE9D,eAAO,MAAM,YAAY,gBAAyB,iBAAiB;;CAwGjE,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;CACjF,GAAG,+BAA+B,GAClC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAEnC,MAAM,MAAM,+BAA+B,GAAG;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"OverlayBadge.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/OverlayBadge/OverlayBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAO9C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAE3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEzH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAgE9D,eAAO,MAAM,YAAY,gBAAyB,iBAAiB;;CAwGjE,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;CACjF,GAAG,+BAA+B,GAClC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAEnC,MAAM,MAAM,+BAA+B,GAAG;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC5B,CAAC"}
@@ -94,7 +94,7 @@ export const OverlayBadge = observer((properties) => {
94
94
  name: slot.name,
95
95
  top: index == 0,
96
96
  bottom: index == sectionSlots.length - 1,
97
- badges: result?.display.badges?.atLocation(`${section}/${slot.tag}`).slice(0, limit),
97
+ badges: result?.display?.badges?.atLocation(`${section}/${slot.tag}`).slice(0, limit),
98
98
  }))
99
99
  .filter((slot) => slot.badges?.length);
100
100
  return {
@@ -0,0 +1,14 @@
1
+ import { h } from 'preact';
2
+ import { ComponentProps } from '../../../types';
3
+ import type { Product, DisplayFieldConfig } from '@athoscommerce/snap-store-mobx';
4
+ export type { DisplayFieldConfig };
5
+ export declare const ProductDetailTable: ((properties: ProductDetailTableProps) => import("@emotion/react/jsx-runtime").JSX.Element | h.JSX.Element | null) & {
6
+ displayName: string;
7
+ };
8
+ export type ProductDetailTableProps = {
9
+ result?: Product;
10
+ } & ProductDetailTableTemplatesLegalProps & ComponentProps<ProductDetailTableProps>;
11
+ export type ProductDetailTableTemplatesLegalProps = {
12
+ displayFields?: DisplayFieldConfig[];
13
+ };
14
+ //# sourceMappingURL=ProductDetailTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductDetailTable.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/ProductDetailTable/ProductDetailTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAQ3B,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAS7D,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIlF,YAAY,EAAE,kBAAkB,EAAE,CAAC;AA+CnC,eAAO,MAAM,kBAAkB,gBAAyB,uBAAuB;;CA2E7E,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,qCAAqC,GACxC,cAAc,CAAC,uBAAuB,CAAC,CAAC;AAEzC,MAAM,MAAM,qCAAqC,GAAG;IAEnD,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACrC,CAAC"}