@memori.ai/memori-react 8.10.1 → 8.12.0

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 (177) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.css +41 -14
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +2 -2
  4. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  5. package/dist/components/Auth/Auth.js +36 -8
  6. package/dist/components/Auth/Auth.js.map +1 -1
  7. package/dist/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +2 -2
  8. package/dist/components/Chat/Chat.js +2 -2
  9. package/dist/components/Chat/Chat.js.map +1 -1
  10. package/dist/components/ChatBubble/ChatBubble.css +81 -13
  11. package/dist/components/ChatBubble/ChatBubble.js +86 -19
  12. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  13. package/dist/components/ChatHistoryDrawer/ChatHistory.css +5 -1
  14. package/dist/components/ChatInputs/ChatInputs.d.ts +1 -0
  15. package/dist/components/ChatInputs/ChatInputs.js +8 -3
  16. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  17. package/dist/components/DateSelector/DateSelector.css +125 -104
  18. package/dist/components/DateSelector/DateSelector.d.ts +1 -1
  19. package/dist/components/DateSelector/DateSelector.js +110 -52
  20. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  21. package/dist/components/Header/Header.js +1 -1
  22. package/dist/components/Header/Header.js.map +1 -1
  23. package/dist/components/LoginDrawer/LoginDrawer.css +37 -5
  24. package/dist/components/LoginDrawer/LoginDrawer.d.ts +1 -2
  25. package/dist/components/LoginDrawer/LoginDrawer.js +2 -9
  26. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  27. package/dist/components/MediaWidget/MediaItemWidget.js +40 -5
  28. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  29. package/dist/components/MediaWidget/MediaWidget.css +4 -0
  30. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  31. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  32. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +1 -1
  33. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  34. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js +3 -0
  35. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js.map +1 -1
  36. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  37. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  38. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +16 -7
  39. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +6 -4
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -1
  41. package/dist/components/MemoriWidget/MemoriWidget.js +69 -25
  42. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  43. package/dist/components/UploadButton/UploadButton.js +2 -0
  44. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  45. package/dist/components/UploadButton/UploadImages/UploadImages.js +2 -2
  46. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  47. package/dist/components/ui/Drawer.css +8 -0
  48. package/dist/components/ui/Drawer.d.ts +2 -0
  49. package/dist/components/ui/Drawer.js +2 -2
  50. package/dist/components/ui/Drawer.js.map +1 -1
  51. package/dist/components/ui/Tooltip.css +49 -1
  52. package/dist/components/ui/Tooltip.d.ts +1 -1
  53. package/dist/locales/de.json +6 -1
  54. package/dist/locales/en.json +9 -1
  55. package/dist/locales/es.json +6 -1
  56. package/dist/locales/fr.json +5 -1
  57. package/dist/locales/it.json +8 -1
  58. package/dist/styles.css +3 -2
  59. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +41 -14
  60. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +2 -2
  61. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  62. package/esm/components/Auth/Auth.js +36 -8
  63. package/esm/components/Auth/Auth.js.map +1 -1
  64. package/esm/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +2 -2
  65. package/esm/components/Chat/Chat.js +2 -2
  66. package/esm/components/Chat/Chat.js.map +1 -1
  67. package/esm/components/ChatBubble/ChatBubble.css +81 -13
  68. package/esm/components/ChatBubble/ChatBubble.js +87 -20
  69. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  70. package/esm/components/ChatHistoryDrawer/ChatHistory.css +5 -1
  71. package/esm/components/ChatInputs/ChatInputs.d.ts +1 -0
  72. package/esm/components/ChatInputs/ChatInputs.js +8 -3
  73. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  74. package/esm/components/DateSelector/DateSelector.css +125 -104
  75. package/esm/components/DateSelector/DateSelector.d.ts +1 -1
  76. package/esm/components/DateSelector/DateSelector.js +111 -52
  77. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  78. package/esm/components/Header/Header.js +1 -1
  79. package/esm/components/Header/Header.js.map +1 -1
  80. package/esm/components/LoginDrawer/LoginDrawer.css +37 -5
  81. package/esm/components/LoginDrawer/LoginDrawer.d.ts +1 -2
  82. package/esm/components/LoginDrawer/LoginDrawer.js +2 -9
  83. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  84. package/esm/components/MediaWidget/MediaItemWidget.js +40 -5
  85. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  86. package/esm/components/MediaWidget/MediaWidget.css +4 -0
  87. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  88. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  89. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +1 -1
  90. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  91. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js +3 -0
  92. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js.map +1 -1
  93. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  94. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  95. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +16 -7
  96. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +6 -4
  97. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -1
  98. package/esm/components/MemoriWidget/MemoriWidget.js +69 -25
  99. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  100. package/esm/components/UploadButton/UploadButton.js +2 -0
  101. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  102. package/esm/components/UploadButton/UploadImages/UploadImages.js +2 -2
  103. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  104. package/esm/components/ui/Drawer.css +8 -0
  105. package/esm/components/ui/Drawer.d.ts +2 -0
  106. package/esm/components/ui/Drawer.js +2 -2
  107. package/esm/components/ui/Drawer.js.map +1 -1
  108. package/esm/components/ui/Tooltip.css +49 -1
  109. package/esm/components/ui/Tooltip.d.ts +1 -1
  110. package/esm/locales/de.json +6 -1
  111. package/esm/locales/en.json +9 -1
  112. package/esm/locales/es.json +6 -1
  113. package/esm/locales/fr.json +5 -1
  114. package/esm/locales/it.json +8 -1
  115. package/esm/styles.css +3 -2
  116. package/package.json +2 -2
  117. package/src/components/AgeVerificationModal/AgeVerificationModal.css +41 -14
  118. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +3 -1
  119. package/src/components/Auth/Auth.tsx +55 -11
  120. package/src/components/Avatar/Avatar.stories.tsx +3 -0
  121. package/src/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +2 -2
  122. package/src/components/Chat/Chat.stories.tsx +16 -2
  123. package/src/components/Chat/Chat.tsx +2 -1
  124. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +1036 -36
  125. package/src/components/ChatBubble/ChatBubble.css +81 -13
  126. package/src/components/ChatBubble/ChatBubble.stories.tsx +16 -2
  127. package/src/components/ChatBubble/ChatBubble.test.tsx +17 -0
  128. package/src/components/ChatBubble/ChatBubble.tsx +144 -31
  129. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +304 -8
  130. package/src/components/ChatHistoryDrawer/ChatHistory.css +5 -1
  131. package/src/components/ChatInputs/ChatInputs.tsx +14 -1
  132. package/src/components/DateSelector/DateSelector.css +125 -104
  133. package/src/components/DateSelector/DateSelector.stories.tsx +1 -1
  134. package/src/components/DateSelector/DateSelector.test.tsx +137 -23
  135. package/src/components/DateSelector/DateSelector.tsx +203 -177
  136. package/src/components/Header/Header.stories.tsx +5 -1
  137. package/src/components/Header/Header.tsx +1 -1
  138. package/src/components/Header/__snapshots__/Header.test.tsx.snap +1 -1
  139. package/src/components/LoginDrawer/LoginDrawer.css +37 -5
  140. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +0 -1
  141. package/src/components/LoginDrawer/LoginDrawer.test.tsx +0 -1
  142. package/src/components/LoginDrawer/LoginDrawer.tsx +0 -19
  143. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +69 -0
  144. package/src/components/MediaWidget/MediaItemWidget.tsx +66 -18
  145. package/src/components/MediaWidget/MediaWidget.css +4 -0
  146. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +10 -10
  147. package/src/components/MediaWidget/__snapshots__/MediaWidget.test.tsx.snap +2 -2
  148. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +996 -204
  149. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.tsx +2 -2
  150. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.tsx +1 -1
  151. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.tsx +3 -0
  152. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +56 -54
  153. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +16 -7
  154. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.tsx +12 -3
  155. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +6 -3
  156. package/src/components/MemoriWidget/MemoriWidget.tsx +123 -48
  157. package/src/components/UploadButton/UploadButton.tsx +2 -0
  158. package/src/components/UploadButton/UploadImages/UploadImages.tsx +3 -2
  159. package/src/components/layouts/FullBody/FullBody.stories.tsx +110 -0
  160. package/src/components/layouts/Totem/Totem.stories.tsx +131 -0
  161. package/src/components/layouts/ZoomedFullBody/ZoomedFullBody.stories.tsx +131 -0
  162. package/src/components/layouts/layouts.stories.tsx +55 -508
  163. package/src/components/ui/Drawer.css +8 -0
  164. package/src/components/ui/Drawer.tsx +16 -12
  165. package/src/components/ui/Tooltip.css +49 -1
  166. package/src/components/ui/Tooltip.tsx +1 -1
  167. package/src/index.stories.tsx +13 -320
  168. package/src/locales/de.json +6 -1
  169. package/src/locales/en.json +9 -1
  170. package/src/locales/es.json +6 -1
  171. package/src/locales/fr.json +5 -1
  172. package/src/locales/it.json +8 -1
  173. package/src/mocks/data.ts +4 -2
  174. package/src/styles.css +3 -2
  175. package/src/components/SignupForm/SignupForm.test.tsx +0 -40
  176. package/src/components/SignupForm/SignupForm.tsx +0 -457
  177. package/src/components/SignupForm/__snapshots__/SignupForm.test.tsx.snap +0 -247
