@athoscommerce/snap-preact 1.2.3-beta.3 → 1.2.3-beta.5

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 (218) hide show
  1. package/README.md +16 -0
  2. package/dist/cjs/components/src/components/Atoms/TemplateSelect/TemplateSelect.d.ts +3 -3
  3. package/dist/cjs/components/src/components/Atoms/TemplateSelect/TemplateSelect.d.ts.map +1 -1
  4. package/dist/cjs/components/src/components/Atoms/TemplateSelect/TemplateSelect.js +7 -8
  5. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts +1 -1
  6. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts.map +1 -1
  7. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.js +3 -3
  8. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts +2 -0
  9. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts.map +1 -1
  10. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.js +29 -27
  11. package/dist/cjs/components/src/components/Molecules/Filter/Filter.d.ts +1 -1
  12. package/dist/cjs/components/src/components/Molecules/Filter/Filter.d.ts.map +1 -1
  13. package/dist/cjs/components/src/components/Molecules/Result/Result.d.ts.map +1 -1
  14. package/dist/cjs/components/src/components/Molecules/Result/Result.js +11 -6
  15. package/dist/cjs/components/src/components/Molecules/SearchInput/SearchInput.d.ts +4 -1
  16. package/dist/cjs/components/src/components/Molecules/SearchInput/SearchInput.d.ts.map +1 -1
  17. package/dist/cjs/components/src/components/Molecules/SearchInput/SearchInput.js +3 -3
  18. package/dist/cjs/components/src/components/Molecules/TemplatesEditor/Components/AbstractedControls.js +5 -5
  19. package/dist/cjs/components/src/components/Molecules/TemplatesEditor/Components/Control.d.ts.map +1 -1
  20. package/dist/cjs/components/src/components/Molecules/TemplatesEditor/Components/Control.js +31 -31
  21. package/dist/cjs/components/src/components/Molecules/TemplatesEditor/TemplatesEditor.d.ts.map +1 -1
  22. package/dist/cjs/components/src/components/Molecules/TemplatesEditor/TemplatesEditor.js +22 -36
  23. package/dist/cjs/components/src/components/Organisms/Chat/Chat.d.ts +8 -0
  24. package/dist/cjs/components/src/components/Organisms/Chat/Chat.d.ts.map +1 -1
  25. package/dist/cjs/components/src/components/Organisms/Chat/Chat.js +715 -427
  26. package/dist/cjs/components/src/components/Organisms/Chat/ChatResult.d.ts.map +1 -1
  27. package/dist/cjs/components/src/components/Organisms/Chat/ChatResult.js +13 -3
  28. package/dist/cjs/components/src/components/Organisms/Chat/MessageText.d.ts +3 -1
  29. package/dist/cjs/components/src/components/Organisms/Chat/MessageText.d.ts.map +1 -1
  30. package/dist/cjs/components/src/components/Organisms/Chat/MessageText.js +22 -19
  31. package/dist/cjs/components/src/components/Organisms/Chat/MessageUser.d.ts +3 -1
  32. package/dist/cjs/components/src/components/Organisms/Chat/MessageUser.d.ts.map +1 -1
  33. package/dist/cjs/components/src/components/Organisms/Chat/MessageUser.js +40 -23
  34. package/dist/cjs/components/src/components/Organisms/Chat/ResultsDisplay.d.ts +1 -1
  35. package/dist/cjs/components/src/components/Organisms/Chat/ResultsDisplay.d.ts.map +1 -1
  36. package/dist/cjs/components/src/components/Organisms/Chat/ResultsDisplay.js +8 -7
  37. package/dist/cjs/components/src/components/Organisms/Facet/Facet.js +2 -1
  38. package/dist/cjs/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.js +2 -1
  39. package/dist/cjs/components/src/components/Organisms/FilterSummary/FilterSummary.d.ts +2 -2
  40. package/dist/cjs/components/src/components/Organisms/FilterSummary/FilterSummary.d.ts.map +1 -1
  41. package/dist/cjs/components/src/components/Organisms/ProductQuickView/ProductQuickView.d.ts +11 -0
  42. package/dist/cjs/components/src/components/Organisms/ProductQuickView/ProductQuickView.d.ts.map +1 -0
  43. package/dist/cjs/components/src/components/Organisms/ProductQuickView/ProductQuickView.js +461 -0
  44. package/dist/cjs/components/src/components/Organisms/ProductQuickView/index.d.ts +2 -0
  45. package/dist/cjs/components/src/components/Organisms/ProductQuickView/index.d.ts.map +1 -0
  46. package/dist/cjs/components/src/components/Organisms/ProductQuickView/index.js +17 -0
  47. package/dist/cjs/components/src/components/Templates/AutocompleteModal/AutocompleteModal.d.ts.map +1 -1
  48. package/dist/cjs/components/src/components/Templates/AutocompleteModal/AutocompleteModal.js +0 -2
  49. package/dist/cjs/components/src/hooks/useAcRenderedInput.d.ts.map +1 -1
  50. package/dist/cjs/components/src/hooks/useAcRenderedInput.js +65 -15
  51. package/dist/cjs/components/src/hooks/useMediaQuery.d.ts.map +1 -1
  52. package/dist/cjs/components/src/hooks/useMediaQuery.js +3 -1
  53. package/dist/cjs/components/src/index.d.ts +1 -0
  54. package/dist/cjs/components/src/index.d.ts.map +1 -1
  55. package/dist/cjs/components/src/index.js +1 -0
  56. package/dist/cjs/components/src/providers/theme.d.ts +1 -1
  57. package/dist/cjs/components/src/providers/theme.d.ts.map +1 -1
  58. package/dist/cjs/components/src/themes/base/base.js +3 -3
  59. package/dist/cjs/components/src/utilities/Colour/Colour.d.ts +11 -0
  60. package/dist/cjs/components/src/utilities/Colour/Colour.d.ts.map +1 -1
  61. package/dist/cjs/components/src/utilities/Colour/Colour.js +32 -0
  62. package/dist/cjs/src/Instantiators/RecommendationInstantiator.d.ts +1 -0
  63. package/dist/cjs/src/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  64. package/dist/cjs/src/Instantiators/RecommendationInstantiator.js +161 -123
  65. package/dist/cjs/src/Snap.d.ts +1 -1
  66. package/dist/cjs/src/Snap.d.ts.map +1 -1
  67. package/dist/cjs/src/Snap.js +18 -6
  68. package/dist/cjs/src/SnapHybrid.d.ts.map +1 -1
  69. package/dist/cjs/src/Templates/SnapTemplates.d.ts +13 -72
  70. package/dist/cjs/src/Templates/SnapTemplates.d.ts.map +1 -1
  71. package/dist/cjs/src/Templates/SnapTemplates.js +123 -72
  72. package/dist/cjs/src/Templates/Stores/TargetStore.d.ts +7 -6
  73. package/dist/cjs/src/Templates/Stores/TargetStore.d.ts.map +1 -1
  74. package/dist/cjs/src/Templates/Stores/TargetStore.js +14 -8
  75. package/dist/cjs/src/Templates/Stores/TemplateEditor/TemplateEditorStore.d.ts +58 -8
  76. package/dist/cjs/src/Templates/Stores/TemplateEditor/TemplateEditorStore.d.ts.map +1 -1
  77. package/dist/cjs/src/Templates/Stores/TemplateEditor/TemplateEditorStore.js +467 -96
  78. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/autocompleteControllerUI.d.ts +1 -0
  79. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/autocompleteControllerUI.d.ts.map +1 -1
  80. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/autocompleteControllerUI.js +123 -70
  81. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.d.ts.map +1 -1
  82. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.js +9 -3
  83. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/searchControllerUI.d.ts +1 -0
  84. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/searchControllerUI.d.ts.map +1 -1
  85. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/searchControllerUI.js +86 -1
  86. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/themeUI.d.ts.map +1 -1
  87. package/dist/cjs/src/Templates/Stores/TemplateEditor/uiAbstractions/themeUI.js +33 -14
  88. package/dist/cjs/src/Templates/Stores/TemplateStore.d.ts +93 -30
  89. package/dist/cjs/src/Templates/Stores/TemplateStore.d.ts.map +1 -1
  90. package/dist/cjs/src/Templates/Stores/TemplateStore.js +33 -41
  91. package/dist/cjs/src/Templates/Stores/ThemeStore.d.ts +2 -8
  92. package/dist/cjs/src/Templates/Stores/ThemeStore.d.ts.map +1 -1
  93. package/dist/cjs/src/Templates/Stores/ThemeStore.js +3 -28
  94. package/dist/cjs/src/Templates/index.d.ts +1 -1
  95. package/dist/cjs/src/Templates/index.d.ts.map +1 -1
  96. package/dist/cjs/src/create/createChatController.js +1 -1
  97. package/dist/cjs/src/index.d.ts +1 -0
  98. package/dist/cjs/src/index.d.ts.map +1 -1
  99. package/dist/cjs/src/setupEvents.d.ts +13 -0
  100. package/dist/cjs/src/setupEvents.d.ts.map +1 -1
  101. package/dist/cjs/src/setupEvents.js +56 -8
  102. package/dist/cjs/src/types.d.ts +3 -1
  103. package/dist/cjs/src/types.d.ts.map +1 -1
  104. package/dist/cjs/src/utils/combineMerge.d.ts +2 -0
  105. package/dist/cjs/src/utils/combineMerge.d.ts.map +1 -0
  106. package/dist/cjs/src/utils/combineMerge.js +22 -0
  107. package/dist/cjs/src/utils/index.d.ts +1 -0
  108. package/dist/cjs/src/utils/index.d.ts.map +1 -1
  109. package/dist/cjs/src/utils/index.js +3 -1
  110. package/dist/esm/components/src/components/Atoms/TemplateSelect/TemplateSelect.d.ts +3 -3
  111. package/dist/esm/components/src/components/Atoms/TemplateSelect/TemplateSelect.d.ts.map +1 -1
  112. package/dist/esm/components/src/components/Atoms/TemplateSelect/TemplateSelect.js +7 -8
  113. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts +1 -1
  114. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts.map +1 -1
  115. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.js +3 -3
  116. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts +2 -0
  117. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts.map +1 -1
  118. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.js +29 -28
  119. package/dist/esm/components/src/components/Molecules/Filter/Filter.d.ts +1 -1
  120. package/dist/esm/components/src/components/Molecules/Filter/Filter.d.ts.map +1 -1
  121. package/dist/esm/components/src/components/Molecules/Result/Result.d.ts.map +1 -1
  122. package/dist/esm/components/src/components/Molecules/Result/Result.js +9 -4
  123. package/dist/esm/components/src/components/Molecules/SearchInput/SearchInput.d.ts +4 -1
  124. package/dist/esm/components/src/components/Molecules/SearchInput/SearchInput.d.ts.map +1 -1
  125. package/dist/esm/components/src/components/Molecules/SearchInput/SearchInput.js +3 -3
  126. package/dist/esm/components/src/components/Molecules/TemplatesEditor/Components/AbstractedControls.js +5 -5
  127. package/dist/esm/components/src/components/Molecules/TemplatesEditor/Components/Control.d.ts.map +1 -1
  128. package/dist/esm/components/src/components/Molecules/TemplatesEditor/Components/Control.js +29 -29
  129. package/dist/esm/components/src/components/Molecules/TemplatesEditor/TemplatesEditor.d.ts.map +1 -1
  130. package/dist/esm/components/src/components/Molecules/TemplatesEditor/TemplatesEditor.js +22 -35
  131. package/dist/esm/components/src/components/Organisms/Chat/Chat.d.ts +8 -0
  132. package/dist/esm/components/src/components/Organisms/Chat/Chat.d.ts.map +1 -1
  133. package/dist/esm/components/src/components/Organisms/Chat/Chat.js +636 -359
  134. package/dist/esm/components/src/components/Organisms/Chat/ChatResult.d.ts.map +1 -1
  135. package/dist/esm/components/src/components/Organisms/Chat/ChatResult.js +13 -3
  136. package/dist/esm/components/src/components/Organisms/Chat/MessageText.d.ts +3 -1
  137. package/dist/esm/components/src/components/Organisms/Chat/MessageText.d.ts.map +1 -1
  138. package/dist/esm/components/src/components/Organisms/Chat/MessageText.js +21 -19
  139. package/dist/esm/components/src/components/Organisms/Chat/MessageUser.d.ts +3 -1
  140. package/dist/esm/components/src/components/Organisms/Chat/MessageUser.d.ts.map +1 -1
  141. package/dist/esm/components/src/components/Organisms/Chat/MessageUser.js +37 -23
  142. package/dist/esm/components/src/components/Organisms/Chat/ResultsDisplay.d.ts +1 -1
  143. package/dist/esm/components/src/components/Organisms/Chat/ResultsDisplay.d.ts.map +1 -1
  144. package/dist/esm/components/src/components/Organisms/Chat/ResultsDisplay.js +8 -7
  145. package/dist/esm/components/src/components/Organisms/Facet/Facet.js +1 -1
  146. package/dist/esm/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.js +1 -1
  147. package/dist/esm/components/src/components/Organisms/FilterSummary/FilterSummary.d.ts +2 -2
  148. package/dist/esm/components/src/components/Organisms/FilterSummary/FilterSummary.d.ts.map +1 -1
  149. package/dist/esm/components/src/components/Organisms/ProductQuickView/ProductQuickView.d.ts +11 -0
  150. package/dist/esm/components/src/components/Organisms/ProductQuickView/ProductQuickView.d.ts.map +1 -0
  151. package/dist/esm/components/src/components/Organisms/ProductQuickView/ProductQuickView.js +436 -0
  152. package/dist/esm/components/src/components/Organisms/ProductQuickView/index.d.ts +2 -0
  153. package/dist/esm/components/src/components/Organisms/ProductQuickView/index.d.ts.map +1 -0
  154. package/dist/esm/components/src/components/Organisms/ProductQuickView/index.js +1 -0
  155. package/dist/esm/components/src/components/Templates/AutocompleteModal/AutocompleteModal.d.ts.map +1 -1
  156. package/dist/esm/components/src/components/Templates/AutocompleteModal/AutocompleteModal.js +0 -2
  157. package/dist/esm/components/src/hooks/useAcRenderedInput.d.ts.map +1 -1
  158. package/dist/esm/components/src/hooks/useAcRenderedInput.js +61 -11
  159. package/dist/esm/components/src/hooks/useMediaQuery.d.ts.map +1 -1
  160. package/dist/esm/components/src/hooks/useMediaQuery.js +3 -1
  161. package/dist/esm/components/src/index.d.ts +1 -0
  162. package/dist/esm/components/src/index.d.ts.map +1 -1
  163. package/dist/esm/components/src/index.js +1 -0
  164. package/dist/esm/components/src/providers/theme.d.ts +1 -1
  165. package/dist/esm/components/src/providers/theme.d.ts.map +1 -1
  166. package/dist/esm/components/src/themes/base/base.js +3 -3
  167. package/dist/esm/components/src/utilities/Colour/Colour.d.ts +11 -0
  168. package/dist/esm/components/src/utilities/Colour/Colour.d.ts.map +1 -1
  169. package/dist/esm/components/src/utilities/Colour/Colour.js +30 -0
  170. package/dist/esm/src/Instantiators/RecommendationInstantiator.d.ts +1 -0
  171. package/dist/esm/src/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  172. package/dist/esm/src/Instantiators/RecommendationInstantiator.js +130 -84
  173. package/dist/esm/src/Snap.d.ts +1 -1
  174. package/dist/esm/src/Snap.d.ts.map +1 -1
  175. package/dist/esm/src/Snap.js +21 -6
  176. package/dist/esm/src/SnapHybrid.d.ts.map +1 -1
  177. package/dist/esm/src/Templates/SnapTemplates.d.ts +13 -72
  178. package/dist/esm/src/Templates/SnapTemplates.d.ts.map +1 -1
  179. package/dist/esm/src/Templates/SnapTemplates.js +137 -78
  180. package/dist/esm/src/Templates/Stores/TargetStore.d.ts +7 -6
  181. package/dist/esm/src/Templates/Stores/TargetStore.d.ts.map +1 -1
  182. package/dist/esm/src/Templates/Stores/TargetStore.js +14 -8
  183. package/dist/esm/src/Templates/Stores/TemplateEditor/TemplateEditorStore.d.ts +58 -8
  184. package/dist/esm/src/Templates/Stores/TemplateEditor/TemplateEditorStore.d.ts.map +1 -1
  185. package/dist/esm/src/Templates/Stores/TemplateEditor/TemplateEditorStore.js +447 -89
  186. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/autocompleteControllerUI.d.ts +1 -0
  187. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/autocompleteControllerUI.d.ts.map +1 -1
  188. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/autocompleteControllerUI.js +118 -66
  189. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.d.ts.map +1 -1
  190. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/configUI.js +9 -3
  191. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/searchControllerUI.d.ts +1 -0
  192. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/searchControllerUI.d.ts.map +1 -1
  193. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/searchControllerUI.js +82 -1
  194. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/themeUI.d.ts.map +1 -1
  195. package/dist/esm/src/Templates/Stores/TemplateEditor/uiAbstractions/themeUI.js +27 -8
  196. package/dist/esm/src/Templates/Stores/TemplateStore.d.ts +93 -30
  197. package/dist/esm/src/Templates/Stores/TemplateStore.d.ts.map +1 -1
  198. package/dist/esm/src/Templates/Stores/TemplateStore.js +29 -38
  199. package/dist/esm/src/Templates/Stores/ThemeStore.d.ts +2 -8
  200. package/dist/esm/src/Templates/Stores/ThemeStore.d.ts.map +1 -1
  201. package/dist/esm/src/Templates/Stores/ThemeStore.js +3 -26
  202. package/dist/esm/src/Templates/index.d.ts +1 -1
  203. package/dist/esm/src/Templates/index.d.ts.map +1 -1
  204. package/dist/esm/src/create/createChatController.js +1 -1
  205. package/dist/esm/src/index.d.ts +1 -0
  206. package/dist/esm/src/index.d.ts.map +1 -1
  207. package/dist/esm/src/setupEvents.d.ts +13 -0
  208. package/dist/esm/src/setupEvents.d.ts.map +1 -1
  209. package/dist/esm/src/setupEvents.js +25 -8
  210. package/dist/esm/src/types.d.ts +3 -1
  211. package/dist/esm/src/types.d.ts.map +1 -1
  212. package/dist/esm/src/utils/combineMerge.d.ts +2 -0
  213. package/dist/esm/src/utils/combineMerge.d.ts.map +1 -0
  214. package/dist/esm/src/utils/combineMerge.js +16 -0
  215. package/dist/esm/src/utils/index.d.ts +1 -0
  216. package/dist/esm/src/utils/index.d.ts.map +1 -1
  217. package/dist/esm/src/utils/index.js +1 -0
  218. package/package.json +20 -14
