@envive-ai/react-toolkit-v3 0.3.6 → 0.3.7

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 (157) 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.d.cts +2 -2
  6. package/dist/Carousel/Carousel.d.ts +2 -2
  7. package/dist/ChatFooter/ChatFooter.d.cts +2 -2
  8. package/dist/ChatFooter/ChatFooter.d.ts +2 -2
  9. package/dist/ChatFooter/components/index.d.cts +5 -5
  10. package/dist/ChatFooter/components/index.d.ts +5 -5
  11. package/dist/ChatFooter/hooks/useGetContainerProperties.cjs +2 -2
  12. package/dist/ChatFooter/hooks/useGetContainerProperties.js +2 -2
  13. package/dist/ChatHeader/ChatHeader.cjs +3 -2
  14. package/dist/ChatHeader/ChatHeader.d.cts +3 -2
  15. package/dist/ChatHeader/ChatHeader.d.ts +3 -2
  16. package/dist/ChatHeader/ChatHeader.js +3 -2
  17. package/dist/ChatHeader/components/Handle.cjs +27 -1
  18. package/dist/ChatHeader/components/Handle.js +27 -1
  19. package/dist/ChatHeader/types/index.d.cts +2 -0
  20. package/dist/ChatHeader/types/index.d.ts +2 -0
  21. package/dist/ChatPreview/ChatPreview.d.cts +2 -2
  22. package/dist/ChatPreview/ChatPreview.d.ts +2 -2
  23. package/dist/ChatPreviewComparison/ChatPreviewComparison.d.cts +2 -2
  24. package/dist/ChatPreviewComparison/ChatPreviewComparison.d.ts +2 -2
  25. package/dist/ChatPreviewLoading/ChatPreviewLoading.d.cts +2 -2
  26. package/dist/ChatPreviewLoading/ChatPreviewLoading.d.ts +2 -2
  27. package/dist/Container/Container.d.cts +176 -176
  28. package/dist/Container/Container.d.ts +176 -176
  29. package/dist/DesignTokens/DesignTokensComponent.d.cts +2 -2
  30. package/dist/DesignTokens/DesignTokensComponent.d.ts +2 -2
  31. package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.cts +2 -2
  32. package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.ts +2 -2
  33. package/dist/FloatingButton/FloatingButton.cjs +2 -1
  34. package/dist/FloatingButton/FloatingButton.d.cts +4 -3
  35. package/dist/FloatingButton/FloatingButton.d.ts +4 -3
  36. package/dist/FloatingButton/FloatingButton.js +2 -1
  37. package/dist/FloatingButton/components/Container.cjs +2 -2
  38. package/dist/FloatingButton/components/Container.js +2 -2
  39. package/dist/FloatingButton/hooks/useGetContainerProperties.cjs +2 -2
  40. package/dist/FloatingButton/hooks/useGetContainerProperties.js +2 -2
  41. package/dist/FloatingButton/types/types.cjs +4 -4
  42. package/dist/FloatingButton/types/types.d.cts +8 -4
  43. package/dist/FloatingButton/types/types.d.ts +8 -4
  44. package/dist/FloatingButton/types/types.js +4 -4
  45. package/dist/FloatingChat/FloatingChat.cjs +106 -39
  46. package/dist/FloatingChat/FloatingChat.d.cts +3 -2
  47. package/dist/FloatingChat/FloatingChat.d.ts +3 -2
  48. package/dist/FloatingChat/FloatingChat.js +108 -41
  49. package/dist/FloatingChat/components/AgentMessage.cjs +3 -2
  50. package/dist/FloatingChat/components/AgentMessage.js +3 -2
  51. package/dist/FloatingChat/components/ChatMessages.cjs +59 -41
  52. package/dist/FloatingChat/components/ChatMessages.js +58 -40
  53. package/dist/FloatingChat/components/Layout.cjs +2 -2
  54. package/dist/FloatingChat/components/Layout.js +2 -2
  55. package/dist/FloatingChat/components/ModalSheet.cjs +184 -0
  56. package/dist/FloatingChat/components/ModalSheet.js +182 -0
  57. package/dist/FloatingChat/components/SalesAgentProductCardsCarousel.cjs +3 -2
  58. package/dist/FloatingChat/components/SalesAgentProductCardsCarousel.js +3 -2
  59. package/dist/FloatingChat/components/index.cjs +1 -0
  60. package/dist/FloatingChat/components/index.js +1 -0
  61. package/dist/FloatingChat/hooks/useChatSuggestions.cjs +25 -0
  62. package/dist/FloatingChat/hooks/useChatSuggestions.js +24 -0
  63. package/dist/FloatingChat/hooks/useFilteredChatMessages.cjs +24 -0
  64. package/dist/FloatingChat/hooks/useFilteredChatMessages.js +23 -0
  65. package/dist/FloatingChat/hooks/usePreventScroll.cjs +117 -0
  66. package/dist/FloatingChat/hooks/usePreventScroll.js +116 -0
  67. package/dist/FloatingChat/hooks/useSnapCalculator.cjs +37 -0
  68. package/dist/FloatingChat/hooks/useSnapCalculator.js +35 -0
  69. package/dist/FloatingChat/hooks/useSnapControl.cjs +82 -0
  70. package/dist/FloatingChat/hooks/useSnapControl.js +81 -0
  71. package/dist/FloatingChat/hooks/useSnapSetup.cjs +59 -0
  72. package/dist/FloatingChat/hooks/useSnapSetup.js +58 -0
  73. package/dist/FloatingChat/types/types.d.cts +4 -0
  74. package/dist/FloatingChat/types/types.d.ts +4 -0
  75. package/dist/Image/Image.d.cts +2 -2
  76. package/dist/Image/Image.d.ts +2 -2
  77. package/dist/ImageGallery/ImageGallery.d.cts +2 -2
  78. package/dist/ImageGallery/ImageGallery.d.ts +2 -2
  79. package/dist/MarkdownProcessor/MarkdownProcessor.d.cts +2 -2
  80. package/dist/MarkdownProcessor/MarkdownProcessor.d.ts +2 -2
  81. package/dist/PromptButton/PromptButton.d.cts +2 -2
  82. package/dist/PromptButton/PromptButton.d.ts +2 -2
  83. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.cts +2 -2
  84. package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.ts +2 -2
  85. package/dist/PromptCarousel/PromptCarousel.cjs +0 -1
  86. package/dist/PromptCarousel/PromptCarousel.d.cts +2 -2
  87. package/dist/PromptCarousel/PromptCarousel.d.ts +2 -2
  88. package/dist/PromptCarousel/PromptCarousel.js +0 -1
  89. package/dist/ReviewCard/ReviewCard.d.cts +2 -2
  90. package/dist/ReviewCard/ReviewCard.d.ts +2 -2
  91. package/dist/ReviewCard/components/index.d.cts +6 -6
  92. package/dist/ReviewCard/components/index.d.ts +6 -6
  93. package/dist/SalesAgentProductCard/SalesAgentProductCard.d.cts +2 -2
  94. package/dist/SalesAgentProductCard/SalesAgentProductCard.d.ts +2 -2
  95. package/dist/SalesAgentProductCard/components/index.d.cts +2 -2
  96. package/dist/SalesAgentProductCard/components/index.d.ts +8 -8
  97. package/dist/SocialProof/SocialProof.cjs +9 -2
  98. package/dist/SocialProof/SocialProof.d.cts +2 -2
  99. package/dist/SocialProof/SocialProof.d.ts +2 -2
  100. package/dist/SocialProof/SocialProof.js +9 -2
  101. package/dist/SocialProof/hooks/index.cjs +1 -0
  102. package/dist/SocialProof/hooks/index.js +3 -0
  103. package/dist/SocialProof/hooks/useSocialProofCount.cjs +48 -0
  104. package/dist/SocialProof/hooks/useSocialProofCount.d.cts +15 -0
  105. package/dist/SocialProof/hooks/useSocialProofCount.d.ts +15 -0
  106. package/dist/SocialProof/hooks/useSocialProofCount.js +46 -0
  107. package/dist/SocialProof/index.cjs +5 -1
  108. package/dist/SocialProof/index.d.cts +3 -2
  109. package/dist/SocialProof/index.d.ts +3 -2
  110. package/dist/SocialProof/index.js +4 -2
  111. package/dist/SocialProof/types/types.cjs +8 -1
  112. package/dist/SocialProof/types/types.d.cts +16 -6
  113. package/dist/SocialProof/types/types.d.ts +16 -6
  114. package/dist/SocialProof/types/types.js +7 -1
  115. package/dist/Stack/Stack.d.cts +2 -2
  116. package/dist/TitledPromptCarousel/TitledPromptCarousel.d.cts +2 -2
  117. package/dist/TitledPromptCarousel/TitledPromptCarousel.d.ts +2 -2
  118. package/dist/TypingAnimation/TypingAnimation.d.cts +2 -2
  119. package/dist/TypingAnimation/TypingAnimation.d.ts +2 -2
  120. package/dist/Typography/Typography.d.cts +4 -4
  121. package/dist/Typography/Typography.d.ts +4 -4
  122. package/dist/WidgetTextField/WidgetTextField.d.cts +2 -2
  123. package/dist/WidgetTextField/WidgetTextField.d.ts +2 -2
  124. package/dist/WidgetWrapper/WidgetWrapper.d.cts +2 -2
  125. package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.cts +2 -2
  126. package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.ts +2 -2
  127. package/dist/styles.css +1 -1
  128. package/package.json +1 -1
  129. package/src/components/ChatFooter/hooks/useGetContainerProperties.ts +2 -2
  130. package/src/components/ChatHeader/ChatHeader.tsx +2 -0
  131. package/src/components/ChatHeader/components/Handle.tsx +29 -1
  132. package/src/components/ChatHeader/types/index.ts +3 -0
  133. package/src/components/FloatingButton/FloatingButton.tsx +2 -0
  134. package/src/components/FloatingButton/components/Container.tsx +3 -0
  135. package/src/components/FloatingButton/hooks/useGetContainerProperties.ts +2 -1
  136. package/src/components/FloatingButton/types/types.ts +9 -4
  137. package/src/components/FloatingChat/FloatingChat.tsx +160 -59
  138. package/src/components/FloatingChat/components/AgentMessage.tsx +3 -0
  139. package/src/components/FloatingChat/components/ChatMessages.tsx +25 -0
  140. package/src/components/FloatingChat/components/Layout.tsx +2 -2
  141. package/src/components/FloatingChat/components/ModalSheet.tsx +288 -0
  142. package/src/components/FloatingChat/components/SalesAgentProductCardsCarousel.tsx +7 -2
  143. package/src/components/FloatingChat/components/index.ts +3 -0
  144. package/src/components/FloatingChat/hooks/useChatSuggestions.ts +49 -0
  145. package/src/components/FloatingChat/hooks/useFilteredChatMessages.ts +43 -0
  146. package/src/components/FloatingChat/hooks/usePreventScroll.ts +207 -0
  147. package/src/components/FloatingChat/hooks/useSnapCalculator.ts +41 -0
  148. package/src/components/FloatingChat/hooks/useSnapControl.ts +131 -0
  149. package/src/components/FloatingChat/hooks/useSnapSetup.ts +106 -0
  150. package/src/components/FloatingChat/types/types.ts +4 -0
  151. package/src/components/PromptCarousel/PromptCarousel.tsx +0 -1
  152. package/src/components/SocialProof/SocialProof.tsx +8 -2
  153. package/src/components/SocialProof/__tests__/SocialProof.test.tsx +66 -17
  154. package/src/components/SocialProof/hooks/index.ts +2 -0
  155. package/src/components/SocialProof/hooks/useSocialProofCount.ts +67 -0
  156. package/src/components/SocialProof/index.ts +2 -1
  157. package/src/components/SocialProof/types/types.ts +18 -6