@@ -1,200 +1,226 @@
1
- import { useEffect, useState, memo, Fragment } from 'react';
2
- import { Listbox, Transition } from '@headlessui/react';
1
+ import { useEffect, useState, memo, useMemo, useRef, ChangeEvent } from 'react';
3
2
  import { DateTime } from 'luxon';
4
3
  import { useTranslation } from 'react-i18next';
5
- import SelectIcon from '../icons/SelectIcon';
6
4
 
7
5
  export interface Props {
8
6
  defaultDate?: string | Date;
9
7
  disabled?: boolean;
10
- onChange: (date: DateTime) => void;
8
+ onChange: (date: DateTime | undefined) => void;
11
9
  }
12
10
 
13
- const months = {
14
- en: [
15
- 'January',
16
- 'February',
17
- 'March',
18
- 'April',
19
- 'May',
20
- 'June',
21
- 'July',
22
- 'August',
23
- 'September',
24
- 'October',
25
- 'November',
26
- 'December',
27
- ],
28
- it: [
29
- 'Gennaio',
30
- 'Febbraio',
31
- 'Marzo',
32
- 'Aprile',
33
- 'Maggio',
34
- 'Giugno',
35
- 'Luglio',
36
- 'Agosto',
37
- 'Settembre',
38
- 'Ottobre',
39
- 'Novembre',
40
- 'Dicembre',
41
- ],
42
- };
43
-
44
11
  const DateSelector = memo(
45
12
  ({ defaultDate, onChange, disabled = false }: Props) => {
46
- const { t, i18n } = useTranslation();
47
-
48
- const [date, setDate] = useState(
49
- !defaultDate
50
- ? DateTime.now()
51
- : typeof defaultDate === 'string'
52
- ? DateTime.fromISO(defaultDate)
53
- : DateTime.fromJSDate(defaultDate)
54
- );
13
+ const { t } = useTranslation();
14
+
15
+ // Calculate constraints for birth date (18 years ago to 1900)
16
+ const maxDate = useMemo(() => DateTime.now().minus({ years: 18 }), []);
17
+ const minDate = useMemo(() => DateTime.fromObject({ year: 1900, month: 1, day: 1 }), []);
18
+
19
+ // State for individual fields as strings to allow empty values
20
+ const [day, setDay] = useState<string>('');
21
+ const [month, setMonth] = useState<string>('');
22
+ const [year, setYear] = useState<string>('');
23
+
24
+ // Initialize from defaultDate if provided
55
25
  useEffect(() => {
56
- onChange(date);
57
- }, [date, onChange]);
26
+ if (defaultDate) {
27
+ const dt = typeof defaultDate === 'string'
28
+ ? DateTime.fromISO(defaultDate)
29
+ : DateTime.fromJSDate(defaultDate);
30
+
31
+ if (dt.isValid) {
32
+ setDay(dt.day.toString());
33
+ setMonth(dt.month.toString());
34
+ setYear(dt.year.toString());
35
+ }
36
+ }
37
+ }, [defaultDate]);
38
+
39
+ const [isMobile, setIsMobile] = useState(false);
40
+
41
+ // Refs for auto-focus
42
+ const dayRef = useRef<HTMLInputElement>(null);
43
+ const monthRef = useRef<HTMLInputElement>(null);
44
+ const yearRef = useRef<HTMLInputElement>(null);
45
+
46
+ // Detect mobile viewport
47
+ useEffect(() => {
48
+ const checkMobile = () => {
49
+ setIsMobile(window.innerWidth < 768);
50
+ };
51
+
52
+ checkMobile();
53
+ window.addEventListener('resize', checkMobile);
54
+ return () => window.removeEventListener('resize', checkMobile);
55
+ }, []);
56
+
57
+ // Validate and propagate changes
58
+ useEffect(() => {
59
+ if (!day || !month || !year) {
60
+ onChange(undefined);
61
+ return;
62
+ }
63
+
64
+ const d = parseInt(day);
65
+ const m = parseInt(month);
66
+ const y = parseInt(year);
67
+
68
+ if (isNaN(d) || isNaN(m) || isNaN(y)) {
69
+ onChange(undefined);
70
+ return;
71
+ }
72
+
73
+ const newDate = DateTime.fromObject({ year: y, month: m, day: d });
74
+
75
+ // Basic validation: check if it's a valid date (e.g. not Feb 30)
76
+ // and within range.
77
+ if (newDate.isValid && newDate >= minDate && newDate <= maxDate) {
78
+ onChange(newDate);
79
+ } else {
80
+ onChange(undefined);
81
+ }
82
+ }, [day, month, year, onChange, minDate, maxDate]);
83
+
84
+ // Handle mobile native input change
85
+ const handleMobileChange = (e: ChangeEvent<HTMLInputElement>) => {
86
+ const value = e.target.value;
87
+ if (value) {
88
+ const newDate = DateTime.fromISO(value);
89
+ if (newDate.isValid) {
90
+ setDay(newDate.day.toString());
91
+ setMonth(newDate.month.toString());
92
+ setYear(newDate.year.toString());
93
+ // The useEffect will handle calling onChange
94
+ }
95
+ } else {
96
+ setDay('');
97
+ setMonth('');
98
+ setYear('');
99
+ }
100
+ };
101
+
102
+ const handleDayChange = (e: ChangeEvent<HTMLInputElement>) => {
103
+ const val = e.target.value;
104
+ // Allow empty or numbers only
105
+ if (val === '' || /^\d+$/.test(val)) {
106
+ // Limit length to 2
107
+ if (val.length > 2) return;
108
+
109
+ // Limit value to 31
110
+ const numVal = parseInt(val);
111
+ if (numVal > 31) return;
112
+
113
+ setDay(val);
114
+ if (val.length >= 2) {
115
+ monthRef.current?.focus();
116
+ }
117
+ }
118
+ };
119
+
120
+ const handleMonthChange = (e: ChangeEvent<HTMLInputElement>) => {
121
+ const val = e.target.value;
122
+ if (val === '' || /^\d+$/.test(val)) {
123
+ // Limit length to 2
124
+ if (val.length > 2) return;
125
+
126
+ // Limit value to 12
127
+ const numVal = parseInt(val);
128
+ if (numVal > 12) return;
129
+
130
+ setMonth(val);
131
+ if (val.length >= 2) {
132
+ yearRef.current?.focus();
133
+ }
134
+ }
135
+ };
136
+
137
+ const handleYearChange = (e: ChangeEvent<HTMLInputElement>) => {
138
+ const val = e.target.value;
139
+ if (val === '' || /^\d+$/.test(val)) {
140
+ // Limit length to 4
141
+ if (val.length > 4) return;
142
+
143
+ setYear(val);
144
+ }
145
+ };
146
+
147
+ // Mobile native input
148
+ if (isMobile) {
149
+ const currentDate = (day && month && year)
150
+ ? DateTime.fromObject({ year: parseInt(year), month: parseInt(month), day: parseInt(day) })
151
+ : null;
152
+
153
+ return (
154
+ <div className="memori--date-selector memori--date-selector--mobile">
155
+ <label className="memori--date-selector__mobile-label">
156
+ {t('birthDate') || 'Birth Date'}:
157
+ </label>
158
+ <input
159
+ type="date"
160
+ className="memori--date-selector__mobile-input"
161
+ value={currentDate?.isValid ? currentDate.toISODate() || '' : ''}
162
+ onChange={handleMobileChange}
163
+ disabled={disabled}
164
+ min={minDate.toISODate() || '1900-01-01'}
165
+ max={maxDate.toISODate() || ''}
166
+ aria-label={String(t('dateOfBirth') || t('date'))}
167
+ />
168
+ </div>
169
+ );
170
+ }
58
171
 