@@ -0,0 +1,436 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ import { useEffect } from 'preact/hooks';
3
+ import { observer } from 'mobx-react-lite';
4
+ import { css } from '@emotion/react';
5
+ import classnames from 'classnames';
6
+ import { Overlay } from '../../Atoms/Overlay';
7
+ import { Image } from '../../Atoms/Image';
8
+ import { Button } from '../../Atoms/Button';
9
+ import { Price } from '../../Atoms/Price';
10
+ import { Icon } from '../../Atoms/Icon';
11
+ import { useTheme, useTreePath } from '../../../providers';
12
+ import { mergeProps, mergeStyles } from '../../../utilities';
13
+ // Fields that have dedicated rendering on the product card; skip them in the info table.
14
+ const CARD_FIELDS = new Set([
15
+ 'name',
16
+ 'brand',
17
+ 'price',
18
+ 'msrp',
19
+ 'imageUrl',
20
+ 'thumbnailImageUrl',
21
+ 'secureImageUrl',
22
+ 'secureThumbnailImageUrl',
23
+ 'url',
24
+ 'addToCartUrl',
25
+ 'uid',
26
+ 'sku',
27
+ 'parentId',
28
+ 'parentImageUrl',
29
+ 'description',
30
+ 'caption',
31
+ 'popularity',
32
+ 'stockMessage',
33
+ ]);
34
+ // Preferred ordering for the structured info table — anything else is appended after.
35
+ const PREFERRED_INFO_ORDER = ['material', 'fit', 'color', 'sizes', 'size', 'category', 'rating', 'availability'];
36
+ const FEATURE_KEYS = ['features', 'feature_list', 'productFeatures', 'product_features', 'highlights'];
37
+ const formatLabel = (key) => {
38
+ return key
39
+ .replace(/[_-]+/g, ' ')
40
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
41
+ .trim();
42
+ };
43
+ const stripHtml = (str) => str.replace(/<[^>]*>/g, '');
44
+ const formatValue = (value) => {
45
+ if (Array.isArray(value)) {
46
+ return stripHtml(value.filter((v) => v != null && v !== '').join(', '));
47
+ }
48
+ if (value == null)
49
+ return '';
50
+ // Upstream sometimes ships array fields as JSON-encoded strings (e.g. `'["VersaWearCo"]'`).
51
+ // Detect and unwrap before stringifying so the raw brackets/quotes don't leak into the UI.
52
+ if (typeof value === 'string') {
53
+ const trimmed = value.trim();
54
+ if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || (trimmed.startsWith('{') && trimmed.endsWith('}'))) {
55
+ try {
56
+ const parsed = JSON.parse(trimmed);
57
+ if (Array.isArray(parsed)) {
58
+ return stripHtml(parsed.filter((v) => v != null && v !== '').join(', '));
59
+ }
60
+ }
61
+ catch {
62
+ // fall through — value wasn't valid JSON, just treat it as a string
63
+ }
64
+ }
65
+ }
66
+ return stripHtml(String(value));
67
+ };
68
+ const collectFeatures = (display) => {
69
+ const attributes = display?.attributes || {};
70
+ for (const key of FEATURE_KEYS) {
71
+ const raw = attributes[key];
72
+ if (Array.isArray(raw) && raw.length > 0) {
73
+ return raw.map((v) => String(v)).filter(Boolean);
74
+ }
75
+ if (typeof raw === 'string' && raw.trim()) {
76
+ return raw
77
+ .split(/\r?\n|,/)
78
+ .map((v) => v.trim())
79
+ .filter(Boolean);
80
+ }
81
+ }
82
+ return [];
83
+ };
84
+ const collectInfoRows = (display, displayFields) => {
85
+ const core = display?.mappings?.core || {};
86
+ const attributes = display?.attributes || {};
87
+ const filterByDisplayFields = displayFields && displayFields.length > 0;
88
+ const displayFieldsLower = filterByDisplayFields ? displayFields.map((f) => f.toLowerCase()) : [];
89
+ const merged = {};
90
+ // When displayFields is specified, include matching core fields that are normally skipped.
91
+ if (filterByDisplayFields) {
92
+ Object.entries(core).forEach(([key, value]) => {
93
+ if (displayFieldsLower.includes(key.toLowerCase()) && value != null) {
94
+ merged[key] = value;
95
+ }
96
+ });
97
+ }
98
+ // Pull selected core fields (rating + availability) regardless.
99
+ if (core.rating != null) {
100
+ const rating = core.rating;
101
+ const ratingCount = core.ratingCount;
102
+ merged.rating = ratingCount ? `${rating}/5.0 (${ratingCount} reviews)` : `${rating}/5.0`;
103
+ }
104
+ if (core.available != null) {
105
+ merged.availability = core.available ? 'In Stock' : 'Out of Stock';
106
+ }
107
+ // Merge product attributes, skipping ones already shown on the card and the feature lists.
108
+ Object.entries(attributes).forEach(([key, value]) => {
109
+ if (!filterByDisplayFields && CARD_FIELDS.has(key))
110
+ return;
111
+ if (FEATURE_KEYS.includes(key))
112
+ return;
113
+ const formatted = formatValue(value);
114
+ if (!formatted)
115
+ return;
116
+ merged[key] = formatted;
117
+ });
118
+ const seen = new Set();
119
+ const ordered = [];
120
+ PREFERRED_INFO_ORDER.forEach((preferred) => {
121
+ const match = Object.keys(merged).find((k) => k.toLowerCase() === preferred);
122
+ if (match && !seen.has(match)) {
123
+ seen.add(match);
124
+ ordered.push({ key: match, rawKey: match, label: formatLabel(match), value: formatValue(merged[match]) });
125
+ }
126
+ });
127
+ Object.keys(merged).forEach((key) => {
128
+ if (seen.has(key))
129
+ return;
130
+ seen.add(key);
131
+ ordered.push({ key, rawKey: key, label: formatLabel(key), value: formatValue(merged[key]) });
132
+ });
133
+ if (filterByDisplayFields) {
134
+ const filtered = ordered.filter((row) => displayFieldsLower.includes(row.rawKey.toLowerCase()));
135
+ filtered.sort((a, b) => displayFieldsLower.indexOf(a.rawKey.toLowerCase()) - displayFieldsLower.indexOf(b.rawKey.toLowerCase()));
136
+ return filtered;
137
+ }
138
+ return ordered;
139
+ };
140
+ const defaultStyles = () => {
141
+ return css({
142
+ // Fixed viewport-level wrapper that hosts both the backdrop and the centered panel.
143
+ position: 'fixed',
144
+ inset: 0,
145
+ zIndex: 10004,
146
+ display: 'flex',
147
+ alignItems: 'center',
148
+ justifyContent: 'center',
149
+ '.ss__product-quick-view__panel': {
150
+ background: '#fff',
151
+ borderRadius: '8px',
152
+ padding: '1.5em',
153
+ maxWidth: '760px',
154
+ width: '90vw',
155
+ maxHeight: '85vh',
156
+ overflowY: 'auto',
157
+ position: 'relative',
158
+ boxShadow: '0 10px 40px rgba(0, 0, 0, 0.2)',
159
+ zIndex: 10004,
160
+ display: 'flex',
161
+ flexDirection: 'column',
162
+ gap: '1em',
163
+ },
164
+ '.ss__product-quick-view__close': {
165
+ position: 'absolute',
166
+ top: '0.75em',
167
+ right: '0.75em',
168
+ cursor: 'pointer',
169
+ padding: '4px',
170
+ zIndex: 1,
171
+ },
172
+ '.ss__product-quick-view__error': {
173
+ padding: '0.75em 1em',
174
+ background: '#fee',
175
+ color: '#a00',
176
+ borderRadius: '4px',
177
+ },
178
+ '.ss__product-quick-view__loading': {
179
+ padding: '2em',
180
+ textAlign: 'center',
181
+ color: '#6A7282',
182
+ },
183
+ '.ss__product-quick-view__body': {
184
+ display: 'flex',
185
+ gap: '1.5em',
186
+ alignItems: 'flex-start',
187
+ flexWrap: 'wrap',
188
+ },
189
+ '.ss__product-quick-view__left': {
190
+ flex: '0 0 auto',
191
+ width: '40%',
192
+ maxWidth: '280px',
193
+ minWidth: '180px',
194
+ display: 'flex',
195
+ flexDirection: 'column',
196
+ gap: '0.75em',
197
+ // On narrow viewports the body wraps to stack vertically — let the image column
198
+ // stretch full-width so the image doesn't sit awkwardly at a fixed 40%/280px.
199
+ // The flex wraps once the panel can't fit the 280px left + gap + 320px right basis,
200
+ // which lands around a 680px viewport given the 90vw panel and 1.5em padding.
201
+ '@media (max-width: 700px)': {
202
+ width: '100%',
203
+ maxWidth: 'none',
204
+ minWidth: 0,
205
+ },
206
+ '.ss__product-quick-view__left__image': {
207
+ width: '100%',
208
+ objectFit: 'contain',
209
+ borderRadius: '0.33em',
210
+ overflow: 'hidden',
211
+ },
212
+ '.ss__product-quick-view__left__actions': {
213
+ display: 'flex',
214
+ flexDirection: 'column',
215
+ gap: '0.5em',
216
+ '.ss__product-quick-view__left__actions__go-to-product': {
217
+ textAlign: 'center',
218
+ a: {
219
+ fontSize: '1em',
220
+ textDecoration: 'underline',
221
+ cursor: 'pointer',
222
+ color: '#374151',
223
+ },
224
+ },
225
+ '.ss__product-quick-view__left__actions__add-to-cart .ss__button': {
226
+ width: '100%',
227
+ // Center the button text — the Button atom defaults to inline-flex with
228
+ // alignItems:center only, so longer labels would otherwise stay left-aligned.
229
+ justifyContent: 'center',
230
+ textAlign: 'center',
231
+ background: '#253B80',
232
+ color: '#fff',
233
+ border: '1px solid #253B80',
234
+ fontWeight: 'bold',
235
+ padding: '0.6em 0.75em',
236
+ '&:not(.ss__button--disabled):hover': {
237
+ background: '#1e3068',
238
+ },
239
+ },
240
+ },
241
+ },
242
+ '.ss__product-quick-view__right': {
243
+ flex: '1 1 320px',
244
+ minWidth: 0,
245
+ display: 'flex',
246
+ flexDirection: 'column',
247
+ gap: '1em',
248
+ '.ss__product-quick-view__title': {
249
+ display: 'flex',
250
+ flexDirection: 'column',
251
+ gap: '0.25em',
252
+ '.ss__product-quick-view__title__name': {
253
+ fontWeight: 'bold',
254
+ fontSize: '1.25em',
255
+ lineHeight: 1.3,
256
+ a: { color: 'inherit', textDecoration: 'none', '&:hover': { textDecoration: 'underline' } },
257
+ },
258
+ '.ss__product-quick-view__title__brand': {
259
+ fontSize: '0.9em',
260
+ color: '#6A7282',
261
+ },
262
+ '.ss__product-quick-view__title__price': {
263
+ fontWeight: 'bold',
264
+ fontSize: '1.15em',
265
+ display: 'flex',
266
+ gap: '0.5em',
267
+ alignItems: 'center',
268
+ marginTop: '0.25em',
269
+ },
270
+ },
271
+ },
272
+ '.ss__product-quick-view__variants': {
273
+ '.ss__product-quick-view__variants__label': {
274
+ fontWeight: 600,
275
+ fontSize: '0.9em',
276
+ color: '#374151',
277
+ textTransform: 'uppercase',
278
+ marginBottom: '0.5em',
279
+ },
280
+ '.ss__product-quick-view__variants__swatches': {
281
+ display: 'flex',
282
+ flexWrap: 'wrap',
283
+ gap: '0.5em',
284
+ '.ss__product-quick-view__variants__swatch': {
285
+ display: 'flex',
286
+ flexDirection: 'column',
287
+ alignItems: 'center',
288
+ gap: '0.25em',
289
+ cursor: 'pointer',
290
+ padding: '0.25em',
291
+ borderRadius: '0.5em',
292
+ border: '2px solid transparent',
293
+ transition: 'border-color 0.15s ease',
294
+ '&:hover': { borderColor: '#253B80' },
295
+ '&.ss__product-quick-view__variants__swatch--selected': {
296
+ borderColor: '#253B80',
297
+ borderWidth: '3px',
298
+ padding: '0.15em',
299
+ },
300
+ '&.ss__product-quick-view__variants__swatch--unavailable': {
301
+ opacity: 0.4,
302
+ },
303
+ '.ss__product-quick-view__variants__swatch__image': {
304
+ width: '48px',
305
+ height: '48px',
306
+ objectFit: 'cover',
307
+ borderRadius: '50%',
308
+ border: '1px solid #E5E7EB',
309
+ },
310
+ '.ss__product-quick-view__variants__swatch__value': {
311
+ fontSize: '0.75em',
312
+ color: '#374151',
313
+ textAlign: 'center',
314
+ maxWidth: '60px',
315
+ overflow: 'hidden',
316
+ textOverflow: 'ellipsis',
317
+ whiteSpace: 'nowrap',
318
+ },
319
+ },
320
+ },
321
+ },
322
+ '.ss__product-quick-view__section': {
323
+ '.ss__product-quick-view__section__title': {
324
+ fontWeight: 600,
325
+ fontSize: '0.9em',
326
+ color: '#374151',
327
+ marginBottom: '0.4em',
328
+ },
329
+ '.ss__product-quick-view__section__table': {
330
+ width: '100%',
331
+ borderCollapse: 'collapse',
332
+ fontSize: '0.9em',
333
+ tr: {
334
+ borderBottom: '1px solid #E5E7EB',
335
+ },
336
+ td: {
337
+ padding: '0.4em 0',
338
+ verticalAlign: 'top',
339
+ wordBreak: 'break-word',
340
+ overflowWrap: 'anywhere',
341
+ },
342
+ 'td:first-of-type': {
343
+ color: '#6A7282',
344
+ width: '40%',
345
+ },
346
+ 'td:last-of-type': {
347
+ textAlign: 'right',
348
+ color: '#374151',
349
+ },
350
+ '.ss__product-quick-view__section__table__availability--in-stock': {
351
+ color: '#10B981',
352
+ },
353
+ '.ss__product-quick-view__section__table__availability--out-of-stock': {
354
+ color: '#DC2626',
355
+ },
356
+ },
357
+ '.ss__product-quick-view__section__description': {
358
+ fontSize: '0.9em',
359
+ color: '#374151',
360
+ lineHeight: 1.5,
361
+ },
362
+ '.ss__product-quick-view__section__features': {
363
+ margin: 0,
364
+ padding: '0 0 0 1.25em',
365
+ fontSize: '0.9em',
366
+ listStyle: 'disc',
367
+ li: {
368
+ padding: '0.2em 0',
369
+ color: '#374151',
370
+ },
371
+ },
372
+ },
373
+ });
374
+ };
375
+ export const ProductQuickView = observer((properties) => {
376
+ const globalTheme = useTheme();
377
+ const globalTreePath = useTreePath();
378
+ const defaultProps = {
379
+ treePath: globalTreePath,
380
+ };
381
+ const props = mergeProps('productQuickView', globalTheme, defaultProps, properties);
382
+ const { controller, displayFields, className, internalClassName } = props;
383
+ const store = controller?.store?.productQuickView;
384
+ if (!store)
385
+ return null;
386
+ const product = store.product;
387
+ const error = store.error;
388
+ const loading = store.loading;
389
+ const open = product !== null;
390
+ const close = () => store.clear();
391
+ const styling = mergeStyles(props, defaultStyles);
392
+ // Lock body scroll while the quickview is open.
393
+ useEffect(() => {
394
+ if (!open)
395
+ return;
396
+ const previousOverflow = document.body.style.overflow;
397
+ document.body.style.overflow = 'hidden';
398
+ return () => {
399
+ document.body.style.overflow = previousOverflow;
400
+ };
401
+ }, [open]);
402
+ if (!open)
403
+ return null;
404
+ return (_jsxs("div", { className: classnames('ss__product-quick-view', className, internalClassName), ...styling, children: [_jsx(Overlay, { active: true, color: "rgba(0,0,0,0.7)", onClick: close }), _jsxs("div", { className: "ss__product-quick-view__panel", children: [_jsx("div", { className: "ss__product-quick-view__close", onClick: close, role: "button", "aria-label": "Close", children: _jsx(Icon, { icon: "close-thin", size: "16px" }) }), product ? (_jsx(ProductQuickViewBody, { product: product, loading: loading, error: error, controller: controller, displayFields: displayFields })) : (_jsx("div", { className: "ss__product-quick-view__loading", children: "Loading..." }))] })] }));
405
+ });
406
+ const ProductQuickViewBody = observer((props) => {
407
+ const { product, loading, error, controller, displayFields } = props;
408
+ const displayed = product.display;
409
+ const displayedCore = displayed.mappings?.core || {};
410
+ const variants = product.variants;
411
+ const selections = variants?.selections || [];
412
+ const displayedData = {
413
+ mappings: displayed.mappings,
414
+ attributes: displayed.attributes || {},
415
+ };
416
+ const allInfoRows = collectInfoRows(displayedData, displayFields);
417
+ const descriptionRow = allInfoRows.find((row) => row.rawKey.toLowerCase() === 'description');
418
+ const infoRows = allInfoRows.filter((row) => row.rawKey.toLowerCase() !== 'description');
419
+ const features = collectFeatures(displayedData);
420
+ // `addToCart` exists on Recommendation/Chat controllers but not on Search/Autocomplete.
421
+ const supportsAddToCart = typeof controller?.addToCart === 'function';
422
+ return (_jsxs("div", { children: [error && _jsx("div", { className: "ss__product-quick-view__error", children: error }), _jsxs("div", { className: "ss__product-quick-view__body", children: [_jsxs("div", { className: "ss__product-quick-view__left", children: [displayedCore.imageUrl ? (_jsx(Image, { className: "ss__product-quick-view__left__image", src: displayedCore.imageUrl, alt: displayedCore.name || '' })) : null, _jsxs("div", { className: "ss__product-quick-view__left__actions", children: [supportsAddToCart && (_jsx("div", { className: "ss__product-quick-view__left__actions__add-to-cart", children: _jsx(Button, { content: 'Add to Cart', onClick: () => {
423
+ controller?.track?.product?.addToCart?.(product);
424
+ controller.addToCart(product);
425
+ } }) })), displayedCore.url && (_jsx("div", { className: "ss__product-quick-view__left__actions__go-to-product", children: _jsx("a", { href: displayedCore.url, onClick: (e) => controller?.track?.product?.click?.(e, product), target: "_blank", rel: "noopener noreferrer", children: "Go to product" }) }))] })] }), _jsxs("div", { className: "ss__product-quick-view__right", children: [_jsxs("div", { className: "ss__product-quick-view__title", children: [displayedCore.name && (_jsx("div", { className: "ss__product-quick-view__title__name", children: displayedCore.url ? (_jsx("a", { href: displayedCore.url, onClick: (e) => controller?.track?.product?.click?.(e, product), target: "_blank", rel: "noopener noreferrer", children: formatValue(displayedCore.name) })) : (formatValue(displayedCore.name)) })), displayedCore.brand != null && formatValue(displayedCore.brand) && (_jsx("div", { className: "ss__product-quick-view__title__brand", children: formatValue(displayedCore.brand) })), displayedCore.price != null && (_jsxs("div", { className: "ss__product-quick-view__title__price", children: [displayedCore.msrp != null && Number(displayedCore.msrp) > Number(displayedCore.price) && (_jsx(Price, { value: displayedCore.msrp, lineThrough: true })), _jsx(Price, { value: displayedCore.price })] }))] }), selections.length > 0 && (_jsx("div", { className: "ss__product-quick-view__variants", children: selections.map((selection) => (_jsxs("div", { children: [_jsxs("div", { className: "ss__product-quick-view__variants__label", children: [formatLabel(selection.field), " (", selection.values.length, ")"] }), _jsx("div", { className: "ss__product-quick-view__variants__swatches", children: selection.values.map((selectionValue) => {
426
+ const isUnavailable = !selectionValue.available;
427
+ const isSelected = selection.selected?.value === selectionValue.value;
428
+ return (_jsxs("div", { className: classnames('ss__product-quick-view__variants__swatch', {
429
+ 'ss__product-quick-view__variants__swatch--selected': isSelected,
430
+ 'ss__product-quick-view__variants__swatch--unavailable': isUnavailable,
431
+ }), title: selectionValue.value, onClick: () => selection.select(selectionValue.value), children: [selectionValue.thumbnailImageUrl ? (_jsx(Image, { className: "ss__product-quick-view__variants__swatch__image", src: selectionValue.thumbnailImageUrl, alt: selectionValue.value })) : null, _jsx("span", { className: "ss__product-quick-view__variants__swatch__value", children: selectionValue.value })] }, selectionValue.value));
432
+ }) })] }, selection.field))) })), infoRows.length > 0 && (_jsxs("div", { className: "ss__product-quick-view__section", children: [_jsx("div", { className: "ss__product-quick-view__section__title", children: "Product Information" }), _jsx("table", { className: "ss__product-quick-view__section__table", children: _jsx("tbody", { children: infoRows.map((row) => (_jsxs("tr", { children: [_jsx("td", { children: row.label }), _jsx("td", { children: row.rawKey === 'availability' ? (_jsx("span", { className: classnames({
433
+ 'ss__product-quick-view__section__table__availability--in-stock': row.value === 'In Stock',
434
+ 'ss__product-quick-view__section__table__availability--out-of-stock': row.value === 'Out of Stock',
435
+ }), children: row.value === 'In Stock' ? `✓ ${row.value}` : row.value })) : row.rawKey.toLowerCase() === 'price' ? (_jsxs("span", { style: { display: 'flex', gap: '0.5em', alignItems: 'center', justifyContent: 'flex-end' }, children: [displayedCore.msrp != null && Number(displayedCore.msrp) > Number(row.value) && (_jsx(Price, { value: Number(displayedCore.msrp), lineThrough: true })), _jsx(Price, { value: Number(row.value) })] })) : (row.value) })] }, row.key))) }) })] })), descriptionRow && (_jsxs("div", { className: "ss__product-quick-view__section", children: [_jsx("div", { className: "ss__product-quick-view__section__title", children: "Description" }), _jsx("div", { className: "ss__product-quick-view__section__description", children: descriptionRow.value })] })), features.length > 0 && (_jsxs("div", { className: "ss__product-quick-view__section", children: [_jsx("div", { className: "ss__product-quick-view__section__title", children: "Features" }), _jsx("ul", { className: "ss__product-quick-view__section__features", children: features.map((feature, idx) => (_jsx("li", { children: feature }, idx))) })] })), loading && selections.length === 0 && infoRows.length === 0 && !descriptionRow && features.length === 0 && (_jsx("div", { className: "ss__product-quick-view__loading", children: "Loading product details..." }))] })] })] }));
436
+ });
@@ -0,0 +1,2 @@
1
+ export * from './ProductQuickView';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Organisms/ProductQuickView/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './ProductQuickView';
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteModal.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Templates/AutocompleteModal/AutocompleteModal.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,cAAc,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAsB,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AA8DjG,eAAO,MAAM,iBAAiB,gBAAyB,sBAAsB;;CAiK3E,CAAC;AAQH,MAAM,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;CAC7C,GAAG,oCAAoC,GACvC,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAEzC,MAAM,MAAM,oCAAoC,GAAG;IAClD,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,uBAAuB,CAAC"}
1
+ {"version":3,"file":"AutocompleteModal.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Templates/AutocompleteModal/AutocompleteModal.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,cAAc,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAsB,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AA4DjG,eAAO,MAAM,iBAAiB,gBAAyB,sBAAsB;;CAiK3E,CAAC;AAQH,MAAM,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;CAC7C,GAAG,oCAAoC,GACvC,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAEzC,MAAM,MAAM,oCAAoC,GAAG;IAClD,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,uBAAuB,CAAC"}
@@ -21,7 +21,6 @@ const defaultStyles = ({ width, height, theme }) => {
21
21
  right: '0',
22
22
  top: '0',
23
23
  zIndex: 1001,
24
- pointerEvents: 'none',
25
24
  '& .ss__autocomplete-modal__inner': {
26
25
  position: 'absolute',
27
26
  left: 0,
@@ -36,7 +35,6 @@ const defaultStyles = ({ width, height, theme }) => {
36
35
  width: width,
37
36
  height: height,
38
37
  maxWidth: '100vw',
39
- pointerEvents: 'auto',
40
38
  },
41
39
  '& .ss__overlay': {
42
40
  zIndex: 1000,
@@ -1 +1 @@
1
- {"version":3,"file":"useAcRenderedInput.d.ts","sourceRoot":"","sources":["../../../../../components/src/hooks/useAcRenderedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAY,UAAU,EAAa,MAAM,cAAc,CAAC;AAE/D,wBAAgB,kBAAkB,CAAC,EAClC,KAAK,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,SAAS,GACT,EAAE;IACF,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,sBAAsB,CAAC;IACnC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACtD,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC,kBA2DA"}
1
+ {"version":3,"file":"useAcRenderedInput.d.ts","sourceRoot":"","sources":["../../../../../components/src/hooks/useAcRenderedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAY,UAAU,EAAa,MAAM,cAAc,CAAC;AAE/D,wBAAgB,kBAAkB,CAAC,EAClC,KAAK,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,SAAS,GACT,EAAE;IACF,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,sBAAsB,CAAC;IACnC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACtD,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC,kBAkHA"}
@@ -18,6 +18,12 @@ export function useAcRenderedInput({ input, controller, renderInput, buttonSelec
18
18
  });
19
19
  };
20
20
  useEffect(() => {
21
+ // track pointer-initiated focus to avoid rendering the overlay between mousedown and mouseup,
22
+ // which splits the click target to the nearest common ancestor instead of the input element
23
+ let pointerFocus = false;
24
+ const clearPointerFocus = () => {
25
+ pointerFocus = false;
26
+ };
21
27
  if (renderInput && buttonSelector) {
22
28
  let button;
23
29
  if (typeof buttonSelector == 'string') {
@@ -27,31 +33,75 @@ export function useAcRenderedInput({ input, controller, renderInput, buttonSelec
27
33
  button = buttonSelector;
28
34
  }
29
35
  if (button) {
30
- button.addEventListener('click', (e) => {
36
+ const onMousedown = () => {
37
+ pointerFocus = true;
38
+ };
39
+ const onClickBtn = (e) => {
40
+ pointerFocus = false;
31
41
  e.stopPropagation();
32
42
  onClick();
33
- });
34
- button.addEventListener('focus', () => onClick());
35
- button.addEventListener('select', () => onClick());
43
+ };
44
+ const onFocusBtn = () => {
45
+ if (!pointerFocus) {
46
+ onClick();
47
+ }
48
+ };
49
+ const onSelectBtn = () => onClick();
50
+ button.addEventListener('mousedown', onMousedown);
51
+ document.addEventListener('mouseup', clearPointerFocus, true);
52
+ button.addEventListener('click', onClickBtn);
53
+ button.addEventListener('focus', onFocusBtn);
54
+ button.addEventListener('select', onSelectBtn);
55
+ return () => {
56
+ button.removeEventListener('mousedown', onMousedown);
57
+ document.removeEventListener('mouseup', clearPointerFocus, true);
58
+ button.removeEventListener('click', onClickBtn);
59
+ button.removeEventListener('focus', onFocusBtn);
60
+ button.removeEventListener('select', onSelectBtn);
61
+ };
36
62
  }
37
63
  }
38
64
  else {
39
65
  if (setActive) {
40
- input.addEventListener('click', (e) => {
66
+ const onMousedown = () => {
67
+ pointerFocus = true;
68
+ };
69
+ const onClickInput = (e) => {
70
+ pointerFocus = false;
41
71
  e.stopPropagation();
42
72
  setActive(true);
43
- });
44
- input.addEventListener('focus', () => setActive(true));
45
- input.addEventListener('select', () => setActive(true));
73
+ };
74
+ const onFocusInput = () => {
75
+ if (!pointerFocus) {
76
+ setActive(true);
77
+ }
78
+ };
79
+ const onSelectInput = () => setActive(true);
80
+ input.addEventListener('mousedown', onMousedown);
81
+ document.addEventListener('mouseup', clearPointerFocus, true);
82
+ input.addEventListener('click', onClickInput);
83
+ input.addEventListener('focus', onFocusInput);
84
+ input.addEventListener('select', onSelectInput);
85
+ return () => {
86
+ input.removeEventListener('mousedown', onMousedown);
87
+ document.removeEventListener('mouseup', clearPointerFocus, true);
88
+ input.removeEventListener('click', onClickInput);
89
+ input.removeEventListener('focus', onFocusInput);
90
+ input.removeEventListener('select', onSelectInput);
91
+ };
46
92
  }
47
93
  }
48
94
  }, []);
49
95
  // this is used to keep the values consistent between the native input and the rendered input
50
96
  useEffect(() => {
51
- if (input !== _input) {
52
- _input?.addEventListener('input', () => {
97
+ if (input !== _input && _input) {
98
+ const onInput = () => {
53
99
  input.value = _input.value;
54
- });
100
+ };
101
+ _input.addEventListener('input', onInput);
102
+ return () => {
103
+ _input.removeEventListener('input', onInput);
104
+ };
55
105
  }
56
106
  }, [_input]);
57
107
  return _input;
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaQuery.d.ts","sourceRoot":"","sources":["../../../../../components/src/hooks/useMediaQuery.tsx"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAgB/E"}
1
+ {"version":3,"file":"useMediaQuery.d.ts","sourceRoot":"","sources":["../../../../../components/src/hooks/useMediaQuery.tsx"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAmB/E"}
@@ -5,12 +5,14 @@ export function useMediaQuery(query, runOnCleanup) {
5
5
  const mediaQuery = window.matchMedia(query);
6
6
  const [match, setMatch] = useState(!!mediaQuery.matches);
7
7
  useEffect(() => {
8
+ // sync state immediately in case query changed
9
+ setMatch(!!mediaQuery.matches);
8
10
  const handler = () => setMatch(!!mediaQuery.matches);
9
11
  mediaQuery.addListener(handler);
10
12
  return () => {
11
13
  runOnCleanup instanceof Function && runOnCleanup();
12
14
  mediaQuery.removeListener(handler);
13
15
  };
14
- }, []);
16
+ }, [query]);
15
17
  return match;
16
18
  }
@@ -55,6 +55,7 @@ export * from './components/Organisms/FacetsHorizontal';
55
55
  export * from './components/Organisms/FilterSummary';
56
56
  export * from './components/Organisms/MobileSidebar';
57
57
  export * from './components/Organisms/NoResults';
58
+ export * from './components/Organisms/ProductQuickView';
58
59
  export * from './components/Organisms/Results';
59
60
  export * from './components/Organisms/Sidebar';
60
61
  export * from './components/Organisms/Toolbar';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/src/index.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8BAA8B,CAAC;AAG7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,SAAS,CAAC;AAGxB,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,OAAO,EACN,aAAa,IAAI,2BAA2B,EAC5C,kBAAkB,IAAI,gCAAgC,GACtD,MAAM,qCAAqC,CAAC;AAG7C,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/src/index.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,oCAAoC,CAAC;AAEnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8BAA8B,CAAC;AAG7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,SAAS,CAAC;AAGxB,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,OAAO,EACN,aAAa,IAAI,2BAA2B,EAC5C,kBAAkB,IAAI,gCAAgC,GACtD,MAAM,qCAAqC,CAAC;AAG7C,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC"}
@@ -59,6 +59,7 @@ export * from './components/Organisms/FacetsHorizontal';
59
59
  export * from './components/Organisms/FilterSummary';
60
60
  export * from './components/Organisms/MobileSidebar';
61
61
  export * from './components/Organisms/NoResults';
62
+ export * from './components/Organisms/ProductQuickView';
62
63
  export * from './components/Organisms/Results';
63
64
  export * from './components/Organisms/Sidebar';
64
65
  export * from './components/Organisms/Toolbar';
@@ -53,7 +53,7 @@ export type ThemeResponsiveComplete = ThemeResponsive & {
53
53
  default?: ThemeComponentsRestricted;
54
54
  };
55
55
  type WithCustomComponent<T> = {
56
- [K in keyof T]: T[K] & {
56
+ [K in keyof T]: [unknown] extends [T[K]] ? T[K] : T[K] & {
57
57
  customComponent?: string;
58
58
  };
59
59
  };