@memori.ai/memori-react 9.0.0-alpha.12 → 9.0.0-alpha.13

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 (60) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/components/Chat/Chat.css +19 -0
  3. package/dist/components/ChatInputs/ChatInputs.css +77 -3
  4. package/dist/components/ChatTextArea/ChatTextArea.css +5 -25
  5. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +7 -2
  6. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +31 -14
  7. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +169 -138
  8. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +7 -7
  9. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  10. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +7 -2
  11. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +1 -0
  12. package/dist/components/MemoriWidget/MemoriWidget.js +5 -1
  13. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  14. package/dist/components/MicrophoneButton/MicrophoneButton.css +22 -0
  15. package/dist/components/layouts/chat.css +22 -2
  16. package/dist/components/layouts/fullpage.css +5 -5
  17. package/dist/components/layouts/zoomed-full-body.css +5 -5
  18. package/dist/styles.css +1 -1
  19. package/dist/version.d.ts +1 -1
  20. package/dist/version.js +1 -1
  21. package/esm/components/Chat/Chat.css +19 -0
  22. package/esm/components/ChatInputs/ChatInputs.css +77 -3
  23. package/esm/components/ChatTextArea/ChatTextArea.css +5 -25
  24. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +7 -2
  25. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +31 -14
  26. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +169 -138
  27. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +8 -8
  28. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  29. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +7 -2
  30. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +1 -0
  31. package/esm/components/MemoriWidget/MemoriWidget.js +5 -1
  32. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  33. package/esm/components/MicrophoneButton/MicrophoneButton.css +22 -0
  34. package/esm/components/layouts/chat.css +22 -2
  35. package/esm/components/layouts/fullpage.css +5 -5
  36. package/esm/components/layouts/zoomed-full-body.css +5 -5
  37. package/esm/styles.css +1 -1
  38. package/esm/version.d.ts +1 -1
  39. package/esm/version.js +1 -1
  40. package/package.json +1 -1
  41. package/src/components/Chat/Chat.css +19 -0
  42. package/src/components/ChatInputs/ChatInputs.css +77 -3
  43. package/src/components/ChatTextArea/ChatTextArea.css +5 -25
  44. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +7 -2
  45. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +31 -14
  46. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +169 -138
  47. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +63 -72
  48. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +7 -2
  49. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +1 -0
  50. package/src/components/MemoriWidget/MemoriWidget.tsx +5 -1
  51. package/src/components/MicrophoneButton/MicrophoneButton.css +22 -0
  52. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +5 -1
  53. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +10 -2
  54. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +5 -1
  55. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +5 -1
  56. package/src/components/layouts/chat.css +22 -2
  57. package/src/components/layouts/fullpage.css +5 -5
  58. package/src/components/layouts/zoomed-full-body.css +5 -5
  59. package/src/styles.css +2 -5
  60. package/src/version.ts +1 -1
@@ -29,6 +29,31 @@
29
29
  max-width: 100vw;
30
30
  }
31
31
 
32
+ @media (max-width: 1260px) {
33
+ .memori-drawer--right.memori-drawer--size-md.memori-artifact-panel-drawer,
34
+ .memori-drawer--right.memori-artifact-panel-drawer-fullscreen {
35
+ --memori-modal-size-md: 100%;
36
+ width: 100% !important;
37
+ max-width: 100% !important;
38
+ height: 100% !important;
39
+ max-height: 100dvh !important;
40
+ border-radius: 0;
41
+ border-left: none;
42
+ box-shadow: none;
43
+ }
44
+
45
+ .memori-artifact-panel-drawer .memori-drawer__body,
46
+ .memori-artifact-panel-drawer-fullscreen .memori-drawer__body {
47
+ display: flex;
48
+ overflow: hidden;
49
+ height: 100%;
50
+ min-height: 0;
51
+ flex: 1 1 auto;
52
+ flex-direction: column;
53
+ padding: 0;
54
+ }
55
+ }
56
+
32
57
  .memori-drawer--right.memori-artifact-panel-drawer-fullscreen {
33
58
  --memori-modal-size-md: 100%;
34
59
  width: 100% !important;
@@ -328,13 +353,6 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
328
353
  gap: var(--memori-spacing-sm);
329
354
  }