172
+ // Desktop simple inputs
59
173
  return (
60
- <div className="memori--date-selector">
61
- <div className="memori--date-selector__select">
62
- <Listbox
63
- value={date}
64
- onChange={value => {
65
- setDate(value);
66
- }}
174
+ <div className="memori--date-selector memori--date-selector--desktop">
175
+ <div className="memori--date-selector__input-group">
176
+ <label className="memori--date-selector__label">
177
+ {t('day') || 'Day'}
178
+ </label>
179
+ <input
180
+ ref={dayRef}
181
+ type="number"
182
+ className="memori--date-selector__input"
183
+ value={day}
184
+ onChange={handleDayChange}
185
+ placeholder={t('dayPlaceholder') || 'DD'}
186
+ min={1}
187
+ max={31}
67
188
  disabled={disabled}
68
- name="day"
69
- >
70
- <Listbox.Label className="memori--date-selector__select-label">
71
- {t('day')}:
72
- </Listbox.Label>
73
- <Listbox.Button
74
- aria-label={t('day')}
75
- className="memori--date-selector__select-button"
76
- >
77
- <span className="memori--date-selector__select--value">
78
- {date.day}
79
- </span>
80
- <span className="memori--date-selector__select--icon">
81
- <SelectIcon />
82
- </span>
83
- </Listbox.Button>
84
- <Transition
85
- as={Fragment}
86
- leave="transition ease-in duration-100"
87
- leaveFrom="opacity-100"
88
- leaveTo="opacity-0"
89
- >
90
- <Listbox.Options className="memori--date-selector__select-options">
91
- {[...Array(31).keys()].map(day => (
92
- <Listbox.Option
93
- key={day}
94
- value={date.set({ day: day + 1 })}
95
- className="memori--date-selector__select-option"
96
- >
97
- {day + 1}
98
- </Listbox.Option>
99
- ))}
100
- </Listbox.Options>
101
- </Transition>
102
- </Listbox>
189
+ />
103
190
  </div>
104
191
 
105
- <div className="memori--date-selector__select">
106
- <Listbox
107
- value={date}
108
- onChange={value => {
109
- setDate(value);
110
- }}
192
+ <div className="memori--date-selector__input-group">
193
+ <label className="memori--date-selector__label">
194
+ {t('month') || 'Month'}
195
+ </label>
196
+ <input
197
+ ref={monthRef}
198
+ type="number"
199
+ className="memori--date-selector__input"
200
+ value={month}
201
+ onChange={handleMonthChange}
202
+ placeholder={t('monthPlaceholder') || 'MM'}
203
+ min={1}
204
+ max={12}
111
205
  disabled={disabled}
112
- name="month"
113
- >
114
- <Listbox.Label className="memori--date-selector__select-label">
115
- {t('month')}:
116
- </Listbox.Label>
117
- <Listbox.Button
118
- aria-label={t('month')}
119
- className="memori--date-selector__select-button"
120
- >
121
- <span className="memori--date-selector__select--value">
122
- {months[i18n.language === 'it' ? 'it' : 'en'][date.month - 1]}
123
- </span>
124
- <span className="memori--date-selector__select--icon">
125
- <SelectIcon />
126
- </span>
127
- </Listbox.Button>
128
- <Transition
129
- as={Fragment}
130
- leave="transition ease-in duration-100"
131
- leaveFrom="opacity-100"
132
- leaveTo="opacity-0"
133
- >
134
- <Listbox.Options className="memori--date-selector__select-options">
135
- {months[i18n.language === 'it' ? 'it' : 'en'].map(month => (
136
- <Listbox.Option
137
- key={month}
138
- className="memori--date-selector__select-option"
139
- value={date.set({
140
- month:
141
- months[i18n.language === 'it' ? 'it' : 'en'].findIndex(
142
- m => m === month
143
- ) + 1,
144
- })}
145
- >
146
- {month}
147
- </Listbox.Option>
148
- ))}
149
- </Listbox.Options>
150
- </Transition>
151
- </Listbox>
206
+ />
152
207
  </div>
153
208
 
154
- <div className="memori--date-selector__select">
155
- <Listbox
156
- value={date}
157
- onChange={value => {
158
- setDate(value);
159
- }}
209
+ <div className="memori--date-selector__input-group memori--date-selector__input-group--year">
210
+ <label className="memori--date-selector__label">
211
+ {t('year') || 'Year'}
212
+ </label>
213
+ <input
214
+ ref={yearRef}
215
+ type="number"
216
+ className="memori--date-selector__input"
217
+ value={year}
218
+ onChange={handleYearChange}
219
+ placeholder={t('yearPlaceholder') || 'YYYY'}
220
+ min={minDate.year}
221
+ max={maxDate.year}
160
222
  disabled={disabled}
161
- name="year"
162
- >
163
- <Listbox.Label className="memori--date-selector__select-label">
164
- {t('year')}:
165
- </Listbox.Label>
166
- <Listbox.Button
167
- aria-label={t('year')}
168
- className="memori--date-selector__select-button"
169
- >
170
- <span className="memori--date-selector__select--value">
171
- {date.year}
172
- </span>
173
- <span className="memori--date-selector__select--icon">
174
- <SelectIcon />
175
- </span>
176
- </Listbox.Button>
177
- <Transition
178
- as={Fragment}
179
- leave="transition ease-in duration-100"
180
- leaveFrom="opacity-100"
181
- leaveTo="opacity-0"
182
- >
183
- <Listbox.Options className="memori--date-selector__select-options">
184
- {[...Array(DateTime.now().year - 1899).keys()]
185
- .sort((a, b) => b - a)
186
- .map(year => (
187
- <Listbox.Option
188
- key={year}
189
- value={date.set({ year: year + 1900 })}
190
- className="memori--date-selector__select-option"
191
- >
192
- {year + 1900}
193
- </Listbox.Option>
194
- ))}
195
- </Listbox.Options>
196
- </Transition>
197
- </Listbox>
223
+ />
198
224
  </div>
199
225
  </div>
200
226
  );
