@memori.ai/memori-react 9.0.0-alpha.16 → 9.0.0-alpha.18

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 (186) hide show
  1. package/CHANGELOG.md +4 -6944
  2. package/dist/components/Chat/Chat.css +11 -15
  3. package/dist/components/Chat/Chat.js +11 -3
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.css +96 -22
  6. package/dist/components/ChatBubble/ChatBubble.js +31 -2
  7. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  8. package/dist/components/ChatHistoryDrawer/ChatHistory.css +1 -0
  9. package/dist/components/ChatInputs/ChatInputs.css +72 -147
  10. package/dist/components/ChatInputs/ChatInputs.js +3 -4
  11. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  12. package/dist/components/Header/ChatConsumptionDropdown.js +2 -1
  13. package/dist/components/Header/ChatConsumptionDropdown.js.map +1 -1
  14. package/dist/components/Header/Header.css +199 -34
  15. package/dist/components/Header/Header.d.ts +1 -0
  16. package/dist/components/Header/Header.js +42 -34
  17. package/dist/components/Header/Header.js.map +1 -1
  18. package/dist/components/IconButton/IconButton.css +144 -0
  19. package/dist/components/IconButton/IconButton.d.ts +9 -0
  20. package/dist/components/IconButton/IconButton.js +36 -0
  21. package/dist/components/IconButton/IconButton.js.map +1 -0
  22. package/dist/components/KnownFacts/KnownFacts.css +22 -9
  23. package/dist/components/KnownFacts/KnownFacts.js +13 -4
  24. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  25. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +29 -44
  26. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +3 -2
  27. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  28. package/dist/components/MemoriWidget/MemoriWidget.css +2 -1
  29. package/dist/components/MemoriWidget/MemoriWidget.js +27 -30
  30. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  31. package/dist/components/MicrophoneButton/MicrophoneButton.css +2 -183
  32. package/dist/components/MicrophoneButton/MicrophoneButton.js +3 -1
  33. package/dist/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  34. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +22 -7
  35. package/dist/components/MobileSessionPanel/MobileSessionPanel.d.ts +1 -0
  36. package/dist/components/MobileSessionPanel/MobileSessionPanel.js +6 -4
  37. package/dist/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  38. package/dist/components/PositionPopover/PositionPopover.d.ts +2 -0
  39. package/dist/components/PositionPopover/PositionPopover.js +18 -4
  40. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  41. package/dist/components/ShareButton/ShareButton.css +3 -2
  42. package/dist/components/ShareButton/ShareButton.js +3 -2
  43. package/dist/components/ShareButton/ShareButton.js.map +1 -1
  44. package/dist/components/UploadButton/UploadButton.css +2 -20
  45. package/dist/components/UploadButton/UploadButton.js +2 -1
  46. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  47. package/dist/components/layouts/Chat.js +59 -73
  48. package/dist/components/layouts/Chat.js.map +1 -1
  49. package/dist/components/layouts/FullPage.js +53 -34
  50. package/dist/components/layouts/FullPage.js.map +1 -1
  51. package/dist/components/layouts/HiddenChat.js +3 -3
  52. package/dist/components/layouts/HiddenChat.js.map +1 -1
  53. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +3 -3
  54. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  55. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +28 -15
  56. package/dist/components/layouts/ZoomedFullBody.js +53 -34
  57. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  58. package/dist/components/layouts/chat.css +76 -41
  59. package/dist/components/layouts/fullpage.css +18 -9
  60. package/dist/components/layouts/hidden-chat.css +45 -69
  61. package/dist/components/layouts/zoomed-full-body.css +6 -5
  62. package/dist/helpers/positionPopover.d.ts +1 -1
  63. package/dist/helpers/positionPopover.js +2 -2
  64. package/dist/helpers/positionPopover.js.map +1 -1
  65. package/dist/styles.css +1 -1
  66. package/dist/version.d.ts +1 -1
  67. package/dist/version.js +1 -1
  68. package/esm/components/Chat/Chat.css +11 -15
  69. package/esm/components/Chat/Chat.js +11 -3
  70. package/esm/components/Chat/Chat.js.map +1 -1
  71. package/esm/components/ChatBubble/ChatBubble.css +96 -22
  72. package/esm/components/ChatBubble/ChatBubble.js +31 -2
  73. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  74. package/esm/components/ChatHistoryDrawer/ChatHistory.css +1 -0
  75. package/esm/components/ChatInputs/ChatInputs.css +72 -147
  76. package/esm/components/ChatInputs/ChatInputs.js +3 -4
  77. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  78. package/esm/components/Header/ChatConsumptionDropdown.js +3 -2
  79. package/esm/components/Header/ChatConsumptionDropdown.js.map +1 -1
  80. package/esm/components/Header/Header.css +199 -34
  81. package/esm/components/Header/Header.d.ts +1 -0
  82. package/esm/components/Header/Header.js +42 -34
  83. package/esm/components/Header/Header.js.map +1 -1
  84. package/esm/components/IconButton/IconButton.css +144 -0
  85. package/esm/components/IconButton/IconButton.d.ts +9 -0
  86. package/esm/components/IconButton/IconButton.js +33 -0
  87. package/esm/components/IconButton/IconButton.js.map +1 -0
  88. package/esm/components/KnownFacts/KnownFacts.css +22 -9
  89. package/esm/components/KnownFacts/KnownFacts.js +13 -4
  90. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  91. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +29 -44
  92. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +3 -2
  93. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  94. package/esm/components/MemoriWidget/MemoriWidget.css +2 -1
  95. package/esm/components/MemoriWidget/MemoriWidget.js +27 -30
  96. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  97. package/esm/components/MicrophoneButton/MicrophoneButton.css +2 -183
  98. package/esm/components/MicrophoneButton/MicrophoneButton.js +3 -2
  99. package/esm/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  100. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +22 -7
  101. package/esm/components/MobileSessionPanel/MobileSessionPanel.d.ts +1 -0
  102. package/esm/components/MobileSessionPanel/MobileSessionPanel.js +6 -4
  103. package/esm/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  104. package/esm/components/PositionPopover/PositionPopover.d.ts +2 -0
  105. package/esm/components/PositionPopover/PositionPopover.js +18 -4
  106. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  107. package/esm/components/ShareButton/ShareButton.css +3 -2
  108. package/esm/components/ShareButton/ShareButton.js +4 -3
  109. package/esm/components/ShareButton/ShareButton.js.map +1 -1
  110. package/esm/components/UploadButton/UploadButton.css +2 -20
  111. package/esm/components/UploadButton/UploadButton.js +2 -1
  112. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  113. package/esm/components/layouts/Chat.js +62 -76
  114. package/esm/components/layouts/Chat.js.map +1 -1
  115. package/esm/components/layouts/FullPage.js +54 -35
  116. package/esm/components/layouts/FullPage.js.map +1 -1
  117. package/esm/components/layouts/HiddenChat.js +3 -3
  118. package/esm/components/layouts/HiddenChat.js.map +1 -1
  119. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +3 -3
  120. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  121. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +28 -15
  122. package/esm/components/layouts/ZoomedFullBody.js +54 -35
  123. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  124. package/esm/components/layouts/chat.css +76 -41
  125. package/esm/components/layouts/fullpage.css +18 -9
  126. package/esm/components/layouts/hidden-chat.css +45 -69
  127. package/esm/components/layouts/zoomed-full-body.css +6 -5
  128. package/esm/helpers/positionPopover.d.ts +1 -1
  129. package/esm/helpers/positionPopover.js +2 -2
  130. package/esm/helpers/positionPopover.js.map +1 -1
  131. package/esm/styles.css +1 -1
  132. package/esm/version.d.ts +1 -1
  133. package/esm/version.js +1 -1
  134. package/package.json +1 -1
  135. package/src/components/Chat/Chat.css +11 -15
  136. package/src/components/Chat/Chat.tsx +13 -2
  137. package/src/components/ChatBubble/ChatBubble.css +96 -22
  138. package/src/components/ChatBubble/ChatBubble.tsx +39 -0
  139. package/src/components/ChatHistoryDrawer/ChatHistory.css +1 -0
  140. package/src/components/ChatInputs/ChatInputs.css +72 -147
  141. package/src/components/ChatInputs/ChatInputs.tsx +7 -7
  142. package/src/components/Header/ChatConsumptionDropdown.tsx +3 -2
  143. package/src/components/Header/Header.css +199 -34
  144. package/src/components/Header/Header.tsx +120 -100
  145. package/src/components/Header/__snapshots__/Header.test.tsx.snap +90 -57
  146. package/src/components/IconButton/IconButton.css +144 -0
  147. package/src/components/IconButton/IconButton.tsx +89 -0
  148. package/src/components/KnownFacts/KnownFacts.css +22 -9
  149. package/src/components/KnownFacts/KnownFacts.tsx +13 -3
  150. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +29 -44
  151. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +11 -20
  152. package/src/components/MemoriWidget/MemoriWidget.css +2 -1
  153. package/src/components/MemoriWidget/MemoriWidget.tsx +38 -31
  154. package/src/components/MicrophoneButton/MicrophoneButton.css +2 -183
  155. package/src/components/MicrophoneButton/MicrophoneButton.tsx +5 -5
  156. package/src/components/MobileSessionPanel/MobileSessionPanel.css +22 -7
  157. package/src/components/MobileSessionPanel/MobileSessionPanel.tsx +8 -6
  158. package/src/components/PositionPopover/PositionPopover.tsx +30 -4
  159. package/src/components/ShareButton/ShareButton.css +3 -2
  160. package/src/components/ShareButton/ShareButton.tsx +8 -9
  161. package/src/components/ShareButton/__snapshots__/ShareButton.test.tsx.snap +9 -9
  162. package/src/components/StartPanel/StartPanel.stories.tsx +1 -1
  163. package/src/components/UploadButton/UploadButton.css +2 -20
  164. package/src/components/UploadButton/UploadButton.tsx +3 -5
  165. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +29 -25
  166. package/src/components/layouts/Chat.tsx +210 -232
  167. package/src/components/layouts/FullPage.tsx +61 -40
  168. package/src/components/layouts/HiddenChat.tsx +5 -6
  169. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +2 -2
  170. package/src/components/layouts/WebsiteAssistant/__snapshots__/WebsiteAssistant.test.tsx.snap +2 -0
  171. package/src/components/layouts/WebsiteAssistant/website-assistant.css +28 -15
  172. package/src/components/layouts/ZoomedFullBody.tsx +61 -40
  173. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +145 -143
  174. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +22 -18
  175. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +10 -145
  176. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +12 -10
  177. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +11 -9
  178. package/src/components/layouts/chat.css +76 -41
  179. package/src/components/layouts/fullpage.css +18 -9
  180. package/src/components/layouts/hidden-chat.css +45 -69
  181. package/src/components/layouts/layouts.stories.tsx +1 -1
  182. package/src/components/layouts/zoomed-full-body.css +6 -5
  183. package/src/helpers/positionPopover.test.ts +10 -4
  184. package/src/helpers/positionPopover.ts +8 -5
  185. package/src/styles.css +1 -0
  186. package/src/version.ts +1 -1