330
355
 
331
- .memori-artifact-panel-drawer-fullscreen > div > div > div {
332
- width: 100% !important;
333
- max-width: 100% !important;
334
- box-shadow: none !important;
335
- transform: translateX(0) !important;
336
- }
337
-
338
356
  .memori-artifact-drawer--header-actions {
339
357
  z-index: 100;
340
358
  display: flex;
@@ -678,24 +696,26 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
678
696
  }
679
697
 
680
698
  .memori-artifact-drawer--close-desktop {
681
- width: 48px;
682
- min-width: 48px;
683
- height: 48px;
684
- min-height: 48px;
699
+ width: 38px;
700
+ min-width: 38px;
701
+ height: 38px;
702
+ min-height: 38px;
685
703
  padding: 0;
686
- border: var(--memori-border) solid var(--memori-border-color);
704
+ border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
687
705
  margin: 0;
688
706
  margin-left: 0 !important;
689
707
  }
690
708
 
691
709
  .memori-artifact-drawer--close-desktop:hover {
692
- color: #fff !important;
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;
693
713
  }
694
714
 
695
715
  .memori-artifact-drawer--close-desktop:hover .memori-artifact-panel--close-icon,
696
716
  .memori-artifact-drawer--close:hover .memori-artifact-panel--close-icon {
697
- color: #fff !important;
698
- stroke: #fff;
717
+ color: inherit !important;
718
+ stroke: currentColor;
699
719
  }
700
720
 
701
721
  /* Mobile Drawer Panel */
@@ -744,48 +764,108 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
744
764
  display: none;
745
765
  }
746
766
 
747
- /* Mobile header: full-width bar with tabs on left, actions on right */
767
+ /* Mobile header: full-width toolbar — tabs left, more+close right */
748
768
  .memori-artifact-drawer-top-right {
769
+ display: flex;
770
+ overflow: visible;
749
771
  width: 100%;
772
+ box-sizing: border-box;
773
+ flex-shrink: 0;
774
+ align-items: center;
750
775
  justify-content: space-between;
751
776
  padding: var(--memori-spacing-sm) var(--memori-spacing-md);
752
777
  border-bottom: 1px solid var(--memori-border-color);
753
- margin-bottom: var(--memori-spacing-xs);
778
+ margin: 0;
779
+ background: var(--memori-secondary-background);
780
+ gap: var(--memori-spacing-sm);
781
+ }
782
+
783
+ .memori-artifact-drawer-top-right-actions {
784
+ display: inline-flex;
785
+ flex-shrink: 0;
786
+ align-items: center;
787
+ margin-left: auto;
788
+ gap: var(--memori-spacing-sm);
789
+ }
790
+
791
+ .memori-artifact-drawer-top-right .memori-mobile-actions-menu {
792
+ margin-left: 0;
754
793
  }
755
794
 
756
- /* Make mobile action buttons match the tab switch height */
795
+ /* Tabs.Root from @memori.ai/ui defaults to width:100% — that pushes actions off-screen */
796
+ .memori-artifact-drawer-top-right .memori-tab-switch,
797
+ .memori-artifact-drawer-top-right .memori-tabs {
798
+ width: auto;
799
+ max-width: fit-content;
800
+ flex: 0 0 auto;
801
+ justify-content: flex-start;
802
+ }
803
+
804
+ .memori-artifact-drawer-top-right .memori-tab-switch__tab {
805
+ min-width: 40px;
806
+ flex: 0 0 auto;
807
+ }
808
+
809
+ /* Make mobile action buttons match header toolbar buttons */
757
810
  .memori-artifact-drawer-top-right .memori-button--more-options,
