@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
@@ -0,0 +1,89 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+ import { Button } from '@memori.ai/ui';
4
+
5
+ export type IconButtonProps = Omit<
6
+ React.ComponentProps<typeof Button>,
7
+ 'variant' | 'active'
8
+ > & {
9
+ /**
10
+ * Toggle / popover-open / selected. Soft primary chrome — never solid primary fill.
11
+ */
12
+ active?: boolean;
13
+ /**
14
+ * Mic (or similar) recording state. Soft error chrome — never primary.
15
+ */
16
+ recording?: boolean;
17
+ /**
18
+ * Optional override; defaults to toolbar so outline+active solid fill from the UI lib
19
+ * cannot leak into secondary icon tools.
20
+ */
21
+ variant?: React.ComponentProps<typeof Button>['variant'];
22
+ };
23
+
24
+ function hasVisibleLabel(children: React.ReactNode): boolean {
25
+ return React.Children.toArray(children).some(child => {
26
+ if (child === null || child === undefined) return false;
27
+ if (typeof child === 'boolean') return false;
28
+ if (typeof child === 'string') return child.trim().length > 0;
29
+ if (typeof child === 'number') return true;
30
+ return true;
31
+ });
32
+ }
33
+
34
+ /**
35
+ * Shared secondary icon control for chat header + input bar.
36
+ * CTA actions (Accedi, send) must keep using Button variant="primary".
37
+ */
38
+ const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(
39
+ (
40
+ {
41
+ active = false,
42
+ recording = false,
43
+ className,
44
+ variant = 'toolbar',
45
+ shape = 'default',
46
+ size = 'sm',
47
+ children,
48
+ ...rest
49
+ },
50
+ ref
51
+ ) => {
52
+ const isRecording = !!recording;
53
+ const isActive = !!active && !isRecording;
54
+ const isLabeled = hasVisibleLabel(children);
55
+ // Never inherit CTA / outline solid-active chrome from layout buttonVariant.
56
+ const resolvedVariant =
57
+ variant === 'primary' ||
58
+ variant === 'secondary' ||
59
+ variant === 'danger' ||
60
+ variant === 'outline' ||
61
+ variant === 'ghost'
62
+ ? 'toolbar'
63
+ : variant;
64
+
65
+ return (
66
+ <Button
67
+ ref={ref}
68
+ variant={resolvedVariant}
69
+ shape={shape}
70
+ size={size}
71
+ active={isActive}
72
+ className={cx(
73
+ 'memori-icon-button',
74
+ isLabeled && 'memori-icon-button--labeled',
75
+ isActive && 'memori-icon-button--active',
76
+ isRecording && 'memori-icon-button--recording',
77
+ className
78
+ )}
79
+ {...rest}
80
+ >
81
+ {children}
82
+ </Button>
83
+ );
84
+ }
85
+ );
86
+
87
+ IconButton.displayName = 'IconButton';
88
+
89
+ export default IconButton;
@@ -14,22 +14,35 @@
14
14
  }
15
15
  }
16
16
 