@@ -4,7 +4,8 @@ import { memori, tenant, history } from '../../mocks/data';
4
4
  import I18nWrapper from '../../I18nWrapper';
5
5
  import Header, { Props } from './Header';
6
6
  import SettingsDrawer from '../SettingsDrawer/SettingsDrawer';
7
- import LoginDrawer from '../LoginDrawer/LoginDrawer';
7
+ import LoginDrawer from '../LoginDrawer/LoginDrawer';
8
+ import { ArtifactProvider } from '../MemoriArtifactSystem/context/ArtifactContext';
8
9
 
9
10
  import './Header.css';
10
11
 
@@ -37,6 +38,7 @@ const Template: Story<Props> = args => {
37
38
 
38
39
  return (
39
40
  <I18nWrapper>
41
+ <ArtifactProvider>
40
42
  <Header
41
43
  {...args}
42
44
  speakerMuted={speakerMuted}
@@ -62,6 +64,7 @@ const Template: Story<Props> = args => {
62
64
  setEnablePositionControls={() => {}}
63
65
  />
64
66
  <LoginDrawer
67
+ setUser={() => {}}
65
68
  tenant={tenant}
66
69
  open={!!showLoginDrawer}
67
70
  onClose={() => setShowLoginDrawer(false)}
@@ -76,6 +79,7 @@ const Template: Story<Props> = args => {
76
79
  } as any
77
80
  }
78
81
  />
82
+ </ArtifactProvider>
79
83
  </I18nWrapper>
80
84
  );
81
85
  };