@@ -2,8 +2,11 @@ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
2
  const require_theme = require('../../tokens/theme/theme.cjs');
3
3
  const require_Stack = require('../../Stack/Stack.cjs');
4
4
  require('../../Stack/index.cjs');
5
+ const require_index = require('../../Typography/types/index.cjs');
6
+ const require_Typography = require('../../Typography/Typography.cjs');
7
+ require('../../Typography/index.cjs');
5
8
  const require_resolveTheme = require('../../utils/resolveTheme.cjs');
6
- const require_index = require('../../Message/types/index.cjs');
9
+ const require_index$1 = require('../../Message/types/index.cjs');
7
10
  const require_Message = require('../../Message/Message.cjs');
8
11
  require('../../Message/index.cjs');
9
12
  const require_UserMessage = require('./UserMessage.cjs');
@@ -17,52 +20,67 @@ classnames = require_rolldown_runtime.__toESM(classnames);
17
20
  let __envive_ai_react_hooks_application_models = require("@envive-ai/react-hooks/application/models");
18
21
 
19
22
  //#region src/components/FloatingChat/components/ChatMessages.tsx
20
- const ChatMessages = (0, react.forwardRef)(({ theme = require_theme.Theme.GLOBAL_CUSTOM, className, agentName, messages, isLoading, isResponseStreaming, ignoreFirstModelResponse, neverShowSingleProductCards, showVerifiedBuyer }, ref) => {
23
+ const ChatMessages = (0, react.forwardRef)(({ theme = require_theme.Theme.GLOBAL_CUSTOM, className, agentName, messages, hasFilteredMessages, handlePreviousDiscussions, isLoading, isResponseStreaming, ignoreFirstModelResponse, neverShowSingleProductCards, showVerifiedBuyer, isPartialView }, ref) => {
21
24
  const finalTheme = require_resolveTheme.resolveTheme(theme);
22
25
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Stack.Stack, {
23
26
  ref,
24
27
  direction: "column",
25
28
  className: (0, classnames.default)("envive-tw-px-4", className),
26
29
  gap: 4,
27
- children: [messages.map((message, index) => {
28
- if (ignoreFirstModelResponse && index === 0 && message[0].role === __envive_ai_react_hooks_application_models.MessageRole.Assistant) return null;
29
- const groupableMessages = require_functions.getGroupableMessages(message);
30
- const firstMessageId = message[0]?.id || `message-${index}`;
31
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Stack.Stack, {
32
- direction: "column",
33
- gap: 4,
34
- children: [groupableMessages.find(([type]) => type === __envive_ai_react_hooks_application_models.MessageType.Separator) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MessageDivider.MessageDivider, { label: "New Discussion" }, `divider-${firstMessageId}`), groupableMessages.map(([type, content], indexSubMessage) => {
35
- const isUser = content[0].role === __envive_ai_react_hooks_application_models.MessageRole.User;
36
- const isAssistant = content[0].role === __envive_ai_react_hooks_application_models.MessageRole.Assistant;
37
- const previousMessages = indexSubMessage > 0 ? groupableMessages[indexSubMessage - 1][1] : [];
38
- const hideAgentName = indexSubMessage > 0 && require_functions.checkIfHideAgentName(previousMessages);
39
- const isLastMessageTurn = index === messages.length - 1;
40
- if (isUser) {
41
- const userMessage = content[0];
42
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_UserMessage.UserMessage, { message: userMessage }, userMessage.id);
43
- }
44
- if (isAssistant) {
45
- const assistantMessages = content;
46
- const assistantMessageId = assistantMessages[0]?.id || `agent-${firstMessageId}-${type}-${indexSubMessage}`;
47
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AgentMessage.AgentMessage, {
48
- theme: finalTheme,
49
- hideAgentName,
50
- agentName,
51
- type,
52
- messages: assistantMessages,
53
- isResponseStreaming: isResponseStreaming && isLastMessageTurn,
54
- neverShowSingleProductCards,
55
- showVerifiedBuyer
56
- }, assistantMessageId);
57
- }
58
- return null;
59
- })]
60
- }, firstMessageId);
61
- }), isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Message.Message, {
62
- isLoading: true,
63
- agentName,
64
- variant: require_index.MessageVariant.AGENT
65
- })]
30
+ children: [
31
+ hasFilteredMessages && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
32
+ type: "button",
33
+ className: "envive-tw-w-full envive-tw-cursor-pointer envive-tw-px-4 envive-tw-py-2 envive-tw-text-center",
34
+ onClick: handlePreviousDiscussions,
35
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Typography.Typography, {
36
+ color: require_index.TypographyColor.TEXT_PRIMARY,
37
+ variant: require_index.TypographyVariant.B3_RG,
38
+ className: "hover:envive-tw-underline",
39
+ children: "View Previous Messages"
40
+ })
41
+ }),
42
+ messages.map((message, index) => {
43
+ if (ignoreFirstModelResponse && index === 0 && message[0].role === __envive_ai_react_hooks_application_models.MessageRole.Assistant) return null;
44
+ const groupableMessages = require_functions.getGroupableMessages(message);
45
+ const firstMessageId = message[0]?.id || `message-${index}`;
46
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Stack.Stack, {
47
+ direction: "column",
48
+ gap: 4,
49
+ children: [groupableMessages.find(([type]) => type === __envive_ai_react_hooks_application_models.MessageType.Separator) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MessageDivider.MessageDivider, { label: "New Discussion" }, `divider-${firstMessageId}`), groupableMessages.map(([type, content], indexSubMessage) => {
50
+ const isUser = content[0].role === __envive_ai_react_hooks_application_models.MessageRole.User;
51
+ const isAssistant = content[0].role === __envive_ai_react_hooks_application_models.MessageRole.Assistant;
52
+ const previousMessages = indexSubMessage > 0 ? groupableMessages[indexSubMessage - 1][1] : [];
53
+ const hideAgentName = indexSubMessage > 0 && require_functions.checkIfHideAgentName(previousMessages);
54
+ const isLastMessageTurn = index === messages.length - 1;
55
+ if (isUser) {
56
+ const userMessage = content[0];
57
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_UserMessage.UserMessage, { message: userMessage }, userMessage.id);
58
+ }
59
+ if (isAssistant) {
60
+ const assistantMessages = content;
61
+ const assistantMessageId = assistantMessages[0]?.id || `agent-${firstMessageId}-${type}-${indexSubMessage}`;
62
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AgentMessage.AgentMessage, {
63
+ theme: finalTheme,
64
+ hideAgentName,
65
+ agentName,
66
+ type,
67
+ messages: assistantMessages,
68
+ isResponseStreaming: isResponseStreaming && isLastMessageTurn,
69
+ neverShowSingleProductCards,
70
+ showVerifiedBuyer,
71
+ isPartialView
72
+ }, assistantMessageId);
73
+ }
74
+ return null;
75
+ })]
76
+ }, firstMessageId);
77
+ }),
78
+ isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Message.Message, {
79
+ isLoading: true,
80
+ agentName,
81
+ variant: require_index$1.MessageVariant.AGENT
82
+ })
83
+ ]
66
84
  });
