@envive-ai/react-toolkit-v3 0.3.22 → 0.3.23

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 (367) hide show
  1. package/dist/AnimatedText/AnimatedText.d.cts +3 -3
  2. package/dist/AnimatedText/AnimatedText.d.ts +3 -3
  3. package/dist/CSSVariablesEditor/CssVariablesEditorComponent.d.cts +2 -2
  4. package/dist/CSSVariablesEditor/CssVariablesEditorComponent.d.ts +2 -2
  5. package/dist/CSSVariablesEditor/hooks/useGetCssVariablesOptions.cjs +1 -1
  6. package/dist/CSSVariablesEditor/hooks/useGetCssVariablesOptions.js +1 -1
  7. package/dist/CSSVariablesEditor/hooks/useGetCurrentMerchantColors.cjs +1 -1
  8. package/dist/CSSVariablesEditor/hooks/useGetCurrentMerchantColors.js +1 -1
  9. package/dist/CSSVariablesEditor/hooks/useGetDefaultCssVariables.cjs +4 -4
  10. package/dist/CSSVariablesEditor/hooks/useGetDefaultCssVariables.js +4 -4
  11. package/dist/CSSVariablesEditor/hooks/useHandleUpdateCssVars.cjs +3 -3
  12. package/dist/CSSVariablesEditor/hooks/useHandleUpdateCssVars.js +3 -3
  13. package/dist/Carousel/Carousel.d.cts +2 -2
  14. package/dist/Carousel/Carousel.d.ts +2 -2
  15. package/dist/Carousel/components/Badge.cjs +1 -1
  16. package/dist/Carousel/components/Badge.js +1 -1
  17. package/dist/Carousel/components/Container.cjs +1 -1
  18. package/dist/Carousel/components/Container.js +1 -1
  19. package/dist/ChatFooter/ChatFooter.cjs +7 -3
  20. package/dist/ChatFooter/ChatFooter.d.cts +7 -3
  21. package/dist/ChatFooter/ChatFooter.d.ts +7 -3
  22. package/dist/ChatFooter/ChatFooter.js +7 -3
  23. package/dist/ChatFooter/components/Layout.cjs +1 -1
  24. package/dist/ChatFooter/components/Layout.js +1 -1
  25. package/dist/ChatFooter/components/index.d.cts +10 -6
  26. package/dist/ChatFooter/components/index.d.ts +10 -6
  27. package/dist/ChatFooter/types/types.d.cts +16 -0
  28. package/dist/ChatFooter/types/types.d.ts +16 -0
  29. package/dist/ChatHeader/ChatHeader.cjs +2 -1
  30. package/dist/ChatHeader/ChatHeader.d.cts +2 -2
  31. package/dist/ChatHeader/ChatHeader.d.ts +2 -2
  32. package/dist/ChatHeader/ChatHeader.js +2 -1
  33. package/dist/ChatHeader/components/Handle.cjs +2 -2
  34. package/dist/ChatHeader/components/Handle.js +2 -2
  35. package/dist/ChatHeader/hooks/useGetHandleProperties.cjs +4 -2
  36. package/dist/ChatHeader/hooks/useGetHandleProperties.js +4 -2
  37. package/dist/ChatHeader/hooks/useGetLayoutProperties.cjs +1 -1
  38. package/dist/ChatHeader/hooks/useGetLayoutProperties.js +1 -1
  39. package/dist/ChatHeader/hooks/useGetToggleOptionProperties.cjs +1 -1
  40. package/dist/ChatHeader/hooks/useGetToggleOptionProperties.js +1 -1
  41. package/dist/ChatPreview/ChatPreview.cjs +6 -3
  42. package/dist/ChatPreview/ChatPreview.d.cts +2 -2
  43. package/dist/ChatPreview/ChatPreview.d.ts +2 -2
  44. package/dist/ChatPreview/ChatPreview.js +6 -3
  45. package/dist/ChatPreview/index.d.cts +2 -2
  46. package/dist/ChatPreview/index.d.ts +2 -2
  47. package/dist/ChatPreview/types/types.d.cts +13 -1
  48. package/dist/ChatPreview/types/types.d.ts +13 -1
  49. package/dist/ChatPreviewComparison/ChatPreviewComparison.cjs +6 -3
  50. package/dist/ChatPreviewComparison/ChatPreviewComparison.d.cts +2 -2
  51. package/dist/ChatPreviewComparison/ChatPreviewComparison.d.ts +2 -2
  52. package/dist/ChatPreviewComparison/ChatPreviewComparison.js +6 -3
  53. package/dist/ChatPreviewComparison/components/Layout.cjs +2 -2
  54. package/dist/ChatPreviewComparison/components/Layout.js +2 -2
  55. package/dist/ChatPreviewComparison/index.d.cts +2 -2
  56. package/dist/ChatPreviewComparison/index.d.ts +2 -2
  57. package/dist/ChatPreviewComparison/types/types.d.cts +13 -1
  58. package/dist/ChatPreviewComparison/types/types.d.ts +13 -1
  59. package/dist/ChatPreviewLoading/ChatPreviewLoading.cjs +7 -2
  60. package/dist/ChatPreviewLoading/ChatPreviewLoading.d.cts +4 -3
  61. package/dist/ChatPreviewLoading/ChatPreviewLoading.d.ts +2 -1
  62. package/dist/ChatPreviewLoading/ChatPreviewLoading.js +7 -2
  63. package/dist/ChatPreviewLoading/types/types.d.cts +4 -0
  64. package/dist/ChatPreviewLoading/types/types.d.ts +4 -0
  65. package/dist/Container/Container.d.cts +174 -174
  66. package/dist/Container/Container.d.ts +174 -174
  67. package/dist/DesignTokens/DesignTokensComponent.d.cts +2 -2
  68. package/dist/DesignTokens/DesignTokensComponent.d.ts +2 -2
  69. package/dist/DesignTokens/components/FontFamily.cjs +1 -1
  70. package/dist/DesignTokens/components/FontFamily.js +1 -1
  71. package/dist/DesignTokens/components/FontSize.cjs +1 -1
  72. package/dist/DesignTokens/components/FontSize.js +1 -1
  73. package/dist/DesignTokens/components/FontWeight.cjs +1 -1
  74. package/dist/DesignTokens/components/FontWeight.js +1 -1
  75. package/dist/DesignTokens/components/LetterSpacing.cjs +1 -1
  76. package/dist/DesignTokens/components/LetterSpacing.js +1 -1
  77. package/dist/DesignTokens/components/LineHeight.cjs +1 -1
  78. package/dist/DesignTokens/components/LineHeight.js +1 -1
  79. package/dist/DesignTokens/components/Typography.cjs +1 -1
  80. package/dist/DesignTokens/components/Typography.js +1 -1
  81. package/dist/Disclaimer/components/Container.cjs +1 -1
  82. package/dist/Disclaimer/components/Container.js +1 -1
  83. package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.cts +2 -2
  84. package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.ts +2 -2
  85. package/dist/DocumentRetrievalCard/components/Image.cjs +1 -1
  86. package/dist/DocumentRetrievalCard/components/Image.js +1 -1
  87. package/dist/DocumentRetrievalCard/components/Layout.cjs +1 -1
  88. package/dist/DocumentRetrievalCard/components/Layout.js +1 -1
  89. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Icon.cjs +1 -1
  90. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Icon.js +1 -1
  91. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Label.cjs +1 -1
  92. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Label.js +1 -1
  93. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Layout.cjs +1 -1
  94. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Layout.js +1 -1
  95. package/dist/FloatingButton/FloatingButton.d.cts +2 -2
  96. package/dist/FloatingButton/FloatingButton.d.ts +2 -2
  97. package/dist/FloatingButton/components/Button.cjs +1 -1
  98. package/dist/FloatingButton/components/Button.js +1 -1
  99. package/dist/FloatingButton/components/Container.cjs +1 -1
  100. package/dist/FloatingButton/components/Container.js +1 -1
  101. package/dist/FloatingButton/components/Wrapper.cjs +1 -1
  102. package/dist/FloatingButton/components/Wrapper.js +1 -1
  103. package/dist/FloatingChat/FloatingChat.cjs +27 -4
  104. package/dist/FloatingChat/FloatingChat.d.cts +2 -2
  105. package/dist/FloatingChat/FloatingChat.d.ts +2 -2
  106. package/dist/FloatingChat/FloatingChat.js +28 -5
  107. package/dist/FloatingChat/components/AgentMessage.cjs +2 -2
  108. package/dist/FloatingChat/components/AgentMessage.js +2 -2
  109. package/dist/FloatingChat/components/ChatMessages.cjs +1 -1
  110. package/dist/FloatingChat/components/ChatMessages.js +1 -1
  111. package/dist/FloatingChat/components/Layout.cjs +1 -1
  112. package/dist/FloatingChat/components/Layout.js +1 -1
  113. package/dist/FloatingChat/components/ProductResultsModal.cjs +1 -1
  114. package/dist/FloatingChat/components/ProductResultsModal.js +1 -1
  115. package/dist/FloatingChat/components/ResultsGridView.cjs +1 -1
  116. package/dist/FloatingChat/components/ResultsGridView.js +1 -1
  117. package/dist/FloatingChat/components/SalesAgentBadgeContent.cjs +1 -1
  118. package/dist/FloatingChat/components/SalesAgentBadgeContent.js +1 -1
  119. package/dist/FloatingChat/hooks/useChatSuggestions.cjs +3 -5
  120. package/dist/FloatingChat/hooks/useChatSuggestions.js +4 -6
  121. package/dist/Form/Form.cjs +1 -1
  122. package/dist/Form/Form.js +1 -1
  123. package/dist/Form/components/Layout.cjs +1 -1
  124. package/dist/Form/components/Layout.js +1 -1
  125. package/dist/Form/components/SubmitButtonItem.cjs +1 -1
  126. package/dist/Form/components/SubmitButtonItem.js +1 -1
  127. package/dist/Form/components/TextFieldItem.cjs +1 -1
  128. package/dist/Form/components/TextFieldItem.js +1 -1
  129. package/dist/FullPageSalesAgent/FullPageSalesAgent.cjs +24 -2
  130. package/dist/FullPageSalesAgent/FullPageSalesAgent.d.cts +5 -3
  131. package/dist/FullPageSalesAgent/FullPageSalesAgent.d.ts +5 -3
  132. package/dist/FullPageSalesAgent/FullPageSalesAgent.js +25 -3
  133. package/dist/FullPageSalesAgent/components/Layout.cjs +1 -1
  134. package/dist/FullPageSalesAgent/components/Layout.js +1 -1
  135. package/dist/Image/Image.cjs +1 -1
  136. package/dist/Image/Image.d.cts +2 -2
  137. package/dist/Image/Image.d.ts +2 -2
  138. package/dist/Image/Image.js +1 -1
  139. package/dist/ImageGallery/ImageGallery.d.cts +2 -2
  140. package/dist/ImageGallery/components/Layout.cjs +1 -1
  141. package/dist/ImageGallery/components/Layout.js +1 -1
  142. package/dist/ImageGallery/utils/functions.cjs +1 -1
  143. package/dist/ImageGallery/utils/functions.js +1 -1
  144. package/dist/MarkdownProcessor/MarkdownProcessor.d.cts +2 -2
  145. package/dist/MarkdownProcessor/MarkdownProcessor.d.ts +2 -2
  146. package/dist/Message/components/Layout.cjs +1 -1
  147. package/dist/Message/components/Layout.js +1 -1
  148. package/dist/OrderLookupCard/OrderLookupCard.cjs +1 -1
  149. package/dist/OrderLookupCard/OrderLookupCard.js +1 -1
  150. package/dist/OrderLookupCard/components/Layout.cjs +1 -1
  151. package/dist/OrderLookupCard/components/Layout.js +1 -1
  152. package/dist/OrderLookupCard/components/MoreProductsOverlay.cjs +1 -1
  153. package/dist/OrderLookupCard/components/MoreProductsOverlay.js +1 -1
  154. package/dist/OrderLookupCard/components/ProductImageGridItem.cjs +1 -1
  155. package/dist/OrderLookupCard/components/ProductImageGridItem.js +1 -1
  156. package/dist/OrderLookupCard/components/ProductImageItem.cjs +1 -1
  157. package/dist/OrderLookupCard/components/ProductImageItem.js +1 -1
  158. package/dist/OrderLookupCard/components/ProductImagesGrid.cjs +1 -1
  159. package/dist/OrderLookupCard/components/ProductImagesGrid.js +1 -1
  160. package/dist/OrderLookupCard/components/StatusLabel.cjs +1 -1
  161. package/dist/OrderLookupCard/components/StatusLabel.js +1 -1
  162. package/dist/OrderLookupCard/components/TrackOrderLink.cjs +1 -1
  163. package/dist/OrderLookupCard/components/TrackOrderLink.js +1 -1
  164. package/dist/ProductCard/ProductCard.cjs +6 -2
  165. package/dist/ProductCard/ProductCard.d.cts +6 -3
  166. package/dist/ProductCard/ProductCard.d.ts +6 -3
  167. package/dist/ProductCard/ProductCard.js +6 -2
  168. package/dist/ProductCard/index.d.cts +2 -2
  169. package/dist/ProductCard/index.d.ts +2 -2
  170. package/dist/ProductCard/types/index.d.cts +7 -1
  171. package/dist/ProductCard/types/index.d.ts +7 -1
  172. package/dist/PromptButton/PromptButton.cjs +1 -1
  173. package/dist/PromptButton/PromptButton.d.cts +2 -2
  174. package/dist/PromptButton/PromptButton.d.ts +2 -2
  175. package/dist/PromptButton/PromptButton.js +1 -1
  176. package/dist/PromptButton/components/Layout.cjs +1 -1
  177. package/dist/PromptButton/components/Layout.js +1 -1
  178. package/dist/PromptButton/components/Loading.cjs +1 -1
  179. package/dist/PromptButton/components/Loading.js +1 -1
  180. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.cjs +5 -2
  181. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.cts +6 -3
  182. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.ts +6 -3
  183. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.js +5 -2
  184. package/dist/PromptButtonCarouselWithImage/components/Layout.cjs +1 -1
  185. package/dist/PromptButtonCarouselWithImage/components/Layout.js +1 -1
  186. package/dist/PromptButtonCarouselWithImage/components/Skeleton.cjs +1 -1
  187. package/dist/PromptButtonCarouselWithImage/components/Skeleton.js +1 -1
  188. package/dist/PromptButtonCarouselWithImage/types/types.d.cts +12 -0
  189. package/dist/PromptButtonCarouselWithImage/types/types.d.ts +12 -0
  190. package/dist/PromptCarousel/PromptCarousel.cjs +1 -1
  191. package/dist/PromptCarousel/PromptCarousel.d.cts +2 -2
  192. package/dist/PromptCarousel/PromptCarousel.d.ts +2 -2
  193. package/dist/PromptCarousel/PromptCarousel.js +1 -1
  194. package/dist/ReviewCard/ReviewCard.d.cts +2 -2
  195. package/dist/ReviewCard/ReviewCard.d.ts +2 -2
  196. package/dist/ReviewCard/components/Container.cjs +1 -1
  197. package/dist/ReviewCard/components/Container.js +1 -1
  198. package/dist/ReviewCard/components/Rating.cjs +1 -2
  199. package/dist/ReviewCard/components/Rating.js +1 -2
  200. package/dist/ReviewCard/components/ReadMoreButton.cjs +1 -1
  201. package/dist/ReviewCard/components/ReadMoreButton.js +1 -1
  202. package/dist/ReviewCard/components/index.d.cts +6 -6
  203. package/dist/ReviewCard/components/index.d.ts +6 -6
  204. package/dist/SalesAgentProductCard/SalesAgentProductCard.d.cts +2 -2
  205. package/dist/SalesAgentProductCard/SalesAgentProductCard.d.ts +2 -2
  206. package/dist/SalesAgentProductCard/components/Container.cjs +1 -1
  207. package/dist/SalesAgentProductCard/components/Container.js +1 -1
  208. package/dist/SalesAgentProductCard/components/ProductImage.cjs +1 -1
  209. package/dist/SalesAgentProductCard/components/ProductImage.js +1 -1
  210. package/dist/SalesAgentProductCard/components/ProductName.cjs +1 -1
  211. package/dist/SalesAgentProductCard/components/ProductName.js +1 -1
  212. package/dist/SalesAgentProductCard/components/index.d.cts +8 -8
  213. package/dist/SalesAgentProductCard/components/index.d.ts +8 -8
  214. package/dist/SocialProof/SocialProof.cjs +6 -3
  215. package/dist/SocialProof/SocialProof.d.cts +2 -2
  216. package/dist/SocialProof/SocialProof.d.ts +2 -2
  217. package/dist/SocialProof/SocialProof.js +6 -3
  218. package/dist/SocialProof/components/Headline.cjs +1 -1
  219. package/dist/SocialProof/components/Headline.js +1 -1
  220. package/dist/SocialProof/components/LayoutFourHorizontal.cjs +1 -1
  221. package/dist/SocialProof/components/LayoutFourHorizontal.js +1 -1
  222. package/dist/SocialProof/components/Textfield.cjs +5 -2
  223. package/dist/SocialProof/components/Textfield.js +5 -2
  224. package/dist/SocialProof/index.d.cts +2 -2
  225. package/dist/SocialProof/index.d.ts +2 -2
  226. package/dist/SocialProof/types/types.d.cts +13 -1
  227. package/dist/SocialProof/types/types.d.ts +13 -1
  228. package/dist/SparkleAnimation/SparkleAnimation.d.cts +2 -2
  229. package/dist/SparkleAnimation/SparkleAnimation.d.ts +2 -2
  230. package/dist/Stack/Stack.d.cts +2 -2
  231. package/dist/Stack/Stack.d.ts +2 -2
  232. package/dist/TextField/TextField.cjs +35 -3
  233. package/dist/TextField/TextField.d.cts +5 -1
  234. package/dist/TextField/TextField.d.ts +5 -1
  235. package/dist/TextField/TextField.js +35 -3
  236. package/dist/TextField/components/Input.cjs +1 -1
  237. package/dist/TextField/components/Input.js +1 -1
  238. package/dist/TextField/components/Layout.cjs +11 -8
  239. package/dist/TextField/components/Layout.js +11 -8
  240. package/dist/TextField/components/SendIcon.cjs +1 -1
  241. package/dist/TextField/components/SendIcon.js +1 -1
  242. package/dist/TextField/components/VoiceInputButton.cjs +45 -0
  243. package/dist/TextField/components/VoiceInputButton.js +39 -0
  244. package/dist/TextField/components/index.cjs +3 -1
  245. package/dist/TextField/components/index.js +3 -1
  246. package/dist/TextField/hooks/useGetMicButtonContainerProperties.cjs +20 -0
  247. package/dist/TextField/hooks/useGetMicButtonContainerProperties.js +19 -0
  248. package/dist/TextField/hooks/useGetSkeletonProperties.cjs +1 -1
  249. package/dist/TextField/hooks/useGetSkeletonProperties.js +1 -1
  250. package/dist/TextField/hooks/useVoiceInput.cjs +59 -0
  251. package/dist/TextField/hooks/useVoiceInput.js +57 -0
  252. package/dist/TextField/types/index.d.cts +11 -0
  253. package/dist/TextField/types/index.d.ts +11 -0
  254. package/dist/TextField/utils/getLayoutStateProperties.cjs +9 -1
  255. package/dist/TextField/utils/getLayoutStateProperties.js +8 -1
  256. package/dist/Title/Title.cjs +1 -1
  257. package/dist/Title/Title.js +1 -1
  258. package/dist/Title/components/Layout.cjs +1 -1
  259. package/dist/Title/components/Layout.js +1 -1
  260. package/dist/TitledPromptCarousel/TitledPromptCarousel.cjs +1 -1
  261. package/dist/TitledPromptCarousel/TitledPromptCarousel.d.cts +2 -2
  262. package/dist/TitledPromptCarousel/TitledPromptCarousel.d.ts +2 -2
  263. package/dist/TitledPromptCarousel/TitledPromptCarousel.js +1 -1
  264. package/dist/Tokens/index.cjs +6 -6
  265. package/dist/Tokens/index.js +6 -6
  266. package/dist/TypingAnimation/TypingAnimation.cjs +7 -3
  267. package/dist/TypingAnimation/TypingAnimation.d.cts +2 -2
  268. package/dist/TypingAnimation/TypingAnimation.d.ts +2 -2
  269. package/dist/TypingAnimation/TypingAnimation.js +7 -3
  270. package/dist/TypingAnimation/index.d.cts +2 -2
  271. package/dist/TypingAnimation/index.d.ts +2 -2
  272. package/dist/TypingAnimation/types/index.d.cts +13 -1
  273. package/dist/TypingAnimation/types/index.d.ts +13 -1
  274. package/dist/Typography/Typography.d.cts +4 -4
  275. package/dist/Typography/Typography.d.ts +4 -4
  276. package/dist/WelcomeMessage/components/Container.cjs +1 -1
  277. package/dist/WelcomeMessage/components/Container.js +1 -1
  278. package/dist/WidgetTextField/WidgetTextField.cjs +39 -7
  279. package/dist/WidgetTextField/WidgetTextField.d.cts +7 -3
  280. package/dist/WidgetTextField/WidgetTextField.d.ts +7 -3
  281. package/dist/WidgetTextField/WidgetTextField.js +33 -2
  282. package/dist/WidgetTextField/components/Container.cjs +32 -26
  283. package/dist/WidgetTextField/components/Container.js +32 -26
  284. package/dist/WidgetTextField/components/Skeleton.cjs +1 -1
  285. package/dist/WidgetTextField/components/Skeleton.js +1 -1
  286. package/dist/WidgetTextField/hooks/useGetContainerProperties.cjs +5 -3
  287. package/dist/WidgetTextField/hooks/useGetContainerProperties.js +5 -3
  288. package/dist/WidgetTextField/hooks/useGetMicWidgetButtonProperties.cjs +20 -0
  289. package/dist/WidgetTextField/hooks/useGetMicWidgetButtonProperties.js +19 -0
  290. package/dist/WidgetTextField/types/types.d.cts +21 -0
  291. package/dist/WidgetTextField/types/types.d.ts +21 -0
  292. package/dist/WidgetWrapper/WidgetWrapper.cjs +1 -1
  293. package/dist/WidgetWrapper/WidgetWrapper.d.cts +2 -2
  294. package/dist/WidgetWrapper/WidgetWrapper.d.ts +2 -2
  295. package/dist/WidgetWrapper/WidgetWrapper.js +1 -1
  296. package/dist/WidgetWrapper/hooks/useGetWrapperProperties.cjs +1 -1
  297. package/dist/WidgetWrapper/hooks/useGetWrapperProperties.js +1 -1
  298. package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.cts +2 -2
  299. package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.ts +2 -2
  300. package/dist/node_modules/jotai/esm/react.cjs +87 -0
  301. package/dist/node_modules/jotai/esm/react.js +88 -2
  302. package/dist/node_modules/jotai/esm/vanilla/internals.cjs +2 -1
  303. package/dist/node_modules/jotai/esm/vanilla/internals.js +1 -1
  304. package/dist/packages/components-v3/tokens/typography/typography.cjs +1 -1
  305. package/dist/packages/components-v3/tokens/typography/typography.js +1 -1
  306. package/dist/styles.css +1 -1
  307. package/dist/utils/resolveTheme.cjs +1 -1
  308. package/dist/utils/resolveTheme.js +1 -1
  309. package/package.json +2 -1
  310. package/src/components/ChatFooter/ChatFooter.tsx +8 -0
  311. package/src/components/ChatFooter/__tests__/ChatFooter.test.tsx +43 -0
  312. package/src/components/ChatFooter/components/TextField.tsx +12 -0
  313. package/src/components/ChatFooter/types/types.ts +17 -0
  314. package/src/components/ChatHeader/ChatHeader.tsx +1 -0
  315. package/src/components/ChatHeader/components/Handle.tsx +7 -2
  316. package/src/components/ChatHeader/hooks/useGetHandleProperties.ts +5 -1
  317. package/src/components/ChatHeader/hooks/useGetToggleOptionProperties.ts +1 -1
  318. package/src/components/ChatHeader/types/index.ts +1 -0
  319. package/src/components/ChatPreview/ChatPreview.tsx +13 -2
  320. package/src/components/ChatPreview/__tests__/ChatPreview.test.tsx +44 -0
  321. package/src/components/ChatPreview/index.ts +1 -1
  322. package/src/components/ChatPreview/types/types.ts +13 -0
  323. package/src/components/ChatPreviewComparison/ChatPreviewComparison.tsx +6 -0
  324. package/src/components/ChatPreviewComparison/__tests__/ChatPreviewComparison.test.tsx +44 -0
  325. package/src/components/ChatPreviewComparison/index.ts +1 -1
  326. package/src/components/ChatPreviewComparison/types/types.ts +13 -0
  327. package/src/components/ChatPreviewLoading/ChatPreviewLoading.tsx +5 -3
  328. package/src/components/ChatPreviewLoading/__tests__/ChatPreviewLoading.test.tsx +40 -0
  329. package/src/components/ChatPreviewLoading/types/types.ts +5 -0
  330. package/src/components/FloatingChat/FloatingChat.tsx +38 -7
  331. package/src/components/FloatingChat/hooks/useChatSuggestions.ts +8 -12
  332. package/src/components/FullPageSalesAgent/FullPageSalesAgent.tsx +32 -1
  333. package/src/components/ProductCard/ProductCard.tsx +7 -0
  334. package/src/components/ProductCard/__tests__/ProductCard.test.tsx +33 -0
  335. package/src/components/ProductCard/index.ts +1 -1
  336. package/src/components/ProductCard/types/index.ts +6 -0
  337. package/src/components/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.tsx +6 -0
  338. package/src/components/PromptButtonCarouselWithImage/__tests__/PromptButtonCarouselWithImage.test.tsx +34 -0
  339. package/src/components/PromptButtonCarouselWithImage/types/types.ts +12 -0
  340. package/src/components/ReviewCard/components/Rating.tsx +0 -1
  341. package/src/components/SocialProof/SocialProof.tsx +6 -0
  342. package/src/components/SocialProof/__tests__/SocialProof.test.tsx +58 -0
  343. package/src/components/SocialProof/components/Textfield.tsx +9 -0
  344. package/src/components/SocialProof/index.ts +1 -1
  345. package/src/components/SocialProof/types/types.ts +13 -0
  346. package/src/components/TextField/TextField.tsx +49 -0
  347. package/src/components/TextField/__tests__/TextField.test.tsx +3 -3
  348. package/src/components/TextField/__tests__/VoiceInputButton.test.tsx +175 -0
  349. package/src/components/TextField/components/Layout.tsx +24 -17
  350. package/src/components/TextField/components/VoiceInputButton.tsx +69 -0
  351. package/src/components/TextField/components/index.ts +2 -0
  352. package/src/components/TextField/hooks/useGetMicButtonContainerProperties.ts +38 -0
  353. package/src/components/TextField/hooks/useGetSkeletonProperties.ts +1 -1
  354. package/src/components/TextField/hooks/useVoiceInput.ts +77 -0
  355. package/src/components/TextField/types/index.ts +11 -0
  356. package/src/components/TextField/utils/getLayoutStateProperties.ts +8 -0
  357. package/src/components/TypingAnimation/TypingAnimation.tsx +7 -0
  358. package/src/components/TypingAnimation/__tests__/TypingAnimation.test.tsx +47 -0
  359. package/src/components/TypingAnimation/index.ts +1 -1
  360. package/src/components/TypingAnimation/types/index.ts +14 -1
  361. package/src/components/WidgetTextField/WidgetTextField.tsx +47 -0
  362. package/src/components/WidgetTextField/__tests__/WidgetTextField.test.tsx +119 -4
  363. package/src/components/WidgetTextField/components/Container.tsx +40 -27
  364. package/src/components/WidgetTextField/hooks/useGetContainerProperties.ts +16 -4
  365. package/src/components/WidgetTextField/hooks/useGetMicWidgetButtonProperties.ts +38 -0
  366. package/src/components/WidgetTextField/types/types.ts +21 -0
  367. package/src/components/WidgetWrapper/hooks/useGetWrapperProperties.ts +1 -1