@@ -290,7 +290,7 @@ const Header: React.FC<Props> = ({
290
290
  <Button
291
291
  primary
292
292
  shape="circle"
293
- className="memori-header--button memori-header--button--speaker"
293
+ className={cx('memori-header--button memori-header--button--speaker', { 'memori-header--button--speaker-muted': speakerMuted })}
294
294
  icon={speakerMuted ? <SoundDeactivated /> : <Sound />}
295
295
  onClick={() => setSpeakerMuted(!speakerMuted)}
296
296
  title={t('widget.sound') || 'Sound'}
@@ -869,7 +869,7 @@ exports[`renders Header with speaker muted unchanged 1`] = `
869
869
  class="memori-header"
870
870
  >
871
871
  <button
872
- class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--speaker"
872
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--speaker memori-header--button--speaker-muted"
873
873
  title="widget.sound"
874
874
  >
875
875
  <span
@@ -134,10 +134,12 @@ p.memori--login-drawer--inline-error {
134
134
  }
135
135
 
136
136
  @keyframes float {
137
+
137
138
  0%,
138
139
  100% {
139
140
  transform: translateY(0px);
140
141
  }
142
+
141
143
  50% {
142
144
  transform: translateY(-10px);
143
145
  }
@@ -219,10 +221,12 @@ p.memori--login-drawer--inline-error {
219
221
  }
220
222
 
221
223
  @keyframes pulse {
224
+
222
225
  0%,
223
226
  100% {
224
227
  transform: scale(1);
225
228
  }
229
+
226
230
  50% {
227
231
  transform: scale(1.05);
228
232
  }
@@ -336,10 +340,12 @@ p.memori--login-drawer--inline-error {
336
340
  }
337
341
 
338
342
  @keyframes rocket {
343
+
339
344
  0%,
340
345
  100% {
341
346
  transform: translateY(0) rotate(0deg);
342
347
  }
348
+
343
349
  50% {
344
350
  transform: translateY(-3px) rotate(5deg);
345
351
  }
@@ -372,9 +378,11 @@ p.memori--login-drawer--inline-error {
372
378
  0% {
373
379
  background-position: 0% 50%;
374
380
  }
381
+
375
382
  50% {
376
383
  background-position: 100% 50%;
377
384
  }
385
+
378
386
  100% {
379
387
  background-position: 0% 50%;
380
388
  }
@@ -393,6 +401,7 @@ p.memori--login-drawer--inline-error {
393
401
  }
394
402
 
395
403
  @keyframes bounce {
404
+
396
405
  0%,
397
406
  20%,
398
407
  50%,
@@ -400,9 +409,11 @@ p.memori--login-drawer--inline-error {
400
409
  100% {
401
410
  transform: translateY(0);
402
411
  }
412
+
403
413
  40% {
404
414
  transform: translateY(-10px);
405
415
  }
416
+
406
417
  60% {
407
418
  transform: translateY(-5px);
408
419
  }
@@ -479,7 +490,7 @@ p.memori--login-drawer--inline-error {
479
490
  .memori--login-drawer--otp-input:focus {
480
491
  border-color: var(--memori-primary);
481
492
  background: white;
482
- box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.1);
493
+ box-shadow: 0 0 0 4px rgba(var(--memori-primary-rgb), 0.1);
483
494
  transform: scale(1.02);
484
495
  }
485
496
 
@@ -512,7 +523,7 @@ p.memori--login-drawer--inline-error {
512
523
  .memori--login-drawer--otp-email-input:focus {
513
524
  border-color: var(--memori-primary);
514
525
  background: white;
515
- box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.1);
526
+ box-shadow: 0 0 0 4px rgba(var(--memori-primary-rgb), 0.1);
516
527
  transform: translateY(-1px);
517
528
  }
518
529
 
@@ -540,9 +551,11 @@ p.memori--login-drawer--inline-error {
540
551
  0% {
541
552
  transform: scale(0) rotate(0deg);
542
553
  }
554
+
543
555
  50% {
544
556
  transform: scale(1.2) rotate(180deg);
545
557
  }
558
+
546
559
  100% {
547
560
  transform: scale(1) rotate(360deg);
548
561
  }
@@ -569,6 +582,7 @@ p.memori--login-drawer--inline-error {
569
582
  0% {
570
583
  transform: rotate(0deg);
571
584
  }
585
+
572
586
  100% {
573
587
  transform: rotate(360deg);
574
588
  }
@@ -597,6 +611,7 @@ p.memori--login-drawer--inline-error {
597
611
  opacity: 0;
598
612
  transform: translateY(20px);
599
613
  }
614
+
600
615
  to {
601
616
  opacity: 1;
602
617
  transform: translateY(0);
@@ -611,13 +626,16 @@ p.memori--login-drawer--inline-error {
611
626
  }
612
627
 
613
628
  @keyframes celebration {
629
+
614
630
  0%,
615
631
  100% {
616
632
  transform: scale(1) rotate(0deg);
617
633
  }
634
+
618
635
  25% {
619
636
  transform: scale(1.1) rotate(-5deg);
620
637
  }
638
+
621
639
  75% {
622
640
  transform: scale(1.1) rotate(5deg);
623
641
  }
@@ -648,10 +666,12 @@ p.memori--login-drawer--inline-error {
648
666
  }
649
667
 
650
668
  @keyframes timerPulse {
669
+
651
670
  0%,
652
671
  100% {
653
672
  transform: scale(1);
654
673
  }
674
+
655
675
  50% {
656
676
  transform: scale(1.02);
657
677
  }
@@ -663,13 +683,16 @@ p.memori--login-drawer--inline-error {
663
683
  }
664
684
 
665
685
  @keyframes tick {
686
+
666
687
  0%,
667
688
  100% {
668
689
  transform: rotate(0deg);
669
690
  }
691
+
670
692
  25% {
671
693
  transform: rotate(-10deg);
672
694
  }
695
+
673
696
  75% {
674
697
  transform: rotate(10deg);
675
698
  }
@@ -721,6 +744,7 @@ p.memori--login-drawer--inline-error {
721
744
  opacity: 0;
722
745
  transform: translateY(-10px);
723
746
  }
747
+
724
748
  to {
725
749
  opacity: 1;
726
750
  transform: translateY(0);
@@ -733,10 +757,12 @@ p.memori--login-drawer--inline-error {
733
757
  }
734
758
 
735
759
  @keyframes warning {
760
+
736
761
  0%,
737
762
  100% {
738
763
  transform: scale(1);
739
764
  }
765
+
740
766
  50% {
741
767
  transform: scale(1.1);
742
768
  }
@@ -768,22 +794,27 @@ p.memori--login-drawer--inline-error {
768
794
  0% {
769
795
  transform: scale(1);
770
796
  }
797
+
771
798
  50% {
772
799
  transform: scale(1.05);
773
800
  }
801
+
774
802
  100% {
775
803
  transform: scale(1);
776
804
  }
777
805
  }
778
806
 
779
807
  @keyframes shake {
808
+
780
809
  0%,
781
810
  100% {
782
811
  transform: translateX(0);
783
812
  }
813
+
784
814
  25% {
785
815
  transform: translateX(-5px);
786
816
  }
817
+
787
818
  75% {
788
819
  transform: translateX(5px);
789
820
  }
@@ -844,7 +875,7 @@ p.memori--login-drawer--inline-error {
844
875
  max-width: 200px;
845
876
  }
846
877
 
847
- .memori--login-drawer--otp-label{
878
+ .memori--login-drawer--otp-label {
848
879
  min-width: auto;
849
880
  }
850
881
  }
@@ -1257,6 +1288,7 @@ p.memori--login-drawer--inline-error {
1257
1288
  width: 1.5rem;
1258
1289
  height: 1.5rem;
1259
1290
  }
1291
+
1260
1292
  /* .memori--login-drawer--stat-card:hover::before {
1261
1293
  transform: scaleX(1);
1262
1294
  } */
@@ -1372,7 +1404,7 @@ p.memori--login-drawer--inline-error {
1372
1404
  transform: translateY(-50%) rotate(180deg);
1373
1405
  }
1374
1406
 
1375
- .memori--login-drawer--account-form .memori--details > *:not(summary) {
1407
+ .memori--login-drawer--account-form .memori--details>*:not(summary) {
1376
1408
  padding: 1.5rem;
1377
1409
  }
1378
1410
 
@@ -1581,4 +1613,4 @@ p.memori--login-drawer--inline-error {
1581
1613
  animation-iteration-count: 1 !important;
1582
1614
  transition-duration: 0.01ms !important;
1583
1615
  }
1584
- }
1616
+ }
@@ -61,7 +61,6 @@ export const SignupWaitingForOtp = Template.bind({});
61
61
  SignupWaitingForOtp.args = {
62
62
  open: true,
63
63
  __TEST__signup: true,
64
- __TEST__waitingForOtp: true,
65
64
  };
66
65
 
67
66
  export const ChangePassword = Template.bind({});