758
811
  .memori-artifact-drawer-top-right .memori-artifact-drawer--close {
759
812
  display: flex;
760
- width: 40px;
761
- min-width: 40px;
762
- height: 40px;
763
- min-height: 40px;
813
+ width: 38px;
814
+ min-width: 38px;
815
+ height: 38px;
816
+ min-height: 38px;
764
817
  align-items: center;
765
818
  justify-content: center;
766
819
  padding: 0;
767
- border: 1px solid var(--memori-border-color);
820
+ border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 16%, transparent);
768
821
  border-radius: var(--memori-radius-box);
822
+ margin-left: 0;
769
823
  }
770
824
 
771
- .memori-artifact-drawer-top-right .memori-artifact-drawer--close {
772
- margin-left: 0;
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);
773
829
  }
774
830
 
775
- /* Solid opaque dropdown popover on mobile */
776
- .memori-artifact-drawer-top-right .memori-mobile-dropdown {
777
- z-index: 1100;
778
- border: 1px solid var(--memori-border-color);
779
- backdrop-filter: none;
780
- background: var(--memori-main-background, #fff);
781
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
831
+ /* Content fills remaining viewport under the toolbar (no floating card) */
832
+ .memori-artifact-panel-drawer .memori-artifact-panel--content,
833
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-panel--content {
834
+ overflow: hidden;
835
+ width: 100%;
836
+ height: auto;
837
+ min-height: 0;
838
+ max-height: none;
839
+ flex: 1 1 auto;
840
+ gap: 0;
841
+ }
842
+
843
+ .memori-artifact-panel-drawer .memori-artifact-panel--main,
844
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-panel--main {
845
+ overflow: hidden;
846
+ min-height: 0;
847
+ flex: 1 1 auto;
782
848
  }
783
849
 
784
- /* Dropdown icon visibility */
785
- .memori-artifact-drawer-top-right .memori-mobile-dropdown .memori-artifact-action-icon {
786
- width: 18px;
787
- height: 18px;
788
- color: var(--memori-text-color);
850
+ .memori-artifact-panel-drawer .memori-artifact-preview,
851
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-preview,
852
+ .memori-artifact-panel-drawer .memori-artifact-preview-content,
853
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-preview-content,
854
+ .memori-artifact-panel-drawer .memori-artifact-tab-content--active,
855
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-tab-content--active,
856
+ .memori-artifact-panel-drawer .memori-artifact-content,
857
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-content {
858
+ border-radius: 0;
859
+ }
860
+
861
+ .memori-artifact-panel-drawer .memori-artifact-tab-content--active,
862
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-tab-content--active {
863
+ padding: 0;
864
+ }
865
+
866
+ .memori-artifact-panel-drawer .memori-artifact-preview-content,
867
+ .memori-artifact-panel-drawer-fullscreen .memori-artifact-preview-content {
868
+ background: transparent;
789
869
  }
790
870
  }
791
871
 
@@ -954,139 +1034,90 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
954
1034
  z-index: 1001;
955
1035
  display: flex;
956
1036
  align-items: center;
957
- padding: 0rem 1rem;
958
1037
  gap: var(--memori-spacing-sm);
959
1038
  }
960
1039
 
961
- /* Mobile Actions Dropdown */
1040
+ /* Mobile Actions Dropdown — portaled popup (not under .top-right) */
962
1041
  .memori-mobile-actions-menu {
963
1042
  position: relative;
964
1043
  display: inline-block;
965
- margin-left: auto;
966
1044
  }
967
1045
 
968
1046
  .memori-mobile-actions-trigger {
969
1047
  display: inline-block;
970
1048
  }
971
1049
 
1050
+ .memori-dropdown__popup.memori-mobile-dropdown,
972
1051
  .memori-mobile-dropdown {
973
- position: absolute;
974
- z-index: 1000;
975
- top: 100%;
976
- right: 0;
1052
+ z-index: 1100;
977
1053
  min-width: 200px;
978
- border: 1px solid var(--artifact-drawer-border);
979
- border-radius: var(--artifact-drawer-radius);
980
- margin-top: var(--memori-spacing-sm);
981
- backdrop-filter: blur(10px);
982
- background: var(--artifact-drawer-bg);
983
- box-shadow: var(--artifact-drawer-shadow);
984
- }
985
-
986
- /* Mobile-specific dropdown positioning */
987
- @media (max-width: 1260px) {
988
- .memori-artifact-drawer--close {
989
- margin-left: 0;
990
- }
991
-
992
- .memori-artifact-panel--header {
993
- margin-bottom: var(--memori-spacing-sm);
994
- }
995
-
996
- .memori-mobile-dropdown {
997
- right: 0;
998
- left: auto;
999
- min-width: 180px;
1000
- max-width: calc(100vw - 2rem);
1001
- }
1002
-
1003
- .memori-mobile-dropdown-list {
1004
- padding: 0.25rem;
1005
- gap: var(--memori-spacing-xs);
1006
- }
1007
-
1008
- .memori-mobile-dropdown .memori-artifact-action-btn {
1009
- min-height: 44px; /* Ensure touch-friendly size */
1010
- padding: 0.625rem 0.75rem;
1011
- font-size: var(--memori-text-size-small);
1012
- }
1013
-
1014
- .memori-mobile-dropdown .memori-artifact-action-text {
1015
- color: var(--artifact-drawer-text);
1016
- font-size: 0.8125rem;
1017
- font-weight: var(--memori-text-weight-semibold);
1018
- }
1019
-
1020
- .memori-mobile-dropdown .memori-artifact-action-icon {
1021
- width: 16px;
1022
- height: 16px;
1023
- flex-shrink: 0;
1024
- }
1025
- }
1026
-
1027
- .memori-mobile-dropdown-list {
1028
- display: flex;
1029
- flex-direction: column;
1030
- padding: 0.5rem;
1031
- gap: var(--memori-spacing-xs);
1054
+ max-width: min(280px, calc(100vw - 1.5rem));
1055
+ padding: var(--memori-spacing-xs);
1056
+ border: 1px solid var(--memori-border-color);
1057
+ border-radius: var(--memori-radius-box);
1058
+ /* Soft contrast vs canvas — not pure white / not heavy fill */
1059
+ background: color-mix(
1060
+ in srgb,
1061
+ var(--memori-text-color) 6%,
1062
+ var(--memori-secondary-background)
1063
+ ) !important;
1064
+ box-shadow: var(--memori-shadow-lg);
1065
+ color: var(--memori-text-color);
1032
1066
  }
1033
1067
 
1034
- .memori-mobile-dropdown .memori-artifact-action-btn {
1068
+ .memori-mobile-dropdown .memori-artifact-action-btn,
1069
+ .memori-mobile-dropdown .memori-dropdown__item,
1070
+ .memori-dropdown__popup.memori-mobile-dropdown .memori-dropdown__item {
1035
1071
  display: flex;
1036
1072
  width: 100%;
1073
+ min-height: 40px;
1037
1074
  align-items: center;
1038
1075
  justify-content: flex-start;
1039
- padding: var(--memori-spacing-sm) var(--memori-spacing-md);
1076
+ padding: 0.5rem 0.75rem;
1040
1077
  border: 1px solid transparent;
1041
- border-radius: var(--artifact-drawer-radius);
1078
+ border-radius: var(--memori-radius-box);
1042
1079
  background: transparent;
1043
- color: var(--artifact-drawer-text);
1044
- text-align: left;
1045
- transition: all 0.2s ease;
1046
- }
1047
-
1048
- .memori-mobile-dropdown .memori-artifact-action-btn:hover {
1049
- border-color: var(--memori-primary);
1050
- background: var(--memori-primary-subtle);
1051
- color: var(--memori-primary);
1052
- }
1053
-
1054
- .memori-mobile-dropdown .memori-artifact-action-text {
1055
- overflow: visible;
1056
- margin-left: var(--memori-spacing-sm);
1057
- color: inherit;
1080
+ color: var(--memori-text-color);
1058
1081
  font-size: var(--memori-text-size-small);
1059
1082
  font-weight: var(--memori-text-weight-medium);
1060
- white-space: nowrap;
1061
- }
1062
-
1063
- /* Mobile Dropdown Animations */
1064
- .memori-mobile-dropdown-enter {
1065
- transition: all 0.2s ease-out;
1083
+ gap: var(--memori-spacing-sm);
1084
+ text-align: left;
1066
1085
  }
1067
1086
 
1068
- .memori-mobile-dropdown-enter-from {
1069
- opacity: 0;
1070
- transform: translateY(-10px) scale(0.95);
1087
+ .memori-mobile-dropdown .memori-artifact-action-btn:hover,
1088
+ .memori-mobile-dropdown .memori-dropdown__item:hover:not([data-disabled]),
1089
+ .memori-dropdown__popup.memori-mobile-dropdown .memori-dropdown__item:hover:not([data-disabled]),
1090
+ .memori-dropdown__popup.memori-mobile-dropdown .memori-dropdown__item[data-highlighted]:not([data-disabled]) {
1091
+ border-color: transparent;
1092
+ background: color-mix(in srgb, var(--memori-text-color) 10%, transparent) !important;
1093
+ color: var(--memori-text-color);
1071
1094
  }
1072
1095
 
1073
- .memori-mobile-dropdown-enter-to {
1074
- opacity: 1;
1075
- transform: translateY(0) scale(1);
1096
+ .memori-mobile-dropdown .memori-artifact-action-icon,
1097
+ .memori-mobile-dropdown .memori-dropdown__item-icon,
1098
+ .memori-mobile-dropdown .memori-dropdown__item-icon svg {
1099
+ width: 16px;
1100
+ height: 16px;
1101
+ flex-shrink: 0;
1102
+ color: inherit;
1103
+ fill: none !important;
1104
+ stroke: currentColor;
1076
1105
  }
1077
1106
 
1078
- .memori-mobile-dropdown-leave {
1079
- transition: all 0.15s ease-in;
1080
- }
1107
+ @media (max-width: 1260px) {
1108
+ .memori-artifact-drawer--close {
1109
+ margin-left: 0;
1110
+ }
1081
1111
 
1082
- .memori-mobile-dropdown-leave-from {
1083
- opacity: 1;
1084
- transform: translateY(0) scale(1);
1085
- }
1112
+ .memori-artifact-panel--header {
1113
+ margin-bottom: var(--memori-spacing-sm);
1114
+ }
1086
1115
 
1087
- .memori-mobile-dropdown-leave-to {
1088
- opacity: 0;
1089
- transform: translateY(-10px) scale(0.95);
1116
+ .memori-dropdown__popup.memori-mobile-dropdown,
1117
+ .memori-mobile-dropdown {
1118
+ min-width: 180px;
1119
+ max-width: calc(100vw - 1.5rem);
1120
+ }
1090
1121
  }
1091
1122
 
1092
1123
  /* Focus and Accessibility */
@@ -16,6 +16,7 @@ import {
16
16
  Download,
17
17
  Link as LinkIcon,
18
18
  Printer,
19
+ Copy,
19
20
  } from 'lucide-react';
20
21
  import ArtifactActions from '../ArtifactActions/ArtifactActions';
21
22
  import { useArtifact } from '../../context/ArtifactContext';
@@ -152,7 +153,7 @@ const ArtifactDrawer: React.FC<{
152
153
  anchor="right"
153
154
  size="md"
154
155
  className={
155
- state.isFullscreen
156
+ state.isFullscreen || isMobile
156
157
  ? 'memori-artifact-panel-drawer-fullscreen'
157
158
  : 'memori-artifact-panel-drawer'
158
159
  }
@@ -295,43 +296,45 @@ const ArtifactDrawer: React.FC<{
295
296
  hasPreview={hasPreview}
296
297
  />
297
298
  )}
298
- <Dropdown className="memori-mobile-actions-menu">
299
- <Dropdown.Trigger
300
- showChevron={false}
301
- className="memori-mobile-actions-trigger"
302
- render={(
303
- props: React.ButtonHTMLAttributes<HTMLButtonElement>
304
- ) => (
305
- <Button
306
- {...props}
307
- className={cx(
308
- 'memori-button',
309
- 'memori-button--more-options',
310
- 'memori-button--icon-only'
311
- )}
312
- variant="ghost"
313
- title={t('artifact.actions') || 'Actions'}
314
- >
315
- <MoreVertical className="memori-artifact-action-icon" />
316
- </Button>
317
- )}
318
- />
319
- <Dropdown.Menu className="memori-mobile-dropdown">
320
- <div className="memori-mobile-dropdown-list">
321
- <Button
322
- onClick={handleCopy}
323
- disabled={false}
299
+ <div className="memori-artifact-drawer-top-right-actions">
300
+ <Dropdown className="memori-mobile-actions-menu">
301
+ <Dropdown.Trigger
302
+ showChevron={false}
303
+ className="memori-mobile-actions-trigger"
304
+ render={(
305
+ props: React.ButtonHTMLAttributes<HTMLButtonElement>
306
+ ) => (
307
+ <Button
308
+ {...props}
309
+ className={cx(
310
+ 'memori-button',
311
+ 'memori-button--more-options',
312
+ 'memori-button--icon-only'
313
+ )}
314
+ variant="ghost"
315
+ title={t('artifact.actions') || 'Actions'}
316
+ >
317
+ <MoreVertical className="memori-artifact-action-icon" />
318
+ </Button>
319
+ )}
320
+ />
321
+ <Dropdown.Menu
322
+ className="memori-mobile-dropdown"
323
+ placement="bottom"
324
+ align="end"
325
+ sideOffset={8}
326
+ container={surfaceEl ?? undefined}
327
+ >
328
+ <Dropdown.Item
324
329
  className="memori-artifact-action-btn"
325
- variant="ghost"
326
- title={t('artifact.copy') || 'Copy'}
330
+ onClick={handleCopy}
331
+ icon={<Copy className="memori-artifact-action-icon" />}
332
+ label={t('artifact.copy') || 'Copy'}
327
333
  >
328
- <span className="memori-artifact-action-text">
329
- {t('artifact.copy') || 'Copy'}
330
- </span>
331
- </Button>
334
+ {t('artifact.copy') || 'Copy'}
335
+ </Dropdown.Item>
332
336
 
333
337
  {formats.map(format => {
334
- // Get appropriate icon based on action type
335
338
  const getIcon = () => {
336
339
  switch (format.action) {
337
340
  case 'copy':
@@ -355,27 +358,24 @@ const ArtifactDrawer: React.FC<{
355
358
  };
356
359
 
357
360
  return (
358
- <Button
361
+ <Dropdown.Item
359
362
  key={format.id}
363
+ className="memori-artifact-action-btn"
360
364
  onClick={() => handleCopyFormat(format)}
361
365
  disabled={
362
366
  copyState.loading &&
363
367
  copyState.activeFormat === format.id
364
368
  }
365
- className="memori-artifact-action-btn"
366
- variant="ghost"
367
369
  icon={getIcon()}
368
- title={format.label}
370
+ label={format.label}
369
371
  >
370
- <span className="memori-artifact-action-text">
371
- {format.label}
372
- </span>
373
- </Button>
372
+ {format.label}
373
+ </Dropdown.Item>
374
374
  );
375
375
  })}
376
376
 
377
- {/* External open action (not from hook) */}
378
- <Button
377
+ <Dropdown.Item
378
+ className="memori-artifact-action-btn"
379
379
  onClick={() =>
380
380
  handleOpenExternal(
381
381
  state.currentArtifact ?? {
@@ -388,38 +388,29 @@ const ArtifactDrawer: React.FC<{
388
388
  }
389
389
  )
390
390
  }
391
- disabled={false}
392
- className="memori-artifact-action-btn"
393
- variant="ghost"
394
391
  icon={<LinkIcon className="memori-artifact-action-icon" />}
395
- title={t('artifact.external') || 'External'}
392
+ label={t('artifact.external') || 'External'}
396
393
  >
397
- <span className="memori-artifact-action-text">
398
- {t('artifact.external') || 'External'}
399
- </span>
400
- </Button>
401
- </div>
402
- </Dropdown.Menu>
403
- </Dropdown>
394
+ {t('artifact.external') || 'External'}
395
+ </Dropdown.Item>
396
+ </Dropdown.Menu>
397
+ </Dropdown>
398
+ <Button
399
+ onClick={closeArtifact}
400
+ className={cx(
401
+ 'memori-artifact-drawer--close',
402
+ 'memori-button--icon-only'
403
+ )}
404
+ variant="ghost"
405
+ aria-label={t('artifact.close') || 'Close'}
406
+ title={t('artifact.close') || 'Close'}
407
+ icon={
408
+ <X className="memori-artifact-panel--close-icon" aria-hidden />
409
+ }
410
+ />
411
+ </div>
404
412
  </>
405
413
  )}
406
-
407
- {/* Close Button */}
408
- {isMobile && (
409
- <Button
410
- onClick={closeArtifact}
411
- className={cx(
412
- 'memori-artifact-drawer--close',
413
- 'memori-button--icon-only'
414
- )}
415
- variant="ghost"
416
- aria-label={t('artifact.close') || 'Close'}
417
- title={t('artifact.close') || 'Close'}
418
- icon={
419
- <X className="memori-artifact-panel--close-icon" aria-hidden />
420
- }
421
- />
422
- )}
423
414
  </div>
424
415
 
425
416
  {/* Content */}
@@ -1,12 +1,16 @@
1
1
  .memori-tab-switch {
2
2
  display: flex;
3
+ width: auto;
3
4
  max-width: fit-content;
5
+ flex: 0 0 auto;
4
6
  align-items: center;
5
- justify-content: center;
7
+ justify-content: flex-start;
6
8
  }
7
9
 
8
10
  .memori-tab-switch__list {
9
11
  display: flex;
12
+ width: auto;
13
+ flex: 0 0 auto;
10
14
  gap: var(--memori-spacing-xs);
11
15
  }
12
16
 
@@ -15,7 +19,8 @@
15
19
  }
16
20
 
17
21
  .memori-tab-switch__tab {
18
- min-width: 70px;
22
+ min-width: 40px;
23
+ flex: 0 0 auto;
19
24
  }
20
25
 
21
26
  .memori-tab-switch__icon {
@@ -127,6 +127,7 @@
127
127
  min-height: 0;
128
128
  flex: 1;
129
129
  padding: 1rem;
130
+ background: color-mix(in srgb, var(--memori-text-color) 4%, var(--memori-secondary-background));
130
131
  color: var(--memori-text-color);
131
132
  font-family: var(--memori-font-family);
132
133
  line-height: 1.6;
@@ -2693,7 +2693,11 @@ const MemoriWidget = ({
2693
2693
  }
2694
2694
  if (integrationConfig?.blurBackground) {
2695
2695
  integrationStylesheetParts.push(
2696
- '.memori-widget .memori-chat--history--has-global-background::before { filter: blur(5px); }'
2696
+ `.memori-widget .memori-chat--history--has-global-background::before,
2697
+ .memori-widget .memori-chat-layout--main--has-background::before {
2698
+ filter: blur(5px);
2699
+ transform: scale(1.06);
2700
+ }`
2697
2701
  );
2698
2702
  }
2699
2703
  const integrationStylesheet = `@layer integration {
@@ -192,3 +192,25 @@
192
192
  [data-theme='dark'] .memori-widget.memori-layout-website_assistant .memori-chat-inputs--mic .lucide-mic {
193
193
  color: inherit;
194
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
+ }