@athoscommerce/snap-preact 1.7.1-beta.121 → 1.8.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 (579) hide show
  1. package/dist/cjs/components/src/components/Atoms/Button/Button.d.ts +1 -1
  2. package/dist/cjs/components/src/components/Atoms/Button/Button.d.ts.map +1 -1
  3. package/dist/cjs/components/src/components/Atoms/Dropdown/Dropdown.d.ts +0 -4
  4. package/dist/cjs/components/src/components/Atoms/Dropdown/Dropdown.d.ts.map +1 -1
  5. package/dist/cjs/components/src/components/Atoms/Dropdown/Dropdown.js +14 -51
  6. package/dist/cjs/components/src/components/Atoms/FormattedNumber/FormattedNumber.d.ts +3 -1
  7. package/dist/cjs/components/src/components/Atoms/FormattedNumber/FormattedNumber.d.ts.map +1 -1
  8. package/dist/cjs/components/src/components/Atoms/FormattedNumber/FormattedNumber.js +4 -3
  9. package/dist/cjs/components/src/components/Atoms/Icon/Icon.d.ts +3 -1
  10. package/dist/cjs/components/src/components/Atoms/Icon/Icon.d.ts.map +1 -1
  11. package/dist/cjs/components/src/components/Atoms/Icon/Icon.js +4 -3
  12. package/dist/cjs/components/src/components/Atoms/Icon/paths.d.ts +0 -21
  13. package/dist/cjs/components/src/components/Atoms/Icon/paths.d.ts.map +1 -1
  14. package/dist/cjs/components/src/components/Atoms/Icon/paths.js +0 -21
  15. package/dist/cjs/components/src/components/Atoms/Image/Image.d.ts +3 -1
  16. package/dist/cjs/components/src/components/Atoms/Image/Image.d.ts.map +1 -1
  17. package/dist/cjs/components/src/components/Atoms/Image/Image.js +4 -4
  18. package/dist/cjs/components/src/components/Atoms/Overlay/Overlay.d.ts +3 -1
  19. package/dist/cjs/components/src/components/Atoms/Overlay/Overlay.d.ts.map +1 -1
  20. package/dist/cjs/components/src/components/Atoms/Overlay/Overlay.js +4 -3
  21. package/dist/cjs/components/src/components/Atoms/Price/Price.d.ts +4 -1
  22. package/dist/cjs/components/src/components/Atoms/Price/Price.d.ts.map +1 -1
  23. package/dist/cjs/components/src/components/Atoms/Price/Price.js +15 -12
  24. package/dist/cjs/components/src/components/Molecules/CalloutBadge/CalloutBadge.js +3 -3
  25. package/dist/cjs/components/src/components/Molecules/Grid/Grid.d.ts +3 -1
  26. package/dist/cjs/components/src/components/Molecules/Grid/Grid.d.ts.map +1 -1
  27. package/dist/cjs/components/src/components/Molecules/Grid/Grid.js +4 -3
  28. package/dist/cjs/components/src/components/Molecules/List/List.d.ts +3 -1
  29. package/dist/cjs/components/src/components/Molecules/List/List.d.ts.map +1 -1
  30. package/dist/cjs/components/src/components/Molecules/List/List.js +4 -3
  31. package/dist/cjs/components/src/components/Molecules/OverlayBadge/OverlayBadge.js +2 -2
  32. package/dist/cjs/components/src/components/Molecules/OverlayResult/OverlayResult.d.ts.map +1 -1
  33. package/dist/cjs/components/src/components/Molecules/OverlayResult/OverlayResult.js +6 -5
  34. package/dist/cjs/components/src/components/Molecules/RadioList/RadioList.d.ts +3 -1
  35. package/dist/cjs/components/src/components/Molecules/RadioList/RadioList.d.ts.map +1 -1
  36. package/dist/cjs/components/src/components/Molecules/RadioList/RadioList.js +4 -3
  37. package/dist/cjs/components/src/components/Molecules/Result/Result.d.ts +3 -5
  38. package/dist/cjs/components/src/components/Molecules/Result/Result.d.ts.map +1 -1
  39. package/dist/cjs/components/src/components/Molecules/Result/Result.js +10 -15
  40. package/dist/cjs/components/src/components/Molecules/SearchInput/SearchInput.d.ts +0 -2
  41. package/dist/cjs/components/src/components/Molecules/SearchInput/SearchInput.d.ts.map +1 -1
  42. package/dist/cjs/components/src/components/Molecules/SearchInput/SearchInput.js +2 -19
  43. package/dist/cjs/components/src/components/Molecules/Slideout/Slideout.d.ts +1 -0
  44. package/dist/cjs/components/src/components/Molecules/Slideout/Slideout.d.ts.map +1 -1
  45. package/dist/cjs/components/src/components/Molecules/Slideout/Slideout.js +30 -25
  46. package/dist/cjs/components/src/components/Molecules/Slideshow/Slideshow.d.ts +3 -1
  47. package/dist/cjs/components/src/components/Molecules/Slideshow/Slideshow.d.ts.map +1 -1
  48. package/dist/cjs/components/src/components/Molecules/Slideshow/Slideshow.js +5 -8
  49. package/dist/cjs/components/src/components/Molecules/Swatches/Swatches.d.ts +3 -1
  50. package/dist/cjs/components/src/components/Molecules/Swatches/Swatches.d.ts.map +1 -1
  51. package/dist/cjs/components/src/components/Molecules/Swatches/Swatches.js +4 -3
  52. package/dist/cjs/components/src/components/Organisms/Facet/Facet.js +1 -2
  53. package/dist/cjs/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.d.ts +7 -2
  54. package/dist/cjs/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.d.ts.map +1 -1
  55. package/dist/cjs/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.js +70 -45
  56. package/dist/cjs/components/src/components/Organisms/Layout/Layout.d.ts +1 -1
  57. package/dist/cjs/components/src/components/Organisms/Layout/Layout.d.ts.map +1 -1
  58. package/dist/cjs/components/src/components/Organisms/Layout/Layout.js +1 -14
  59. package/dist/cjs/components/src/components/Organisms/Results/Results.d.ts.map +1 -1
  60. package/dist/cjs/components/src/components/Organisms/Results/Results.js +12 -2
  61. package/dist/cjs/components/src/components/Organisms/Toolbar/Toolbar.d.ts +1 -1
  62. package/dist/cjs/components/src/components/Organisms/Toolbar/Toolbar.d.ts.map +1 -1
  63. package/dist/cjs/components/src/components/Organisms/Toolbar/Toolbar.js +3 -2
  64. package/dist/cjs/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.d.ts +1 -1
  65. package/dist/cjs/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.d.ts.map +1 -1
  66. package/dist/cjs/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.js +1 -3
  67. package/dist/cjs/components/src/components/Templates/AutocompleteModal/AutocompleteModal.d.ts +1 -1
  68. package/dist/cjs/components/src/components/Templates/AutocompleteModal/AutocompleteModal.d.ts.map +1 -1
  69. package/dist/cjs/components/src/components/Templates/AutocompleteModal/AutocompleteModal.js +1 -3
  70. package/dist/cjs/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.d.ts +1 -1
  71. package/dist/cjs/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.d.ts.map +1 -1
  72. package/dist/cjs/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.js +1 -3
  73. package/dist/cjs/components/src/components/Templates/Recommendation/Recommendation.d.ts.map +1 -1
  74. package/dist/cjs/components/src/components/Templates/Recommendation/Recommendation.js +10 -0
  75. package/dist/cjs/components/src/components/Templates/RecommendationBundle/BundleCTA.d.ts +1 -1
  76. package/dist/cjs/components/src/components/Templates/RecommendationBundle/BundleCTA.d.ts.map +1 -1
  77. package/dist/cjs/components/src/components/Templates/RecommendationBundle/BundleCTA.js +48 -5
  78. package/dist/cjs/components/src/components/Templates/RecommendationBundle/RecommendationBundle.d.ts +1 -1
  79. package/dist/cjs/components/src/components/Templates/RecommendationBundle/RecommendationBundle.d.ts.map +1 -1
  80. package/dist/cjs/components/src/components/Templates/RecommendationBundle/RecommendationBundle.js +82 -7
  81. package/dist/cjs/components/src/components/Templates/RecommendationEmail/RecommendationEmail.d.ts +0 -2
  82. package/dist/cjs/components/src/components/Templates/RecommendationEmail/RecommendationEmail.d.ts.map +1 -1
  83. package/dist/cjs/components/src/components/Templates/RecommendationEmail/RecommendationEmail.js +22 -3
  84. package/dist/cjs/components/src/components/Templates/RecommendationGrid/RecommendationGrid.d.ts.map +1 -1
  85. package/dist/cjs/components/src/components/Templates/RecommendationGrid/RecommendationGrid.js +10 -1
  86. package/dist/cjs/components/src/components/Templates/Search/Search.d.ts +2 -1
  87. package/dist/cjs/components/src/components/Templates/Search/Search.d.ts.map +1 -1
  88. package/dist/cjs/components/src/components/Templates/Search/Search.js +52 -16
  89. package/dist/cjs/components/src/hooks/useA11y.js +1 -1
  90. package/dist/cjs/components/src/index.d.ts +0 -12
  91. package/dist/cjs/components/src/index.d.ts.map +1 -1
  92. package/dist/cjs/components/src/index.js +1 -14
  93. package/dist/cjs/components/src/providers/langComponents.d.ts +4 -2
  94. package/dist/cjs/components/src/providers/langComponents.d.ts.map +1 -1
  95. package/dist/cjs/components/src/providers/themeComponents.d.ts +1 -11
  96. package/dist/cjs/components/src/providers/themeComponents.d.ts.map +1 -1
  97. package/dist/cjs/components/src/providers/themeComponents.js +0 -1
  98. package/dist/cjs/components/src/providers/withTracking.d.ts +2 -2
  99. package/dist/cjs/components/src/providers/withTracking.d.ts.map +1 -1
  100. package/dist/cjs/components/src/setupTests.js +0 -17
  101. package/dist/cjs/components/src/themes/base/components/templates/index.d.ts.map +1 -1
  102. package/dist/cjs/components/src/themes/base/components/templates/index.js +4 -5
  103. package/dist/cjs/components/src/themes/base/components/templates/searchCollapsible.d.ts.map +1 -1
  104. package/dist/cjs/components/src/themes/base/components/templates/searchCollapsible.js +5 -7
  105. package/dist/cjs/components/src/themes/bocachica/components/organisms/index.d.ts.map +1 -1
  106. package/dist/cjs/components/src/themes/bocachica/components/organisms/index.js +4 -5
  107. package/dist/cjs/components/src/themes/bocachica/components/templates/index.d.ts.map +1 -1
  108. package/dist/cjs/components/src/themes/bocachica/components/templates/index.js +4 -5
  109. package/dist/cjs/components/src/themes/bocachica/components/templates/searchCollapsible.js +1 -1
  110. package/dist/cjs/components/src/themes/pike/components/organisms/facetsHorizontal.d.ts.map +1 -1
  111. package/dist/cjs/components/src/themes/pike/components/organisms/facetsHorizontal.js +5 -8
  112. package/dist/cjs/components/src/themes/pike/components/organisms/index.d.ts.map +1 -1
  113. package/dist/cjs/components/src/themes/pike/components/organisms/index.js +4 -5
  114. package/dist/cjs/components/src/themes/pike/components/organisms/toolbar.js +1 -1
  115. package/dist/cjs/components/src/themes/pike/components/templates/index.d.ts.map +1 -1
  116. package/dist/cjs/components/src/themes/pike/components/templates/index.js +4 -5
  117. package/dist/cjs/components/src/themes/pike/components/templates/search.d.ts.map +1 -1
  118. package/dist/cjs/components/src/themes/pike/components/templates/search.js +3 -4
  119. package/dist/cjs/components/src/themes/pike/components/templates/searchHorizontal.d.ts.map +1 -1
  120. package/dist/cjs/components/src/themes/pike/components/templates/searchHorizontal.js +3 -7
  121. package/dist/cjs/components/src/themes/snapnco/components/organisms/index.d.ts.map +1 -1
  122. package/dist/cjs/components/src/themes/snapnco/components/organisms/index.js +4 -5
  123. package/dist/cjs/components/src/themes/snapnco/components/templates/index.d.ts.map +1 -1
  124. package/dist/cjs/components/src/themes/snapnco/components/templates/index.js +4 -5
  125. package/dist/cjs/components/src/themes/snapnco/components/templates/searchCollapsible.js +1 -1
  126. package/dist/cjs/components/src/themes/snappy/components/organisms/facetsHorizontal.js +1 -1
  127. package/dist/cjs/components/src/themes/snappy/components/organisms/index.d.ts.map +1 -1
  128. package/dist/cjs/components/src/themes/snappy/components/organisms/index.js +4 -5
  129. package/dist/cjs/components/src/themes/snappy/components/templates/index.d.ts.map +1 -1
  130. package/dist/cjs/components/src/themes/snappy/components/templates/index.js +4 -5
  131. package/dist/cjs/components/src/themes/snappy/components/templates/searchCollapsible.js +1 -1
  132. package/dist/cjs/components/src/themes/themeComponents/searchCollapsible.js +2 -2
  133. package/dist/cjs/components/src/themes/themeComponents/searchHorizontal.js +2 -2
  134. package/dist/cjs/components/src/utilities/Colour/Colour.d.ts +0 -11
  135. package/dist/cjs/components/src/utilities/Colour/Colour.d.ts.map +1 -1
  136. package/dist/cjs/components/src/utilities/Colour/Colour.js +0 -32
  137. package/dist/cjs/components/src/utilities/snapify.d.ts +2 -3
  138. package/dist/cjs/components/src/utilities/snapify.d.ts.map +1 -1
  139. package/dist/cjs/components/src/utilities/snapify.js +0 -48
  140. package/dist/cjs/src/Snap.d.ts +1 -2
  141. package/dist/cjs/src/Snap.d.ts.map +1 -1
  142. package/dist/cjs/src/Snap.js +24 -134
  143. package/dist/cjs/src/Templates/SnapTemplates.d.ts +2 -2
  144. package/dist/cjs/src/Templates/SnapTemplates.d.ts.map +1 -1
  145. package/dist/cjs/src/Templates/SnapTemplates.js +77 -77
  146. package/dist/cjs/src/Templates/Stores/LibraryStore.d.ts +2 -4
  147. package/dist/cjs/src/Templates/Stores/LibraryStore.d.ts.map +1 -1
  148. package/dist/cjs/src/Templates/Stores/LibraryStore.js +2 -21
  149. package/dist/cjs/src/Templates/Stores/TemplateStore.d.ts +7 -19
  150. package/dist/cjs/src/Templates/Stores/TemplateStore.d.ts.map +1 -1
  151. package/dist/cjs/src/Templates/Stores/TemplateStore.js +1 -2
  152. package/dist/cjs/src/Templates/Stores/library/languages/es.d.ts.map +1 -1
  153. package/dist/cjs/src/Templates/Stores/library/languages/es.js +11 -19
  154. package/dist/cjs/src/Templates/Stores/library/languages/fr.d.ts.map +1 -1
  155. package/dist/cjs/src/Templates/Stores/library/languages/fr.js +16 -24
  156. package/dist/cjs/src/Templates/Stores/library/plugins/shopify/pluginMarkets.d.ts +2 -0
  157. package/dist/cjs/src/Templates/Stores/library/plugins/shopify/pluginMarkets.d.ts.map +1 -0
  158. package/dist/cjs/src/Templates/Stores/library/plugins/shopify/pluginMarkets.js +5 -0
  159. package/dist/cjs/src/setupEvents.d.ts +0 -13
  160. package/dist/cjs/src/setupEvents.d.ts.map +1 -1
  161. package/dist/cjs/src/setupEvents.js +0 -87
  162. package/dist/cjs/src/types.d.ts +3 -15
  163. package/dist/cjs/src/types.d.ts.map +1 -1
  164. package/dist/esm/components/src/components/Atoms/Button/Button.d.ts +1 -1
  165. package/dist/esm/components/src/components/Atoms/Button/Button.d.ts.map +1 -1
  166. package/dist/esm/components/src/components/Atoms/Dropdown/Dropdown.d.ts +0 -4
  167. package/dist/esm/components/src/components/Atoms/Dropdown/Dropdown.d.ts.map +1 -1
  168. package/dist/esm/components/src/components/Atoms/Dropdown/Dropdown.js +11 -53
  169. package/dist/esm/components/src/components/Atoms/FormattedNumber/FormattedNumber.d.ts +3 -1
  170. package/dist/esm/components/src/components/Atoms/FormattedNumber/FormattedNumber.d.ts.map +1 -1
  171. package/dist/esm/components/src/components/Atoms/FormattedNumber/FormattedNumber.js +3 -2
  172. package/dist/esm/components/src/components/Atoms/Icon/Icon.d.ts +3 -1
  173. package/dist/esm/components/src/components/Atoms/Icon/Icon.d.ts.map +1 -1
  174. package/dist/esm/components/src/components/Atoms/Icon/Icon.js +3 -2
  175. package/dist/esm/components/src/components/Atoms/Icon/paths.d.ts +0 -21
  176. package/dist/esm/components/src/components/Atoms/Icon/paths.d.ts.map +1 -1
  177. package/dist/esm/components/src/components/Atoms/Icon/paths.js +0 -21
  178. package/dist/esm/components/src/components/Atoms/Image/Image.d.ts +3 -1
  179. package/dist/esm/components/src/components/Atoms/Image/Image.d.ts.map +1 -1
  180. package/dist/esm/components/src/components/Atoms/Image/Image.js +3 -2
  181. package/dist/esm/components/src/components/Atoms/Overlay/Overlay.d.ts +3 -1
  182. package/dist/esm/components/src/components/Atoms/Overlay/Overlay.d.ts.map +1 -1
  183. package/dist/esm/components/src/components/Atoms/Overlay/Overlay.js +3 -2
  184. package/dist/esm/components/src/components/Atoms/Price/Price.d.ts +4 -1
  185. package/dist/esm/components/src/components/Atoms/Price/Price.d.ts.map +1 -1
  186. package/dist/esm/components/src/components/Atoms/Price/Price.js +14 -11
  187. package/dist/esm/components/src/components/Molecules/CalloutBadge/CalloutBadge.js +1 -1
  188. package/dist/esm/components/src/components/Molecules/Grid/Grid.d.ts +3 -1
  189. package/dist/esm/components/src/components/Molecules/Grid/Grid.d.ts.map +1 -1
  190. package/dist/esm/components/src/components/Molecules/Grid/Grid.js +3 -2
  191. package/dist/esm/components/src/components/Molecules/List/List.d.ts +3 -1
  192. package/dist/esm/components/src/components/Molecules/List/List.d.ts.map +1 -1
  193. package/dist/esm/components/src/components/Molecules/List/List.js +3 -2
  194. package/dist/esm/components/src/components/Molecules/OverlayBadge/OverlayBadge.js +1 -1
  195. package/dist/esm/components/src/components/Molecules/OverlayResult/OverlayResult.d.ts.map +1 -1
  196. package/dist/esm/components/src/components/Molecules/OverlayResult/OverlayResult.js +2 -1
  197. package/dist/esm/components/src/components/Molecules/RadioList/RadioList.d.ts +3 -1
  198. package/dist/esm/components/src/components/Molecules/RadioList/RadioList.d.ts.map +1 -1
  199. package/dist/esm/components/src/components/Molecules/RadioList/RadioList.js +3 -2
  200. package/dist/esm/components/src/components/Molecules/Result/Result.d.ts +3 -5
  201. package/dist/esm/components/src/components/Molecules/Result/Result.d.ts.map +1 -1
  202. package/dist/esm/components/src/components/Molecules/Result/Result.js +8 -12
  203. package/dist/esm/components/src/components/Molecules/SearchInput/SearchInput.d.ts +0 -2
  204. package/dist/esm/components/src/components/Molecules/SearchInput/SearchInput.d.ts.map +1 -1
  205. package/dist/esm/components/src/components/Molecules/SearchInput/SearchInput.js +2 -35
  206. package/dist/esm/components/src/components/Molecules/Slideout/Slideout.d.ts +1 -0
  207. package/dist/esm/components/src/components/Molecules/Slideout/Slideout.d.ts.map +1 -1
  208. package/dist/esm/components/src/components/Molecules/Slideout/Slideout.js +31 -26
  209. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.d.ts +3 -1
  210. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.d.ts.map +1 -1
  211. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.js +4 -7
  212. package/dist/esm/components/src/components/Molecules/Swatches/Swatches.d.ts +3 -1
  213. package/dist/esm/components/src/components/Molecules/Swatches/Swatches.d.ts.map +1 -1
  214. package/dist/esm/components/src/components/Molecules/Swatches/Swatches.js +3 -2
  215. package/dist/esm/components/src/components/Organisms/Facet/Facet.js +1 -1
  216. package/dist/esm/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.d.ts +7 -2
  217. package/dist/esm/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.d.ts.map +1 -1
  218. package/dist/esm/components/src/components/Organisms/FacetsHorizontal/FacetsHorizontal.js +77 -43
  219. package/dist/esm/components/src/components/Organisms/Layout/Layout.d.ts +1 -1
  220. package/dist/esm/components/src/components/Organisms/Layout/Layout.d.ts.map +1 -1
  221. package/dist/esm/components/src/components/Organisms/Layout/Layout.js +1 -18
  222. package/dist/esm/components/src/components/Organisms/Results/Results.d.ts.map +1 -1
  223. package/dist/esm/components/src/components/Organisms/Results/Results.js +12 -2
  224. package/dist/esm/components/src/components/Organisms/Toolbar/Toolbar.d.ts +1 -1
  225. package/dist/esm/components/src/components/Organisms/Toolbar/Toolbar.d.ts.map +1 -1
  226. package/dist/esm/components/src/components/Organisms/Toolbar/Toolbar.js +2 -2
  227. package/dist/esm/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.d.ts +1 -1
  228. package/dist/esm/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.d.ts.map +1 -1
  229. package/dist/esm/components/src/components/Templates/AutocompleteFixed/AutocompleteFixed.js +1 -4
  230. package/dist/esm/components/src/components/Templates/AutocompleteModal/AutocompleteModal.d.ts +1 -1
  231. package/dist/esm/components/src/components/Templates/AutocompleteModal/AutocompleteModal.d.ts.map +1 -1
  232. package/dist/esm/components/src/components/Templates/AutocompleteModal/AutocompleteModal.js +1 -4
  233. package/dist/esm/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.d.ts +1 -1
  234. package/dist/esm/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.d.ts.map +1 -1
  235. package/dist/esm/components/src/components/Templates/AutocompleteSlideout/AutocompleteSlideout.js +1 -4
  236. package/dist/esm/components/src/components/Templates/Recommendation/Recommendation.d.ts.map +1 -1
  237. package/dist/esm/components/src/components/Templates/Recommendation/Recommendation.js +10 -0
  238. package/dist/esm/components/src/components/Templates/RecommendationBundle/BundleCTA.d.ts +1 -1
  239. package/dist/esm/components/src/components/Templates/RecommendationBundle/BundleCTA.d.ts.map +1 -1
  240. package/dist/esm/components/src/components/Templates/RecommendationBundle/BundleCTA.js +2 -2
  241. package/dist/esm/components/src/components/Templates/RecommendationBundle/RecommendationBundle.d.ts +1 -1
  242. package/dist/esm/components/src/components/Templates/RecommendationBundle/RecommendationBundle.d.ts.map +1 -1
  243. package/dist/esm/components/src/components/Templates/RecommendationBundle/RecommendationBundle.js +23 -4
  244. package/dist/esm/components/src/components/Templates/RecommendationEmail/RecommendationEmail.d.ts +0 -2
  245. package/dist/esm/components/src/components/Templates/RecommendationEmail/RecommendationEmail.d.ts.map +1 -1
  246. package/dist/esm/components/src/components/Templates/RecommendationEmail/RecommendationEmail.js +16 -3
  247. package/dist/esm/components/src/components/Templates/RecommendationGrid/RecommendationGrid.d.ts.map +1 -1
  248. package/dist/esm/components/src/components/Templates/RecommendationGrid/RecommendationGrid.js +10 -1
  249. package/dist/esm/components/src/components/Templates/Search/Search.d.ts +2 -1
  250. package/dist/esm/components/src/components/Templates/Search/Search.d.ts.map +1 -1
  251. package/dist/esm/components/src/components/Templates/Search/Search.js +53 -11
  252. package/dist/esm/components/src/hooks/useA11y.js +1 -1
  253. package/dist/esm/components/src/index.d.ts +0 -12
  254. package/dist/esm/components/src/index.d.ts.map +1 -1
  255. package/dist/esm/components/src/index.js +0 -12
  256. package/dist/esm/components/src/providers/langComponents.d.ts +4 -2
  257. package/dist/esm/components/src/providers/langComponents.d.ts.map +1 -1
  258. package/dist/esm/components/src/providers/themeComponents.d.ts +1 -11
  259. package/dist/esm/components/src/providers/themeComponents.d.ts.map +1 -1
  260. package/dist/esm/components/src/providers/themeComponents.js +0 -1
  261. package/dist/esm/components/src/providers/withTracking.d.ts +2 -2
  262. package/dist/esm/components/src/providers/withTracking.d.ts.map +1 -1
  263. package/dist/esm/components/src/setupTests.js +0 -14
  264. package/dist/esm/components/src/themes/base/components/templates/index.d.ts.map +1 -1
  265. package/dist/esm/components/src/themes/base/components/templates/index.js +0 -5
  266. package/dist/esm/components/src/themes/base/components/templates/searchCollapsible.d.ts.map +1 -1
  267. package/dist/esm/components/src/themes/base/components/templates/searchCollapsible.js +5 -7
  268. package/dist/esm/components/src/themes/bocachica/components/organisms/index.d.ts.map +1 -1
  269. package/dist/esm/components/src/themes/bocachica/components/organisms/index.js +0 -5
  270. package/dist/esm/components/src/themes/bocachica/components/templates/index.d.ts.map +1 -1
  271. package/dist/esm/components/src/themes/bocachica/components/templates/index.js +0 -5
  272. package/dist/esm/components/src/themes/bocachica/components/templates/searchCollapsible.js +1 -1
  273. package/dist/esm/components/src/themes/pike/components/organisms/facetsHorizontal.d.ts.map +1 -1
  274. package/dist/esm/components/src/themes/pike/components/organisms/facetsHorizontal.js +5 -8
  275. package/dist/esm/components/src/themes/pike/components/organisms/index.d.ts.map +1 -1
  276. package/dist/esm/components/src/themes/pike/components/organisms/index.js +0 -5
  277. package/dist/esm/components/src/themes/pike/components/organisms/toolbar.js +1 -1
  278. package/dist/esm/components/src/themes/pike/components/templates/index.d.ts.map +1 -1
  279. package/dist/esm/components/src/themes/pike/components/templates/index.js +0 -5
  280. package/dist/esm/components/src/themes/pike/components/templates/search.d.ts.map +1 -1
  281. package/dist/esm/components/src/themes/pike/components/templates/search.js +3 -4
  282. package/dist/esm/components/src/themes/pike/components/templates/searchHorizontal.d.ts.map +1 -1
  283. package/dist/esm/components/src/themes/pike/components/templates/searchHorizontal.js +3 -7
  284. package/dist/esm/components/src/themes/snapnco/components/organisms/index.d.ts.map +1 -1
  285. package/dist/esm/components/src/themes/snapnco/components/organisms/index.js +0 -5
  286. package/dist/esm/components/src/themes/snapnco/components/templates/index.d.ts.map +1 -1
  287. package/dist/esm/components/src/themes/snapnco/components/templates/index.js +0 -5
  288. package/dist/esm/components/src/themes/snapnco/components/templates/searchCollapsible.js +1 -1
  289. package/dist/esm/components/src/themes/snappy/components/organisms/facetsHorizontal.js +1 -1
  290. package/dist/esm/components/src/themes/snappy/components/organisms/index.d.ts.map +1 -1
  291. package/dist/esm/components/src/themes/snappy/components/organisms/index.js +0 -5
  292. package/dist/esm/components/src/themes/snappy/components/templates/index.d.ts.map +1 -1
  293. package/dist/esm/components/src/themes/snappy/components/templates/index.js +0 -5
  294. package/dist/esm/components/src/themes/snappy/components/templates/searchCollapsible.js +1 -1
  295. package/dist/esm/components/src/themes/themeComponents/searchCollapsible.js +2 -2
  296. package/dist/esm/components/src/themes/themeComponents/searchHorizontal.js +2 -2
  297. package/dist/esm/components/src/utilities/Colour/Colour.d.ts +0 -11
  298. package/dist/esm/components/src/utilities/Colour/Colour.d.ts.map +1 -1
  299. package/dist/esm/components/src/utilities/Colour/Colour.js +0 -30
  300. package/dist/esm/components/src/utilities/snapify.d.ts +2 -3
  301. package/dist/esm/components/src/utilities/snapify.d.ts.map +1 -1
  302. package/dist/esm/components/src/utilities/snapify.js +2 -29
  303. package/dist/esm/src/Snap.d.ts +1 -2
  304. package/dist/esm/src/Snap.d.ts.map +1 -1
  305. package/dist/esm/src/Snap.js +0 -72
  306. package/dist/esm/src/Templates/SnapTemplates.d.ts +2 -2
  307. package/dist/esm/src/Templates/SnapTemplates.d.ts.map +1 -1
  308. package/dist/esm/src/Templates/SnapTemplates.js +64 -60
  309. package/dist/esm/src/Templates/Stores/LibraryStore.d.ts +2 -4
  310. package/dist/esm/src/Templates/Stores/LibraryStore.d.ts.map +1 -1
  311. package/dist/esm/src/Templates/Stores/LibraryStore.js +2 -8
  312. package/dist/esm/src/Templates/Stores/TemplateStore.d.ts +7 -19
  313. package/dist/esm/src/Templates/Stores/TemplateStore.d.ts.map +1 -1
  314. package/dist/esm/src/Templates/Stores/TemplateStore.js +1 -2
  315. package/dist/esm/src/Templates/Stores/library/languages/es.d.ts.map +1 -1
  316. package/dist/esm/src/Templates/Stores/library/languages/es.js +11 -19
  317. package/dist/esm/src/Templates/Stores/library/languages/fr.d.ts.map +1 -1
  318. package/dist/esm/src/Templates/Stores/library/languages/fr.js +16 -24
  319. package/dist/esm/src/Templates/Stores/library/plugins/shopify/pluginMarkets.d.ts +2 -0
  320. package/dist/esm/src/Templates/Stores/library/plugins/shopify/pluginMarkets.d.ts.map +1 -0
  321. package/dist/esm/src/Templates/Stores/library/plugins/shopify/pluginMarkets.js +1 -0
  322. package/dist/esm/src/setupEvents.d.ts +0 -13
  323. package/dist/esm/src/setupEvents.d.ts.map +1 -1
  324. package/dist/esm/src/setupEvents.js +0 -40
  325. package/dist/esm/src/types.d.ts +3 -15
  326. package/dist/esm/src/types.d.ts.map +1 -1
  327. package/package.json +12 -14
  328. package/dist/cjs/components/src/components/Atoms/ChatLoadingIndicator/ChatLoadingIndicator.d.ts +0 -7
  329. package/dist/cjs/components/src/components/Atoms/ChatLoadingIndicator/ChatLoadingIndicator.d.ts.map +0 -1
  330. package/dist/cjs/components/src/components/Atoms/ChatLoadingIndicator/ChatLoadingIndicator.js +0 -85
  331. package/dist/cjs/components/src/components/Atoms/ChatLoadingIndicator/index.d.ts +0 -2
  332. package/dist/cjs/components/src/components/Atoms/ChatLoadingIndicator/index.d.ts.map +0 -1
  333. package/dist/cjs/components/src/components/Atoms/ChatLoadingIndicator/index.js +0 -17
  334. package/dist/cjs/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.d.ts +0 -20
  335. package/dist/cjs/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.d.ts.map +0 -1
  336. package/dist/cjs/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.js +0 -187
  337. package/dist/cjs/components/src/components/Molecules/ChatAttachmentContext/index.d.ts +0 -2
  338. package/dist/cjs/components/src/components/Molecules/ChatAttachmentContext/index.d.ts.map +0 -1
  339. package/dist/cjs/components/src/components/Molecules/ChatAttachmentContext/index.js +0 -17
  340. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts +0 -18
  341. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts.map +0 -1
  342. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.js +0 -154
  343. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/index.d.ts +0 -2
  344. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/index.d.ts.map +0 -1
  345. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/index.js +0 -17
  346. package/dist/cjs/components/src/components/Molecules/ChatMessageText/ChatMessageText.d.ts +0 -21
  347. package/dist/cjs/components/src/components/Molecules/ChatMessageText/ChatMessageText.d.ts.map +0 -1
  348. package/dist/cjs/components/src/components/Molecules/ChatMessageText/ChatMessageText.js +0 -211
  349. package/dist/cjs/components/src/components/Molecules/ChatMessageText/index.d.ts +0 -2
  350. package/dist/cjs/components/src/components/Molecules/ChatMessageText/index.d.ts.map +0 -1
  351. package/dist/cjs/components/src/components/Molecules/ChatMessageText/index.js +0 -17
  352. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.d.ts +0 -16
  353. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.d.ts.map +0 -1
  354. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.js +0 -255
  355. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/index.d.ts +0 -2
  356. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/index.d.ts.map +0 -1
  357. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/index.js +0 -17
  358. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.d.ts +0 -17
  359. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.d.ts.map +0 -1
  360. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.js +0 -143
  361. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/index.d.ts +0 -2
  362. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/index.d.ts.map +0 -1
  363. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/index.js +0 -17
  364. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts +0 -25
  365. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts.map +0 -1
  366. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.js +0 -487
  367. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/index.d.ts +0 -2
  368. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/index.d.ts.map +0 -1
  369. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/index.js +0 -17
  370. package/dist/cjs/components/src/components/Molecules/ChatResult/ChatResult.d.ts +0 -11
  371. package/dist/cjs/components/src/components/Molecules/ChatResult/ChatResult.d.ts.map +0 -1
  372. package/dist/cjs/components/src/components/Molecules/ChatResult/ChatResult.js +0 -200
  373. package/dist/cjs/components/src/components/Molecules/ChatResult/index.d.ts +0 -2
  374. package/dist/cjs/components/src/components/Molecules/ChatResult/index.d.ts.map +0 -1
  375. package/dist/cjs/components/src/components/Molecules/ChatResult/index.js +0 -17
  376. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.d.ts +0 -12
  377. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.d.ts.map +0 -1
  378. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.js +0 -123
  379. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/index.d.ts +0 -2
  380. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/index.d.ts.map +0 -1
  381. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/index.js +0 -17
  382. package/dist/cjs/components/src/components/Molecules/ChatSuggestedQuestions/ChatSuggestedQuestions.d.ts +0 -15
  383. package/dist/cjs/components/src/components/Molecules/ChatSuggestedQuestions/ChatSuggestedQuestions.d.ts.map +0 -1
  384. package/dist/cjs/components/src/components/Molecules/ChatSuggestedQuestions/ChatSuggestedQuestions.js +0 -99
  385. package/dist/cjs/components/src/components/Molecules/ChatSuggestedQuestions/index.d.ts +0 -2
  386. package/dist/cjs/components/src/components/Molecules/ChatSuggestedQuestions/index.d.ts.map +0 -1
  387. package/dist/cjs/components/src/components/Molecules/ChatSuggestedQuestions/index.js +0 -17
  388. package/dist/cjs/components/src/components/Organisms/Chat/Chat.d.ts +0 -30
  389. package/dist/cjs/components/src/components/Organisms/Chat/Chat.d.ts.map +0 -1
  390. package/dist/cjs/components/src/components/Organisms/Chat/Chat.js +0 -1030
  391. package/dist/cjs/components/src/components/Organisms/Chat/Chat.styles.d.ts +0 -16
  392. package/dist/cjs/components/src/components/Organisms/Chat/Chat.styles.d.ts.map +0 -1
  393. package/dist/cjs/components/src/components/Organisms/Chat/Chat.styles.js +0 -1186
  394. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatFileUpload.d.ts +0 -32
  395. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatFileUpload.d.ts.map +0 -1
  396. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatFileUpload.js +0 -104
  397. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatGestures.d.ts +0 -40
  398. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatGestures.d.ts.map +0 -1
  399. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatGestures.js +0 -98
  400. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatOverflow.d.ts +0 -44
  401. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatOverflow.d.ts.map +0 -1
  402. package/dist/cjs/components/src/components/Organisms/Chat/hooks/useChatOverflow.js +0 -116
  403. package/dist/cjs/components/src/components/Organisms/Chat/index.d.ts +0 -2
  404. package/dist/cjs/components/src/components/Organisms/Chat/index.d.ts.map +0 -1
  405. package/dist/cjs/components/src/components/Organisms/Chat/index.js +0 -17
  406. package/dist/cjs/components/src/components/Organisms/MobileSidebar/MobileSidebar.d.ts +0 -47
  407. package/dist/cjs/components/src/components/Organisms/MobileSidebar/MobileSidebar.d.ts.map +0 -1
  408. package/dist/cjs/components/src/components/Organisms/MobileSidebar/MobileSidebar.js +0 -171
  409. package/dist/cjs/components/src/components/Organisms/MobileSidebar/index.d.ts +0 -2
  410. package/dist/cjs/components/src/components/Organisms/MobileSidebar/index.d.ts.map +0 -1
  411. package/dist/cjs/components/src/components/Organisms/MobileSidebar/index.js +0 -17
  412. package/dist/cjs/components/src/components/Templates/Chat/Chat.d.ts +0 -12
  413. package/dist/cjs/components/src/components/Templates/Chat/Chat.d.ts.map +0 -1
  414. package/dist/cjs/components/src/components/Templates/Chat/Chat.js +0 -55
  415. package/dist/cjs/components/src/components/Templates/Chat/index.d.ts +0 -2
  416. package/dist/cjs/components/src/components/Templates/Chat/index.d.ts.map +0 -1
  417. package/dist/cjs/components/src/components/Templates/Chat/index.js +0 -17
  418. package/dist/cjs/components/src/themes/base/components/templates/chat.d.ts +0 -4
  419. package/dist/cjs/components/src/themes/base/components/templates/chat.d.ts.map +0 -1
  420. package/dist/cjs/components/src/themes/base/components/templates/chat.js +0 -6
  421. package/dist/cjs/components/src/themes/bocachica/components/organisms/mobileSidebar.d.ts +0 -4
  422. package/dist/cjs/components/src/themes/bocachica/components/organisms/mobileSidebar.d.ts.map +0 -1
  423. package/dist/cjs/components/src/themes/bocachica/components/organisms/mobileSidebar.js +0 -63
  424. package/dist/cjs/components/src/themes/bocachica/components/templates/chat.d.ts +0 -4
  425. package/dist/cjs/components/src/themes/bocachica/components/templates/chat.d.ts.map +0 -1
  426. package/dist/cjs/components/src/themes/bocachica/components/templates/chat.js +0 -6
  427. package/dist/cjs/components/src/themes/pike/components/organisms/mobileSidebar.d.ts +0 -4
  428. package/dist/cjs/components/src/themes/pike/components/organisms/mobileSidebar.d.ts.map +0 -1
  429. package/dist/cjs/components/src/themes/pike/components/organisms/mobileSidebar.js +0 -146
  430. package/dist/cjs/components/src/themes/pike/components/templates/chat.d.ts +0 -4
  431. package/dist/cjs/components/src/themes/pike/components/templates/chat.d.ts.map +0 -1
  432. package/dist/cjs/components/src/themes/pike/components/templates/chat.js +0 -6
  433. package/dist/cjs/components/src/themes/snapnco/components/organisms/mobileSidebar.d.ts +0 -4
  434. package/dist/cjs/components/src/themes/snapnco/components/organisms/mobileSidebar.d.ts.map +0 -1
  435. package/dist/cjs/components/src/themes/snapnco/components/organisms/mobileSidebar.js +0 -70
  436. package/dist/cjs/components/src/themes/snapnco/components/templates/chat.d.ts +0 -4
  437. package/dist/cjs/components/src/themes/snapnco/components/templates/chat.d.ts.map +0 -1
  438. package/dist/cjs/components/src/themes/snapnco/components/templates/chat.js +0 -6
  439. package/dist/cjs/components/src/themes/snappy/components/organisms/mobileSidebar.d.ts +0 -4
  440. package/dist/cjs/components/src/themes/snappy/components/organisms/mobileSidebar.d.ts.map +0 -1
  441. package/dist/cjs/components/src/themes/snappy/components/organisms/mobileSidebar.js +0 -74
  442. package/dist/cjs/components/src/themes/snappy/components/templates/chat.d.ts +0 -4
  443. package/dist/cjs/components/src/themes/snappy/components/templates/chat.d.ts.map +0 -1
  444. package/dist/cjs/components/src/themes/snappy/components/templates/chat.js +0 -6
  445. package/dist/cjs/components/src/themes/themeComponents/chat.d.ts +0 -4
  446. package/dist/cjs/components/src/themes/themeComponents/chat.d.ts.map +0 -1
  447. package/dist/cjs/components/src/themes/themeComponents/chat.js +0 -14
  448. package/dist/cjs/src/Templates/Stores/library/components/Chat.d.ts +0 -2
  449. package/dist/cjs/src/Templates/Stores/library/components/Chat.d.ts.map +0 -1
  450. package/dist/cjs/src/Templates/Stores/library/components/Chat.js +0 -5
  451. package/dist/cjs/src/create/createChatController.d.ts +0 -5
  452. package/dist/cjs/src/create/createChatController.d.ts.map +0 -1
  453. package/dist/cjs/src/create/createChatController.js +0 -43
  454. package/dist/esm/components/src/components/Atoms/ChatLoadingIndicator/ChatLoadingIndicator.d.ts +0 -7
  455. package/dist/esm/components/src/components/Atoms/ChatLoadingIndicator/ChatLoadingIndicator.d.ts.map +0 -1
  456. package/dist/esm/components/src/components/Atoms/ChatLoadingIndicator/ChatLoadingIndicator.js +0 -67
  457. package/dist/esm/components/src/components/Atoms/ChatLoadingIndicator/index.d.ts +0 -2
  458. package/dist/esm/components/src/components/Atoms/ChatLoadingIndicator/index.d.ts.map +0 -1
  459. package/dist/esm/components/src/components/Atoms/ChatLoadingIndicator/index.js +0 -1
  460. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.d.ts +0 -20
  461. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.d.ts.map +0 -1
  462. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.js +0 -169
  463. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/index.d.ts +0 -2
  464. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/index.d.ts.map +0 -1
  465. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/index.js +0 -1
  466. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts +0 -18
  467. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts.map +0 -1
  468. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.js +0 -145
  469. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/index.d.ts +0 -2
  470. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/index.d.ts.map +0 -1
  471. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/index.js +0 -1
  472. package/dist/esm/components/src/components/Molecules/ChatMessageText/ChatMessageText.d.ts +0 -21
  473. package/dist/esm/components/src/components/Molecules/ChatMessageText/ChatMessageText.d.ts.map +0 -1
  474. package/dist/esm/components/src/components/Molecules/ChatMessageText/ChatMessageText.js +0 -192
  475. package/dist/esm/components/src/components/Molecules/ChatMessageText/index.d.ts +0 -2
  476. package/dist/esm/components/src/components/Molecules/ChatMessageText/index.d.ts.map +0 -1
  477. package/dist/esm/components/src/components/Molecules/ChatMessageText/index.js +0 -1
  478. package/dist/esm/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.d.ts +0 -16
  479. package/dist/esm/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.d.ts.map +0 -1
  480. package/dist/esm/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.js +0 -223
  481. package/dist/esm/components/src/components/Molecules/ChatMessageUser/index.d.ts +0 -2
  482. package/dist/esm/components/src/components/Molecules/ChatMessageUser/index.d.ts.map +0 -1
  483. package/dist/esm/components/src/components/Molecules/ChatMessageUser/index.js +0 -1
  484. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.d.ts +0 -17
  485. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.d.ts.map +0 -1
  486. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.js +0 -121
  487. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/index.d.ts +0 -2
  488. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/index.d.ts.map +0 -1
  489. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/index.js +0 -1
  490. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts +0 -25
  491. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts.map +0 -1
  492. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.js +0 -460
  493. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/index.d.ts +0 -2
  494. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/index.d.ts.map +0 -1
  495. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/index.js +0 -1
  496. package/dist/esm/components/src/components/Molecules/ChatResult/ChatResult.d.ts +0 -11
  497. package/dist/esm/components/src/components/Molecules/ChatResult/ChatResult.d.ts.map +0 -1
  498. package/dist/esm/components/src/components/Molecules/ChatResult/ChatResult.js +0 -184
  499. package/dist/esm/components/src/components/Molecules/ChatResult/index.d.ts +0 -2
  500. package/dist/esm/components/src/components/Molecules/ChatResult/index.d.ts.map +0 -1
  501. package/dist/esm/components/src/components/Molecules/ChatResult/index.js +0 -1
  502. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.d.ts +0 -12
  503. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.d.ts.map +0 -1
  504. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.js +0 -102
  505. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/index.d.ts +0 -2
  506. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/index.d.ts.map +0 -1
  507. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/index.js +0 -1
  508. package/dist/esm/components/src/components/Molecules/ChatSuggestedQuestions/ChatSuggestedQuestions.d.ts +0 -15
  509. package/dist/esm/components/src/components/Molecules/ChatSuggestedQuestions/ChatSuggestedQuestions.d.ts.map +0 -1
  510. package/dist/esm/components/src/components/Molecules/ChatSuggestedQuestions/ChatSuggestedQuestions.js +0 -80
  511. package/dist/esm/components/src/components/Molecules/ChatSuggestedQuestions/index.d.ts +0 -2
  512. package/dist/esm/components/src/components/Molecules/ChatSuggestedQuestions/index.d.ts.map +0 -1
  513. package/dist/esm/components/src/components/Molecules/ChatSuggestedQuestions/index.js +0 -1
  514. package/dist/esm/components/src/components/Organisms/Chat/Chat.d.ts +0 -30
  515. package/dist/esm/components/src/components/Organisms/Chat/Chat.d.ts.map +0 -1
  516. package/dist/esm/components/src/components/Organisms/Chat/Chat.js +0 -939
  517. package/dist/esm/components/src/components/Organisms/Chat/Chat.styles.d.ts +0 -16
  518. package/dist/esm/components/src/components/Organisms/Chat/Chat.styles.d.ts.map +0 -1
  519. package/dist/esm/components/src/components/Organisms/Chat/Chat.styles.js +0 -1227
  520. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatFileUpload.d.ts +0 -32
  521. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatFileUpload.d.ts.map +0 -1
  522. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatFileUpload.js +0 -54
  523. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatGestures.d.ts +0 -40
  524. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatGestures.d.ts.map +0 -1
  525. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatGestures.js +0 -92
  526. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatOverflow.d.ts +0 -44
  527. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatOverflow.d.ts.map +0 -1
  528. package/dist/esm/components/src/components/Organisms/Chat/hooks/useChatOverflow.js +0 -110
  529. package/dist/esm/components/src/components/Organisms/Chat/index.d.ts +0 -2
  530. package/dist/esm/components/src/components/Organisms/Chat/index.d.ts.map +0 -1
  531. package/dist/esm/components/src/components/Organisms/Chat/index.js +0 -1
  532. package/dist/esm/components/src/components/Organisms/MobileSidebar/MobileSidebar.d.ts +0 -47
  533. package/dist/esm/components/src/components/Organisms/MobileSidebar/MobileSidebar.d.ts.map +0 -1
  534. package/dist/esm/components/src/components/Organisms/MobileSidebar/MobileSidebar.js +0 -164
  535. package/dist/esm/components/src/components/Organisms/MobileSidebar/index.d.ts +0 -2
  536. package/dist/esm/components/src/components/Organisms/MobileSidebar/index.d.ts.map +0 -1
  537. package/dist/esm/components/src/components/Organisms/MobileSidebar/index.js +0 -1
  538. package/dist/esm/components/src/components/Templates/Chat/Chat.d.ts +0 -12
  539. package/dist/esm/components/src/components/Templates/Chat/Chat.d.ts.map +0 -1
  540. package/dist/esm/components/src/components/Templates/Chat/Chat.js +0 -42
  541. package/dist/esm/components/src/components/Templates/Chat/index.d.ts +0 -2
  542. package/dist/esm/components/src/components/Templates/Chat/index.d.ts.map +0 -1
  543. package/dist/esm/components/src/components/Templates/Chat/index.js +0 -1
  544. package/dist/esm/components/src/themes/base/components/templates/chat.d.ts +0 -4
  545. package/dist/esm/components/src/themes/base/components/templates/chat.d.ts.map +0 -1
  546. package/dist/esm/components/src/themes/base/components/templates/chat.js +0 -3
  547. package/dist/esm/components/src/themes/bocachica/components/organisms/mobileSidebar.d.ts +0 -4
  548. package/dist/esm/components/src/themes/bocachica/components/organisms/mobileSidebar.d.ts.map +0 -1
  549. package/dist/esm/components/src/themes/bocachica/components/organisms/mobileSidebar.js +0 -56
  550. package/dist/esm/components/src/themes/bocachica/components/templates/chat.d.ts +0 -4
  551. package/dist/esm/components/src/themes/bocachica/components/templates/chat.d.ts.map +0 -1
  552. package/dist/esm/components/src/themes/bocachica/components/templates/chat.js +0 -3
  553. package/dist/esm/components/src/themes/pike/components/organisms/mobileSidebar.d.ts +0 -4
  554. package/dist/esm/components/src/themes/pike/components/organisms/mobileSidebar.d.ts.map +0 -1
  555. package/dist/esm/components/src/themes/pike/components/organisms/mobileSidebar.js +0 -143
  556. package/dist/esm/components/src/themes/pike/components/templates/chat.d.ts +0 -4
  557. package/dist/esm/components/src/themes/pike/components/templates/chat.d.ts.map +0 -1
  558. package/dist/esm/components/src/themes/pike/components/templates/chat.js +0 -3
  559. package/dist/esm/components/src/themes/snapnco/components/organisms/mobileSidebar.d.ts +0 -4
  560. package/dist/esm/components/src/themes/snapnco/components/organisms/mobileSidebar.d.ts.map +0 -1
  561. package/dist/esm/components/src/themes/snapnco/components/organisms/mobileSidebar.js +0 -64
  562. package/dist/esm/components/src/themes/snapnco/components/templates/chat.d.ts +0 -4
  563. package/dist/esm/components/src/themes/snapnco/components/templates/chat.d.ts.map +0 -1
  564. package/dist/esm/components/src/themes/snapnco/components/templates/chat.js +0 -3
  565. package/dist/esm/components/src/themes/snappy/components/organisms/mobileSidebar.d.ts +0 -4
  566. package/dist/esm/components/src/themes/snappy/components/organisms/mobileSidebar.d.ts.map +0 -1
  567. package/dist/esm/components/src/themes/snappy/components/organisms/mobileSidebar.js +0 -68
  568. package/dist/esm/components/src/themes/snappy/components/templates/chat.d.ts +0 -4
  569. package/dist/esm/components/src/themes/snappy/components/templates/chat.d.ts.map +0 -1
  570. package/dist/esm/components/src/themes/snappy/components/templates/chat.js +0 -3
  571. package/dist/esm/components/src/themes/themeComponents/chat.d.ts +0 -4
  572. package/dist/esm/components/src/themes/themeComponents/chat.d.ts.map +0 -1
  573. package/dist/esm/components/src/themes/themeComponents/chat.js +0 -11
  574. package/dist/esm/src/Templates/Stores/library/components/Chat.d.ts +0 -2
  575. package/dist/esm/src/Templates/Stores/library/components/Chat.d.ts.map +0 -1
  576. package/dist/esm/src/Templates/Stores/library/components/Chat.js +0 -1
  577. package/dist/esm/src/create/createChatController.d.ts +0 -5
  578. package/dist/esm/src/create/createChatController.d.ts.map +0 -1
  579. package/dist/esm/src/create/createChatController.js +0 -29