@@ -25,8 +25,14 @@ export const ChatPreview = ({
25
25
  hexCardColor,
26
26
  } = widgetStyleProps ?? {};
27
27
 
28
- const { messageText, promptButtons, textFieldPlaceholderText, logoSrc, titleLabel } =
29
- widgetContentProps ?? {};
28
+ const {
29
+ messageText,
30
+ promptButtons,
31
+ textFieldPlaceholderText,
32
+ logoSrc,
33
+ titleLabel,
34
+ voiceInputEnabled,
35
+ } = widgetContentProps ?? {};
30
36
 
31
37
  const {
32
38
  handlePromptButtonClick,
@@ -38,6 +44,8 @@ export const ChatPreview = ({
38
44
  handlePromptButtonTouchEnd,
39
45
  handleLinkClick,
40
46
  handleTextFieldClick,
47
+ onTranscriptionStarted,
48
+ onTranscriptionCompleted,
41
49
  } = widgetEventProps ?? {};
42
50
 
43
51
  const suggestionTextMap = useMemo(() => {
@@ -85,6 +93,9 @@ export const ChatPreview = ({
85
93
  theme={finalTheme}
86
94
  placeholder={textFieldPlaceholderText ?? ''}
87
95
  onClick={() => handleTextFieldClick?.()}
96
+ enableVoiceInput={voiceInputEnabled}
97
+ onTranscriptionStarted={onTranscriptionStarted}
98
+ onTranscriptionCompleted={onTranscriptionCompleted}
88
99
  />
89
100
  );
90
101
 
@@ -399,4 +399,48 @@ describe('ChatPreview', () => {
399
399
  expect(emptyHandler).toHaveBeenCalledTimes(1);
400
400
  });
401
401
  });
402
+
403
+ describe('Voice input', () => {
404
+ it('should render with voiceInputEnabled set to true', async () => {
405
+ render(
406
+ <ChatPreview
407
+ {...defaultProps}
408
+ widgetContentProps={{
409
+ ...defaultProps.widgetContentProps,
410
+ voiceInputEnabled: true,
411
+ }}
412
+ widgetStyleProps={{ hideTextField: false }}
413
+ />,
414
+ );
415
+ expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
416
+ });
417
+
418
+ it('should render with voiceInputEnabled set to false', () => {
419
+ render(
420
+ <ChatPreview
421
+ {...defaultProps}
422
+ widgetContentProps={{
423
+ ...defaultProps.widgetContentProps,
424
+ voiceInputEnabled: false,
425
+ }}
426
+ widgetStyleProps={{ hideTextField: false }}
427
+ />,
428
+ );
429
+ expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
430
+ });
431
+
432
+ it('should render with voiceInputEnabled undefined (default)', () => {
433
+ render(
434
+ <ChatPreview
435
+ {...defaultProps}
436
+ widgetContentProps={{
437
+ ...defaultProps.widgetContentProps,
438
+ voiceInputEnabled: undefined,
439
+ }}
440
+ widgetStyleProps={{ hideTextField: false }}
441
+ />,
442
+ );
443
+ expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
444
+ });
445
+ });
402
446
  });
@@ -1,2 +1,2 @@
1
1
  export { ChatPreview } from './ChatPreview';
2
- export type { ChatPreviewProps } from './types/types';
2
+ export type { ChatPreviewProps, WidgetEventProps } from './types/types';
@@ -66,6 +66,11 @@ export type WidgetContentProps = {
66
66
  * Displayed when the text field is visible.
67
67
  */
68
68
  textFieldPlaceholderText?: string;
69
+
70
+ /**
71
+ * Whether to enable voice input.
72
+ */
73
+ voiceInputEnabled?: boolean;
69
74
  };
70
75
 
71
76
  /**
@@ -170,6 +175,14 @@ export type WidgetEventProps = {
170
175
  * Callback function invoked when the text field is clicked.
171
176
  */
172
177
  handleTextFieldClick?: () => void;
178
+ /**
179
+ * Callback function invoked when voice transcription starts.
180
+ */
181
+ onTranscriptionStarted?: () => void;
182
+ /**
183
+ * Callback function invoked when voice transcription completes.
184
+ */
185
+ onTranscriptionCompleted?: (transcript: string) => void;
173
186
  };
174
187
 
175
188
  /**
@@ -34,6 +34,7 @@ export const ChatPreviewComparison = ({
34
34
  images,
35
35
  logoSrc,
36
36
  titleLabel,
37
+ voiceInputEnabled,
37
38
  } = widgetContentProps ?? {};
38
39
 
39
40
  const {
@@ -46,6 +47,8 @@ export const ChatPreviewComparison = ({
46
47
  handlePromptButtonTouchEnd,
47
48
  handleLinkClick,
48
49
  handleTextFieldClick,
50
+ onTranscriptionStarted,
51
+ onTranscriptionCompleted,
49
52
  } = widgetEventProps ?? {};
50
53
 
51
54
  const finalTheme = resolveTheme(theme);
@@ -101,6 +104,9 @@ export const ChatPreviewComparison = ({
101
104
  theme={finalTheme}
102
105
  placeholder={textFieldPlaceholderText ?? ''}
103
106
  onClick={() => handleTextFieldClick?.()}
107
+ enableVoiceInput={voiceInputEnabled}
108
+ onTranscriptionStarted={onTranscriptionStarted}
109
+ onTranscriptionCompleted={onTranscriptionCompleted}
104
110
  />
105
111
  );
106
112
 
@@ -418,4 +418,48 @@ describe('ChatPreviewComparison', () => {
418
418
  expect(screen.getByText('Button 1')).toBeInTheDocument();
419
419
  });
420
420
  });
421
+
422
+ describe('Voice input', () => {
423
+ it('should render with voiceInputEnabled set to true', () => {
424
+ render(
425
+ <ChatPreviewComparison
426
+ {...defaultProps}
427
+ widgetContentProps={{
428
+ ...defaultProps.widgetContentProps,
429
+ voiceInputEnabled: true,
430
+ }}
431
+ widgetStyleProps={{ hideTextField: false }}
432
+ />,
433
+ );
434
+ expect(screen.getByText('Compare these products')).toBeInTheDocument();
435
+ });
436
+
437
+ it('should render with voiceInputEnabled set to false', () => {
438
+ render(
439
+ <ChatPreviewComparison
440
+ {...defaultProps}
441
+ widgetContentProps={{
442
+ ...defaultProps.widgetContentProps,
443
+ voiceInputEnabled: false,
444
+ }}
445
+ widgetStyleProps={{ hideTextField: false }}
446
+ />,
447
+ );
448
+ expect(screen.getByText('Compare these products')).toBeInTheDocument();
449
+ });
450
+
451
+ it('should render with voiceInputEnabled undefined (default)', () => {
452
+ render(
453
+ <ChatPreviewComparison
454
+ {...defaultProps}
455
+ widgetContentProps={{
456
+ ...defaultProps.widgetContentProps,
457
+ voiceInputEnabled: undefined,
458
+ }}
459
+ widgetStyleProps={{ hideTextField: false }}
460
+ />,
461
+ );
462
+ expect(screen.getByText('Compare these products')).toBeInTheDocument();
463
+ });
464
+ });
421
465
  });
@@ -1,2 +1,2 @@
1
1
  export { ChatPreviewComparison } from './ChatPreviewComparison';
2
- export type { ChatPreviewComparisonProps } from './types/types';
2
+ export type { ChatPreviewComparisonProps, WidgetEventProps } from './types/types';
@@ -72,6 +72,11 @@ export type WidgetContentProps = {
72
72
  * Array of image objects for the images.
73
73
  */
74
74
  images?: ImageGalleryImage[];
75
+
76
+ /**
77
+ * Whether to enable voice input.
78
+ */
79
+ voiceInputEnabled?: boolean;
75
80
  };