17
+ /* Table wrapper: flex column so pagination footer stays visible below the scroll body */
18
+ .memori-known-facts-table-wrapper.memori-table-wrapper {
19
+ display: flex;
20
+ overflow: hidden;
21
+ min-height: 0;
22
+ flex: 1 1 auto;
23
+ flex-direction: column;
24
+ border: 1px solid var(--memori-color-border, #e2e8f0);
25
+ border-radius: 8px;
26
+ }
27
+
17
28
  .memori-known-facts-table-wrapper {
18
29
  .memori-table-scroll {
19
- height: 100%;
30
+ min-height: 0;
31
+ max-height: none;
32
+ flex: 1 1 auto;
33
+ }
34
+
35
+ .memori-table-footer {
36
+ flex-shrink: 0;
20
37
  }
38
+
21
39
  .memori-table-pagination__range {
22
40
  display: none;
23
41
  }
24
- }
25
42
 
26
- /* Table wrapper: scroll + spacing (@memori.ai/ui Table root) */
27
- .memori-known-facts-table-wrapper.memori-table-wrapper {
28
- overflow: hidden;
29
- min-height: 0;
30
- flex: 1 1 auto;
31
- border: 1px solid var(--memori-color-border, #e2e8f0);
32
- border-radius: 8px;
43
+ .memori-table-pagination__page-size {
44
+ display: none;
45
+ }
33
46
  }
34
47
 
35
48
  .memori-known-facts-text-cell {
@@ -10,7 +10,6 @@ import memoriApiClient from '@memori.ai/memori-api-client';
10
10
  import {
11
11
  Button,
12
12
  Drawer,
13
- Spin,
14
13
  Modal,
15
14
  Table,
16
15
  useAlertManager,
@@ -118,7 +117,9 @@ const KnownFacts = ({
118
117
 
119
118
  const [bulkDeleteModalVisible, setBulkDeleteModalVisible] = useState(false);
120
119
  const [bulkDeleteIds, setBulkDeleteIds] = useState<string[]>([]);
120
+ const [bulkDeleting, setBulkDeleting] = useState(false);
121
121
  const [deleteModalVisibleFor, setDeleteModalVisibleFor] = useState<string>();
122
+ const [singleDeleting, setSingleDeleting] = useState(false);
122
123
  const selectedRowsLabel = useMemo(
123
124
  () =>
124
125
  t('knownFacts.selectedRows', {
@@ -222,7 +223,10 @@ const KnownFacts = ({
222
223
  </Button>
223
224
  <Button
224
225
  variant="danger"
226
+ loading={bulkDeleting}
227
+ disabled={bulkDeleting}
225
228
  onClick={async () => {
229
+ setBulkDeleting(true);
226
230
  try {
227
231
  const mutations = bulkDeleteIds.map(knownFactID =>
228
232
  deleteKnownFact(sessionID, knownFactID)
@@ -261,6 +265,8 @@ const KnownFacts = ({
261
265
  severity: 'error',
262
266
  })
263
267
  );
268
+ } finally {
269
+ setBulkDeleting(false);
264
270
  }
265
271
  }}
266
272
  >
@@ -277,7 +283,7 @@ const KnownFacts = ({
277
283
  getRowId={row => row.knownFactID}
278
284
  isLoading={loading}
279
285
  rowActionsVariant='inline'
280
- maxBodyHeight="75vh"
286
+ maxBodyHeight={false}
281
287
  bulkActions={[
282
288
  {
283
289
  label: t('delete'),
@@ -315,7 +321,6 @@ const KnownFacts = ({
315
321
  );
316
322
  },
317
323
  initialPageSize: 10,
318
- pageSizeOptions: [10,25,50,100],
319
324
  }
320
325
  : { enablePagination: false })}
321
326
  />
@@ -345,9 +350,12 @@ const KnownFacts = ({
345
350
  </Button>
346
351
  <Button
347
352
  variant="danger"
353
+ loading={singleDeleting}
354
+ disabled={singleDeleting}
348
355
  onClick={async () => {
349
356
  if (!deleteModalVisibleFor) return;
350
357
  const kfId = deleteModalVisibleFor;
358
+ setSingleDeleting(true);
351
359
  try {
352
360
  const response = await deleteKnownFact(sessionID, kfId);
353
361
  if (response.resultCode === 0) {
@@ -378,6 +386,8 @@ const KnownFacts = ({
378
386
  severity: 'error',
379
387
  })
380
388
  );
389
+ } finally {
390
+ setSingleDeleting(false);
381
391
  }
382
392
  }}
383
393
  >
@@ -69,13 +69,14 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
69
69
  display: none !important;
70
70
  }
71
71
 
72
- /* Inline layout column — renders inside the flex grid, not as a fixed overlay */
72
+ /* Inline layout column — fills the layout flex slot, not a fixed overlay.
73
+ min-height: 0 (not 100vh) so opening the artifact cannot expand the page. */
73
74
  .memori-artifact-layout-column {
74
75
  display: flex;
75
76
  overflow: hidden;
76
77
  width: 100%;
77
78
  height: 100%;
78
- min-height: 100vh;
79
+ min-height: 0;
79
80
  flex-direction: column;
80
81
  }
81
82
 
@@ -695,26 +696,25 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
695
696
  background: var(--memori-primary-subtle);
696
697
  }
697
698
 
698
- .memori-artifact-drawer--close-desktop {
699
- width: 38px;
700
- min-width: 38px;
701
- height: 38px;
702
- min-height: 38px;
703
- padding: 0;
704
- border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
705
- margin: 0;
706
- margin-left: 0 !important;
699
+ /* Match website_assistant / hidden_chat sidebar close — never outline primary fill */
700
+ .memori-widget .memori-artifact-drawer--close.memori-icon-button.memori-button,
701
+ .memori-widget .memori-artifact-drawer--close.memori-icon-button.memori-button:hover:not(:disabled, .memori-button--disabled),
702
+ .memori-widget .memori-artifact-drawer--close.memori-icon-button.memori-button:active:not(:disabled, .memori-button--disabled) {
703
+ border: var(--memori-border, 1px) solid color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent);
704
+ background: transparent;
705
+ box-shadow: none;
706
+ color: var(--memori-text-color, #111827);
707
+ transform: none;
707
708
  }
708
709
 
709
- .memori-artifact-drawer--close-desktop:hover {
710
- border-color: color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
711
- background: color-mix(in srgb, var(--memori-text-color, #111827) 8%, transparent);
712
- color: inherit !important;
710
+ .memori-widget .memori-artifact-drawer--close.memori-icon-button.memori-button:hover:not(:disabled, .memori-button--disabled) {
711
+ background: color-mix(in srgb, var(--memori-text-color, #111827) 6%, transparent);
713
712
  }
714
713
 
715
- .memori-artifact-drawer--close-desktop:hover .memori-artifact-panel--close-icon,
716
- .memori-artifact-drawer--close:hover .memori-artifact-panel--close-icon {
717
- color: inherit !important;
714
+ .memori-widget .memori-artifact-drawer--close .memori-icon-close {
715
+ width: 1.125rem;
716
+ height: 1.125rem;
717
+ fill: none;
718
718
  stroke: currentColor;
719
719
  }
720
720
 
@@ -738,15 +738,6 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
738
738
  font-family: var(--memori-font-family);
739
739
  }
740
740
 
741
- .memori-artifact-drawer--close {
742
- display: flex;
743
- align-items: center;
744
- justify-content: center;
745
- border-radius: var(--memori-radius-box);
746
- /* background: var(--artifact-drawer-bg); */
747
- margin-left: auto;
748
- }
749
-
750
741
  .memori-artifact-actions {
751
742
  flex: 1;
752
743
  }
@@ -806,26 +797,24 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
806
797
  flex: 0 0 auto;
807
798
  }
808
799
 
809
- /* Make mobile action buttons match header toolbar buttons */
810
- .memori-artifact-drawer-top-right .memori-button--more-options,
811
- .memori-artifact-drawer-top-right .memori-artifact-drawer--close {
800
+ /* Make mobile more-options match header toolbar buttons */
801
+ .memori-artifact-drawer-top-right .memori-button--more-options {
812
802
  display: flex;
813
- width: 38px;
814
- min-width: 38px;
815
- height: 38px;
816
- min-height: 38px;
803
+ width: 2.5rem;
804
+ min-width: 2.5rem;
805
+ height: 2.5rem;
806
+ min-height: 2.5rem;
817
807
  align-items: center;
818
808
  justify-content: center;
819
809
  padding: 0;
820
- border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
821
- border-radius: var(--memori-radius-box);
810
+ border: var(--memori-border, 1px) solid color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent);
811
+ border-radius: var(--memori-radius-box, 0.5rem);
822
812
  margin-left: 0;
823
813
  }
824
814
 
825
- .memori-artifact-drawer-top-right .memori-button--more-options:hover,
826
- .memori-artifact-drawer-top-right .memori-artifact-drawer--close:hover {
827
- border-color: color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
828
- background: color-mix(in srgb, var(--memori-text-color, #111827) 8%, transparent);
815
+ .memori-artifact-drawer-top-right .memori-button--more-options:hover {
816
+ border-color: color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent);
817
+ background: color-mix(in srgb, var(--memori-text-color, #111827) 6%, transparent);
829
818
  }
830
819
 
831
820
  /* Content fills remaining viewport under the toolbar (no floating card) */
@@ -1105,10 +1094,6 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
1105
1094
  }
1106
1095
 
1107
1096
  @media (max-width: 1260px) {
1108
- .memori-artifact-drawer--close {
1109
- margin-left: 0;
1110
- }
1111
-
1112
1097
  .memori-artifact-panel--header {
1113
1098
  margin-bottom: var(--memori-spacing-sm);
1114
1099
  }
@@ -25,6 +25,7 @@ import { ArtifactData, ArtifactTab } from '../../types/artifact.types';
25
25
  import cx from 'classnames';
26
26
  import { useCopyArtifact } from '../ArtifactActions/hooks/useCopyArtifact';
27
27
  import TabSwitch from './components/TabSwitch';
28
+ import IconButton from '../../../IconButton/IconButton';
28
29
 
29
30
  const ArtifactDrawer: React.FC<{
30
31
  isChatLogPanel?: boolean;
@@ -261,19 +262,14 @@ const ArtifactDrawer: React.FC<{
261
262
  isMobile={isMobile}
262
263
  />
263
264
  {!isChatLogPanel && (
264
- <Button
265
+ <IconButton
265
266
  onClick={closeArtifact}
266
- variant="outline"
267
267
  aria-label={t('artifact.close') || 'Close'}
268
- className="memori-artifact-drawer--close-desktop"
269
- icon={
270
- <X
271
- className="memori-artifact-panel--close-icon"
272
- aria-hidden
273
- />
274
- }
275
268
  title={t('artifact.close') || 'Close'}
276
- />
269
+ className="memori-artifact-drawer--close"
270
+ >
271
+ <X className="memori-icon-close" aria-hidden />
272
+ </IconButton>
277
273
  )}
278
274
  </>
279
275
  )}
@@ -395,19 +391,14 @@ const ArtifactDrawer: React.FC<{
395
391
  </Dropdown.Item>
396
392
  </Dropdown.Menu>
397
393
  </Dropdown>
398
- <Button
394
+ <IconButton
399
395
  onClick={closeArtifact}
400
- className={cx(
401
- 'memori-artifact-drawer--close',
402
- 'memori-button--icon-only'
403
- )}
404
- variant="ghost"
405
396
  aria-label={t('artifact.close') || 'Close'}
406
397
  title={t('artifact.close') || 'Close'}
407
- icon={
408
- <X className="memori-artifact-panel--close-icon" aria-hidden />
409
- }
410
- />
398
+ className="memori-artifact-drawer--close"
399
+ >
400
+ <X className="memori-icon-close" aria-hidden />
401
+ </IconButton>
411
402
  </div>
412
403
  </>
413
404
  )}
@@ -156,7 +156,8 @@
156
156
  }
157
157
 
158
158
  .memori.memori-widget.chat-focused .memori--powered-by,
159
- .memori.memori-widget.chat-focused .memori-website_assistant--close-button {
159
+ .memori.memori-widget.memori-layout-website_assistant.chat-focused
160
+ .memori-website_assistant--close-button {
160
161
  display: none;
161
162
  }
162
163
 
@@ -549,6 +549,11 @@ export function getChatStyles(
549
549
  'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, white) 85%)',
550
550
  '--memori-skeleton-highlight':
551
551
  'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, white) 75%)',
552
+ /* Soft fills for secondary IconButton active / recording (never solid CTA) */
553
+ '--memori-icon-active-bg':
554
+ 'color-mix(in oklch, var(--memori-primary) 12%, transparent)',
555
+ '--memori-icon-recording-bg':
556
+ 'color-mix(in oklch, var(--memori-error, #dc2626) 12%, transparent)',
552
557
  } as CSSProperties;
553
558
  }
554
559
 
@@ -647,23 +652,6 @@ const MemoriWidget = ({
647
652
  const [widgetSurfaceEl, setWidgetSurfaceEl] = useState<HTMLDivElement | null>(
648
653
  null
649
654
  );
650
- const [isDarkTheme, setIsDarkTheme] = useState(false);
651
- useEffect(() => {
652
- if (!widgetRootEl) return;
653
- const check = () => {
654
- setIsDarkTheme(!!widgetRootEl.closest('[data-theme="dark"]'));
655
- };
656
- check();
657
- const observer = new MutationObserver(check);
658
- const parent = widgetRootEl.parentElement ?? document.body;
659
- observer.observe(parent, {
660
- attributes: true,
661
- attributeFilter: ['data-theme'],
662
- subtree: true,
663
- });
664
- return () => observer.disconnect();
665
- }, [widgetRootEl]);
666
-
667
655
  const [loginToken, setLoginToken] = useState<string | undefined>(
668
656
  additionalInfo?.loginToken ?? authToken
669
657
  );
@@ -884,6 +872,8 @@ const MemoriWidget = ({
884
872
  useState(false);
885
873
  const [hasUserTypedMessage, setHasUserTypedMessage] = useState(false);
886
874
  const [positionPopoverOpen, setPositionPopoverOpenState] = useState(false);
875
+ const [autoStartPositionGeolocation, setAutoStartPositionGeolocation] =
876
+ useState(false);
887
877
  const [showSettingsDrawer, setShowSettingsDrawer] = useState(false);
888
878
  const [showChatHistoryDrawer, setShowChatHistoryDrawer] = useState(false);
889
879
  const [showKnownFactsDrawer, setShowKnownFactsDrawer] = useState(false);
@@ -2691,12 +2681,12 @@ const MemoriWidget = ({
2691
2681
  }`
2692
2682
  );
2693
2683
  }
2694
- if (integrationConfig?.blurBackground) {
2684
+ if (integrationConfig?.blurBackground === false) {
2695
2685
  integrationStylesheetParts.push(
2696
2686
  `.memori-widget .memori-chat--history--has-global-background::before,
2697
2687
  .memori-widget .memori-chat-layout--main--has-background::before {
2698
- filter: blur(5px);
2699
- transform: scale(1.06);
2688
+ filter: none;
2689
+ transform: none;
2700
2690
  }`
2701
2691
  );
2702
2692
  }
@@ -3280,19 +3270,30 @@ const MemoriWidget = ({
3280
3270
 
3281
3271
  const setPositionPopoverOpen = useCallback(
3282
3272
  (open: boolean) => {
3273
+ const sessionAlreadyStarted = !!(sessionId && hasUserActivatedSpeak);
3283
3274
  setPositionPopoverOpenState(wasOpen => {
3284
3275
  if (
3285
- shouldRestartSessionOnPositionPopoverClose(wasOpen, open, autoStart)
3276
+ shouldRestartSessionOnPositionPopoverClose(
3277
+ wasOpen,
3278
+ open,
3279
+ autoStart,
3280
+ sessionAlreadyStarted
3281
+ )
3286
3282
  ) {
3287
3283
  // Defer: React setState updaters must stay pure.
3288
3284
  queueMicrotask(() => {
3289
3285
  onClickStart();
3290
3286
  });
3291
3287
  }
3288
+ if (!open) {
3289
+ queueMicrotask(() => {
3290
+ setAutoStartPositionGeolocation(false);
3291
+ });
3292
+ }
3292
3293
  return open;
3293
3294
  });
3294
3295
  },
3295
- [autoStart, onClickStart]
3296
+ [autoStart, onClickStart, sessionId, hasUserActivatedSpeak]
3296
3297
  );
3297
3298
 
3298
3299
  useEffect(() => {
@@ -3497,6 +3498,7 @@ const MemoriWidget = ({
3497
3498
  setVenue: setPosition,
3498
3499
  positionPopoverOpen,
3499
3500
  setPositionPopoverOpen,
3501
+ autoStartPositionGeolocation,
3500
3502
  setShowSettingsDrawer,
3501
3503
  setShowKnownFactsDrawer,
3502
3504
  setShowExpertsDrawer,
@@ -3508,7 +3510,9 @@ const MemoriWidget = ({
3508
3510
  setShowChatHistoryDrawer,
3509
3511
  showSettings: showSettings ?? integrationConfig?.showSettings ?? true,
3510
3512
  showChatHistory:
3511
- showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3513
+ selectedLayout === 'WEBSITE_ASSISTANT'
3514
+ ? false
3515
+ : showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3512
3516
  showMessageConsumption: enableMessageConsumption,
3513
3517
  hasUserActivatedSpeak,
3514
3518
  showReload: selectedLayout === 'TOTEM',
@@ -3564,7 +3568,10 @@ const MemoriWidget = ({
3564
3568
  apiUrl: client.constants.BACKEND_URL,
3565
3569
  position: position,
3566
3570
  setVenue: setPosition,
3567
- openPositionPopover: () => setPositionPopoverOpen(true),
3571
+ openPositionPopover: () => {
3572
+ setAutoStartPositionGeolocation(true);
3573
+ setPositionPopoverOpen(true);
3574
+ },
3568
3575
  integrationConfig: integrationConfig,
3569
3576
  instruct: instruct,
3570
3577
  sessionId: sessionId,
@@ -3577,7 +3584,9 @@ const MemoriWidget = ({
3577
3584
  showLogin: canShowLoginButton,
3578
3585
  setShowLoginDrawer,
3579
3586
  showChatHistory:
3580
- showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3587
+ selectedLayout === 'WEBSITE_ASSISTANT'
3588
+ ? false
3589
+ : showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3581
3590
  setShowChatHistoryDrawer,
3582
3591
  user,
3583
3592
  };
@@ -3672,7 +3681,7 @@ const MemoriWidget = ({
3672
3681
  const integrationStyle =
3673
3682
  integration &&
3674
3683
  (Object.keys(integrationProperties).length > 0 ||
3675
- integrationConfig?.blurBackground) ? (
3684
+ integrationConfig?.blurBackground === false) ? (
3676
3685
  <style dangerouslySetInnerHTML={{ __html: integrationStylesheet }} />
3677
3686
  ) : null;
3678
3687
 
@@ -3703,13 +3712,11 @@ const MemoriWidget = ({
3703
3712
 
3704
3713
  // Resolve the widget theme once so both `data-theme` on the root and the
3705
3714
  // `MemoriUIProvider` (which stamps portaled popups) stay in sync.
3706
- // Prefer integration config; fall back to host dark mode when unset.
3707
- const widgetTheme: 'light' | 'dark' | undefined =
3715
+ // Prefer integration config; default to light when unset.
3716
+ const widgetTheme: 'light' | 'dark' =
3708
3717
  integrationConfig?.theme === 'light' || integrationConfig?.theme === 'dark'
3709
3718
  ? integrationConfig.theme
3710
- : isDarkTheme
3711
- ? 'dark'
3712
- : undefined;
3719
+ : 'light';
3713
3720
 
3714
3721
  return (
3715
3722
  <div