67
85
  });
68
86
  ChatMessages.displayName = "ChatMessages";
@@ -1,6 +1,9 @@
1
1
  import { Theme } from "../../tokens/theme/theme.js";
2
2
  import { Stack } from "../../Stack/Stack.js";
3
3
  import "../../Stack/index.js";
4
+ import { TypographyColor, TypographyVariant } from "../../Typography/types/index.js";
5
+ import { Typography } from "../../Typography/Typography.js";
6
+ import "../../Typography/index.js";
4
7
  import { resolveTheme } from "../../utils/resolveTheme.js";
5
8
  import { MessageVariant } from "../../Message/types/index.js";
6
9
  import { Message } from "../../Message/Message.js";
@@ -15,52 +18,67 @@ import classNames from "classnames";
15
18
  import { MessageRole, MessageType } from "@envive-ai/react-hooks/application/models";
16
19
 
17
20
  //#region src/components/FloatingChat/components/ChatMessages.tsx
18
- const ChatMessages = forwardRef(({ theme = Theme.GLOBAL_CUSTOM, className, agentName, messages, isLoading, isResponseStreaming, ignoreFirstModelResponse, neverShowSingleProductCards, showVerifiedBuyer }, ref) => {
21
+ const ChatMessages = forwardRef(({ theme = Theme.GLOBAL_CUSTOM, className, agentName, messages, hasFilteredMessages, handlePreviousDiscussions, isLoading, isResponseStreaming, ignoreFirstModelResponse, neverShowSingleProductCards, showVerifiedBuyer, isPartialView }, ref) => {
19
22
  const finalTheme = resolveTheme(theme);
20
23
  return /* @__PURE__ */ jsxs(Stack, {
21
24
  ref,
22
25
  direction: "column",
23
26
  className: classNames("envive-tw-px-4", className),
24
27
  gap: 4,
25
- children: [messages.map((message, index) => {
26
- if (ignoreFirstModelResponse && index === 0 && message[0].role === MessageRole.Assistant) return null;
27
- const groupableMessages = getGroupableMessages(message);
28
- const firstMessageId = message[0]?.id || `message-${index}`;
29
- return /* @__PURE__ */ jsxs(Stack, {
30
- direction: "column",
31
- gap: 4,
32
- children: [groupableMessages.find(([type]) => type === MessageType.Separator) && /* @__PURE__ */ jsx(MessageDivider, { label: "New Discussion" }, `divider-${firstMessageId}`), groupableMessages.map(([type, content], indexSubMessage) => {
33
- const isUser = content[0].role === MessageRole.User;
34
- const isAssistant = content[0].role === MessageRole.Assistant;
35
- const previousMessages = indexSubMessage > 0 ? groupableMessages[indexSubMessage - 1][1] : [];
36
- const hideAgentName = indexSubMessage > 0 && checkIfHideAgentName(previousMessages);
37
- const isLastMessageTurn = index === messages.length - 1;
38
- if (isUser) {
39
- const userMessage = content[0];
40
- return /* @__PURE__ */ jsx(UserMessage, { message: userMessage }, userMessage.id);
41
- }
42
- if (isAssistant) {
43
- const assistantMessages = content;
44
- const assistantMessageId = assistantMessages[0]?.id || `agent-${firstMessageId}-${type}-${indexSubMessage}`;
45
- return /* @__PURE__ */ jsx(AgentMessage, {
46
- theme: finalTheme,
47
- hideAgentName,
48
- agentName,
49
- type,
50
- messages: assistantMessages,
51
- isResponseStreaming: isResponseStreaming && isLastMessageTurn,
52
- neverShowSingleProductCards,
53
- showVerifiedBuyer
54
- }, assistantMessageId);
55
- }
56
- return null;
57
- })]
58
- }, firstMessageId);
59
- }), isLoading && /* @__PURE__ */ jsx(Message, {
60
- isLoading: true,
61
- agentName,
62
- variant: MessageVariant.AGENT
63
- })]
28
+ children: [
29
+ hasFilteredMessages && /* @__PURE__ */ jsx("button", {
30
+ type: "button",
31
+ className: "envive-tw-w-full envive-tw-cursor-pointer envive-tw-px-4 envive-tw-py-2 envive-tw-text-center",
32
+ onClick: handlePreviousDiscussions,
33
+ children: /* @__PURE__ */ jsx(Typography, {
34
+ color: TypographyColor.TEXT_PRIMARY,
35
+ variant: TypographyVariant.B3_RG,
36
+ className: "hover:envive-tw-underline",
37
+ children: "View Previous Messages"
38
+ })
39
+ }),
40
+ messages.map((message, index) => {
41
+ if (ignoreFirstModelResponse && index === 0 && message[0].role === MessageRole.Assistant) return null;
42
+ const groupableMessages = getGroupableMessages(message);
43
+ const firstMessageId = message[0]?.id || `message-${index}`;
44
+ return /* @__PURE__ */ jsxs(Stack, {
45
+ direction: "column",
46
+ gap: 4,
47
+ children: [groupableMessages.find(([type]) => type === MessageType.Separator) && /* @__PURE__ */ jsx(MessageDivider, { label: "New Discussion" }, `divider-${firstMessageId}`), groupableMessages.map(([type, content], indexSubMessage) => {
48
+ const isUser = content[0].role === MessageRole.User;
49
+ const isAssistant = content[0].role === MessageRole.Assistant;
50
+ const previousMessages = indexSubMessage > 0 ? groupableMessages[indexSubMessage - 1][1] : [];
51
+ const hideAgentName = indexSubMessage > 0 && checkIfHideAgentName(previousMessages);
52
+ const isLastMessageTurn = index === messages.length - 1;
53
+ if (isUser) {
54
+ const userMessage = content[0];
55
+ return /* @__PURE__ */ jsx(UserMessage, { message: userMessage }, userMessage.id);
56
+ }
57
+ if (isAssistant) {
58
+ const assistantMessages = content;
59
+ const assistantMessageId = assistantMessages[0]?.id || `agent-${firstMessageId}-${type}-${indexSubMessage}`;
60
+ return /* @__PURE__ */ jsx(AgentMessage, {
61
+ theme: finalTheme,
62
+ hideAgentName,
63
+ agentName,
64
+ type,
65
+ messages: assistantMessages,
66
+ isResponseStreaming: isResponseStreaming && isLastMessageTurn,
67
+ neverShowSingleProductCards,
68
+ showVerifiedBuyer,
69
+ isPartialView
70
+ }, assistantMessageId);
71
+ }
72
+ return null;
73
+ })]
74
+ }, firstMessageId);
75
+ }),
76
+ isLoading && /* @__PURE__ */ jsx(Message, {
77
+ isLoading: true,
78
+ agentName,
79
+ variant: MessageVariant.AGENT
80
+ })
81
+ ]
64
82
  });
65
83
  });
66
84
  ChatMessages.displayName = "ChatMessages";
@@ -19,13 +19,13 @@ const Layout = ({ id, className, style, testId, theme = require_theme.Theme.GLOB
19
19
  id,
20
20
  testId,
21
21
  style,
22
- className: (0, classnames.default)("envive-tw-flex envive-tw-h-full envive-tw-w-[512px] envive-tw-flex-col envive-tw-bg-[#FFFFFF]", className),
22
+ className: (0, classnames.default)("envive-tw-flex envive-tw-h-full envive-tw-w-full envive-tw-max-w-[512px] envive-tw-flex-col envive-tw-bg-[#FFFFFF]", className),
23
23
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Stack.Stack, {
24
24
  direction: "column",
25
25
  className: "envive-tw-relative envive-tw-h-full envive-tw-overflow-hidden",
26
26
  children: [
27
27
  header && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
28
- className: "envive-tw-flex-shrink-0",
28
+ className: "envive-tw-flex-shrink-0 envive-tw-leading-[0]",
29
29
  children: header
30
30
  }),
31
31
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -17,13 +17,13 @@ const Layout = ({ id, className, style, testId, theme = Theme.GLOBAL_CUSTOM, hea
17
17
  id,
18
18
  testId,
19
19
  style,
20
- className: classNames("envive-tw-flex envive-tw-h-full envive-tw-w-[512px] envive-tw-flex-col envive-tw-bg-[#FFFFFF]", className),
20
+ className: classNames("envive-tw-flex envive-tw-h-full envive-tw-w-full envive-tw-max-w-[512px] envive-tw-flex-col envive-tw-bg-[#FFFFFF]", className),
21
21
  children: /* @__PURE__ */ jsxs(Stack, {
22
22
  direction: "column",
23
23
  className: "envive-tw-relative envive-tw-h-full envive-tw-overflow-hidden",
24
24
  children: [
25
25
  header && /* @__PURE__ */ jsx("div", {
26
- className: "envive-tw-flex-shrink-0",
26
+ className: "envive-tw-flex-shrink-0 envive-tw-leading-[0]",
27
27
  children: header
28
28
  }),
29
29
  /* @__PURE__ */ jsx("div", {
@@ -0,0 +1,184 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_useSnapControl = require('../hooks/useSnapControl.cjs');
3
+ const require_usePreventScroll = require('../hooks/usePreventScroll.cjs');
4
+ let react = require("react");
5
+ react = require_rolldown_runtime.__toESM(react);
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let framer_motion = require("framer-motion");
8
+
9
+ //#region src/components/FloatingChat/components/ModalSheet.tsx
10
+ const BOTTOM_OFFSET = 100;
11
+ const ModalSheet = ({ animationKey, children, open, height, unit, snaps = [], initSnap = 0, handler, animation = {
12
+ type: "spring",
13
+ stiffness: 300,
14
+ damping: 30
15
+ }, controlRef, onClose, onSnap, disableDrag = false }) => {
16
+ const [layerRef] = (0, framer_motion.useAnimate)();
17
+ const [containerRef] = (0, framer_motion.useAnimate)();
18
+ const { gestureRef, isScrollableArea, getScrollParent, getGestureDirection, getScrollDirections } = require_usePreventScroll.usePreventScroll();
19
+ const onSnapComplete = (currentSnap$1, nextSnap, collapsed) => {
20
+ if (collapsed) {
21
+ onClose?.();
22
+ return;
23
+ }
24
+ if (currentSnap$1 !== nextSnap) onSnap?.(nextSnap);
25
+ };
26
+ const { scope, animatedY, swipeviewHeightPx, initSnapInPixels, contentHeight, currentSnap, displayOverlay, opacityOverlay, jumpTo, defineNextSnapByPosition, resetControls, getSnapToPixel } = require_useSnapControl.useSnapControl({
27
+ animationKey,
28
+ animation,
29
+ height,
30
+ unit,
31
+ snaps,
32
+ initSnap,
33
+ overlayOpacity: .5,
34
+ onSnapComplete
35
+ });
36
+ (0, react.useImperativeHandle)(controlRef, () => ({ jumpToSnap: (snapIndex) => {
37
+ jumpTo(getSnapToPixel(snaps[snapIndex]));
38
+ } }));
39
+ const expandToFullView = () => {
40
+ if (snaps.indexOf(currentSnap) === 1) jumpTo(getSnapToPixel(2));
41
+ };
42
+ const notifySnapChanges = (isModalOpen) => {
43
+ if (isModalOpen) {
44
+ onSnap?.(currentSnap);
45
+ return;
46
+ }
47
+ const snap = resetControls();
48
+ onSnap?.(snap);
49
+ };
50
+ (0, react.useEffect)(() => {
51
+ const preventDefault = (event) => event.preventDefault();
52
+ layerRef?.current?.addEventListener("touchmove", preventDefault, { passive: false });
53
+ return () => {
54
+ layerRef?.current?.removeEventListener("touchmove", preventDefault);
55
+ };
56
+ }, [layerRef?.current]);
57
+ (0, react.useEffect)(() => {
58
+ const preventScroll = (event) => {
59
+ if (!isScrollableArea(getGestureDirection(event.touches[0].clientX, event.touches[0].clientY))) {
60
+ event.preventDefault();
61
+ event.stopPropagation();
62
+ }
63
+ };
64
+ containerRef?.current?.addEventListener("touchmove", preventScroll, { passive: false });
65
+ notifySnapChanges(open);
66
+ return () => {
67
+ containerRef?.current?.removeEventListener("touchmove", preventScroll);
68
+ };
69
+ }, [open]);
70
+ const handleDragEnd = () => {
71
+ jumpTo(defineNextSnapByPosition());
72
+ };
73
+ const handleTouchStart = (event) => {
74
+ const scrollableElement = getScrollParent(event.target);
75
+ const scrollableDirections = getScrollDirections(scrollableElement);
76
+ const parentScrollableElement = getScrollParent(scrollableElement, true);
77
+ const parentScrollableDirections = getScrollDirections(parentScrollableElement);
78
+ const grandparentScrollableElement = getScrollParent(parentScrollableElement, true);
79
+ const grandparentScrollableDirections = getScrollDirections(grandparentScrollableElement);
80
+ gestureRef.current = {
81
+ event: event.touches?.[0],
82
+ scrollableElements: [
83
+ {
84
+ element: scrollableElement,
85
+ scrollableDirections
86
+ },
87
+ {
88
+ element: parentScrollableElement,
89
+ scrollableDirections: parentScrollableDirections
90
+ },
91
+ {
92
+ element: grandparentScrollableElement,
93
+ scrollableDirections: grandparentScrollableDirections
94
+ }
95
+ ]
96
+ };
97
+ };
98
+ const handleTouchEnd = () => {
99
+ handleDragEnd();
100
+ gestureRef.current = {
101
+ scrollableElements: [],
102
+ event: null
103
+ };
104
+ };
105
+ const handleContentGesture = (fingerX, fingerY) => {
106
+ if (!gestureRef.current?.event) return;
107
+ const pointerDistance = (gestureRef.current?.event?.clientY || 0) - fingerY;
108
+ const distanceToTravel = getSnapToPixel(currentSnap) - pointerDistance;
109
+ const gestureDirection = getGestureDirection(fingerX, fingerY);
110
+ if (!(isScrollableArea(gestureDirection) || gestureDirection !== "down" && currentSnap === 100)) animatedY.set(distanceToTravel);
111
+ };
112
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.AnimatePresence, { children: open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
113
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.motion.div, {
114
+ ref: layerRef,
115
+ style: {
116
+ display: displayOverlay,
117
+ position: "fixed",
118
+ top: 0,
119
+ left: 0,
120
+ right: 0,
121
+ bottom: 0,
122
+ opacity: opacityOverlay,
123
+ background: "black"
124
+ }
125
+ }),
126
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.motion.div, {
127
+ ref: scope,
128
+ drag: "y",
129
+ dragConstraints: {
130
+ top: 0,
131
+ bottom: swipeviewHeightPx
132
+ },
133
+ initial: { y: swipeviewHeightPx },
134
+ animate: { y: initSnapInPixels },
135
+ exit: { y: swipeviewHeightPx + BOTTOM_OFFSET },
136
+ transition: animation,
137
+ onDragEnd: handleDragEnd,
138
+ onClick: expandToFullView,
139
+ style: {
140
+ y: animatedY,
141
+ bottom: swipeviewHeightPx,
142
+ right: 0,
143
+ position: "fixed",
144
+ width: "100%",
145
+ zIndex: 2147483647
146
+ },
147
+ children: handler
148
+ }),
149
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.motion.div, {
150
+ ref: scope,
151
+ onTouchStart: handleTouchStart,
152
+ onTouchEnd: handleTouchEnd,
153
+ onTouchMove: (event) => handleContentGesture(event.touches[0].clientX, event.touches[0].clientY),
154
+ onPointerMove: disableDrag ? void 0 : (event) => handleContentGesture(event.clientX, event.clientY),
155
+ initial: { y: swipeviewHeightPx + BOTTOM_OFFSET },
156
+ animate: { y: initSnapInPixels },
157
+ exit: { y: swipeviewHeightPx + BOTTOM_OFFSET },
158
+ transition: animation,
159
+ style: {
160
+ y: animatedY,
161
+ width: "100%",
162
+ height: swipeviewHeightPx + BOTTOM_OFFSET,
163
+ position: "fixed",
164
+ bottom: -BOTTOM_OFFSET + 1,
165
+ right: 0,
166
+ boxSizing: "content-box",
167
+ zIndex: 2147483646
168
+ },
169
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.motion.div, {
170
+ ref: containerRef,
171
+ initial: { height: 0 },
172
+ style: {
173
+ width: "100%",
174
+ height: contentHeight,
175
+ userSelect: "none"
176
+ },
177
+ children
178
+ })
179
+ })
180
+ ] }) });
181
+ };
182
+
183
+ //#endregion
184
+ exports.ModalSheet = ModalSheet;
@@ -0,0 +1,182 @@
1
+ import { useSnapControl } from "../hooks/useSnapControl.js";
2
+ import { usePreventScroll } from "../hooks/usePreventScroll.js";
3
+ import React, { useEffect, useImperativeHandle } from "react";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { AnimatePresence, motion, useAnimate } from "framer-motion";
6
+
7
+ //#region src/components/FloatingChat/components/ModalSheet.tsx
8
+ const BOTTOM_OFFSET = 100;
9
+ const ModalSheet = ({ animationKey, children, open, height, unit, snaps = [], initSnap = 0, handler, animation = {
10
+ type: "spring",
11
+ stiffness: 300,
12
+ damping: 30
13
+ }, controlRef, onClose, onSnap, disableDrag = false }) => {
14
+ const [layerRef] = useAnimate();
15
+ const [containerRef] = useAnimate();
16
+ const { gestureRef, isScrollableArea, getScrollParent, getGestureDirection, getScrollDirections } = usePreventScroll();
17
+ const onSnapComplete = (currentSnap$1, nextSnap, collapsed) => {
18
+ if (collapsed) {
19
+ onClose?.();
20
+ return;
21
+ }
22
+ if (currentSnap$1 !== nextSnap) onSnap?.(nextSnap);
23
+ };
24
+ const { scope, animatedY, swipeviewHeightPx, initSnapInPixels, contentHeight, currentSnap, displayOverlay, opacityOverlay, jumpTo, defineNextSnapByPosition, resetControls, getSnapToPixel } = useSnapControl({
25
+ animationKey,
26
+ animation,
27
+ height,
28
+ unit,
29
+ snaps,
30
+ initSnap,
31
+ overlayOpacity: .5,
32
+ onSnapComplete
33
+ });
34
+ useImperativeHandle(controlRef, () => ({ jumpToSnap: (snapIndex) => {
35
+ jumpTo(getSnapToPixel(snaps[snapIndex]));
36
+ } }));
37
+ const expandToFullView = () => {
38
+ if (snaps.indexOf(currentSnap) === 1) jumpTo(getSnapToPixel(2));
39
+ };
40
+ const notifySnapChanges = (isModalOpen) => {
41
+ if (isModalOpen) {
42
+ onSnap?.(currentSnap);
43
+ return;
44
+ }
45
+ const snap = resetControls();
46
+ onSnap?.(snap);
47
+ };
48
+ useEffect(() => {
49
+ const preventDefault = (event) => event.preventDefault();
50
+ layerRef?.current?.addEventListener("touchmove", preventDefault, { passive: false });
51
+ return () => {
52
+ layerRef?.current?.removeEventListener("touchmove", preventDefault);
53
+ };
54
+ }, [layerRef?.current]);
55
+ useEffect(() => {
56
+ const preventScroll = (event) => {
57
+ if (!isScrollableArea(getGestureDirection(event.touches[0].clientX, event.touches[0].clientY))) {
58
+ event.preventDefault();
59
+ event.stopPropagation();
60
+ }
61
+ };
62
+ containerRef?.current?.addEventListener("touchmove", preventScroll, { passive: false });
63
+ notifySnapChanges(open);
64
+ return () => {
65
+ containerRef?.current?.removeEventListener("touchmove", preventScroll);
66
+ };
67
+ }, [open]);
68
+ const handleDragEnd = () => {
69
+ jumpTo(defineNextSnapByPosition());
70
+ };
71
+ const handleTouchStart = (event) => {
72
+ const scrollableElement = getScrollParent(event.target);
73
+ const scrollableDirections = getScrollDirections(scrollableElement);
74
+ const parentScrollableElement = getScrollParent(scrollableElement, true);
75
+ const parentScrollableDirections = getScrollDirections(parentScrollableElement);
76
+ const grandparentScrollableElement = getScrollParent(parentScrollableElement, true);
77
+ const grandparentScrollableDirections = getScrollDirections(grandparentScrollableElement);
78
+ gestureRef.current = {
79
+ event: event.touches?.[0],
80
+ scrollableElements: [
81
+ {
82
+ element: scrollableElement,
83
+ scrollableDirections
84
+ },
85
+ {
86
+ element: parentScrollableElement,
87
+ scrollableDirections: parentScrollableDirections
88
+ },
89
+ {
90
+ element: grandparentScrollableElement,
91
+ scrollableDirections: grandparentScrollableDirections
92
+ }
93
+ ]
94
+ };
95
+ };
96
+ const handleTouchEnd = () => {
97
+ handleDragEnd();
98
+ gestureRef.current = {
99
+ scrollableElements: [],
100
+ event: null
101
+ };
102
+ };
103
+ const handleContentGesture = (fingerX, fingerY) => {
104
+ if (!gestureRef.current?.event) return;
105
+ const pointerDistance = (gestureRef.current?.event?.clientY || 0) - fingerY;
106
+ const distanceToTravel = getSnapToPixel(currentSnap) - pointerDistance;
107
+ const gestureDirection = getGestureDirection(fingerX, fingerY);
108
+ if (!(isScrollableArea(gestureDirection) || gestureDirection !== "down" && currentSnap === 100)) animatedY.set(distanceToTravel);
109
+ };
110
+ return /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsxs(Fragment, { children: [
111
+ /* @__PURE__ */ jsx(motion.div, {
112
+ ref: layerRef,
113
+ style: {
114
+ display: displayOverlay,
115
+ position: "fixed",
116
+ top: 0,
117
+ left: 0,
118
+ right: 0,
119
+ bottom: 0,
120
+ opacity: opacityOverlay,
121
+ background: "black"
122
+ }
123
+ }),
124
+ /* @__PURE__ */ jsx(motion.div, {
125
+ ref: scope,
126
+ drag: "y",
127
+ dragConstraints: {
128
+ top: 0,
129
+ bottom: swipeviewHeightPx
130
+ },
131
+ initial: { y: swipeviewHeightPx },
132
+ animate: { y: initSnapInPixels },
133
+ exit: { y: swipeviewHeightPx + BOTTOM_OFFSET },
134
+ transition: animation,
135
+ onDragEnd: handleDragEnd,
136
+ onClick: expandToFullView,
137
+ style: {
138
+ y: animatedY,
139
+ bottom: swipeviewHeightPx,
140
+ right: 0,
141
+ position: "fixed",
142
+ width: "100%",
143
+ zIndex: 2147483647
144
+ },
145
+ children: handler
146
+ }),
147
+ /* @__PURE__ */ jsx(motion.div, {
148
+ ref: scope,
149
+ onTouchStart: handleTouchStart,
150
+ onTouchEnd: handleTouchEnd,
151
+ onTouchMove: (event) => handleContentGesture(event.touches[0].clientX, event.touches[0].clientY),
152
+ onPointerMove: disableDrag ? void 0 : (event) => handleContentGesture(event.clientX, event.clientY),
153
+ initial: { y: swipeviewHeightPx + BOTTOM_OFFSET },
154
+ animate: { y: initSnapInPixels },
155
+ exit: { y: swipeviewHeightPx + BOTTOM_OFFSET },
156
+ transition: animation,
157
+ style: {
158
+ y: animatedY,
159
+ width: "100%",
160
+ height: swipeviewHeightPx + BOTTOM_OFFSET,
161
+ position: "fixed",
162
+ bottom: -BOTTOM_OFFSET + 1,
163
+ right: 0,
164
+ boxSizing: "content-box",
165
+ zIndex: 2147483646
166
+ },
167
+ children: /* @__PURE__ */ jsx(motion.div, {
168
+ ref: containerRef,
169
+ initial: { height: 0 },
170
+ style: {
171
+ width: "100%",
172
+ height: contentHeight,
173
+ userSelect: "none"
174
+ },
175
+ children
176
+ })
177
+ })
178
+ ] }) });
179
+ };
180
+
181
+ //#endregion
182
+ export { ModalSheet };
@@ -6,14 +6,15 @@ const require_SalesAgentProductCard = require('../../SalesAgentProductCard/Sales
6
6
  let react_jsx_runtime = require("react/jsx-runtime");
7
7
 
8
8
  //#region src/components/FloatingChat/components/SalesAgentProductCardsCarousel.tsx
9
- const SalesAgentProductCardsCarousel = ({ products, theme, hideNavigation = false, numberOfProducts }) => {
9
+ const SalesAgentProductCardsCarousel = ({ products, theme, hideNavigation = false, numberOfProducts, variant = require_types.SalesAgentProductCardVariant.LARGE, isPartialView = false }) => {
10
10
  const finalTheme = require_resolveTheme.resolveTheme(theme);
11
+ const finalVariant = isPartialView ? require_types.SalesAgentProductCardVariant.SMALL : variant;
11
12
  const forceShowCurrentPriceSpace = products.some((product) => product.currentPrice && product.previousPrice !== product.currentPrice);
12
13
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Carousel.Carousel, {
13
14
  hideNavigation,
14
15
  badgeLabel: numberOfProducts && numberOfProducts > 1 ? `${numberOfProducts} Products` : void 0,
15
16
  elements: products.map((product) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_SalesAgentProductCard.SalesAgentProductCard, {
16
- variant: require_types.SalesAgentProductCardVariant.LARGE,
17
+ variant: finalVariant,
17
18
  productName: product.productName,
18
19
  currentPrice: product.currentPrice,
19
20
  previousPrice: product.previousPrice,