76
81
 
77
82
  /**
@@ -176,6 +181,14 @@ export type WidgetEventProps = {
176
181
  * Callback function invoked when the text field is clicked.
177
182
  */
178
183
  handleTextFieldClick?: () => void;
184
+ /**
185
+ * Callback function invoked when voice transcription starts.
186
+ */
187
+ onTranscriptionStarted?: () => void;
188
+ /**
189
+ * Callback function invoked when voice transcription completes.
190
+ */
191
+ onTranscriptionCompleted?: (transcript: string) => void;
179
192
  };
180
193
 
181
194
  /**
@@ -1,8 +1,8 @@
1
1
  import { useMemo } from 'react';
2
- import { WidgetWrapperVariant } from '../WidgetWrapper';
3
2
  import { Stack } from '../Stack';
4
- import { ChatPreviewLoadingComponents } from './components';
5
3
  import { WidgetTextField } from '../WidgetTextField';
4
+ import { WidgetWrapperVariant } from '../WidgetWrapper';
5
+ import { ChatPreviewLoadingComponents } from './components';
6
6
  import { ChatPreviewLoadingProps } from './types/types';
7
7
 
8
8
  export const ChatPreviewLoading = ({
@@ -18,6 +18,7 @@ export const ChatPreviewLoading = ({
18
18
  hideLogo,
19
19
  logoSrc,
20
20
  titleLabel,
21
+ voiceInputEnabled,
21
22
  }: ChatPreviewLoadingProps) => {
22
23
  const textfield = useMemo(() => {
23
24
  if (fullIsLoading) {
@@ -29,10 +30,11 @@ export const ChatPreviewLoading = ({
29
30
  return (
30
31
  <WidgetTextField
31
32
  placeholder={textFieldPlaceholder ?? ''}
33
+ enableVoiceInput={voiceInputEnabled}
32
34
  disabled
33
35
  />
34
36
  );
35
- }, [fullIsLoading, textFieldPlaceholder]);
37
+ }, [fullIsLoading, textFieldPlaceholder, voiceInputEnabled]);
36
38
 
37
39
  const headline = useMemo(
38
40
  () => (
@@ -330,4 +330,44 @@ describe('ChatPreviewLoading', () => {
330
330
  expect(skeletons.length).toBeGreaterThanOrEqual(6);
331
331
  });
332
332
  });
333
+
334
+ describe('Voice input', () => {
335
+ it('should render with voiceInputEnabled set to true', async () => {
336
+ render(
337
+ <ChatPreviewLoading
338
+ {...defaultProps}
339
+ voiceInputEnabled
340
+ fullIsLoading={false}
341
+ hideTextField={false}
342
+ />,
343
+ );
344
+ await waitFor(() => {
345
+ expect(screen.getByText('What can I help you find?')).toBeInTheDocument();
346
+ });
347
+ });
348
+
349
+ it('should render with voiceInputEnabled set to false', () => {
350
+ render(
351
+ <ChatPreviewLoading
352
+ {...defaultProps}
353
+ voiceInputEnabled={false}
354
+ fullIsLoading={false}
355
+ hideTextField={false}
356
+ />,
357
+ );
358
+ expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
359
+ });
360
+
361
+ it('should render with voiceInputEnabled undefined (default)', () => {
362
+ render(
363
+ <ChatPreviewLoading
364
+ {...defaultProps}
365
+ voiceInputEnabled={undefined}
366
+ fullIsLoading={false}
367
+ hideTextField={false}
368
+ />,
369
+ );
370
+ expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
371
+ });
372
+ });
333
373
  });
@@ -50,6 +50,11 @@ export type ChatPreviewLoadingProps = {
50
50
  */
