@envive-ai/react-toolkit-v3 0.3.21 → 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 (284) 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/Carousel/Carousel.cjs +1 -1
  6. package/dist/Carousel/Carousel.d.cts +2 -2
  7. package/dist/Carousel/Carousel.d.ts +2 -2
  8. package/dist/Carousel/Carousel.js +1 -1
  9. package/dist/Carousel/components/Container.cjs +2 -2
  10. package/dist/Carousel/components/Container.js +2 -2
  11. package/dist/ChatFooter/ChatFooter.cjs +7 -3
  12. package/dist/ChatFooter/ChatFooter.d.cts +7 -3
  13. package/dist/ChatFooter/ChatFooter.d.ts +5 -1
  14. package/dist/ChatFooter/ChatFooter.js +7 -3
  15. package/dist/ChatFooter/components/Layout.cjs +2 -2
  16. package/dist/ChatFooter/components/Layout.js +2 -2
  17. package/dist/ChatFooter/components/index.d.cts +10 -6
  18. package/dist/ChatFooter/components/index.d.ts +7 -3
  19. package/dist/ChatFooter/types/types.d.cts +16 -0
  20. package/dist/ChatFooter/types/types.d.ts +16 -0
  21. package/dist/ChatHeader/ChatHeader.cjs +2 -1
  22. package/dist/ChatHeader/ChatHeader.d.cts +2 -2
  23. package/dist/ChatHeader/ChatHeader.d.ts +2 -2
  24. package/dist/ChatHeader/ChatHeader.js +2 -1
  25. package/dist/ChatHeader/components/Handle.cjs +4 -4
  26. package/dist/ChatHeader/components/Handle.js +4 -4
  27. package/dist/ChatHeader/components/Toggle.cjs +3 -3
  28. package/dist/ChatHeader/components/Toggle.js +3 -3
  29. package/dist/ChatHeader/hooks/useGetHandleProperties.cjs +8 -6
  30. package/dist/ChatHeader/hooks/useGetHandleProperties.js +8 -6
  31. package/dist/ChatHeader/hooks/useGetToggleOptionProperties.cjs +1 -1
  32. package/dist/ChatHeader/hooks/useGetToggleOptionProperties.js +1 -1
  33. package/dist/ChatPreview/ChatPreview.cjs +7 -4
  34. package/dist/ChatPreview/ChatPreview.d.cts +2 -2
  35. package/dist/ChatPreview/ChatPreview.js +7 -4
  36. package/dist/ChatPreview/index.d.cts +2 -2
  37. package/dist/ChatPreview/index.d.ts +2 -2
  38. package/dist/ChatPreview/types/types.d.cts +13 -1
  39. package/dist/ChatPreview/types/types.d.ts +13 -1
  40. package/dist/ChatPreviewComparison/ChatPreviewComparison.cjs +7 -4
  41. package/dist/ChatPreviewComparison/ChatPreviewComparison.d.cts +2 -2
  42. package/dist/ChatPreviewComparison/ChatPreviewComparison.d.ts +2 -2
  43. package/dist/ChatPreviewComparison/ChatPreviewComparison.js +7 -4
  44. package/dist/ChatPreviewComparison/components/Headline.cjs +2 -2
  45. package/dist/ChatPreviewComparison/components/Headline.js +2 -2
  46. package/dist/ChatPreviewComparison/components/Layout.cjs +4 -4
  47. package/dist/ChatPreviewComparison/components/Layout.js +4 -4
  48. package/dist/ChatPreviewComparison/components/Message.cjs +2 -2
  49. package/dist/ChatPreviewComparison/components/Message.js +2 -2
  50. package/dist/ChatPreviewComparison/index.d.cts +2 -2
  51. package/dist/ChatPreviewComparison/index.d.ts +2 -2
  52. package/dist/ChatPreviewComparison/types/types.d.cts +13 -1
  53. package/dist/ChatPreviewComparison/types/types.d.ts +13 -1
  54. package/dist/ChatPreviewLoading/ChatPreviewLoading.cjs +7 -2
  55. package/dist/ChatPreviewLoading/ChatPreviewLoading.d.cts +4 -3
  56. package/dist/ChatPreviewLoading/ChatPreviewLoading.d.ts +4 -3
  57. package/dist/ChatPreviewLoading/ChatPreviewLoading.js +7 -2
  58. package/dist/ChatPreviewLoading/types/types.d.cts +4 -0
  59. package/dist/ChatPreviewLoading/types/types.d.ts +4 -0
  60. package/dist/Container/Container.d.cts +172 -172
  61. package/dist/Container/Container.d.ts +172 -172
  62. package/dist/DesignTokens/DesignTokensComponent.d.cts +2 -2
  63. package/dist/DesignTokens/DesignTokensComponent.d.ts +2 -2
  64. package/dist/Disclaimer/components/Container.cjs +2 -2
  65. package/dist/Disclaimer/components/Container.js +2 -2
  66. package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.cts +2 -2
  67. package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.ts +2 -2
  68. package/dist/DocumentRetrievalCard/components/Layout.cjs +2 -2
  69. package/dist/DocumentRetrievalCard/components/Layout.js +2 -2
  70. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Icon.cjs +1 -1
  71. package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Icon.js +1 -1
  72. package/dist/FloatingButton/FloatingButton.d.cts +2 -2
  73. package/dist/FloatingButton/FloatingButton.d.ts +2 -2
  74. package/dist/FloatingChat/FloatingChat.cjs +27 -4
  75. package/dist/FloatingChat/FloatingChat.d.cts +2 -2
  76. package/dist/FloatingChat/FloatingChat.d.ts +2 -2
  77. package/dist/FloatingChat/FloatingChat.js +28 -5
  78. package/dist/FloatingChat/components/AgentMessage.cjs +2 -2
  79. package/dist/FloatingChat/components/AgentMessage.js +2 -2
  80. package/dist/FloatingChat/components/ChatMessages.cjs +1 -1
  81. package/dist/FloatingChat/components/ChatMessages.js +1 -1
  82. package/dist/FloatingChat/components/Layout.cjs +3 -3
  83. package/dist/FloatingChat/components/Layout.js +3 -3
  84. package/dist/FloatingChat/components/ResultsGridView.cjs +1 -1
  85. package/dist/FloatingChat/components/ResultsGridView.js +1 -1
  86. package/dist/FloatingChat/components/SalesAgentBadgeContent.cjs +1 -1
  87. package/dist/FloatingChat/components/SalesAgentBadgeContent.js +1 -1
  88. package/dist/FloatingChat/hooks/useChatSuggestions.cjs +3 -5
  89. package/dist/FloatingChat/hooks/useChatSuggestions.js +4 -6
  90. package/dist/FullPageSalesAgent/FullPageSalesAgent.cjs +25 -3
  91. package/dist/FullPageSalesAgent/FullPageSalesAgent.d.cts +5 -3
  92. package/dist/FullPageSalesAgent/FullPageSalesAgent.d.ts +5 -3
  93. package/dist/FullPageSalesAgent/FullPageSalesAgent.js +26 -4
  94. package/dist/Image/Image.d.cts +2 -2
  95. package/dist/Image/Image.d.ts +2 -2
  96. package/dist/ImageGallery/ImageGallery.d.cts +2 -2
  97. package/dist/ImageGallery/ImageGallery.d.ts +2 -2
  98. package/dist/ImageGallery/components/Layout.cjs +1 -1
  99. package/dist/ImageGallery/components/Layout.js +1 -1
  100. package/dist/MarkdownProcessor/MarkdownProcessor.d.cts +2 -2
  101. package/dist/MarkdownProcessor/MarkdownProcessor.d.ts +2 -2
  102. package/dist/Message/components/LinkButton.cjs +1 -1
  103. package/dist/Message/components/LinkButton.js +1 -1
  104. package/dist/OrderLookupCard/OrderLookupCard.cjs +1 -1
  105. package/dist/OrderLookupCard/OrderLookupCard.js +1 -1
  106. package/dist/ProductCard/ProductCard.cjs +7 -3
  107. package/dist/ProductCard/ProductCard.d.cts +6 -3
  108. package/dist/ProductCard/ProductCard.d.ts +6 -3
  109. package/dist/ProductCard/ProductCard.js +7 -3
  110. package/dist/ProductCard/index.d.cts +2 -2
  111. package/dist/ProductCard/index.d.ts +2 -2
  112. package/dist/ProductCard/types/index.d.cts +7 -1
  113. package/dist/ProductCard/types/index.d.ts +7 -1
  114. package/dist/PromptButton/PromptButton.d.cts +2 -2
  115. package/dist/PromptButton/PromptButton.d.ts +2 -2
  116. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.cjs +5 -2
  117. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.cts +6 -3
  118. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.ts +6 -3
  119. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.js +5 -2
  120. package/dist/PromptButtonCarouselWithImage/components/PromptButtonsCarousel.cjs +1 -1
  121. package/dist/PromptButtonCarouselWithImage/components/PromptButtonsCarousel.js +1 -1
  122. package/dist/PromptButtonCarouselWithImage/types/types.d.cts +12 -0
  123. package/dist/PromptButtonCarouselWithImage/types/types.d.ts +12 -0
  124. package/dist/PromptCarousel/PromptCarousel.cjs +3 -3
  125. package/dist/PromptCarousel/PromptCarousel.d.cts +2 -2
  126. package/dist/PromptCarousel/PromptCarousel.d.ts +2 -2
  127. package/dist/PromptCarousel/PromptCarousel.js +3 -3
  128. package/dist/ReviewCard/ReviewCard.d.cts +2 -2
  129. package/dist/ReviewCard/ReviewCard.d.ts +2 -2
  130. package/dist/ReviewCard/components/Container.cjs +2 -2
  131. package/dist/ReviewCard/components/Container.js +2 -2
  132. package/dist/ReviewCard/components/Rating.cjs +0 -1
  133. package/dist/ReviewCard/components/Rating.js +0 -1
  134. package/dist/ReviewCard/components/ReadMoreButton.cjs +1 -1
  135. package/dist/ReviewCard/components/ReadMoreButton.js +1 -1
  136. package/dist/ReviewCard/components/index.d.cts +4 -4
  137. package/dist/ReviewCard/components/index.d.ts +6 -6
  138. package/dist/SalesAgentProductCard/SalesAgentProductCard.d.cts +2 -2
  139. package/dist/SalesAgentProductCard/SalesAgentProductCard.d.ts +2 -2
  140. package/dist/SalesAgentProductCard/components/Container.cjs +2 -2
  141. package/dist/SalesAgentProductCard/components/Container.js +2 -2
  142. package/dist/SalesAgentProductCard/components/index.d.cts +6 -6
  143. package/dist/SalesAgentProductCard/components/index.d.ts +8 -8
  144. package/dist/SocialProof/SocialProof.cjs +7 -4
  145. package/dist/SocialProof/SocialProof.d.cts +2 -2
  146. package/dist/SocialProof/SocialProof.js +7 -4
  147. package/dist/SocialProof/components/Headline.cjs +3 -3
  148. package/dist/SocialProof/components/Headline.js +3 -3
  149. package/dist/SocialProof/components/LayoutFourHorizontal.cjs +1 -1
  150. package/dist/SocialProof/components/LayoutFourHorizontal.js +1 -1
  151. package/dist/SocialProof/components/Subheadline.cjs +1 -1
  152. package/dist/SocialProof/components/Subheadline.js +1 -1
  153. package/dist/SocialProof/components/Textfield.cjs +5 -2
  154. package/dist/SocialProof/components/Textfield.js +5 -2
  155. package/dist/SocialProof/index.d.cts +2 -2
  156. package/dist/SocialProof/index.d.ts +2 -2
  157. package/dist/SocialProof/types/types.d.cts +13 -1
  158. package/dist/SocialProof/types/types.d.ts +13 -1
  159. package/dist/SparkleAnimation/SparkleAnimation.d.cts +2 -2
  160. package/dist/SparkleAnimation/SparkleAnimation.d.ts +2 -2
  161. package/dist/Stack/Stack.d.cts +2 -2
  162. package/dist/Stack/Stack.d.ts +2 -2
  163. package/dist/TextField/TextField.cjs +34 -2
  164. package/dist/TextField/TextField.d.cts +5 -1
  165. package/dist/TextField/TextField.d.ts +5 -1
  166. package/dist/TextField/TextField.js +34 -2
  167. package/dist/TextField/components/Layout.cjs +10 -7
  168. package/dist/TextField/components/Layout.js +10 -7
  169. package/dist/TextField/components/VoiceInputButton.cjs +45 -0
  170. package/dist/TextField/components/VoiceInputButton.js +39 -0
  171. package/dist/TextField/components/index.cjs +3 -1
  172. package/dist/TextField/components/index.js +3 -1
  173. package/dist/TextField/hooks/useGetMicButtonContainerProperties.cjs +20 -0
  174. package/dist/TextField/hooks/useGetMicButtonContainerProperties.js +19 -0
  175. package/dist/TextField/hooks/useGetSkeletonProperties.cjs +1 -1
  176. package/dist/TextField/hooks/useGetSkeletonProperties.js +1 -1
  177. package/dist/TextField/hooks/useVoiceInput.cjs +59 -0
  178. package/dist/TextField/hooks/useVoiceInput.js +57 -0
  179. package/dist/TextField/types/index.d.cts +11 -0
  180. package/dist/TextField/types/index.d.ts +11 -0
  181. package/dist/TextField/utils/getLayoutStateProperties.cjs +9 -1
  182. package/dist/TextField/utils/getLayoutStateProperties.js +8 -1
  183. package/dist/TitledPromptCarousel/TitledPromptCarousel.cjs +1 -1
  184. package/dist/TitledPromptCarousel/TitledPromptCarousel.d.cts +2 -2
  185. package/dist/TitledPromptCarousel/TitledPromptCarousel.d.ts +2 -2
  186. package/dist/TitledPromptCarousel/TitledPromptCarousel.js +1 -1
  187. package/dist/Tokens/index.cjs +1 -1
  188. package/dist/Tokens/index.js +1 -1
  189. package/dist/TypingAnimation/TypingAnimation.cjs +8 -4
  190. package/dist/TypingAnimation/TypingAnimation.d.cts +2 -2
  191. package/dist/TypingAnimation/TypingAnimation.js +8 -4
  192. package/dist/TypingAnimation/hooks/useGetTypographyVariant.cjs +1 -1
  193. package/dist/TypingAnimation/hooks/useGetTypographyVariant.js +1 -1
  194. package/dist/TypingAnimation/index.d.cts +2 -2
  195. package/dist/TypingAnimation/index.d.ts +2 -2
  196. package/dist/TypingAnimation/types/index.d.cts +13 -1
  197. package/dist/TypingAnimation/types/index.d.ts +13 -1
  198. package/dist/Typography/Typography.d.cts +4 -4
  199. package/dist/Typography/Typography.d.ts +4 -4
  200. package/dist/WelcomeMessage/components/Container.cjs +2 -2
  201. package/dist/WelcomeMessage/components/Container.js +2 -2
  202. package/dist/WidgetTextField/WidgetTextField.cjs +40 -8
  203. package/dist/WidgetTextField/WidgetTextField.d.cts +7 -3
  204. package/dist/WidgetTextField/WidgetTextField.d.ts +7 -3
  205. package/dist/WidgetTextField/WidgetTextField.js +34 -3
  206. package/dist/WidgetTextField/components/Container.cjs +33 -27
  207. package/dist/WidgetTextField/components/Container.js +33 -27
  208. package/dist/WidgetTextField/components/Icon.cjs +1 -1
  209. package/dist/WidgetTextField/components/Icon.js +1 -1
  210. package/dist/WidgetTextField/hooks/useGetContainerProperties.cjs +5 -3
  211. package/dist/WidgetTextField/hooks/useGetContainerProperties.js +5 -3
  212. package/dist/WidgetTextField/hooks/useGetMicWidgetButtonProperties.cjs +20 -0
  213. package/dist/WidgetTextField/hooks/useGetMicWidgetButtonProperties.js +19 -0
  214. package/dist/WidgetTextField/types/types.d.cts +21 -0
  215. package/dist/WidgetTextField/types/types.d.ts +21 -0
  216. package/dist/WidgetWrapper/WidgetWrapper.d.cts +2 -2
  217. package/dist/WidgetWrapper/WidgetWrapper.d.ts +2 -2
  218. package/dist/WidgetWrapper/hooks/useGetWrapperProperties.cjs +1 -1
  219. package/dist/WidgetWrapper/hooks/useGetWrapperProperties.js +1 -1
  220. package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.cts +2 -2
  221. package/dist/node_modules/jotai/esm/react.cjs +87 -0
  222. package/dist/node_modules/jotai/esm/react.js +88 -2
  223. package/dist/node_modules/jotai/esm/vanilla/internals.cjs +2 -1
  224. package/dist/node_modules/jotai/esm/vanilla/internals.js +1 -1
  225. package/dist/styles.css +1 -1
  226. package/package.json +2 -1
  227. package/src/components/ChatFooter/ChatFooter.tsx +8 -0
  228. package/src/components/ChatFooter/__tests__/ChatFooter.test.tsx +43 -0
  229. package/src/components/ChatFooter/components/TextField.tsx +12 -0
  230. package/src/components/ChatFooter/types/types.ts +17 -0
  231. package/src/components/ChatHeader/ChatHeader.tsx +1 -0
  232. package/src/components/ChatHeader/components/Handle.tsx +7 -2
  233. package/src/components/ChatHeader/hooks/useGetHandleProperties.ts +9 -5
  234. package/src/components/ChatHeader/hooks/useGetToggleOptionProperties.ts +1 -1
  235. package/src/components/ChatHeader/types/index.ts +1 -0
  236. package/src/components/ChatPreview/ChatPreview.tsx +13 -2
  237. package/src/components/ChatPreview/__tests__/ChatPreview.test.tsx +44 -0
  238. package/src/components/ChatPreview/index.ts +1 -1
  239. package/src/components/ChatPreview/types/types.ts +13 -0
  240. package/src/components/ChatPreviewComparison/ChatPreviewComparison.tsx +6 -0
  241. package/src/components/ChatPreviewComparison/__tests__/ChatPreviewComparison.test.tsx +44 -0
  242. package/src/components/ChatPreviewComparison/index.ts +1 -1
  243. package/src/components/ChatPreviewComparison/types/types.ts +13 -0
  244. package/src/components/ChatPreviewLoading/ChatPreviewLoading.tsx +5 -3
  245. package/src/components/ChatPreviewLoading/__tests__/ChatPreviewLoading.test.tsx +40 -0
  246. package/src/components/ChatPreviewLoading/types/types.ts +5 -0
  247. package/src/components/FloatingChat/FloatingChat.tsx +38 -7
  248. package/src/components/FloatingChat/hooks/useChatSuggestions.ts +8 -12
  249. package/src/components/FullPageSalesAgent/FullPageSalesAgent.tsx +32 -1
  250. package/src/components/ProductCard/ProductCard.tsx +7 -0
  251. package/src/components/ProductCard/__tests__/ProductCard.test.tsx +33 -0
  252. package/src/components/ProductCard/index.ts +1 -1
  253. package/src/components/ProductCard/types/index.ts +6 -0
  254. package/src/components/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.tsx +6 -0
  255. package/src/components/PromptButtonCarouselWithImage/__tests__/PromptButtonCarouselWithImage.test.tsx +34 -0
  256. package/src/components/PromptButtonCarouselWithImage/types/types.ts +12 -0
  257. package/src/components/ReviewCard/components/Rating.tsx +0 -1
  258. package/src/components/SocialProof/SocialProof.tsx +6 -0
  259. package/src/components/SocialProof/__tests__/SocialProof.test.tsx +58 -0
  260. package/src/components/SocialProof/components/Textfield.tsx +9 -0
  261. package/src/components/SocialProof/index.ts +1 -1
  262. package/src/components/SocialProof/types/types.ts +13 -0
  263. package/src/components/TextField/TextField.tsx +49 -0
  264. package/src/components/TextField/__tests__/TextField.test.tsx +3 -3
  265. package/src/components/TextField/__tests__/VoiceInputButton.test.tsx +175 -0
  266. package/src/components/TextField/components/Layout.tsx +24 -17
  267. package/src/components/TextField/components/VoiceInputButton.tsx +69 -0
  268. package/src/components/TextField/components/index.ts +2 -0
  269. package/src/components/TextField/hooks/useGetMicButtonContainerProperties.ts +38 -0
  270. package/src/components/TextField/hooks/useGetSkeletonProperties.ts +1 -1
  271. package/src/components/TextField/hooks/useVoiceInput.ts +77 -0
  272. package/src/components/TextField/types/index.ts +11 -0
  273. package/src/components/TextField/utils/getLayoutStateProperties.ts +8 -0
  274. package/src/components/TypingAnimation/TypingAnimation.tsx +7 -0
  275. package/src/components/TypingAnimation/__tests__/TypingAnimation.test.tsx +47 -0
  276. package/src/components/TypingAnimation/index.ts +1 -1
  277. package/src/components/TypingAnimation/types/index.ts +14 -1
  278. package/src/components/WidgetTextField/WidgetTextField.tsx +47 -0
  279. package/src/components/WidgetTextField/__tests__/WidgetTextField.test.tsx +119 -4
  280. package/src/components/WidgetTextField/components/Container.tsx +40 -27
  281. package/src/components/WidgetTextField/hooks/useGetContainerProperties.ts +16 -4
  282. package/src/components/WidgetTextField/hooks/useGetMicWidgetButtonProperties.ts +38 -0
  283. package/src/components/WidgetTextField/types/types.ts +21 -0
  284. package/src/components/WidgetWrapper/hooks/useGetWrapperProperties.ts +1 -1