@@ -1,939 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@emotion/react/jsx-runtime";
2
- import classnames from 'classnames';
3
- import deepmerge from 'deepmerge';
4
- import { observer } from 'mobx-react-lite';
5
- import { useTheme, CacheProvider, useTreePath } from '../../../providers';
6
- import { Colour, mergeProps, mergeStyles } from '../../../utilities';
7
- import { chatDefaultStyles } from './Chat.styles';
8
- import { useChatGestures } from './hooks/useChatGestures';
9
- import { useChatOverflow } from './hooks/useChatOverflow';
10
- import { useChatFileUpload } from './hooks/useChatFileUpload';
11
- import { Button } from '../../Atoms/Button';
12
- import { useRef, useEffect, useMemo, useState } from 'preact/hooks';
13
- import { ChatMessageUser } from '../../Molecules/ChatMessageUser';
14
- import { ChatMessageText } from '../../Molecules/ChatMessageText';
15
- import { ChatSuggestedQuestions } from '../../Molecules/ChatSuggestedQuestions';
16
- import { ChatAttachmentContext } from '../../Molecules/ChatAttachmentContext';
17
- import { Image } from '../../Atoms/Image';
18
- import { ChatLoadingIndicator } from '../../Atoms/ChatLoadingIndicator';
19
- import { Dropdown, FacetSlider, Icon, Overlay, useMediaQuery } from '../../..';
20
- import { ChatInspirationResultMessage } from '../../Molecules/ChatInspirationResultMessage';
21
- import { ChatProductComparisonMessage, } from '../../Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage';
22
- import { ChatProductQueryMessage, } from '../../Molecules/ChatProductQueryMessage/ChatProductQueryMessage';
23
- export const ChatOrganism = observer((properties) => {
24
- const globalTheme = useTheme();
25
- const globalTreePath = useTreePath();
26
- const isMobile = useMediaQuery('(max-width: 767px)');
27
- const defaultProps = {
28
- treePath: globalTreePath,
29
- logo: 'https://cdn.athoscommerce.net/snap/images/Athos%20Commerce_Icon_white.svg',
30
- title: 'Athos Conversational Assistant',
31
- subtitle: 'Your Guided Discovery Expert',
32
- multiselectFacets: false,
33
- disableBubbleSuggestedQuestions: isMobile ? true : false,
34
- primaryColorBg: '#253B80',
35
- primaryColorFg: '#fff',
36
- primaryAccentColorBg: '#feeeae',
37
- primaryAccentColorFg: '#000000',
38
- secondaryAccentColorBg: '#000000',
39
- secondaryAccentColorFg: '#ffffff',
40
- position: 'right',
41
- hideMessageTypeIndicatorText: false,
42
- buttonBelowMessage: false,
43
- };
44
- let props = mergeProps('chat', globalTheme, defaultProps, properties);
45
- const { className, internalClassName, controller, logo, title, subtitle, avatar, offset, multiselectFacets, disableBubbleSuggestedQuestions, primaryColorBg, primaryColorFg, primaryAccentColorBg, primaryAccentColorFg, secondaryAccentColorBg, secondaryAccentColorFg, position, hideMessageTypeIndicatorText, buttonBelowMessage, disableStyles, treePath, } = props;
46
- const colorPrimary = primaryColorBg;
47
- const colorPrimaryText = primaryColorFg;
48
- const colorPrimaryAccent = primaryAccentColorBg;
49
- const colorPrimaryAccentText = primaryAccentColorFg;
50
- const colorSecondaryAccent = secondaryAccentColorBg;
51
- const colorSecondaryAccentText = secondaryAccentColorFg;
52
- const chatPosition = position === 'right' ? 'right' : 'left';
53
- const isValidImageUrl = (value) => {
54
- try {
55
- const { protocol } = new URL(value);
56
- return protocol === 'http:' || protocol === 'https:' || protocol === 'data:';
57
- }
58
- catch {
59
- return false;
60
- }
61
- };
62
- // A single-character avatar renders as a capitalized letter; a longer value renders
63
- // as an image when it's a valid image URL. Anything else renders no avatar.
64
- const avatarCharacter = avatar && avatar.length === 1 ? avatar.toUpperCase() : undefined;
65
- const avatarImage = avatar && avatar.length > 1 && isValidImageUrl(avatar) ? avatar : undefined;
66
- const { store } = controller;
67
- const themeDefaults = {
68
- components: {},
69
- };
70
- // merge deeply the themeDefaults with the theme props and the displaySettings theme props (do not merge arrays, but replace them)
71
- const theme = deepmerge(themeDefaults, props?.theme || {}, { arrayMerge: (destinationArray, sourceArray) => sourceArray });
72
- props = {
73
- ...props,
74
- theme,
75
- };
76
- const subProps = {
77
- messageUser: {
78
- disableStyles,
79
- theme: props.theme,
80
- treePath,
81
- primaryColor: colorPrimary,
82
- primaryColorText: colorPrimaryText,
83
- hideMessageTypeIndicatorText,
84
- },
85
- messageText: {
86
- disableStyles,
87
- theme: props.theme,
88
- treePath,
89
- primaryColor: colorPrimary,
90
- primaryColorText: colorPrimaryText,
91
- primaryAccentColor: colorPrimaryAccent,
92
- primaryAccentColorText: colorPrimaryAccentText,
93
- buttonBelowMessage,
94
- },
95
- suggestedQuestions: {
96
- disableStyles,
97
- theme: props.theme,
98
- treePath,
99
- primaryColor: colorPrimary,
100
- },
101
- attachmentContext: {
102
- disableStyles,
103
- theme: props.theme,
104
- treePath,
105
- },
106
- loadingIndicator: {
107
- disableStyles,
108
- theme: props.theme,
109
- treePath,
110
- },
111
- inspirationResultMessage: {
112
- disableStyles,
113
- theme: props.theme,
114
- treePath,
115
- },
116
- productComparisonMessage: {
117
- disableStyles,
118
- theme: props.theme,
119
- treePath,
120
- },
121
- productQueryMessage: {
122
- disableStyles,
123
- theme: props.theme,
124
- treePath,
125
- primaryColor: colorPrimary,
126
- primaryColorText: colorPrimaryText,
127
- },
128
- };
129
- const messagesEndRef = useRef(null);
130
- const messagesContainerRef = useRef(null);
131
- const headerRef = useRef(null);
132
- const footerRef = useRef(null);
133
- const chatRef = useRef(null);
134
- // Ref for the mobile secondary panel — needed for swipe-to-dismiss measurements
135
- const secondaryRef = useRef(null);
136
- const [mobileProductInfoOpen, setMobileProductInfoOpen] = useState(false);
137
- const [footerHeight, setFooterHeight] = useState(0);
138
- const dropEnabled = store.features.imageSearch.enabled && !store.loading && !store.blocked && !store.currentChat?.sessionLimitReached;
139
- const { fileInputRef, isDraggingFile, dragHandlers } = useChatFileUpload({
140
- enabled: !!dropEnabled,
141
- onUpload: (files) => controller.upload(files),
142
- });
143
- // productQuery messages are filtered out of the main chat render (they only drive the side-chat panel),
144
- // so don't auto-scroll when one is added — otherwise clicking a product in the side chat scrolls the main thread.
145
- const visibleChat = (store.currentChat?.chat || []).filter((m) => m.messageType !== 'productQuery');
146
- const visibleChatLength = visibleChat.length;
147
- const lastVisibleMessage = visibleChat[visibleChat.length - 1];
148
- const { showNewMessages, setShowNewMessages, messagesOverflow, scrollToBottom, scrollToBottomIfNear } = useChatOverflow({
149
- messagesContainerRef,
150
- headerRef,
151
- open: store.open,
152
- loading: store.loading,
153
- visibleChatLength,
154
- lastVisibleMessage,
155
- });
156
- // Re-focus the chat input on desktop after a search completes.
157
- // The input is disabled while loading, which causes the browser to drop focus.
158
- // On mobile we intentionally skip this so the virtual keyboard dismisses.
159
- // Only fire on the loading true → false transition — running on mount steals
160
- // focus away from the Storybook controls whenever the story re-renders.
161
- const prevLoadingRef = useRef(store.loading);
162
- useEffect(() => {
163
- if (prevLoadingRef.current && !store.loading && !isMobile && store.open) {
164
- controller.focusInput();
165
- }
166
- prevLoadingRef.current = store.loading;
167
- }, [store.loading]);
168
- // const subProps: ChatSubProps = {};
169
- const activeMessage = store.currentChat?.activeMessage;
170
- // On mobile, only auto-open the secondary panel for the first productComparison
171
- // message in the chat session. Subsequent comparison results show a "Show Details"
172
- // button instead (handled in MessageText via sideChatLabel toggle).
173
- const isFirstMobileComparison = (() => {
174
- if (!isMobile || activeMessage?.messageType !== 'productComparison')
175
- return true;
176
- // If the user explicitly activated a comparison (via "Show Details" or the
177
- // view-side-chat button), always allow it regardless of position in the chat
178
- if (store.currentChat?.activeMessageId)
179
- return true;
180
- const comparisonMessages = (store.currentChat?.chat || []).filter((m) => m.messageType === 'productComparison');
181
- return comparisonMessages.length <= 1;
182
- })();
183
- const sideChatTypes = isMobile
184
- ? ['inspirationResult', ...(isFirstMobileComparison ? ['productComparison'] : []), ...(mobileProductInfoOpen ? ['productQuery'] : [])]
185
- : ['inspirationResult', 'productComparison', 'productQuery'];
186
- const shouldShowSideChat = activeMessage && sideChatTypes.includes(activeMessage?.messageType) && store.currentChat?.dismissedSideChatMessageId !== activeMessage.id;
187
- const hasSideChat = !!shouldShowSideChat;
188
- const styling = useMemo(() => mergeStyles({
189
- mobile: isMobile,
190
- offset,
191
- hasSideChat,
192
- footerHeight,
193
- primaryColorBg: colorPrimary,
194
- primaryColorFg: colorPrimaryText,
195
- primaryAccentColorBg: colorPrimaryAccent,
196
- primaryAccentColorFg: colorPrimaryAccentText,
197
- secondaryAccentColorBg: colorSecondaryAccent,
198
- secondaryAccentColorFg: colorSecondaryAccentText,
199
- position: chatPosition,
200
- }, chatDefaultStyles), [
201
- isMobile,
202
- offset,
203
- hasSideChat,
204
- footerHeight,
205
- colorPrimary,
206
- colorPrimaryText,
207
- colorPrimaryAccent,
208
- colorPrimaryAccentText,
209
- colorSecondaryAccent,
210
- colorSecondaryAccentText,
211
- chatPosition,
212
- ]);
213
- // Lock body scroll while chat is open so touch/wheel scrolls don't leak to the page behind
214
- useEffect(() => {
215
- if (!store.open)
216
- return;
217
- const body = document.body;
218
- const previousOverflow = body.style.overflow;
219
- const previousOverscroll = body.style.overscrollBehavior;
220
- body.style.overflow = 'hidden';
221
- body.style.overscrollBehavior = 'contain';
222
- return () => {
223
- body.style.overflow = previousOverflow;
224
- body.style.overscrollBehavior = previousOverscroll;
225
- };
226
- }, [store.open]);
227
- // Close chat on Escape key (or dismiss side chat first when it's open)
228
- useEffect(() => {
229
- if (!store.open)
230
- return;
231
- const onKeyDown = (e) => {
232
- if (e.key !== 'Escape')
233
- return;
234
- if (store.currentChat?.activeMessage && shouldShowSideChat) {
235
- store.currentChat?.dismissSideChat();
236
- }
237
- else {
238
- controller.handlers.button.click();
239
- }
240
- };
241
- document.addEventListener('keydown', onKeyDown);
242
- return () => document.removeEventListener('keydown', onKeyDown);
243
- }, [store.open, shouldShowSideChat]);
244
- // Track the primary footer height so the mobile secondary panel can sit above it
245
- useEffect(() => {
246
- const el = footerRef.current;
247
- if (!el)
248
- return;
249
- const observer = new ResizeObserver((entries) => {
250
- for (const entry of entries) {
251
- setFooterHeight(entry.borderBoxSize?.[0]?.blockSize ?? entry.target.getBoundingClientRect().height);
252
- }
253
- });
254
- observer.observe(el);
255
- return () => observer.disconnect();
256
- }, [store.open, store.currentChat?.isExpired]);
257
- // Prevent the background page from scrolling while the chat is open on touch
258
- // devices. iOS Safari (real iPad/iPhone) rubber-band-scrolls the body when a
259
- // touchmove inside `.ss__chat__messages` reaches the top/bottom — and
260
- // `overscroll-behavior: contain` is ignored there.
261
- //
262
- // We don't touch body styles (locking via `position: fixed` on `<body>` leaves
263
- // iPad Safari in a stuck viewport state where the page can't scroll after the
264
- // lock is released). Instead we install a `touchmove` handler that:
265
- // - allows the touchmove if it's inside a scrollable region of the chat
266
- // and that region isn't at its scroll edge in the swipe direction;
267
- // - calls `preventDefault()` otherwise — which is what blocks both
268
- // background scrolling and iOS rubber-band overscroll.
269
- // Cleanup just removes the listeners, so nothing can leak into the page.
270
- useEffect(() => {
271
- if (!store.open)
272
- return;
273
- if (typeof document === 'undefined')
274
- return;
275
- let startX = 0;
276
- let startY = 0;
277
- let scrollEl = null;
278
- // Walk up from the touch target to find the first ancestor inside the chat
279
- // that is actually scrollable in either axis. Stop at the chat root so we
280
- // never consider elements outside the chat.
281
- const findScrollableInChat = (start) => {
282
- const chatRoot = chatRef.current;
283
- if (!chatRoot)
284
- return null;
285
- let el = start;
286
- while (el && chatRoot.contains(el)) {
287
- const style = getComputedStyle(el);
288
- const scrollableY = (style.overflowY === 'auto' || style.overflowY === 'scroll') && el.scrollHeight > el.clientHeight;
289
- const scrollableX = (style.overflowX === 'auto' || style.overflowX === 'scroll') && el.scrollWidth > el.clientWidth;
290
- if (scrollableY || scrollableX) {
291
- return el;
292
- }
293
- if (el === chatRoot)
294
- break;
295
- el = el.parentElement;
296
- }
297
- return null;
298
- };
299
- const onTouchStart = (e) => {
300
- if (!e.touches[0])
301
- return;
302
- startX = e.touches[0].clientX;
303
- startY = e.touches[0].clientY;
304
- scrollEl = findScrollableInChat(e.target);
305
- };
306
- const onTouchMove = (e) => {
307
- const target = e.target;
308
- const chatRoot = chatRef.current;
309
- const inChat = !!(chatRoot && target && chatRoot.contains(target));
310
- // Touches outside the chat shouldn't scroll the background.
311
- if (!inChat) {
312
- if (e.cancelable)
313
- e.preventDefault();
314
- return;
315
- }
316
- // Inside the chat but no scrollable container — block to prevent body scroll.
317
- if (!scrollEl) {
318
- if (e.cancelable)
319
- e.preventDefault();
320
- return;
321
- }
322
- // Inside a scrollable container — only block when at the edge in the
323
- // swipe direction, so internal scrolling continues to work. Detect the
324
- // dominant axis so horizontally-scrollable rows (e.g. the facets row)
325
- // also get to handle their own touch gestures.
326
- const currentX = e.touches[0]?.clientX ?? startX;
327
- const currentY = e.touches[0]?.clientY ?? startY;
328
- const deltaX = currentX - startX;
329
- const deltaY = currentY - startY;
330
- const horizontal = Math.abs(deltaX) > Math.abs(deltaY);
331
- if (horizontal) {
332
- const scrollsX = scrollEl.scrollWidth > scrollEl.clientWidth;
333
- if (!scrollsX) {
334
- if (e.cancelable)
335
- e.preventDefault();
336
- return;
337
- }
338
- const atLeft = scrollEl.scrollLeft <= 0;
339
- const atRight = scrollEl.scrollLeft + scrollEl.clientWidth >= scrollEl.scrollWidth - 1;
340
- if ((atLeft && deltaX > 0) || (atRight && deltaX < 0)) {
341
- if (e.cancelable)
342
- e.preventDefault();
343
- }
344
- }
345
- else {
346
- const scrollsY = scrollEl.scrollHeight > scrollEl.clientHeight;
347
- if (!scrollsY) {
348
- if (e.cancelable)
349
- e.preventDefault();
350
- return;
351
- }
352
- const atTop = scrollEl.scrollTop <= 0;
353
- const atBottom = scrollEl.scrollTop + scrollEl.clientHeight >= scrollEl.scrollHeight - 1;
354
- if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {
355
- if (e.cancelable)
356
- e.preventDefault();
357
- }
358
- }
359
- };
360
- document.addEventListener('touchstart', onTouchStart, { passive: true });
361
- document.addEventListener('touchmove', onTouchMove, { passive: false });
362
- return () => {
363
- document.removeEventListener('touchstart', onTouchStart);
364
- document.removeEventListener('touchmove', onTouchMove);
365
- };
366
- }, [store.open]);
367
- const HistoryButton = (props) => (_jsx(Button, { className: "ss__chat__header__button--history", disabled: props.disabled, icon: {
368
- icon: 'history',
369
- title: 'Chat History',
370
- } }));
371
- const HistoryPopup = (props) => (_jsxs("div", { className: "ss__chat__history", children: [_jsxs("div", { className: "ss__chat__history__header", children: [_jsx("h4", { children: "History" }), _jsx("div", { className: "ss__chat__history__header__buttons", children: _jsx(Button, { content: "clear", disabled: store.loading || store.blocked, onClick: () => {
372
- controller.store.clearHistory();
373
- props.toggleOpen && props.toggleOpen();
374
- } }) })] }), store.chats.length > 0 ? (_jsx("div", { className: "ss__chat__history__chats", children: store.chats
375
- .slice()
376
- .reverse()
377
- .map((chat) => (_jsx("div", { className: "ss__chat__history__chats__chat", children: _jsxs(Button, { className: "ss__chat__history__chat__button", onClick: () => {
378
- controller.store.switchChat(chat.id);
379
- }, disabled: chat.id === store.currentChatId || store.loading || store.blocked, children: [_jsx("div", { className: "ss__chat__history__chat__button__text", children: (() => {
380
- const lastUserMessage = [...chat.chat].reverse().find((message) => message.messageType === 'user');
381
- if (!lastUserMessage)
382
- return 'New Chat';
383
- const text = lastUserMessage.text;
384
- return text.length > 50 ? `${text.slice(0, 50)}...` : text;
385
- })() }), _jsx("div", { className: "ss__chat__history__chat__button__date", children: chat.createdAt.toLocaleString() })] }) }, chat.id))) })) : null] }));
386
- const FacetButton = (props) => _jsx(Button, { icon: props.open ? 'angle-down' : 'angle-up', children: props.label });
387
- const getFacetButtonLabel = (facet) => {
388
- const base = facet.label || facet.field;
389
- // Slider facets show the active low-high range in the button when narrowed.
390
- if (facet.type === 'range') {
391
- const rangeFacet = facet;
392
- const active = rangeFacet.active;
393
- const range = rangeFacet.range;
394
- if (active && range && (active.low !== range.low || active.high !== range.high)) {
395
- return `${base} (${active.low ?? '*'}-${active.high ?? '*'})`;
396
- }
397
- return base;
398
- }
399
- // Count current selections from the urlManager (source of truth for live state).
400
- // `value.filtered` reflects the server's snapshot at response time and goes stale
401
- // once the user deselects locally.
402
- const applied = (facet.values || []).filter((value) => {
403
- if (!value)
404
- return false;
405
- const optionValue = 'low' in value && 'high' in value
406
- ? `${value.low ?? '*'}:${value.high ?? '*'}`
407
- : value.value || value.label;
408
- return controller.store.isFacetSelected(facet.field, optionValue);
409
- }).length;
410
- return applied > 0 ? `${base} (${applied})` : base;
411
- };
412
- // Slider dropdown grows to fill the remaining chat width from its anchor,
413
- // so the price range slider isn't cramped inside a 150px-wide dropdown.
414
- const SliderFacetDropdown = (props) => {
415
- const anchorRef = useRef(null);
416
- const [width, setWidth] = useState(null);
417
- useEffect(() => {
418
- const compute = () => {
419
- if (!anchorRef.current || !chatRef.current)
420
- return;
421
- const anchor = anchorRef.current.getBoundingClientRect();
422
- const chat = chatRef.current.getBoundingClientRect();
423
- const remaining = chat.right - anchor.left - 16;
424
- setWidth(Math.max(220, remaining));
425
- };
426
- compute();
427
- const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(compute) : null;
428
- if (ro && chatRef.current)
429
- ro.observe(chatRef.current);
430
- window.addEventListener('resize', compute);
431
- return () => {
432
- if (ro)
433
- ro.disconnect();
434
- window.removeEventListener('resize', compute);
435
- };
436
- }, []);
437
- return (_jsx("div", { ref: anchorRef, className: "ss__chat__actions__facet ss__chat__actions__facet--range", children: _jsx(Dropdown, { usePortal: true, dropUp: true, button: _jsx(FacetButton, { label: props.label }), style: {
438
- '.ss__dropdown__content': {
439
- width: width ? `${width}px` : 'auto',
440
- background: 'white',
441
- boxShadow: '0px 3px 6px 0px rgba(0, 0, 0, 0.2)',
442
- borderRadius: '6px',
443
- },
444
- }, children: _jsx("div", { className: "ss__chat__actions__facet__options", children: _jsx("div", { className: "ss__chat__actions__facet__slider", style: { padding: '12px 16px' }, children: _jsx(FacetSlider, { facet: props.facet, onChange: () => {
445
- if (!multiselectFacets) {
446
- // FacetSlider fires onChange before its urlManager update; defer
447
- // so controller.search() reads the updated filter state. Force
448
- // productSearch with the current filters so a slider tweak doesn't
449
- // fall through to `general` when hasPendingFacetChanges happens to
450
- // be false (e.g. the slider returned to the seeded range).
451
- queueMicrotask(() => controller.search({
452
- data: { requestType: 'productSearch', searchFilters: controller.store.searchFilters },
453
- }));
454
- }
455
- } }) }) }) }) }));
456
- };
457
- // TODO: if starting a new chat and it's expired, this button would then disappear
458
- if (!controller.store.chatEnabled) {
459
- return _jsx(_Fragment, {});
460
- }
461
- // Dismiss the secondary panel and clear any product attachments tied to the side-chat
462
- // (discuss product flow), while preserving productSimilar/productComparison attachments.
463
- const dismissSideChat = () => {
464
- const productAttachmentsToRemove = (store.currentChat?.attachments.attached || []).filter((item) => item.type === 'product' && item.requestType !== 'productSimilar' && item.requestType !== 'productComparison');
465
- productAttachmentsToRemove.forEach((item) => store.currentChat?.attachments.remove(item.id));
466
- setMobileProductInfoOpen(false);
467
- store.currentChat?.dismissSideChat();
468
- };
469
- const { swipeOffset, swipeAnimating, swipeHandlers } = useChatGestures({
470
- panelRef: secondaryRef,
471
- shouldShowSideChat: !!shouldShowSideChat,
472
- activeMessageId: activeMessage?.id,
473
- onDismiss: dismissSideChat,
474
- });
475
- const requestType = store.currentChat?.requestType;
476
- const loadingVerbs = useMemo(() => {
477
- switch (requestType) {
478
- case 'productQuery':
479
- return ['Thinking', 'Searching', 'Analyzing', 'Gathering details'];
480
- case 'productSearch':
481
- return ['Searching', 'Browsing catalog', 'Finding products', 'Curating results'];
482
- case 'productComparison':
483
- return ['Comparing', 'Analyzing', 'Evaluating', 'Weighing options'];
484
- case 'imageSearch':
485
- return ['Analyzing image', 'Identifying', 'Searching', 'Matching'];
486
- case 'productSimilar':
487
- return ['Finding similar items', 'Searching', 'Matching', 'Curating'];
488
- case 'inspirationRequest':
489
- return ['Brainstorming', 'Imagining', 'Curating', 'Inspiring'];
490
- case 'general':
491
- default:
492
- return undefined;
493
- }
494
- }, [requestType]);
495
- const isWelcomeState = (!store.currentChat?.chat || store.currentChat.chat.length === 0) && !!store.welcomeMessage && !store.currentChat?.isExpired;
496
- return (_jsx(CacheProvider, { children: _jsxs(_Fragment, { children: [_jsxs("div", { ref: chatRef, className: classnames('ss__chat', {
497
- 'ss__chat--open': store.open,
498
- 'ss__chat--minimized': !store.open,
499
- 'ss__chat--mobile': isMobile,
500
- 'ss__chat--welcome': isWelcomeState,
501
- }, className, internalClassName), ...styling, children: [!disableBubbleSuggestedQuestions && !store.open && !store.currentChat && store.suggestedQuestions?.length > 0 && (_jsx("div", { className: "ss__chat__suggested-questions", children: store.suggestedQuestions.map((question) => (_jsx("div", { className: "ss__chat__suggested-questions__item", onClick: () => {
502
- controller.openChat(question);
503
- }, children: question }, question))) })), _jsx("button", { type: "button", className: 'ss__chat__bubble', "aria-label": store.open ? 'Close chat' : 'Open chat', "aria-expanded": store.open, onClick: () => controller.handlers.button.click(), children: _jsx(Icon, { icon: "chat", title: "Open Chat" }) }), store.open && shouldShowSideChat && activeMessage ? (_jsxs("div", { ref: secondaryRef, className: classnames('ss__chat__secondary'), role: "region", "aria-label": "Conversation details", style: isMobile
504
- ? {
505
- // Touch swipe animations need to be inline to prevent visual jumps
506
- transform: swipeOffset > 0 ? `translateY(${swipeOffset}px)` : undefined,
507
- transition: swipeAnimating ? 'transform 0.3s ease-out' : 'none',
508
- }
509
- : undefined, children: [isMobile && (_jsx("div", { className: "ss__chat__secondary__drag-handle", ...swipeHandlers, children: _jsx("div", { className: "ss__chat__secondary__drag-handle__indicator" }) })), _jsxs("div", { className: 'ss__chat__header', onTouchStart: isMobile ? swipeHandlers.onTouchStart : undefined, onTouchMove: isMobile ? swipeHandlers.onTouchMove : undefined, onTouchEnd: isMobile ? swipeHandlers.onTouchEnd : undefined, children: [_jsxs("div", { className: "ss__chat__header__title", children: [_jsx("div", { className: "ss__chat__header__title__primary", children: {
510
- inspirationResult: 'Inspiration Scenarios',
511
- productComparison: 'Product Comparison',
512
- productQuery: '',
513
- }[activeMessage.messageType] || null }), _jsx("div", { className: "ss__chat__header__title__secondary", children: {
514
- inspirationResult: 'Choose a style direction to explore',
515
- productComparison: `Comparing ${activeMessage?.searchResults?.length || ''} products`,
516
- productQuery: '',
517
- }[activeMessage.messageType] || null })] }), _jsx("div", { className: "ss__chat__header__buttons", children: _jsx(Button, { className: "ss__chat__header__button--close", "aria-label": "Close chat", icon: { icon: 'close2', title: 'Close Chat' }, onClick: () => dismissSideChat() }) })] }), _jsx("div", { className: "ss__chat__content", children: _jsx("div", { className: 'ss__chat__messages', children: {
518
- inspirationResult: (_jsx(ChatInspirationResultMessage, { ...subProps.inspirationResultMessage, chatItem: activeMessage, controller: controller, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined })),
519
- productComparison: (_jsx(ChatProductComparisonMessage, { ...subProps.productComparisonMessage, chatItem: activeMessage, controller: controller })),
520
- productQuery: (_jsx(ChatProductQueryMessage, { ...subProps.productQueryMessage, chatItem: activeMessage, controller: controller, displayFields: controller.config.settings?.quickview?.displayFields, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
521
- }[activeMessage.messageType] || null }) })] })) : null, store.open ? (_jsxs("div", { className: 'ss__chat__primary',
522
- // On mobile, interacting with the primary chat (header or anywhere within)
523
- // dismisses the secondary panel. Capture phase so it fires even when an
524
- // inner control stops propagation.
525
- onClickCapture: isMobile && shouldShowSideChat ? () => dismissSideChat() : undefined, children: [_jsxs("div", { className: 'ss__chat__header', children: [_jsxs("div", { className: "ss__chat__header__title", children: [logo ? _jsx(Image, { className: "ss__chat__header__title__logo", src: logo, alt: title || 'Chat logo' }) : null, _jsxs("div", { className: "ss__chat__header__title__text", children: [title ? _jsx("div", { className: "ss__chat__header__title__text__primary", children: title }) : null, subtitle ? _jsx("div", { className: "ss__chat__header__title__text__secondary", children: subtitle }) : null] })] }), _jsxs("div", { className: "ss__chat__header__buttons", children: [_jsx(Button
526
- // disabled={store.currentChat?.chat && store.currentChat.chat.length <= 1}
527
- , {
528
- // disabled={store.currentChat?.chat && store.currentChat.chat.length <= 1}
529
- className: "ss__chat__header__button--new", "aria-label": "New chat", icon: { icon: controller.store.initChatLoading ? 'spinner' : 'plus2', title: 'New Chat' }, onClick: () => controller.store.createChat() }), store.chats.length > 1 && (_jsx(Dropdown, { disabled: store.loading || store.blocked, className: "ss__chat__header__dropdown-history", button: _jsx(HistoryButton, {}), children: _jsx(HistoryPopup, {}) })), _jsx(Button, { className: "ss__chat__header__button--close", "aria-label": "Close chat", icon: { icon: 'close2', title: 'Close Chat' }, onClick: () => controller.handlers.button.click() })] })] }), _jsxs("div", { className: "ss__chat__content", children: [(() => {
530
- const feedbackAfterMessages = controller.config.settings?.feedbackAfterMessages;
531
- const systemMessages = (store.currentChat?.chat || []).filter((msg) => msg.messageType !== 'user' && msg.messageType !== 'productQuery');
532
- const currentRating = store.currentChat?.feedback.rating;
533
- const hasRated = !!currentRating;
534
- const shouldShowFeedback = feedbackAfterMessages &&
535
- systemMessages.length >= feedbackAfterMessages &&
536
- !store.currentChat?.feedback.dismissed &&
537
- (!hasRated || store.currentChat?.feedback.justGiven);
538
- return shouldShowFeedback ? (_jsxs("div", { className: "ss__chat__session-feedback", children: [_jsx("div", { className: "ss__chat__session-feedback__icon", children: _jsx(Icon, { icon: "chat", size: "16px" }) }), _jsx("span", { className: "ss__chat__session-feedback__label", children: hasRated ? 'Thank you for your feedback' : "How's your experience so far?" }), _jsxs("div", { className: `ss__chat__session-feedback__actions${hasRated ? ' ss__chat__session-feedback__actions--rated' : ''}`, children: [(!hasRated || currentRating === 'UP') && (_jsx("span", { onClick: () => !hasRated && controller.handleFeedback('UP'), children: _jsx(Icon, { icon: 'thumbs-up', size: "16px", title: 'Thumbs Up' }) })), (!hasRated || currentRating === 'DOWN') && (_jsx("span", { onClick: () => !hasRated && controller.handleFeedback('DOWN'), children: _jsx(Icon, { icon: 'thumbs-down', size: "16px", title: 'Thumbs Down' }) }))] }), !hasRated && (_jsx("span", { className: "ss__chat__session-feedback__close", onClick: () => {
539
- if (store.currentChat) {
540
- store.currentChat.feedback.dismissed = true;
541
- store.currentChat.save();
542
- }
543
- }, children: _jsx(Icon, { icon: "close-thin", size: "14px" }) }))] })) : null;
544
- })(), _jsx("div", { ref: headerRef, className: classnames('ss__chat__content__header', {
545
- 'ss__chat__content__header--overlay': messagesOverflow,
546
- }), children: store.currentChat?.comparisons.compared && store.currentChat.comparisons.compared.length > 0 && (_jsxs("div", { className: 'ss__chat__content__header__comparisons', children: [_jsxs("div", { className: 'ss__chat__content__header__comparisons__header', children: [_jsxs("div", { className: 'ss__chat__content__header__comparisons__header__title', children: [_jsx(Icon, { className: 'ss__chat__content__header__comparisons__header__title__icon', icon: 'clipboard' }), _jsxs("span", { className: 'ss__chat__content__header__comparisons__header__title__text', children: ["Compare Products (", store.currentChat?.comparisons.compared.length, "/", store.currentChat?.comparisons.maxItems, ")"] })] }), _jsx("div", { className: 'ss__chat__content__header__comparisons__header__actions', children: _jsx(Button, { onClick: () => store.currentChat?.comparisons.reset(), children: "clear" }) })] }), _jsxs("div", { className: 'ss__chat__content__header__comparisons__content', children: [_jsx("div", { className: 'ss__chat__content__header__comparisons__content__items', children: Array.from({ length: store.currentChat?.comparisons.maxItems }).map((_, index) => {
547
- const comparisonItem = store.currentChat?.comparisons.compared[index];
548
- return (_jsx("div", { className: classnames('ss__chat__content__header__comparisons__content__comparison', {
549
- 'ss__chat__content__header__comparisons__content__comparison--placeholder': !comparisonItem,
550
- }), children: comparisonItem ? (_jsxs(_Fragment, { children: [_jsx(Image
551
- // onClick={() => {
552
- // controller?.productQuickView(product as any);
553
- // }}
554
- , {
555
- // onClick={() => {
556
- // controller?.productQuickView(product as any);
557
- // }}
558
- alt: (comparisonItem?.result?.display || comparisonItem?.result)?.mappings?.core?.name || '', src: (comparisonItem?.result?.display || comparisonItem?.result)?.mappings?.core?.imageUrl ||
559
- (comparisonItem?.result?.display || comparisonItem?.result)?.mappings?.core?.parentImageUrl ||
560
- '' }), _jsx("div", { className: "ss__chat__content__header__comparisons__content__comparison__remove", onClick: () => {
561
- store.currentChat?.comparisons.remove(comparisonItem.result.id);
562
- }, children: _jsx(Icon, { icon: 'close-thin', size: '12px' }) })] })) : (_jsxs(_Fragment, { children: [_jsx(Icon, { icon: 'plus-thin' }), _jsx("div", { className: 'ss__chat__content__header__comparisons__content__comparison--placeholder__text', children: "Add" })] })) }, index));
563
- }) }), _jsx("div", { className: classnames('ss__chat__content__header__comparisons__action', {
564
- 'ss__chat__content__header__comparisons__action--hidden': (store.currentChat?.comparisons.compared.length || 0) < 2,
565
- }), children: _jsx(Button, { onClick: () => controller.search(), icon: { icon: 'compare', title: 'Compare' }, children: "Compare" }) })] })] })) }), _jsxs("div", { className: 'ss__chat__messages', ref: messagesContainerRef, role: "log", "aria-live": "polite", "aria-relevant": "additions", "aria-label": "Chat messages", style: visibleChatLength ? { scrollbarGutter: 'stable' } : undefined, children: [(!store.currentChat?.chat || store.currentChat.chat.length === 0) && store.welcomeMessage && !store.currentChat?.isExpired && (_jsxs("div", { className: "ss__chat__welcome", children: [_jsx("div", { className: "ss__chat__welcome__message", children: store.welcomeMessage }), _jsx(ChatSuggestedQuestions, { ...subProps.suggestedQuestions, questions: store.suggestedQuestions, controller: controller })] })), store.currentChat?.chat
566
- .filter((chatItem) => chatItem.messageType !== 'productQuery')
567
- .map((chatItem) => {
568
- const showAvatar = !!(avatarCharacter || avatarImage) && chatItem.messageType !== 'user';
569
- const messageContent = {
570
- user: (_jsx(ChatMessageUser, { ...subProps.messageUser, chatItem: chatItem, controller: controller, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
571
- text: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
572
- content: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
573
- productSearchResult: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
574
- inspirationResult: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
575
- productAnswer: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
576
- productComparison: (() => {
577
- // On mobile, only the first productComparison in the session
578
- // auto-opens the secondary panel. Subsequent ones get a
579
- // prominent "Show Details" button instead.
580
- const comparisonMessages = (store.currentChat?.chat || []).filter((m) => m.messageType === 'productComparison');
581
- const isFirst = comparisonMessages.length > 0 && comparisonMessages[0].id === chatItem.id;
582
- return (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, showDetailsButton: isMobile && !isFirst, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText }));
583
- })(),
584
- productRecommendation: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, onProductQuickView: isMobile ? () => setMobileProductInfoOpen(true) : undefined, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
585
- actions: (_jsx(ChatSuggestedQuestions, { actions: chatItem.actions, controller: controller })),
586
- errorResponse: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
587
- topicDrift: (_jsx(ChatMessageText, { ...subProps.messageText, chatItem: chatItem, controller: controller, scrollToBottom: scrollToBottomIfNear, sideChatOpen: !!shouldShowSideChat, primaryColor: colorPrimary, primaryColorText: colorPrimaryText })),
588
- productQuery: null,
589
- }[chatItem.messageType] || null;
590
- return (_jsxs("div", { className: classnames(`ss__chat__message`, `ss__chat__message--${chatItem.messageType}`, {
591
- 'ss__chat__message--with-avatar': showAvatar,
592
- }), children: [showAvatar && (_jsx("div", { className: classnames('ss__chat__message__avatar', {
593
- 'ss__chat__message__avatar--image': !!avatarImage,
594
- }), "aria-hidden": "true", children: avatarImage ? _jsx(Image, { src: avatarImage, alt: "" }) : avatarCharacter })), showAvatar ? _jsx("div", { className: "ss__chat__message__content", children: messageContent }) : messageContent] }, chatItem.id));
595
- }), _jsx("div", { className: "ss__chat__messages__end", ref: messagesEndRef }), showNewMessages && messagesOverflow && (_jsxs("div", { className: "ss__chat__new-messages", onClick: () => {
596
- scrollToBottom();
597
- setShowNewMessages(false);
598
- }, children: [_jsx(Icon, { icon: "angle-down", size: "12px" }), _jsx("span", { children: "New messages" })] }))] }), _jsx(ChatLoadingIndicator, { ...subProps.loadingIndicator, loading: store.loading, verbs: loadingVerbs }), !store.currentChat?.isExpired ? (_jsxs("div", { className: "ss__chat__content__footer", ref: footerRef, ...dragHandlers, children: [store.error && _jsx("div", { className: "ss__chat__error", children: store.error.message }), store.currentChat?.sessionLimitReached && (_jsxs("div", { className: 'ss__chat__topic-drift', children: [_jsx(Icon, { icon: "info", size: "18px", className: 'ss__chat__topic-drift__icon--info' }), _jsxs("div", { className: 'ss__chat__topic-drift__text', children: [_jsx("span", { children: "Session limit reached" }), _jsx("span", { children: "This chat has reached its maximum number of interactions. Start a new session to continue." })] }), _jsx(Button, { className: 'ss__chat__topic-drift__button', onClick: () => {
599
- controller.store.createChat();
600
- }, children: "New Session" })] })), store.facets && store.facets.length > 0 && (_jsx("div", { className: 'ss__chat__actions', children: _jsxs("div", { className: "ss__chat__actions__wrap", children: [_jsxs("div", { className: "ss__chat__actions__facets-header", children: [_jsx("div", { className: "ss__chat__actions--title", children: "Filter by:" }), multiselectFacets && store.hasPendingFacetChanges && (_jsx("div", { className: 'ss__chat__actions__facets-apply ss__chat__actions__facets-apply--active', children: _jsx(Button, { onClick: () => {
601
- controller.search();
602
- }, children: store.pendingFacetCount > 0 ? `Apply (${store.pendingFacetCount})` : 'Clear facets' }) }))] }), _jsx("div", { className: "ss__chat__actions--facets", children: store.facets.slice(0, 10).map((facet, idx) => {
603
- // range/slider facets render via FacetSlider; everything else needs at least one value to be useful
604
- if (facet.type !== 'range' && !facet.values?.length)
605
- return null;
606
- if (facet.type === 'range') {
607
- return _jsx(SliderFacetDropdown, { facet: facet, label: getFacetButtonLabel(facet) }, idx);
608
- }
609
- return (_jsx("div", { className: `ss__chat__actions__facet ss__chat__actions__facet--${facet.type}`, children: _jsx(Dropdown, { usePortal: true, dropUp: true, boundaryRef: chatRef, button: _jsx(FacetButton, { label: getFacetButtonLabel(facet) }), style: {
610
- '.ss__dropdown__content': {
611
- width: '150px',
612
- maxHeight: '200px',
613
- overflowY: 'auto',
614
- background: 'white',
615
- boxShadow: '0px 3px 6px 0px rgba(0, 0, 0, 0.2)',
616
- borderRadius: '6px',
617
- ...(multiselectFacets
618
- ? {
619
- '.ss__chat__actions__facet__option--checkbox': {
620
- display: 'flex',
621
- alignItems: 'center',
622
- gap: '8px',
623
- padding: '6px 10px',
624
- cursor: 'pointer',
625
- width: '100%',
626
- boxSizing: 'border-box',
627
- background: '#fff',
628
- border: 'none',
629
- borderBottom: '1px solid #f0f0f0',
630
- '&:hover': {
631
- background: new Colour(colorPrimary).lightenHex(0.95),
632
- },
633
- '&:last-child': {
634
- borderBottom: 'none',
635
- },
636
- '.ss__chat__actions__facet__option__checkbox': {
637
- width: '16px',
638
- height: '16px',
639
- borderRadius: '3px',
640
- border: '2px solid #ccc',
641
- display: 'flex',
642
- alignItems: 'center',
643
- justifyContent: 'center',
644
- flexShrink: 0,
645
- '&.ss__chat__actions__facet__option__checkbox--checked': {
646
- background: colorPrimary,
647
- borderColor: colorPrimary,
648
- color: colorPrimaryText,
649
- svg: {
650
- fill: colorPrimaryText,
651
- stroke: colorPrimaryText,
652
- },
653
- },
654
- },
655
- '.ss__chat__actions__facet__option__label': {
656
- fontSize: '14px',
657
- color: '#333',
658
- flex: '1 1 auto',
659
- textAlign: 'left',
660
- },
661
- },
662
- }
663
- : {
664
- '.ss__button': {
665
- width: '100%',
666
- border: 'none',
667
- borderRadius: 0,
668
- boxSizing: 'border-box',
669
- background: '#fff',
670
- '&:hover': {
671
- background: new Colour(colorPrimary).lightenHex(0.95),
672
- },
673
- '&.ss__chat__actions__facet__option--selected': {
674
- fontWeight: 'bold',
675
- },
676
- },
677
- }),
678
- },
679
- }, children: _jsx("div", { className: "ss__chat__actions__facet__options", children: facet.type === 'range-buckets'
680
- ? facet.values.map((option) => {
681
- const rangeOption = option;
682
- const optionValue = `${rangeOption.low ?? '*'}:${rangeOption.high ?? '*'}`;
683
- if (multiselectFacets) {
684
- const isSelected = controller.store.isFacetSelected(facet.field, optionValue);
685
- return (_jsxs("div", { className: "ss__chat__actions__facet__option--checkbox", onClick: () => {
686
- if (isSelected) {
687
- controller.store.removeFacet(facet.field, optionValue);
688
- }
689
- else {
690
- controller.store.addFacet({
691
- key: facet.field,
692
- value: optionValue,
693
- });
694
- }
695
- }, children: [_jsx("div", { className: classnames('ss__chat__actions__facet__option__checkbox', {
696
- 'ss__chat__actions__facet__option__checkbox--checked': isSelected,
697
- }), children: isSelected && _jsx(Icon, { icon: "check-thin", size: "10px" }) }), _jsx("span", { className: "ss__chat__actions__facet__option__label", children: rangeOption.label })] }, optionValue));
698
- }
699
- return (_jsx(Button, { className: classnames({
700
- 'ss__chat__actions__facet__option--selected': controller.store.isFacetSelected(facet.field, optionValue),
701
- }), onClick: () => {
702
- // Non-multiselect: clicking an already-selected value toggles it off.
703
- // `addFacet` is idempotent against an existing urlManager value, so without
704
- // the toggle the state wouldn't change, `hasPendingFacetChanges` would stay
705
- // false, and the params getter would fall through to `general`.
706
- if (controller.store.isFacetSelected(facet.field, optionValue)) {
707
- controller.store.removeFacet(facet.field, optionValue);
708
- }
709
- else {
710
- controller.store.addFacet({
711
- key: facet.field,
712
- value: optionValue,
713
- });
714
- }
715
- // Force productSearch with the current filter state rather than relying
716
- // on the params getter's hasPendingFacetChanges promotion — a facet click
717
- // in the chat is unambiguously a search intent.
718
- controller.search({
719
- data: { requestType: 'productSearch', searchFilters: controller.store.searchFilters },
720
- });
721
- }, children: rangeOption.label }, optionValue));
722
- })
723
- : facet.values.map((option) => {
724
- const valueOption = option;
725
- const optionValue = valueOption.value || valueOption.label;
726
- if (multiselectFacets) {
727
- const isSelected = controller.store.isFacetSelected(facet.field, optionValue);
728
- return (_jsxs("div", { className: "ss__chat__actions__facet__option--checkbox", onClick: () => {
729
- if (isSelected) {
730
- controller.store.removeFacet(facet.field, optionValue);
731
- }
732
- else {
733
- controller.store.addFacet({
734
- key: facet.field,
735
- value: optionValue,
736
- });
737
- }
738
- }, children: [_jsx("div", { className: classnames('ss__chat__actions__facet__option__checkbox', {
739
- 'ss__chat__actions__facet__option__checkbox--checked': isSelected,
740
- }), children: isSelected && _jsx(Icon, { icon: "check-thin", size: "10px" }) }), _jsx("span", { className: "ss__chat__actions__facet__option__label", children: valueOption.label })] }, optionValue));
741
- }
742
- return (_jsx(Button, { className: classnames({
743
- 'ss__chat__actions__facet__option--selected': controller.store.isFacetSelected(facet.field, optionValue),
744
- }), onClick: () => {
745
- // Non-multiselect: clicking an already-selected value toggles it off.
746
- // `addFacet` is idempotent against an existing urlManager value, so without
747
- // the toggle the state wouldn't change, `hasPendingFacetChanges` would stay
748
- // false, and the params getter would fall through to `general`.
749
- if (controller.store.isFacetSelected(facet.field, optionValue)) {
750
- controller.store.removeFacet(facet.field, optionValue);
751
- }
752
- else {
753
- controller.store.addFacet({
754
- key: facet.field,
755
- value: optionValue,
756
- });
757
- }
758
- // Force productSearch with the current filter state rather than relying
759
- // on the params getter's hasPendingFacetChanges promotion — a facet click
760
- // in the chat is unambiguously a search intent.
761
- controller.search({
762
- data: { requestType: 'productSearch', searchFilters: controller.store.searchFilters },
763
- });
764
- }, children: valueOption.label }, optionValue));
765
- }) }) }, facet.field) }, idx));
766
- }) })] }) })), (() => {
767
- const activeComparisonSearchResults = shouldShowSideChat && activeMessage?.messageType === 'productComparison'
768
- ? activeMessage.searchResults || []
769
- : null;
770
- const showCommittedComparisons = !activeComparisonSearchResults &&
771
- store.currentChat?.comparisons.committed &&
772
- store.currentChat.comparisons.committed.length > 0 &&
773
- (activeMessage?.messageType === 'user' ||
774
- activeMessage?.messageType === 'productComparison' ||
775
- activeMessage?.messageType === 'productQuery');
776
- const visibleAttachments = store.currentChat?.attachments.attached.filter((item) => item.state === 'attached' || item.state === 'active' || item.state === 'loading' || item.state === 'error') || [];
777
- const productAttachments = visibleAttachments.filter((item) => item.type === 'product' &&
778
- item.requestType !== 'productSimilar' &&
779
- item.requestType !== 'productComparison');
780
- const imageAttachments = visibleAttachments.filter((item) => item.type === 'image');
781
- const comparisonItems = activeComparisonSearchResults
782
- ? activeComparisonSearchResults.map((result) => {
783
- const d = result?.display || result;
784
- return {
785
- id: result?.id,
786
- name: d?.mappings?.core?.name || '',
787
- imageUrl: d?.mappings?.core?.thumbnailImageUrl || d?.mappings?.core?.imageUrl || d?.mappings?.core?.parentImageUrl || '',
788
- onClick: () => {
789
- controller.productQuickView(result);
790
- if (isMobile)
791
- setMobileProductInfoOpen(true);
792
- },
793
- };
794
- })
795
- : showCommittedComparisons
796
- ? (store.currentChat?.comparisons.committed || []).map((comparisonItem) => {
797
- const d = comparisonItem?.result?.display || comparisonItem?.result;
798
- return {
799
- id: comparisonItem.result?.id,
800
- name: d?.mappings?.core?.name || '',
801
- imageUrl: d?.mappings?.core?.thumbnailImageUrl || d?.mappings?.core?.imageUrl || d?.mappings?.core?.parentImageUrl || '',
802
- onClick: () => {
803
- controller.productQuickView(comparisonItem.result);
804
- if (isMobile)
805
- setMobileProductInfoOpen(true);
806
- },
807
- };
808
- })
809
- : [];
810
- const productItems = productAttachments.map((item) => {
811
- const remove = () => {
812
- store.currentChat?.attachments.remove(item.id);
813
- setMobileProductInfoOpen(false);
814
- store.currentChat?.dismissSideChat();
815
- };
816
- return {
817
- id: item.id,
818
- name: item.name || '',
819
- imageUrl: item.thumbnailUrl || '',
820
- onClick: remove,
821
- onRemove: remove,
822
- };
823
- });
824
- const imageItems = imageAttachments.map((item) => ({
825
- id: item.id,
826
- name: item.fileName || 'Image',
827
- imageUrl: item.base64 || item.thumbnailUrl || '',
828
- isLoading: item.state === 'loading',
829
- hasError: !!item.error,
830
- errorMessage: item.error?.message,
831
- onRemove: () => store.currentChat?.attachments.remove(item.id),
832
- }));
833
- const productTitle = productItems.length > 1 ? 'Compare these products' : 'Ask about this product';
834
- const hasImageError = imageItems.some((item) => item.hasError);
835
- const imageTitle = imageItems.length > 0 && !hasImageError ? 'Find products similar to this image:' : '';
836
- return (_jsxs(_Fragment, { children: [comparisonItems.length > 0 && (_jsx(ChatAttachmentContext, { ...subProps.attachmentContext, title: 'Compare these products', items: comparisonItems, onClose: () => {
837
- store.currentChat?.comparisons.resetCommitted();
838
- store.currentChat?.dismissSideChat();
839
- } })), productItems.length > 0 && (_jsx(ChatAttachmentContext, { ...subProps.attachmentContext, title: productTitle, items: productItems, onClose: () => {
840
- productAttachments.forEach((item) => store.currentChat?.attachments.remove(item.id));
841
- setMobileProductInfoOpen(false);
842
- store.currentChat?.dismissSideChat();
843
- } })), imageItems.length > 0 && _jsx(ChatAttachmentContext, { ...subProps.attachmentContext, title: imageTitle, items: imageItems })] }));
844
- })(), (() => {
845
- const drift = store.currentChat?.topicDrift;
846
- if (!drift)
847
- return null;
848
- // recommendedAction is the prescription; driftType is the diagnosis.
849
- // Hide the banner when the backend says to keep flowing, or when no drift was detected.
850
- if (drift.recommendedAction === 'CONTINUE' || drift.driftType === 'NO_DRIFT')
851
- return null;
852
- const isScopeRedirect = drift.recommendedAction === 'SCOPE_REDIRECT';
853
- const primaryText = isScopeRedirect ? "I'm here to help with shopping" : 'Looking for something new?';
854
- const secondaryText = isScopeRedirect
855
- ? 'Try asking about products, comparisons, or recommendations'
856
- : 'Start a fresh session for better assistance, or keep going in this one?';
857
- const buttonText = isScopeRedirect ? '' : 'New Session';
858
- return (_jsxs("div", { className: 'ss__chat__topic-drift', children: [_jsx(Icon, { icon: "info", size: "18px", className: 'ss__chat__topic-drift__icon--info' }), _jsxs("div", { className: 'ss__chat__topic-drift__text', children: [_jsx("span", { children: primaryText }), _jsx("span", { children: secondaryText })] }), buttonText && (_jsx(Button, { className: 'ss__chat__topic-drift__button', onClick: () => {
859
- if (isScopeRedirect) {
860
- store.currentChat?.dismissTopicDrift();
861
- return;
862
- }
863
- // Capture image attachments from the current chat before handleTopicDrift /
864
- // createChat tear down the conversation — an imageSearch that drifted needs
865
- // the same image attached to the carried-over message in the new session,
866
- // otherwise params would fall back to a `general` request without the image.
867
- const previousImageAttachments = (store.currentChat?.attachments.attached || [])
868
- .filter((item) => item.type === 'image' && item.state !== 'error')
869
- .map((item) => {
870
- const img = item;
871
- return {
872
- type: 'image',
873
- base64: img.base64,
874
- fileName: img.fileName,
875
- imageId: img.imageId,
876
- imageUrl: img.imageUrl,
877
- thumbnailUrl: img.thumbnailUrl,
878
- // Already uploaded — skip the 'loading' default state.
879
- state: 'attached',
880
- };
881
- });
882
- const messageText = store.currentChat?.handleTopicDrift();
883
- if (messageText) {
884
- controller.store.createChat();
885
- previousImageAttachments.forEach((cfg) => {
886
- controller.store.currentChat?.attachments.add(cfg);
887
- });
888
- controller.search({ data: { message: messageText } });
889
- }
890
- }, children: buttonText })), _jsx("span", { onClick: () => {
891
- store.currentChat?.dismissTopicDrift();
892
- }, children: _jsx(Icon, { icon: "close-thin", size: "14px", className: 'ss__chat__topic-drift__icon--close' }) })] }));
893
- })(), _jsxs("div", { className: 'ss__chat__input', children: [_jsxs("div", { className: 'ss__chat__input__input', children: [_jsx("input", { type: "text", name: "ss-chat-input", disabled: store.loading || store.blocked || store.currentChat?.sessionLimitReached, placeholder: (() => {
894
- const comparedCount = store.currentChat?.comparisons.compared.length || 0;
895
- const committedCount = store.currentChat?.comparisons.committed.length || 0;
896
- const attached = store.currentChat?.attachments.attached.filter((item) => item.state === 'attached' || item.state === 'active') || [];
897
- const attachedProducts = attached.filter((item) => item.type === 'product');
898
- const attachedImages = attached.filter((item) => item.type === 'image' && !item.error);
899
- if (attachedProducts.length === 1) {
900
- return 'Ask about this product...';
901
- }
902
- if (comparedCount > 1 || attachedProducts.length > 1) {
903
- return 'What would you like to compare?';
904
- }
905
- if (committedCount > 0) {
906
- return 'Ask about the compared products...';
907
- }
908
- if (attachedImages.length > 0) {
909
- return 'Ask about this image...';
910
- }
911
- if (comparedCount === 1) {
912
- return 'Add another product to compare...';
913
- }
914
- return 'Type your message...';
915
- })(), onInput: (e) => controller.handlers.input.input(e), onKeyDown: (e) => {
916
- controller.handlers.input.enterKey(e);
917
- if (e.keyCode === 13 && isMobile && mobileProductInfoOpen) {
918
- setMobileProductInfoOpen(false);
919
- }
920
- }, value: controller.store.inputValue }), store.features.imageSearch.enabled && (_jsxs(_Fragment, { children: [_jsx(Button, { className: 'ss__chat__upload-button', disabled: store.loading || store.blocked || store.currentChat?.sessionLimitReached, onClick: () => fileInputRef.current?.click(), icon: { icon: 'image', title: 'Upload Image' } }), _jsx("input", { ref: fileInputRef, onChange: async (e) => {
921
- await controller.upload(e.target.files);
922
- // reset value
923
- e.target.value = '';
924
- }, type: "file", accept: "image/*", className: "ss__chat__input__input__file" })] }))] }), _jsx("div", { className: 'ss__chat__input__actions', children: (() => {
925
- const hasImageAttachment = (store.currentChat?.attachments.attached || []).some((item) => item.type === 'image' && !item.error);
926
- const messageEmpty = !controller.store.inputValue.trim();
927
- const sendDisabled = store.blocked || store.currentChat?.sessionLimitReached || (hasImageAttachment && messageEmpty) || messageEmpty;
928
- return (_jsx(Button, { className: "ss__chat__send-button", icon: { icon: 'send', title: 'Send Message' }, disabled: sendDisabled, onClick: () => {
929
- if (sendDisabled)
930
- return;
931
- controller.search();
932
- if (isMobile && mobileProductInfoOpen) {
933
- setMobileProductInfoOpen(false);
934
- }
935
- } }));
936
- })() })] }), _jsx("div", { className: 'ss__chat__disclaimer', children: _jsxs("i", { children: ["Powered by Athos Commerce. AI-powered assistant. It sometimes make mistakes. Avoid sharing personal data.", ' ', _jsx("a", { href: "https://athoscommerce.com/legal/privacy-policy/", target: "_blank", rel: "noopener noreferrer", children: "Privacy Policy" })] }) }), isDraggingFile && (_jsxs("div", { className: "ss__chat__content__footer__drop-overlay", children: [_jsx(Icon, { icon: "image", size: "24px" }), _jsx("span", { children: "Drop image to upload" })] }))] })) : (_jsxs("div", { className: 'ss__chat__expired', children: [_jsx("div", { className: 'ss__chat__expired__message', children: "This chat is expired. Please start a new chat." }), _jsx(Button, { className: 'ss__chat__expired__button', onClick: () => {
937
- controller.store.createChat();
938
- }, children: "New Session" })] }))] })] })) : null] }), _jsx(Overlay, { style: { zIndex: 1001 }, color: "transparent", active: store.open, onClick: () => controller.handlers.button.click() })] }) }));
939
- });