51
51
  hideTextField?: boolean;
52
52
 
53
+ /**
54
+ * Whether to enable voice input.
55
+ */
56
+ voiceInputEnabled?: boolean;
57
+
53
58
  /**
54
59
  * Placeholder text displayed in the text field.
55
60
  * Only used when `fullIsLoading` is `false` and `hideTextField` is `false`.
@@ -1,13 +1,13 @@
1
- import { useEffect, useMemo, useRef, useState } from 'react';
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
 
3
3
  import { ChatElementDisplayLocationV3 } from '@envive-ai/react-hooks/application/models';
4
- import { motion } from 'framer-motion';
4
+ import { EnviveMetricsEventName } from '@envive-ai/react-hooks/contexts/amplitudeContext';
5
+ import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
5
6
  import {
6
7
  WidgetInteractionComponent,
7
8
  WidgetInteractionType,
8
9
  } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
9
- import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
10
- import { EnviveMetricsEventName } from '@envive-ai/react-hooks/contexts/amplitudeContext';
10
+ import { motion } from 'framer-motion';
11
11
  import { Theme } from '../../../tokens/theme/theme';
12
12
  import { ColorNames } from '../../models/colorsConfig';
13
13
 
@@ -24,12 +24,12 @@ import { useScrollToBottom } from './hooks/useScrollToBottom';
24
24
  import { useSnapSetup } from './hooks/useSnapSetup';
25
25
 
26
26
  import { Disclaimer } from '../Disclaimer';
27
+ import { SalesAgentProductCardProps } from '../SalesAgentProductCard/types/types';
27
28
  import { resolveTheme } from '../utils/resolveTheme';
29
+ import { FloatingChatComponents, ModalSheet } from './components';
28
30
  import { useFilteredChatMessages } from './hooks/useFilteredChatMessages';
29
31
  import { Unit } from './hooks/useSnapCalculator';
30
32
  import { FloatingChatProps } from './types/types';
31
- import { FloatingChatComponents, ModalSheet } from './components';
32
- import { SalesAgentProductCardProps } from '../SalesAgentProductCard/types/types';
33
33
  import { trackProductCardClicked } from './utils/trackProductCardInteraction';
34
34
 
35
35
  export const FloatingChat = ({
@@ -93,7 +93,8 @@ export const FloatingChat = ({
93
93
  return undefined;
94
94
  }, [disclaimerText]);
95
95
 
96
- const { agentName, chatHeaderLogoDarkSrc, chatHeaderLogoLightSrc } = lookAndFeelConfig;
96
+ const { agentName, chatHeaderLogoDarkSrc, chatHeaderLogoLightSrc, voiceInputEnabled } =
97
+ lookAndFeelConfig;
97
98
 
98
99
  const {
99
100
  messages,
@@ -217,6 +218,32 @@ export const FloatingChat = ({
217
218
  );
218
219
  };
219
220
 
221
+ const handleTranscriptionStarted = useCallback(() => {
222
+ trackWidgetInteraction({
223
+ eventName: EnviveMetricsEventName.WidgetInteraction,
224
+ trigger: {
225
+ widget: WidgetInteractionComponent.FLOATING_CHAT,
226
+ widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_STARTED,
227
+ },
228
+ });
229
+ }, [trackWidgetInteraction]);
230
+
231
+ const handleTranscriptionCompleted = useCallback(
232
+ (transcript: string) => {
233
+ trackWidgetInteraction({
234
+ eventName: EnviveMetricsEventName.WidgetInteraction,
235
+ trigger: {
236
+ widget: WidgetInteractionComponent.FLOATING_CHAT,
237
+ widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_COMPLETED,
238
+ widget_interaction_data: {
239
+ transcription: transcript,
240
+ },
241
+ },
242
+ });
243
+ },
244
+ [trackWidgetInteraction],
245
+ );
246
+
220
247
  const header = (
221
248
  <ChatHeader
222
249
  logoDark={chatHeaderLogoDarkSrc}
@@ -281,6 +308,7 @@ export const FloatingChat = ({
281
308
  theme={finalTheme}
282
309
  isScrolled={isMobile ? isFloatingLayout : false}
283
310
  onChange={setQuery}
311
+ inputClassName="placeholder:envive-tw-text-text-secondary"
284
312
  onSubmit={() => {
285
313
  onTypedMessageSubmitted({
286
314
  query,
@@ -315,6 +343,9 @@ export const FloatingChat = ({
315
343
  hideEnviveWatermark={!showEnviveLogo}
316
344
  onFocus={handleInputQueryFocus}
317
345
  parentWidget={WidgetInteractionComponent.FLOATING_CHAT}
346
+ voiceInputEnabled={voiceInputEnabled}
347
+ onTranscriptionStarted={handleTranscriptionStarted}
348
+ onTranscriptionCompleted={handleTranscriptionCompleted}
318
349
  />
319
350
  );
320
351
 
@@ -1,4 +1,4 @@
1
- import { useEffect, useState } from 'react';
1
+ import { useLayoutEffect, useState } from 'react';
2
2
  import { Suggestion } from '@envive-ai/react-hooks/application/models';
3
3
 
4
4
  export interface UseChatSuggestionsProps {
@@ -26,17 +26,13 @@ export const useChatSuggestions = ({
26
26
  const showAnswerSuggestions =
27
27
  answerSuggestions.length > 0 && !isPendingResponse && !isResponseStreaming;
28
28
 
29
- useEffect(() => {
30
- if (suggestions.length > 0) {
31
- setAnswerSuggestions(
32
- suggestions.filter(suggestion => suggestion.isAnswer).map(suggestion => suggestion.content),
33
- );
34
- setGeneralSuggestions(
35
- suggestions
36
- .filter(suggestion => !suggestion.isAnswer)
37
- .map(suggestion => suggestion.content),
38
- );
39
- }
29
+ useLayoutEffect(() => {
30
+ setAnswerSuggestions(
31
+ suggestions.filter(suggestion => suggestion.isAnswer).map(suggestion => suggestion.content),
32
+ );
33
+ setGeneralSuggestions(
34
+ suggestions.filter(suggestion => !suggestion.isAnswer).map(suggestion => suggestion.content),
35
+ );
40
36
  }, [suggestions]);
41
37
 
42
38
  return {
@@ -8,7 +8,7 @@ import {
8
8
  WidgetInteractionComponent,
9
9
  WidgetInteractionType,
10
10
  } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
11
- import { useRef, useState } from 'react';
11
+ import { useCallback, useRef, useState } from 'react';
12
12
  import { ChatFooter } from '../ChatFooter';
13
13
  import { Disclaimer } from '../Disclaimer';
14
14
  import { FloatingChatComponents } from '../FloatingChat/components';
@@ -40,6 +40,7 @@ interface FullPageSalesAgentProps {
40
40
  hardcopyContent: HardcopyResponse;
41
41
  headerContainer?: string;
42
42
  autoHeight?: boolean;
43
+ voiceInputEnabled?: boolean;
43
44
  }
44
45
 
45
46
  export const FullPageSalesAgent = ({
@@ -49,6 +50,7 @@ export const FullPageSalesAgent = ({
49
50
  hardcopyContent,
50
51
  headerContainer,
51
52
  autoHeight,
53
+ voiceInputEnabled,
52
54
  }: FullPageSalesAgentProps) => {
53
55
  const resolvedTheme = resolveTheme(theme);
54
56
  const salesAgentData = useSalesAgent(WidgetInteractionComponent.FULL_PAGE_SALES_AGENT);
@@ -153,6 +155,32 @@ export const FullPageSalesAgent = ({
153
155
  );
154
156
  };
155
157
 
158
+ const handleTranscriptionStarted = useCallback(() => {
159
+ trackWidgetInteraction({
160
+ eventName: EnviveMetricsEventName.WidgetInteraction,
161
+ trigger: {
162
+ widget: WidgetInteractionComponent.FULL_PAGE_SALES_AGENT,
163
+ widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_STARTED,
164
+ },
165
+ });
166
+ }, [trackWidgetInteraction]);
167
+
168
+ const handleTranscriptionCompleted = useCallback(
169
+ (transcript: string) => {
170
+ trackWidgetInteraction({
171
+ eventName: EnviveMetricsEventName.WidgetInteraction,
172
+ trigger: {
173
+ widget: WidgetInteractionComponent.FULL_PAGE_SALES_AGENT,
174
+ widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_COMPLETED,
175
+ widget_interaction_data: {
176
+ transcription: transcript,
177
+ },
178
+ },
179
+ });
180
+ },
181
+ [trackWidgetInteraction],
182
+ );
183
+
156
184
  const welcomeMessage = (
157
185
  <div className={messageContainerClasses}>
158
186
  <WelcomeMessage
@@ -205,6 +233,9 @@ export const FullPageSalesAgent = ({
205
233
  }}
206
234
  onFocus={handleInputQueryFocus}
207
235
  parentWidget={WidgetInteractionComponent.FULL_PAGE_SALES_AGENT}
236
+ voiceInputEnabled={voiceInputEnabled}
237
+ onTranscriptionStarted={handleTranscriptionStarted}
238
+ onTranscriptionCompleted={handleTranscriptionCompleted}
208
239
  />
209
240
  );
210
241
 
@@ -20,6 +20,7 @@ export const ProductCard = ({
20
20
  textTypingDuration,
21
21
  textTransition,
22
22
  loop,
23
+ voiceInputEnabled,
23
24
  onSelect,
24
25
  onDrag,
25
26
  onHover,
@@ -28,6 +29,8 @@ export const ProductCard = ({
28
29
  onTouchStart,
29
30
  onTouchEnd,
30
31
  onInputClick,
32
+ onTranscriptionStarted,
33
+ onTranscriptionCompleted,
31
34
  }: ProductCardProps) => {
32
35
  const resolvedTheme = resolveTheme(theme);
33
36
 
@@ -59,8 +62,12 @@ export const ProductCard = ({
59
62
  />
60
63
  <WidgetTextField
61
64
  theme={resolvedTheme}
65
+ minimalFrame={resolvedTheme === Theme.MINIMAL ? 'bottom-only' : 'full'}
62
66
  placeholder={placeholder}
63
67
  onClick={onInputClick}
68
+ enableVoiceInput={voiceInputEnabled}
69
+ onTranscriptionStarted={onTranscriptionStarted}
70
+ onTranscriptionCompleted={onTranscriptionCompleted}
64
71
  textColor={
65
72
  resolvedTheme === Theme.MINIMAL
66
73
  ? TypographyColor.TEXT_LIGHT
@@ -259,5 +259,38 @@ describe('ProductCard', () => {
259
259
  expect(screen.getByText('Test Product')).toBeInTheDocument();
260
260
  expect(screen.getByText('Prompt 1')).toBeInTheDocument();
261
261
  });
262
+
263
+ it('should render with voiceInputEnabled set to true', () => {
264
+ render(
265
+ <ProductCard
266
+ {...defaultProps}
267
+ voiceInputEnabled
268
+ />,
269
+ );
270
+
271
+ expect(screen.getByText('Test Product')).toBeInTheDocument();
272
+ });
273
+
274
+ it('should render with voiceInputEnabled set to false', () => {
275
+ render(
276
+ <ProductCard
277
+ {...defaultProps}
278
+ voiceInputEnabled={false}
279
+ />,
280
+ );
281
+
282
+ expect(screen.getByText('Test Product')).toBeInTheDocument();
283
+ });
284
+
285
+ it('should render with voiceInputEnabled undefined (default)', () => {
286
+ render(
287
+ <ProductCard
288
+ {...defaultProps}
289
+ voiceInputEnabled={undefined}
290
+ />,
291
+ );
292
+
293
+ expect(screen.getByText('Test Product')).toBeInTheDocument();
294
+ });
262
295
  });
263
296
  });
@@ -1,2 +1,2 @@
1
1
  export { ProductCard } from './ProductCard';
2
- export type { ProductCardProps } from './types';
2
+ export type { ProductCardProps, InputProps } from './types';
@@ -94,6 +94,12 @@ export interface InputProps {
94
94
  onInputClick: () => void;
95
95
  /** Placeholder text displayed in the input field. */