@@ -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
  });
@@ -59,6 +59,10 @@ export type PromptButtonCarouselWithImageProps = {
59
59
  * Whether to hide the text field.
60
60
  */
61
61
  hideTextField?: boolean;
62
+ /**
63
+ * Whether to enable voice input.
64
+ */
65
+ voiceInputEnabled?: boolean;
62
66
  /**
63
67
  * Callback function invoked when a prompt button is clicked.
64
68
  * Receives the button's text as a parameter.
@@ -97,4 +101,12 @@ export type PromptButtonCarouselWithImageProps = {
97
101
  * Receives the placeholder text as a parameter.
98
102
  */
99
103
  handleTextFieldClick: (text: string) => void;
104
+ /**
105
+ * Callback function invoked when voice transcription starts.
106
+ */
107
+ onTranscriptionStarted?: () => void;
108
+ /**
109
+ * Callback function invoked when voice transcription completes.
110
+ */
111
+ onTranscriptionCompleted?: (transcript: string) => void;
100
112
  };
@@ -36,7 +36,6 @@ export const Rating = ({ rating, theme, style }: RatingProps) => {
36
36
  variant={TypographyVariant.B3_RG}
37
37
  color={TypographyColor.TEXT_PRIMARY}
38
38
  style={style}
39
- noWrap
40
39
  >
41
40
  {formattedRating}
42
41
  </Typography>
@@ -44,6 +44,7 @@ export const SocialProof = ({
44
44
  images,
45
45
  logoSrc,
46
46
  titleLabel,
47
+ voiceInputEnabled,
47
48
  } = widgetContentProps ?? {};
48
49
 
49
50
  const numberOfCustomersText = useSocialProofCount({
@@ -63,6 +64,8 @@ export const SocialProof = ({
63
64
  handleSecondaryButtonTouchStart,
64
65
  handleSecondaryButtonTouchEnd,
65
66
  handleTextFieldClick,
67
+ onTranscriptionStarted,
68
+ onTranscriptionCompleted,
66
69
  } = widgetEventProps ?? {};
67
70
 
68
71
  const finalTheme = resolveTheme(theme);
@@ -120,6 +123,9 @@ export const SocialProof = ({
120
123
  placeholder={textFieldPlaceholderText}
121
124
  handleTextFieldClick={handleTextFieldClick}
122
125
  iconVariant={hasDynamicLayout ? IconVariant.DEFAULT : IconVariant.SEARCH}
126
+ voiceInputEnabled={voiceInputEnabled}
127
+ onTranscriptionStarted={onTranscriptionStarted}
128
+ onTranscriptionCompleted={onTranscriptionCompleted}
123
129
  />
124
130
  );
125
131
 
@@ -531,4 +531,62 @@ describe('SocialProof', () => {
531
531
  expect(screen.getByText(/\d+ customers/)).toBeInTheDocument();
532
532
  });
533
533
  });
534
+
535
+ describe('Voice input', () => {
536
+ it('should render with voiceInputEnabled set to true', async () => {
537
+ render(
538
+ <SocialProof
539
+ {...defaultProps}
540
+ widgetContentProps={{
541
+ ...defaultProps.widgetContentProps,
542
+ voiceInputEnabled: true,
543
+ }}
544
+ widgetStyleProps={{
545
+ hideTextField: false,
546
+ imageGalleryLayout: ImageGalleryLayout.FOUR_GRID,
547
+ }}
548
+ widgetEventProps={{ handleTextFieldClick: vi.fn() }}
549
+ />,
550
+ );
551
+ await waitFor(() => {
552
+ expect(screen.getByText('What can I help you find?')).toBeInTheDocument();
553
+ });
554
+ });
555
+
556
+ it('should render with voiceInputEnabled set to false', () => {
557
+ render(
558
+ <SocialProof
559
+ {...defaultProps}
560
+ widgetContentProps={{
561
+ ...defaultProps.widgetContentProps,
562
+ voiceInputEnabled: false,
563
+ }}
564
+ widgetStyleProps={{
565
+ hideTextField: false,
566
+ imageGalleryLayout: ImageGalleryLayout.FOUR_GRID,
567
+ }}
568
+ widgetEventProps={{ handleTextFieldClick: vi.fn() }}
569
+ />,
570
+ );
571
+ expect(screen.getByText(/\d+ customers/)).toBeInTheDocument();
572
+ });
573
+
574
+ it('should render with voiceInputEnabled undefined (default)', () => {
575
+ render(
576
+ <SocialProof
577
+ {...defaultProps}
578
+ widgetContentProps={{
579
+ ...defaultProps.widgetContentProps,
580
+ voiceInputEnabled: undefined,
581
+ }}
582
+ widgetStyleProps={{
583
+ hideTextField: false,
584
+ imageGalleryLayout: ImageGalleryLayout.FOUR_GRID,
585
+ }}
586
+ widgetEventProps={{ handleTextFieldClick: vi.fn() }}
587
+ />,
588
+ );
589
+ expect(screen.getByText(/\d+ customers/)).toBeInTheDocument();
590
+ });
591
+ });
534
592
  });
@@ -8,6 +8,9 @@ export type TextfieldProps = {
8
8
  placeholder: string;
9
9
  handleTextFieldClick: (text: string) => void;
10
10
  iconVariant?: IconVariant;
11
+ voiceInputEnabled?: boolean;
12
+ onTranscriptionStarted?: () => void;
13
+ onTranscriptionCompleted?: (transcript: string) => void;
11
14
  };
12
15
 
13
16
  export const Textfield = ({
@@ -15,6 +18,9 @@ export const Textfield = ({
15
18
  placeholder,
16
19
  handleTextFieldClick,
17
20
  iconVariant = IconVariant.DEFAULT,
21
+ voiceInputEnabled,
22
+ onTranscriptionStarted,
23
+ onTranscriptionCompleted,
18
24
  }: TextfieldProps) => {
19
25
  const finalTheme = resolveTheme(theme);
20
26
 
@@ -24,6 +30,9 @@ export const Textfield = ({
24
30
  placeholder={placeholder}
25
31
  iconVariant={iconVariant}
26
32
  onClick={() => handleTextFieldClick(placeholder)}
33
+ enableVoiceInput={voiceInputEnabled}
34
+ onTranscriptionStarted={onTranscriptionStarted}
35
+ onTranscriptionCompleted={onTranscriptionCompleted}
27
36
  />
28
37
  );
29
38
  };
@@ -1,4 +1,4 @@
1
1
  export { SocialProof } from './SocialProof';
2
- export type { SocialProofProps } from './types/types';
2
+ export type { SocialProofProps, WidgetEventProps } from './types/types';
3
3
  export { DynamicLayout, PageVariant, WidgetKind } from './types/types';
4
4
  export { useSocialProofCount } from './hooks';