@@ -1,9 +1,9 @@
1
- /* Hold-to-talk: tooltip uses align=topLeft so the bubble stays in view (mic sits on the trailing edge). */
1
+ /* Hold-to-talk: tooltip chrome only — button look owned by IconButton */
2
+
2
3
  .memori-chat-inputs--mic-tooltip.memori-tooltip {
3
4
  vertical-align: middle;
4
5
  }
5
6
 
6
- /* Library default is overflow: hidden auto + max-height — avoid scrollbars on short hint text */
7
7
  .memori-chat-inputs--mic-tooltip .memori-tooltip--content {
8
8
  overflow: visible;
9
9
  max-height: none;
@@ -11,148 +11,15 @@
11
11
 
12
12
  .memori-chat-inputs--mic {
13
13
  z-index: 1;
14
- width: 34px;
15
- min-width: 34px;
16
- height: 34px;
17
- box-sizing: border-box;
18
14
  flex-shrink: 0;
19
- padding: 0;
20
- border: none;
21
- border-radius: 10px;
22
15
  margin-left: 0;
23
- background: transparent;
24
- color: #888;
25
- cursor: pointer;
26
16
  -webkit-tap-highlight-color: transparent;
27
17
  touch-action: manipulation;
28
18
  -webkit-touch-callout: none;
29
- transition: background 0.15s ease, color 0.15s ease;
30
19
  -webkit-user-drag: none;
31
- -khtml-user-drag: none;
32
- -moz-user-drag: none;
33
- -o-user-drag: none;
34
- -webkit-user-select: none;
35
- user-select: none;
36
- }
37
-
38
- .memori-chat-inputs--mic svg {
39
- width: 18px;
40
- height: 18px;
41
- color: inherit;
42
- font-size: 1em;
43
- -webkit-user-select: none;
44
20
  user-select: none;
45
21
  }
46
22
 
47
- .memori-chat-inputs--mic:hover {
48
- background-color: #f2eef5 !important;
49
- color: #555 !important;
50
- }
51
-
52
- .memori-chat-inputs--mic:active,
53
- .memori-chat-inputs--mic:focus {
54
- box-shadow: none !important;
55
- }
56
-
57
- .memori-chat-inputs--mic:not(.memori-chat-inputs--mic--listening):active,
58
- .memori-chat-inputs--mic:not(.memori-chat-inputs--mic--listening):focus {
59
- color: #555 !important;
60
- }
61
-
62
- /* Layout-scoped mic colors (FULL_PAGE / HIDDEN_CHAT / WEBSITE_ASSISTANT) */
63
- .memori-widget.memori-layout-fullpage .memori-chat-inputs--mic,
64
- .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--mic,
65
- .memori-widget.memori-layout-website_assistant .memori-chat-inputs--mic {
66
- color: #9c98a4;
67
- }
68
-
69
- .memori-widget.memori-layout-fullpage .memori-chat-inputs--mic:hover {
70
- background-color: #332f3a !important;
71
- color: #d8d6de !important;
72
- }
73
-
74
- .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--mic:hover,
75
- .memori-widget.memori-layout-website_assistant .memori-chat-inputs--mic:hover {
76
- background-color: transparent !important;
77
- color: #d8d6de !important;
78
- }
79
-
80
- /* Enhanced touch feedback for mobile */
81
- @media (hover: none) and (pointer: coarse) {
82
- .memori-chat-inputs--mic:active {
83
- transform: scale(0.95);
84
- transition: transform 0.1s ease;
85
- }
86
-
87
- .memori-chat-inputs--mic:not(.memori-chat-inputs--mic--listening):active {
88
- background-color: #f2eef5;
89
- }
90
- }
91
-
92
- @keyframes micBtnActivePulse {
93
- 0% {
94
- transform: scale(1.25);
95
- }
96
-
97
- 25% {
98
- transform: scale(1.4);
99
- }
100
-
101
- 50% {
102
- transform: scale(1.3);
103
- }
104
-
105
- 75% {
106
- transform: scale(1.4);
107
- }
108
-
109
- 100% {
110
- transform: scale(1.2);
111
- }
112
- }
113
-
114
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening {
115
- position: relative;
116
- color: red !important;
117
- -webkit-tap-highlight-color: transparent;
118
- touch-action: manipulation;
119
- -webkit-touch-callout: none;
120
- transform: scale(1.5);
121
- }
122
-
123
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening::before,
124
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening::after {
125
- position: absolute;
126
- z-index: -1;
127
- top: 0;
128
- left: 0;
129
- width: 100%;
130
- height: 100%;
131
- border-radius: 50%;
132
- animation: micBtnActivePulse 2s infinite;
133
- background: var(--memori-primary);
134
- content: '';
135
- opacity: 0.2;
136
- }
137
-
138
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening::after {
139
- top: 5%;
140
- left: 5%;
141
- width: 90%;
142
- height: 90%;
143
- animation-delay: 0.3s;
144
- opacity: 0.3;
145
- }
146
-
147
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening:active,
148
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening:focus {
149
- border-color: red !important;
150
- }
151
-
152
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening svg {
153
- color: red !important;
154
- }
155
-
156
23
  .memori-chat-inputs--mic-tooltip.memori-tooltip--align-topLeft .memori-tooltip--content {
157
24
  top: -50%;
158
25
  right: 115%;
@@ -164,53 +31,5 @@
164
31
  font-size: 0.85em;
165
32
  opacity: 0;
166
33
  text-align: center;
167
- /* left: 0; */
168
34
  transform: translateY(-100%);
169
35
  }
170
-
171
- /* Mobile-specific improvements for listening state */
172
- @media (hover: none) and (pointer: coarse) {
173
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening {
174
- transform: scale(1.3);
175
- }
176
-
177
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening::before,
178
- .memori-chat-inputs--mic.memori-chat-inputs--mic--listening::after {
179
- animation-duration: 1.5s;
180
- }
181
- }
182
-
183
- [data-theme='dark'] .memori-chat-inputs--mic .lucide-mic {
184
- color: #fff;
185
- }
186
-
187
- .memori-widget.memori-layout-fullpage[data-theme='dark'] .memori-chat-inputs--mic .lucide-mic,
188
- [data-theme='dark'] .memori-widget.memori-layout-fullpage .memori-chat-inputs--mic .lucide-mic,
189
- .memori-widget.memori-layout-hidden_chat[data-theme='dark'] .memori-chat-inputs--mic .lucide-mic,
190
- [data-theme='dark'] .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--mic .lucide-mic,
191
- .memori-widget.memori-layout-website_assistant[data-theme='dark'] .memori-chat-inputs--mic .lucide-mic,
192
- [data-theme='dark'] .memori-widget.memori-layout-website_assistant .memori-chat-inputs--mic .lucide-mic {
193
- color: inherit;
194
- }
195
-
196
- /* Light hover surface (#f2eef5) — keep the icon black in dark mode for contrast */
197
- .memori-widget[data-theme='dark'] .memori-chat-inputs--mic:hover,
198
- .memori-widget.memori-layout-fullpage[data-theme='dark'] .memori-chat-inputs--mic:hover,
199
- [data-theme='dark'] .memori-widget.memori-layout-fullpage .memori-chat-inputs--mic:hover,
200
- .memori-widget.memori-layout-hidden_chat[data-theme='dark'] .memori-chat-inputs--mic:hover,
201
- [data-theme='dark'] .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--mic:hover,
202
- .memori-widget.memori-layout-website_assistant[data-theme='dark'] .memori-chat-inputs--mic:hover,
203
- [data-theme='dark'] .memori-widget.memori-layout-website_assistant .memori-chat-inputs--mic:hover,
204
- .memori-widget[data-theme='dark'] .memori-chat-inputs--trailing .memori-chat-inputs--mic:hover {
205
- color: #000 !important;
206
- }
207
-
208
- .memori-widget[data-theme='dark'] .memori-chat-inputs--mic:hover .lucide-mic,
209
- .memori-widget.memori-layout-fullpage[data-theme='dark'] .memori-chat-inputs--mic:hover .lucide-mic,
210
- [data-theme='dark'] .memori-widget.memori-layout-fullpage .memori-chat-inputs--mic:hover .lucide-mic,
211
- .memori-widget.memori-layout-hidden_chat[data-theme='dark'] .memori-chat-inputs--mic:hover .lucide-mic,
212
- [data-theme='dark'] .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--mic:hover .lucide-mic,
213
- .memori-widget.memori-layout-website_assistant[data-theme='dark'] .memori-chat-inputs--mic:hover .lucide-mic,
214
- [data-theme='dark'] .memori-widget.memori-layout-website_assistant .memori-chat-inputs--mic:hover .lucide-mic {
215
- color: #000 !important;
216
- }
@@ -1,7 +1,8 @@
1
1
  import React, { useState, useEffect, useRef } from 'react';
2
2
  import { Props as ChatInputProps } from '../ChatInputs/ChatInputs';
3
3
  import { Mic } from 'lucide-react';
4
- import { Button, Tooltip } from '@memori.ai/ui';
4
+ import { Tooltip } from '@memori.ai/ui';
5
+ import IconButton from '../IconButton/IconButton';
5
6
  import { useTranslation } from 'react-i18next';
6
7
 
7
8
  export interface Props {
@@ -112,10 +113,10 @@ const MicrophoneButton = ({
112
113
  }}
113
114
  >
114
115
  <div onContextMenu={handleContextMenu}>
115
- <Button
116
- variant="ghost"
116
+ <IconButton
117
117
  size="sm"
118
- className={`memori-chat-inputs--mic${listening ? ' memori-chat-inputs--mic--listening' : ''}`}
118
+ className="memori-chat-inputs--mic"
119
+ recording={!!listening}
119
120
  aria-label={listening ? listeningHint : idleHint}
120
121
  aria-pressed={!!listening}
121
122
  disabled={disabled}
@@ -124,7 +125,6 @@ const MicrophoneButton = ({
124
125
  onMouseUp={stopHold}
125
126
  onTouchEnd={handleTouchEnd}
126
127
  onMouseLeave={stopHold}
127
- // shape="circle"
128
128
  icon={<Mic />}
129
129
  />
130
130
  </div>
@@ -197,8 +197,7 @@
197
197
  justify-content: center;
198
198
  border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
199
199
  border-radius: 12px;
200
- /* background: var(--memori-main-background); */
201
- color: var(--memori-primary);
200
+ color: var(--memori-icon-button-icon, color-mix(in oklch, var(--memori-text-color, #111827) 72%, transparent));
202
201
  }
203
202
 
204
203
  [data-theme='dark'] .memori-mobile-session-panel--action-icon {
@@ -206,13 +205,33 @@
206
205
  color: #fff;
207
206
  }
208
207
 
208
+ .memori-mobile-session-panel--logout .memori-mobile-session-panel--action-icon {
209
+ color: #a53b45;
210
+ }
211
+
212
+ .memori-mobile-session-panel--action:focus-visible .memori-mobile-session-panel--action-icon {
213
+ color: var(--memori-primary);
214
+ }
215
+
216
+ .memori-mobile-session-panel--action:hover:not(:disabled) .memori-mobile-session-panel--action-icon {
217
+ color: var(--memori-primary);
218
+ }
219
+
220
+ [data-theme='dark'] .memori-mobile-session-panel--action:focus-visible .memori-mobile-session-panel--action-icon {
221
+ color: var(--memori-primary);
222
+ }
223
+
224
+ [data-theme='dark'] .memori-mobile-session-panel--action:hover:not(:disabled) .memori-mobile-session-panel--action-icon {
225
+ color: var(--memori-primary);
226
+ }
227
+
209
228
  .memori-mobile-session-panel--action-icon svg {
210
229
  width: 1rem;
211
230
  max-width: 1rem;
212
231
  height: 1rem;
213
232
  max-height: 1rem;
214
233
  flex-shrink: 0;
215
- /* color: var(--memori-primary); */
234
+ color: inherit;
216
235
  }
217
236
 
218
237
  .memori-mobile-session-panel--action-copy {
@@ -272,10 +291,6 @@
272
291
  gap: 0.5rem;
273
292
  }
274
293
 
275
- .memori-mobile-session-panel--logout .memori-mobile-session-panel--action-icon {
276
- color: #a53b45;
277
- }
278
-
279
294
  .memori-mobile-session-panel--logout-label {
280
295
  font-size: 1.02rem;
281
296
  font-weight: 500;
@@ -79,6 +79,8 @@ export interface MobileSessionPanelProps {
79
79
  history?: Message[];
80
80
  aiUsageTitle?: string;
81
81
  isLoggedIn?: boolean;
82
+ /** When false, hide profile / login / logout controls (authToken alone must not surface them). */
83
+ showLogin?: boolean;
82
84
  loginLabel?: string;
83
85
  onLogin?: () => void;
84
86
  }
@@ -179,11 +181,14 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
179
181
  history = [],
180
182
  aiUsageTitle,
181
183
  isLoggedIn = false,
184
+ showLogin = false,
182
185
  loginLabel = 'Log in',
183
186
  onLogin,
184
187
  venue,
185
188
  setVenue,
186
189
  }) => {
190
+ const showAuthControls = showLogin;
191
+ const showProfileControls = showAuthControls && isLoggedIn;
187
192
  const panelRef = useRef<HTMLElement>(null);
188
193
  const dialogRef = useRef<HTMLDivElement>(null);
189
194
  const panelTitleId = 'mobile-session-panel-title';
@@ -465,7 +470,7 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
465
470
  {!isPopover && <div className="memori-mobile-session-panel--handle" />}
466
471
  {activeView === 'session' ? (
467
472
  <>
468
- {isLoggedIn && (
473
+ {showProfileControls && (
469
474
  <div className="memori-mobile-session-panel--user">
470
475
  <div className="memori-dropdown--avatar-wrap">
471
476
  {avatarURL ? (
@@ -582,9 +587,6 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
582
587
  {resolvedKnownFactsHint}
583
588
  </span>
584
589
  </span>
585
- <span className="memori-mobile-session-panel--action-trailing">
586
- <ChevronRight size={16} />
587
- </span>
588
590
  </Button>
589
591
  </li>
590
592
  )}
@@ -671,7 +673,7 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
671
673
  </li>
672
674
  ))}
673
675
  </ul>
674
- {isLoggedIn && (
676
+ {showProfileControls && (
675
677
  <Button
676
678
  variant="toolbar"
677
679
  size="sm"
@@ -687,7 +689,7 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
687
689
  </span>
688
690
  </Button>
689
691
  )}
690
- {!isLoggedIn && (
692
+ {showAuthControls && !isLoggedIn && (
691
693
  <div className="memori-mobile-session-panel--login-cta-wrap">
692
694
  <Button
693
695
  variant="toolbar"
@@ -5,6 +5,7 @@ import {
5
5
  useAlertManager,
6
6
  createAlertOptions,
7
7
  } from '@memori.ai/ui';
8
+ import IconButton from '../IconButton/IconButton';
8
9
  import { MapPin, Pencil } from 'lucide-react';
9
10
  import React, { useCallback, useEffect, useRef, useState } from 'react';
10
11
  import { useTranslation } from 'react-i18next';
@@ -31,16 +32,21 @@ export interface PositionPopoverProps {
31
32
  triggerButtonVariant?: React.ComponentProps<typeof Button>['variant'];
32
33
  triggerAriaLabel: string;
33
34
  positionerClassName?: string;
35
+ /** When true, start browser geolocation as soon as the popover opens. */
36
+ autoStartGeolocation?: boolean;
34
37
  }
35
38
 
36
39
  export interface PositionPopoverContentProps {
37
40
  venue?: Venue;
38
41
  setVenue: (venue?: Venue) => void;
42
+ /** When true, start browser geolocation as soon as the panel mounts (e.g. StartPanel CTA). */
43
+ autoStartGeolocation?: boolean;
39
44
  }
40
45
 
41
46
  export const PositionPopoverContent: React.FC<PositionPopoverContentProps> = ({
42
47
  venue,
43
48
  setVenue,
49
+ autoStartGeolocation = false,
44
50
  }) => {
45
51
  const { t } = useTranslation();
46
52
  const { add } = useAlertManager();
@@ -55,6 +61,7 @@ export const PositionPopoverContent: React.FC<PositionPopoverContentProps> = ({
55
61
  const [suggestions, setSuggestions] = useState<NominatimItem[]>([]);
56
62
  const geoGenRef = useRef(0);
57
63
  const autocompleteInputRef = useRef<HTMLInputElement>(null);
64
+ const autoStartedRef = useRef(false);
58
65
 
59
66
  const sharingActive = geolocationLoading || hasShareableCoords(venue);
60
67
 
@@ -200,6 +207,17 @@ export const PositionPopoverContent: React.FC<PositionPopoverContentProps> = ({
200
207
  startGeolocation();
201
208
  }, [geolocationLoading, setVenue, sharingActive, startGeolocation]);
202
209
 
210
+ useEffect(() => {
211
+ if (!autoStartGeolocation) {
212
+ autoStartedRef.current = false;
213
+ return;
214
+ }
215
+ if (autoStartedRef.current) return;
216
+ if (hasShareableCoords(venue) || geolocationLoading) return;
217
+ autoStartedRef.current = true;
218
+ startGeolocation();
219
+ }, [autoStartGeolocation, geolocationLoading, startGeolocation, venue]);
220
+
203
221
  useEffect(() => {
204
222
  if (!editingLocation) return;
205
223
  const id = requestAnimationFrame(() => {
@@ -313,9 +331,10 @@ const PositionPopover: React.FC<PositionPopoverProps> = ({
313
331
  open,
314
332
  onOpenChange,
315
333
  triggerClassName,
316
- triggerButtonVariant = 'primary',
334
+ triggerButtonVariant = 'toolbar',
317
335
  triggerAriaLabel,
318
336
  positionerClassName,
337
+ autoStartGeolocation = false,
319
338
  }) => {
320
339
  const sharingActive = hasShareableCoords(venue);
321
340
 
@@ -333,15 +352,16 @@ const PositionPopover: React.FC<PositionPopoverProps> = ({
333
352
  className: triggerClassName,
334
353
  render: (props: React.ComponentProps<typeof Button>) => {
335
354
  return (
336
- <Button
355
+ <IconButton
337
356
  {...props}
338
357
  type="button"
339
358
  variant={triggerButtonVariant}
359
+ active={open}
340
360
  className={cx(
341
361
  'memori-header--button',
342
362
  'memori-header--button--position',
343
363
  sharingActive && 'memori-header--button--position--active',
344
- open && 'memori-button--active'
364
+ triggerClassName
345
365
  )}
346
366
  aria-label={triggerAriaLabel}
347
367
  aria-expanded={open}
@@ -357,7 +377,13 @@ const PositionPopover: React.FC<PositionPopoverProps> = ({
357
377
  ),
358
378
  },
359
379
  }}
360
- content={<PositionPopoverContent venue={venue} setVenue={setVenue} />}
380
+ content={
381
+ <PositionPopoverContent
382
+ venue={venue}
383
+ setVenue={setVenue}
384
+ autoStartGeolocation={open && autoStartGeolocation}
385
+ />
386
+ }
361
387
  >
362
388
  {null}
363
389
  </Popover>
@@ -23,8 +23,9 @@
23
23
  max-height: 1rem;
24
24
  }
25
25
 
26
- .memori-share-button .memori-button.memori-button--active:not(:disabled):not(.memori-button--disabled) {
27
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--memori-primary, #3b82f6) 40%, transparent);
26
+ .memori-share-button .memori-icon-button.memori-button.memori-button--active:not(:disabled):not(.memori-button--disabled) {
27
+ /* Soft active owned by IconButton.css */
28
+ box-shadow: none;
28
29
  }
29
30
 
30
31
  .memori-share-button--trigger-menu-item {
@@ -16,6 +16,7 @@ import {
16
16
  createAlertOptions,
17
17
  Tooltip,
18
18
  } from '@memori.ai/ui';
19
+ import IconButton from '../IconButton/IconButton';
19
20
  import cx from 'classnames';
20
21
  import {
21
22
  Tenant,
@@ -549,28 +550,26 @@ const ShareButton: React.FC<Props> = ({
549
550
  showChevron={false}
550
551
  className="memori-share-button--trigger"
551
552
  render={(props: React.ButtonHTMLAttributes<HTMLButtonElement>) => (
552
- <Button
553
+ <IconButton
553
554
  {...props}
554
555
  variant={triggerVariant}
556
+ active={isShareMenuOpen}
555
557
  title={String(triggerLabel || t('widget.share') || 'Share')}
556
558
  aria-label={String(
557
559
  triggerLabel || t('widget.share') || 'Share'
558
560
  )}
559
561
  icon={<Share2 aria-hidden />}
560
- className={cx(
561
- {
562
- 'memori-share-button--trigger-menu-item':
563
- triggerMode === 'menu-item',
564
- },
565
- isShareMenuOpen && 'memori-button--active'
566
- )}
562
+ className={cx({
563
+ 'memori-share-button--trigger-menu-item':
564
+ triggerMode === 'menu-item',
565
+ })}
567
566
  >
568
567
  {triggerMode === 'menu-item' || triggerLabel ? (
569
568
  <span className="memori-header--action-label">
570
569
  {triggerLabel || t('widget.share')}
571
570
  </span>
572
571
  ) : undefined}
573
- </Button>
572
+ </IconButton>
574
573
  )}
575
574
  />
576
575
  </Tooltip>
@@ -16,7 +16,7 @@ exports[`renders ShareButton aligned left unchanged 1`] = `
16
16
  aria-expanded="false"
17
17
  aria-haspopup="menu"
18
18
  aria-label="widget.share"
19
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
19
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
20
20
  id="base-ui-:r1e:"
21
21
  tabindex="0"
22
22
  title="widget.share"
@@ -99,7 +99,7 @@ exports[`renders ShareButton unchanged 1`] = `
99
99
  aria-expanded="false"
100
100
  aria-haspopup="menu"
101
101
  aria-label="widget.share"
102
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
102
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
103
103
  id="base-ui-:r6:"
104
104
  tabindex="0"
105
105
  title="widget.share"
@@ -182,7 +182,7 @@ exports[`renders ShareButton with button not primary unchanged 1`] = `
182
182
  aria-expanded="false"
183
183
  aria-haspopup="menu"
184
184
  aria-label="widget.share"
185
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
185
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
186
186
  id="base-ui-:ru:"
187
187
  tabindex="0"
188
188
  title="widget.share"
@@ -265,7 +265,7 @@ exports[`renders ShareButton with other tenant img set unchanged 1`] = `
265
265
  aria-expanded="false"
266
266
  aria-haspopup="menu"
267
267
  aria-label="widget.share"
268
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
268
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
269
269
  id="base-ui-:r1u:"
270
270
  tabindex="0"
271
271
  title="widget.share"
@@ -348,7 +348,7 @@ exports[`renders ShareButton with share chat unchanged 1`] = `
348
348
  aria-expanded="false"
349
349
  aria-haspopup="menu"
350
350
  aria-label="widget.share"
351
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
351
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
352
352
  id="base-ui-:r26:"
353
353
  tabindex="0"
354
354
  title="widget.share"
@@ -431,7 +431,7 @@ exports[`renders ShareButton with tenant img set unchanged 1`] = `
431
431
  aria-expanded="false"
432
432
  aria-haspopup="menu"
433
433
  aria-label="widget.share"
434
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
434
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
435
435
  id="base-ui-:r1m:"
436
436
  tabindex="0"
437
437
  title="widget.share"
@@ -514,7 +514,7 @@ exports[`renders ShareButton with title unchanged 1`] = `
514
514
  aria-expanded="false"
515
515
  aria-haspopup="menu"
516
516
  aria-label="widget.share"
517
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
517
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
518
518
  id="base-ui-:rm:"
519
519
  tabindex="0"
520
520
  title="widget.share"
@@ -597,7 +597,7 @@ exports[`renders ShareButton with url unchanged 1`] = `
597
597
  aria-expanded="false"
598
598
  aria-haspopup="menu"
599
599
  aria-label="widget.share"
600
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
600
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
601
601
  id="base-ui-:re:"
602
602
  tabindex="0"
603
603
  title="widget.share"
@@ -680,7 +680,7 @@ exports[`renders ShareButton without qr code unchanged 1`] = `
680
680
  aria-expanded="false"
681
681
  aria-haspopup="menu"
682
682
  aria-label="widget.share"
683
- class="memori-button memori-button--ghost memori-button--md memori-button--icon-only"
683
+ class="memori-button memori-button--toolbar memori-button--sm memori-button--icon-only memori-icon-button"
684
684
  id="base-ui-:r16:"
685
685
  tabindex="0"
686
686
  title="widget.share"
@@ -51,7 +51,7 @@ const integrationStylesheet =
51
51
  const dataTheme =
52
52
  integrationConfig?.theme === 'light' || integrationConfig?.theme === 'dark'
53
53
  ? integrationConfig.theme
54
- : undefined;
54
+ : 'light';
55
55
 
56
56
  const Template: Story<Props> = args => (
57
57
  <I18nWrapper>
@@ -64,29 +64,11 @@
64
64
  display: inline-flex;
65
65
  }
66
66
 
67
- /* Main Upload Button */
68
- .memori--unified-upload-button {
67
+ /* Main Upload Button — chrome from IconButton */
68
+ .memori--unified-upload-button.memori-icon-button {
69
69
  position: relative;
70
- display: flex;
71
- width: 40px;
72
- height: 40px;
73
- align-items: center;
74
- justify-content: center;
75
- border: 1px solid #e0e0e0;
76
- border-radius: 50%;
77
- background-color: #f5f5f5;
78
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
79
- cursor: pointer;
80
- transition: all 0.2s ease;
81
- }
82
-
83
- .memori--unified-upload-button:hover {
84
- background-color: #efefef;
85
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
86
- transform: translateY(-1px);
87
70
  }
88
71
 
89
- /* Document Button */
90
72
  .memori--document-upload-button {
91
73
  position: relative;
92
74
  display: flex;
@@ -7,6 +7,7 @@ import React, {
7
7
  } from 'react';
8
8
  import { Upload as UploadIcon } from 'lucide-react';
9
9
  import { Spin, Tooltip, useAlertManager } from '@memori.ai/ui';
10
+ import IconButton from '../IconButton/IconButton';
10
11
  import cx from 'classnames';
11
12
  import UploadDocuments from './UploadDocuments/UploadDocuments';
12
13
  import UploadImages from './UploadImages/UploadImages';
@@ -590,13 +591,10 @@ ${file.textAssetUrl || ''}
590
591
  const isUploadDisabled = disabled || isLoading || hasReachedMediaLimit;
591
592
 
592
593
  const uploadButton = (
593
- <button
594
+ <IconButton
594
595
  ref={buttonRef}
595
596
  type="button"
596
597
  className={cx(
597
- 'memori-button',
598
- 'memori-button--circle',
599
- 'memori-button--icon-only',
600
598
  'memori-share-button--button',
601
599
  'memori--conversation-button',
602
600
  'memori--unified-upload-button'
@@ -611,7 +609,7 @@ ${file.textAssetUrl || ''}
611
609
  ) : (
612
610
  <UploadIcon className="memori--upload-icon" />
613
611
  )}
614
- </button>
612
+ </IconButton>
615
613
  );
616
614
 
617
615
  return (