96
96
  placeholder?: string;
97
+ /** Whether to enable voice input. */
98
+ voiceInputEnabled?: boolean;
99
+ /** Callback function invoked when voice transcription starts. */
100
+ onTranscriptionStarted?: () => void;
101
+ /** Callback function invoked when voice transcription completes. */
102
+ onTranscriptionCompleted?: (transcript: string) => void;
97
103
  }
98
104
 
99
105
  /**
@@ -13,6 +13,7 @@ export const PromptButtonCarouselWithImage = ({
13
13
  alt,
14
14
  isLoading,
15
15
  hideTextField,
16
+ voiceInputEnabled,
16
17
  title,
17
18
  promptButtonsTexts,
18
19
  promptButtonType,
@@ -25,6 +26,8 @@ export const PromptButtonCarouselWithImage = ({
25
26
  handlePromptButtonTouchEnd,
26
27
  textFieldPlaceholder,
27
28
  handleTextFieldClick,
29
+ onTranscriptionStarted,
30
+ onTranscriptionCompleted,
28
31
  }: PromptButtonCarouselWithImageProps) => {
29
32
  const finalTheme = resolveTheme(theme);
30
33
 
@@ -49,6 +52,9 @@ export const PromptButtonCarouselWithImage = ({
49
52
  className={finalTheme === Theme.MINIMAL ? '!envive-tw-border-border-medium' : undefined}
50
53
  onClick={() => handleTextFieldClick(textFieldPlaceholder)}
51
54
  theme={finalTheme}
55
+ enableVoiceInput={voiceInputEnabled}
56
+ onTranscriptionStarted={onTranscriptionStarted}
57
+ onTranscriptionCompleted={onTranscriptionCompleted}
52
58
  />
53
59
  }
54
60
  image={
@@ -513,4 +513,38 @@ describe('PromptButtonCarouselWithImage', () => {
513
513
  }).not.toThrow();
514
514
  });
515
515
  });
516
+
517
+ describe('Voice input', () => {
518
+ it('should render with voiceInputEnabled set to true', () => {
519
+ setMobile(true);
520
+ render(
521
+ <PromptButtonCarouselWithImage
522
+ {...defaultProps}
523
+ voiceInputEnabled
524
+ />,
525
+ );
526
+ expect(screen.getByText('Type something...')).toBeInTheDocument();
527
+ setMobile(false);
528
+ });
529
+
530
+ it('should render with voiceInputEnabled set to false', () => {
531
+ render(
532
+ <PromptButtonCarouselWithImage
533
+ {...defaultProps}
534
+ voiceInputEnabled={false}
535
+ />,
536
+ );
537
+ expect(screen.getByText('Type something...')).toBeInTheDocument();
538
+ });
539
+
540
+ it('should render with voiceInputEnabled undefined (default)', () => {
541
+ render(
542
+ <PromptButtonCarouselWithImage
543
+ {...defaultProps}
544
+ voiceInputEnabled={undefined}
545
+ />,
546
+ );
547
+ expect(screen.getByText('Type something...')).toBeInTheDocument();
548
+ });
549
+ });
516
550
  });