@memori.ai/memori-react 1.2.0 → 2.0.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 (291) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +12 -2
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.d.ts +7 -0
  4. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +39 -0
  5. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -0
  6. package/dist/components/AgeVerificationModal/AgeVerificationModal.test.d.ts +1 -0
  7. package/dist/components/AgeVerificationModal/AgeVerificationModal.test.js +27 -0
  8. package/dist/components/AgeVerificationModal/AgeVerificationModal.test.js.map +1 -0
  9. package/dist/components/AttachmentLinkModal/AttachmentLinkModal.stories.d.ts +2 -2
  10. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.stories.d.ts +2 -2
  11. package/dist/components/Auth/Auth.stories.d.ts +5 -5
  12. package/dist/components/Avatar/Avatar.js +2 -2
  13. package/dist/components/Avatar/Avatar.js.map +1 -1
  14. package/dist/components/Avatar/Avatar.stories.d.ts +5 -5
  15. package/dist/components/AvatarView/AvatarView.stories.d.ts +10 -10
  16. package/dist/components/AvatarView/components/fullbodyAvatar.d.ts +2 -1
  17. package/dist/components/AvatarView/components/fullbodyAvatar.js +6 -3
  18. package/dist/components/AvatarView/components/fullbodyAvatar.js.map +1 -1
  19. package/dist/components/AvatarView/components/loader.js +3 -1
  20. package/dist/components/AvatarView/components/loader.js.map +1 -1
  21. package/dist/components/AvatarView/index.d.ts +2 -1
  22. package/dist/components/AvatarView/index.js +2 -2
  23. package/dist/components/AvatarView/index.js.map +1 -1
  24. package/dist/components/AvatarView/utils/useMouthSpeaking.js +3 -1
  25. package/dist/components/AvatarView/utils/useMouthSpeaking.js.map +1 -1
  26. package/dist/components/Blob/Blob.stories.d.ts +4 -4
  27. package/dist/components/BlockedMemoriBadge/BlockedMemoriBadge.stories.d.ts +5 -5
  28. package/dist/components/ChangeMode/ChangeMode.stories.d.ts +3 -3
  29. package/dist/components/Chat/Chat.stories.d.ts +12 -12
  30. package/dist/components/ChatBubble/ChatBubble.stories.d.ts +7 -7
  31. package/dist/components/ChatInputs/ChatInputs.js +2 -1
  32. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  33. package/dist/components/ChatInputs/ChatInputs.stories.d.ts +9 -9
  34. package/dist/components/ChatTextArea/ChatTextArea.stories.d.ts +4 -4
  35. package/dist/components/CustomGLBModelViewer/ModelViewer.stories.d.ts +2 -2
  36. package/dist/components/DateSelector/DateSelector.d.ts +9 -0
  37. package/dist/components/DateSelector/DateSelector.js +61 -0
  38. package/dist/components/DateSelector/DateSelector.js.map +1 -0
  39. package/dist/components/DateSelector/DateSelector.test.d.ts +1 -0
  40. package/dist/components/DateSelector/DateSelector.test.js +24 -0
  41. package/dist/components/DateSelector/DateSelector.test.js.map +1 -0
  42. package/dist/components/ExportHistoryButton/ExportHistoryButton.stories.d.ts +5 -5
  43. package/dist/components/FeedbackButtons/FeedbackButtons.stories.d.ts +4 -4
  44. package/dist/components/Header/Header.d.ts +1 -0
  45. package/dist/components/Header/Header.js +26 -2
  46. package/dist/components/Header/Header.js.map +1 -1
  47. package/dist/components/Header/Header.stories.d.ts +7 -7
  48. package/dist/components/ImageUpload/ImageUpload.stories.d.ts +8 -8
  49. package/dist/components/MediaWidget/LinkItemWidget.d.ts +2 -1
  50. package/dist/components/MediaWidget/LinkItemWidget.js +10 -2
  51. package/dist/components/MediaWidget/LinkItemWidget.js.map +1 -1
  52. package/dist/components/MediaWidget/LinkItemWidget.stories.d.ts +2 -2
  53. package/dist/components/MediaWidget/MediaItemWidget.d.ts +3 -1
  54. package/dist/components/MediaWidget/MediaItemWidget.js +44 -72
  55. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  56. package/dist/components/MediaWidget/MediaItemWidget.stories.d.ts +3 -3
  57. package/dist/components/MediaWidget/MediaWidget.js +10 -7
  58. package/dist/components/MediaWidget/MediaWidget.js.map +1 -1
  59. package/dist/components/MediaWidget/MediaWidget.stories.d.ts +5 -5
  60. package/dist/components/MemoriWidget/MemoriWidget.d.ts +3 -2
  61. package/dist/components/MemoriWidget/MemoriWidget.js +92 -25
  62. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  63. package/dist/components/MemoriWidget/MemoriWidget.stories.d.ts +8 -8
  64. package/dist/components/PoweredBy/PoweredBy.stories.d.ts +4 -4
  65. package/dist/components/SendOnEnterMenu/SendOnEnterMenu.stories.d.ts +3 -3
  66. package/dist/components/SettingsDrawer/SettingsDrawer.d.ts +13 -0
  67. package/dist/components/SettingsDrawer/SettingsDrawer.js +27 -0
  68. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -0
  69. package/dist/components/SettingsDrawer/SettingsDrawer.test.d.ts +1 -0
  70. package/dist/components/SettingsDrawer/SettingsDrawer.test.js +27 -0
  71. package/dist/components/SettingsDrawer/SettingsDrawer.test.js.map +1 -0
  72. package/dist/components/ShareButton/ShareButton.stories.d.ts +4 -4
  73. package/dist/components/Snippet/Snippet.stories.d.ts +15 -15
  74. package/dist/components/StartPanel/StartPanel.d.ts +1 -1
  75. package/dist/components/StartPanel/StartPanel.js +10 -7
  76. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  77. package/dist/components/StartPanel/StartPanel.stories.d.ts +6 -6
  78. package/dist/components/StartPanel/StartPanel.test.js +7 -0
  79. package/dist/components/StartPanel/StartPanel.test.js.map +1 -1
  80. package/dist/components/UploadMenu/UploadMenu.stories.d.ts +4 -4
  81. package/dist/components/icons/Refresh.d.ts +5 -0
  82. package/dist/components/icons/Refresh.js +6 -0
  83. package/dist/components/icons/Refresh.js.map +1 -0
  84. package/dist/components/icons/SelectIcon.d.ts +5 -0
  85. package/dist/components/icons/SelectIcon.js +6 -0
  86. package/dist/components/icons/SelectIcon.js.map +1 -0
  87. package/dist/components/icons/icons.stories.d.ts +2 -2
  88. package/dist/components/layouts/FullPage.d.ts +17 -0
  89. package/dist/components/layouts/FullPage.js +8 -0
  90. package/dist/components/layouts/FullPage.js.map +1 -0
  91. package/dist/components/layouts/FullPage.test.d.ts +1 -0
  92. package/dist/components/layouts/FullPage.test.js +12 -0
  93. package/dist/components/layouts/FullPage.test.js.map +1 -0
  94. package/dist/components/layouts/Totem.d.ts +17 -0
  95. package/dist/components/layouts/Totem.js +8 -0
  96. package/dist/components/layouts/Totem.js.map +1 -0
  97. package/dist/components/layouts/Totem.test.d.ts +1 -0
  98. package/dist/components/layouts/Totem.test.js +12 -0
  99. package/dist/components/layouts/Totem.test.js.map +1 -0
  100. package/dist/components/ui/Button.stories.d.ts +14 -14
  101. package/dist/components/ui/Card.stories.d.ts +7 -7
  102. package/dist/components/ui/Checkbox.d.ts +2 -0
  103. package/dist/components/ui/Checkbox.js +2 -2
  104. package/dist/components/ui/Checkbox.js.map +1 -1
  105. package/dist/components/ui/Checkbox.stories.d.ts +5 -5
  106. package/dist/components/ui/Drawer.stories.d.ts +9 -9
  107. package/dist/components/ui/Modal.stories.d.ts +9 -9
  108. package/dist/components/ui/Select.d.ts +15 -0
  109. package/dist/components/ui/Select.js +17 -0
  110. package/dist/components/ui/Select.js.map +1 -0
  111. package/dist/components/ui/Select.test.d.ts +1 -0
  112. package/dist/components/ui/Select.test.js +47 -0
  113. package/dist/components/ui/Select.test.js.map +1 -0
  114. package/dist/components/ui/Spin.stories.d.ts +4 -4
  115. package/dist/components/ui/Tooltip.stories.d.ts +6 -6
  116. package/dist/components/ui/definitions.stories.d.ts +2 -3
  117. package/dist/helpers/configuration.js +2 -0
  118. package/dist/helpers/configuration.js.map +1 -1
  119. package/dist/helpers/utils.js +1 -1
  120. package/dist/helpers/utils.js.map +1 -1
  121. package/dist/index.d.ts +2 -0
  122. package/dist/index.js +2 -2
  123. package/dist/index.js.map +1 -1
  124. package/dist/index.stories.d.ts +2 -2
  125. package/dist/locales/en.json +17 -0
  126. package/dist/locales/it.json +17 -0
  127. package/dist/mocks/data.js +5 -2
  128. package/dist/mocks/data.js.map +1 -1
  129. package/esm/components/AgeVerificationModal/AgeVerificationModal.d.ts +7 -0
  130. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +36 -0
  131. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -0
  132. package/esm/components/AgeVerificationModal/AgeVerificationModal.test.d.ts +1 -0
  133. package/esm/components/AgeVerificationModal/AgeVerificationModal.test.js +24 -0
  134. package/esm/components/AgeVerificationModal/AgeVerificationModal.test.js.map +1 -0
  135. package/esm/components/Avatar/Avatar.js +2 -2
  136. package/esm/components/Avatar/Avatar.js.map +1 -1
  137. package/esm/components/AvatarView/components/fullbodyAvatar.d.ts +2 -1
  138. package/esm/components/AvatarView/components/fullbodyAvatar.js +7 -4
  139. package/esm/components/AvatarView/components/fullbodyAvatar.js.map +1 -1
  140. package/esm/components/AvatarView/components/loader.js +2 -1
  141. package/esm/components/AvatarView/components/loader.js.map +1 -1
  142. package/esm/components/AvatarView/index.d.ts +2 -1
  143. package/esm/components/AvatarView/index.js +2 -2
  144. package/esm/components/AvatarView/index.js.map +1 -1
  145. package/esm/components/AvatarView/utils/useMouthSpeaking.js +3 -1
  146. package/esm/components/AvatarView/utils/useMouthSpeaking.js.map +1 -1
  147. package/esm/components/ChatInputs/ChatInputs.js +2 -1
  148. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  149. package/esm/components/DateSelector/DateSelector.d.ts +9 -0
  150. package/esm/components/DateSelector/DateSelector.js +58 -0
  151. package/esm/components/DateSelector/DateSelector.js.map +1 -0
  152. package/esm/components/DateSelector/DateSelector.test.d.ts +1 -0
  153. package/esm/components/DateSelector/DateSelector.test.js +21 -0
  154. package/esm/components/DateSelector/DateSelector.test.js.map +1 -0
  155. package/esm/components/Header/Header.d.ts +1 -0
  156. package/esm/components/Header/Header.js +26 -2
  157. package/esm/components/Header/Header.js.map +1 -1
  158. package/esm/components/MediaWidget/LinkItemWidget.d.ts +2 -1
  159. package/esm/components/MediaWidget/LinkItemWidget.js +10 -2
  160. package/esm/components/MediaWidget/LinkItemWidget.js.map +1 -1
  161. package/esm/components/MediaWidget/MediaItemWidget.d.ts +3 -1
  162. package/esm/components/MediaWidget/MediaItemWidget.js +44 -72
  163. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  164. package/esm/components/MediaWidget/MediaWidget.js +11 -8
  165. package/esm/components/MediaWidget/MediaWidget.js.map +1 -1
  166. package/esm/components/MemoriWidget/MemoriWidget.d.ts +3 -2
  167. package/esm/components/MemoriWidget/MemoriWidget.js +92 -25
  168. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  169. package/esm/components/SettingsDrawer/SettingsDrawer.d.ts +13 -0
  170. package/esm/components/SettingsDrawer/SettingsDrawer.js +24 -0
  171. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -0
  172. package/esm/components/SettingsDrawer/SettingsDrawer.test.d.ts +1 -0
  173. package/esm/components/SettingsDrawer/SettingsDrawer.test.js +24 -0
  174. package/esm/components/SettingsDrawer/SettingsDrawer.test.js.map +1 -0
  175. package/esm/components/StartPanel/StartPanel.d.ts +1 -1
  176. package/esm/components/StartPanel/StartPanel.js +10 -7
  177. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  178. package/esm/components/StartPanel/StartPanel.test.js +7 -0
  179. package/esm/components/StartPanel/StartPanel.test.js.map +1 -1
  180. package/esm/components/icons/Refresh.d.ts +5 -0
  181. package/esm/components/icons/Refresh.js +4 -0
  182. package/esm/components/icons/Refresh.js.map +1 -0
  183. package/esm/components/icons/SelectIcon.d.ts +5 -0
  184. package/esm/components/icons/SelectIcon.js +4 -0
  185. package/esm/components/icons/SelectIcon.js.map +1 -0
  186. package/esm/components/layouts/FullPage.d.ts +17 -0
  187. package/esm/components/layouts/FullPage.js +5 -0
  188. package/esm/components/layouts/FullPage.js.map +1 -0
  189. package/esm/components/layouts/FullPage.test.d.ts +1 -0
  190. package/esm/components/layouts/FullPage.test.js +9 -0
  191. package/esm/components/layouts/FullPage.test.js.map +1 -0
  192. package/esm/components/layouts/Totem.d.ts +17 -0
  193. package/esm/components/layouts/Totem.js +5 -0
  194. package/esm/components/layouts/Totem.js.map +1 -0
  195. package/esm/components/layouts/Totem.test.d.ts +1 -0
  196. package/esm/components/layouts/Totem.test.js +9 -0
  197. package/esm/components/layouts/Totem.test.js.map +1 -0
  198. package/esm/components/ui/Checkbox.d.ts +2 -0
  199. package/esm/components/ui/Checkbox.js +2 -2
  200. package/esm/components/ui/Checkbox.js.map +1 -1
  201. package/esm/components/ui/Select.d.ts +15 -0
  202. package/esm/components/ui/Select.js +14 -0
  203. package/esm/components/ui/Select.js.map +1 -0
  204. package/esm/components/ui/Select.test.d.ts +1 -0
  205. package/esm/components/ui/Select.test.js +44 -0
  206. package/esm/components/ui/Select.test.js.map +1 -0
  207. package/esm/helpers/configuration.js +2 -0
  208. package/esm/helpers/configuration.js.map +1 -1
  209. package/esm/helpers/utils.js +1 -1
  210. package/esm/helpers/utils.js.map +1 -1
  211. package/esm/index.d.ts +2 -0
  212. package/esm/index.js +2 -2
  213. package/esm/index.js.map +1 -1
  214. package/esm/locales/en.json +17 -0
  215. package/esm/locales/it.json +17 -0
  216. package/esm/mocks/data.js +5 -2
  217. package/esm/mocks/data.js.map +1 -1
  218. package/package.json +20 -16
  219. package/src/components/AgeVerificationModal/AgeVerificationModal.css +63 -0
  220. package/src/components/AgeVerificationModal/AgeVerificationModal.stories.tsx +41 -0
  221. package/src/components/AgeVerificationModal/AgeVerificationModal.test.tsx +33 -0
  222. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +89 -0
  223. package/src/components/AgeVerificationModal/__snapshots__/AgeVerificationModal.test.tsx.snap +19 -0
  224. package/src/components/Avatar/Avatar.stories.tsx +20 -1
  225. package/src/components/Avatar/Avatar.tsx +2 -1
  226. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +2 -2
  227. package/src/components/AvatarView/AvatarView.stories.tsx +31 -0
  228. package/src/components/AvatarView/components/fullbodyAvatar.tsx +8 -6
  229. package/src/components/AvatarView/components/loader.tsx +15 -12
  230. package/src/components/AvatarView/index.tsx +4 -1
  231. package/src/components/AvatarView/utils/useMouthSpeaking.ts +3 -1
  232. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +67 -67
  233. package/src/components/ChatBubble/ChatBubble.css +1 -2
  234. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +4 -4
  235. package/src/components/ChatInputs/ChatInputs.css +14 -3
  236. package/src/components/ChatInputs/ChatInputs.tsx +2 -0
  237. package/src/components/ChatInputs/__snapshots__/ChatInputs.test.tsx.snap +5 -5
  238. package/src/components/DateSelector/DateSelector.css +135 -0
  239. package/src/components/DateSelector/DateSelector.stories.tsx +34 -0
  240. package/src/components/DateSelector/DateSelector.test.tsx +38 -0
  241. package/src/components/DateSelector/DateSelector.tsx +203 -0
  242. package/src/components/DateSelector/__snapshots__/DateSelector.test.tsx.snap +14938 -0
  243. package/src/components/Header/Header.stories.tsx +23 -5
  244. package/src/components/Header/Header.tsx +47 -1
  245. package/src/components/MediaWidget/LinkItemWidget.tsx +20 -1
  246. package/src/components/MediaWidget/MediaItemWidget.css +67 -0
  247. package/src/components/MediaWidget/MediaItemWidget.tsx +72 -71
  248. package/src/components/MediaWidget/MediaWidget.css +9 -0
  249. package/src/components/MediaWidget/MediaWidget.stories.tsx +8 -0
  250. package/src/components/MediaWidget/MediaWidget.tsx +44 -27
  251. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +1 -1
  252. package/src/components/MemoriWidget/MemoriWidget.css +1 -1
  253. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +12 -0
  254. package/src/components/MemoriWidget/MemoriWidget.tsx +178 -33
  255. package/src/components/SettingsDrawer/SettingsDrawer.css +5 -0
  256. package/src/components/SettingsDrawer/SettingsDrawer.stories.tsx +57 -0
  257. package/src/components/SettingsDrawer/SettingsDrawer.test.tsx +61 -0
  258. package/src/components/SettingsDrawer/SettingsDrawer.tsx +108 -0
  259. package/src/components/SettingsDrawer/__snapshots__/SettingsDrawer.test.tsx.snap +19 -0
  260. package/src/components/StartPanel/StartPanel.css +8 -2
  261. package/src/components/StartPanel/StartPanel.stories.tsx +66 -2
  262. package/src/components/StartPanel/StartPanel.test.tsx +21 -0
  263. package/src/components/StartPanel/StartPanel.tsx +28 -23
  264. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +420 -67
  265. package/src/components/icons/Refresh.tsx +30 -0
  266. package/src/components/icons/SelectIcon.tsx +28 -0
  267. package/src/components/layouts/FullPage.test.tsx +17 -0
  268. package/src/components/layouts/{Default.tsx → FullPage.tsx} +2 -2
  269. package/src/components/layouts/Totem.test.tsx +17 -0
  270. package/src/components/layouts/Totem.tsx +52 -0
  271. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +391 -0
  272. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +422 -0
  273. package/src/components/layouts/layouts.stories.tsx +155 -0
  274. package/src/components/layouts/totem.css +148 -0
  275. package/src/components/ui/Button.css +4 -0
  276. package/src/components/ui/Checkbox.tsx +6 -0
  277. package/src/components/ui/Drawer.css +24 -2
  278. package/src/components/ui/Select.css +135 -0
  279. package/src/components/ui/Select.stories.tsx +79 -0
  280. package/src/components/ui/Select.test.tsx +84 -0
  281. package/src/components/ui/Select.tsx +73 -0
  282. package/src/components/ui/Spin.css +2 -0
  283. package/src/components/ui/__snapshots__/Select.test.tsx.snap +278 -0
  284. package/src/helpers/configuration.ts +4 -2
  285. package/src/helpers/utils.ts +3 -2
  286. package/src/index.stories.tsx +41 -1
  287. package/src/index.tsx +7 -2
  288. package/src/locales/en.json +17 -0
  289. package/src/locales/it.json +17 -0
  290. package/src/mocks/data.ts +5 -2
  291. package/src/styles.css +24 -2
@@ -89,7 +89,7 @@ exports[`renders ChatInputs disabled unchanged 1`] = `
89
89
  </span>
90
90
  </button>
91
91
  <button
92
- class="memori-button memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
92
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
93
93
  title="write_and_speak.micButtonPopover"
94
94
  >
95
95
  <span
@@ -199,7 +199,7 @@ exports[`renders ChatInputs listening unchanged 1`] = `
199
199
  </span>
200
200
  </button>
201
201
  <button
202
- class="memori-button memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic memori-chat-inputs--mic--listening"
202
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic memori-chat-inputs--mic--listening"
203
203
  title="write_and_speak.micButtonPopoverListening"
204
204
  >
205
205
  <span
@@ -338,7 +338,7 @@ exports[`renders ChatInputs on instruct unchanged 1`] = `
338
338
  </span>
339
339
  </button>
340
340
  <button
341
- class="memori-button memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
341
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
342
342
  title="write_and_speak.micButtonPopover"
343
343
  >
344
344
  <span
@@ -447,7 +447,7 @@ exports[`renders ChatInputs unchanged 1`] = `
447
447
  </span>
448
448
  </button>
449
449
  <button
450
- class="memori-button memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
450
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
451
451
  title="write_and_speak.micButtonPopover"
452
452
  >
453
453
  <span
@@ -557,7 +557,7 @@ exports[`renders ChatInputs with user message unchanged 1`] = `
557
557
  </span>
558
558
  </button>
559
559
  <button
560
- class="memori-button memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
560
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-chat-inputs--mic"
561
561
  title="write_and_speak.micButtonPopover"
562
562
  >
563
563
  <span
@@ -0,0 +1,135 @@
1
+ .memori--date-selector {
2
+ display: flex;
3
+ flex-wrap: nowrap;
4
+ }
5
+
6
+ .memori--date-selector__select {
7
+ width: 30%;
8
+ max-width: 100%;
9
+ margin: 1.5rem 1.5% 0;
10
+ }
11
+
12
+ .memori--date-selector__select-button {
13
+ position: relative;
14
+ width: 100%;
15
+ padding-top: .5rem;
16
+ padding-right: 2.5rem;
17
+ padding-bottom: .5rem;
18
+ padding-left: .75rem;
19
+ border: 1px solid #e5e7eb;
20
+ border-radius: .5rem;
21
+ background: #fff;
22
+ box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.1) 0px 2px 4px -2px;
23
+ cursor: pointer;
24
+ text-align: left;
25
+ }
26
+
27
+ .memori--date-selector__select-button:focus {
28
+ border-color: #cbd5e0;
29
+ box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5);
30
+ }
31
+
32
+ .memori--date-selector__select-button:focus-visible {
33
+ border-color: #63b3ed;
34
+ box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5);
35
+ }
36
+
37
+ .memori--date-selector__select-button:hover {
38
+ border-color: #e2e8f0;
39
+ }
40
+
41
+ .memori--date-selector__select-button:active {
42
+ border-color: #e2e8f0;
43
+ }
44
+
45
+ .memori--date-selector__select-button:disabled {
46
+ border-color: #e2e8f0;
47
+ background-color: #f7fafc;
48
+ color: #a0aec0;
49
+ cursor: not-allowed;
50
+ }
51
+
52
+ @media (min-width: 640px) {
53
+ .memori--date-selector__select-button {
54
+ font-size: .875rem;
55
+ line-height: 1.25rem;
56
+ }
57
+ }
58
+
59
+ .memori--date-selector__select-label {
60
+ display: inline-block;
61
+ margin-bottom: 0.25rem;
62
+ }
63
+
64
+ .memori--date-selector__select--value {
65
+ display: block;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
69
+ }
70
+
71
+ .memori--date-selector__select--icon {
72
+ position: absolute;
73
+ top: 0;
74
+ right: 0;
75
+ bottom: 0;
76
+ display: flex;
77
+ align-items: center;
78
+ padding-right: .5rem;
79
+ pointer-events: none;
80
+ }
81
+
82
+ .memori--date-selector__select--icon svg {
83
+ width: 1.25rem;
84
+ height: 1.25rem;
85
+ color: rgb(156 163 175/1);
86
+ }
87
+
88
+ ul.memori--date-selector__select-options {
89
+ position: absolute;
90
+ z-index: 1;
91
+ overflow: auto;
92
+ width: 100%;
93
+ max-width: min(18rem, 30%);
94
+ max-height: 15rem;
95
+ padding-top: .25rem;
96
+ padding-right: 0;
97
+ padding-bottom: .25rem;
98
+ padding-left: 0;
99
+ border-radius: .375rem;
100
+ margin-top: .25rem;
101
+ margin-right: 0;
102
+ margin-bottom: 0;
103
+ margin-left: 0;
104
+ background: #fff;
105
+ box-shadow: rgb(255, 255, 255) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.1) 0px 4px 6px -4px;
106
+ list-style: none;
107
+ }
108
+
109
+ @media (min-width: 640px) {
110
+ .memori--date-selector__select-options {
111
+ font-size: .875rem;
112
+ line-height: 1.25rem;
113
+ }
114
+ }
115
+
116
+ li.memori--date-selector__select-option {
117
+ position: relative;
118
+ padding-top: .5rem;
119
+ padding-right: 1rem;
120
+ padding-bottom: .5rem;
121
+ padding-left: 1rem;
122
+ color: rgb(17 24 39/1);
123
+ cursor: pointer;
124
+ user-select: none;
125
+ }
126
+
127
+ li.memori--date-selector__select-option:hover,
128
+ li.memori--date-selector__select-option:focus {
129
+ background-color: #f7fafc;
130
+ }
131
+
132
+ li.memori--date-selector__select-option:focus {
133
+ outline: 2px solid #63b3ed;
134
+ outline-offset: 2px;
135
+ }
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import { Meta, Story } from '@storybook/react';
3
+ import DateSelector, { Props } from './DateSelector';
4
+
5
+ import './DateSelector.css';
6
+
7
+ const meta: Meta = {
8
+ title: 'DateSelector',
9
+ component: DateSelector,
10
+ parameters: {
11
+ controls: { expanded: true },
12
+ layout: 'fullscreen',
13
+ },
14
+ };
15
+
16
+ export default meta;
17
+
18
+ const Template: Story<Props> = args => <DateSelector {...args} />;
19
+
20
+ // By passing using the Args format for exported stories, you can control the props for a component for reuse in a test
21
+ // https://storybook.js.org/docs/react/workflows/unit-testing
22
+ export const Default = Template.bind({});
23
+ Default.args = {
24
+ defaultDate: new Date(Date.now()),
25
+ onChange: () => {},
26
+ disabled: false,
27
+ };
28
+
29
+ export const Disabled = Template.bind({});
30
+ Disabled.args = {
31
+ defaultDate: new Date(Date.now()),
32
+ onChange: () => {},
33
+ disabled: false,
34
+ };
@@ -0,0 +1,38 @@
1
+ import { render } from '@testing-library/react';
2
+ import DateSelector from './DateSelector';
3
+ import moment from 'moment';
4
+
5
+ const dateMock = new Date(Date.UTC(2022, 8, 24, 0, 0, 0, 0));
6
+
7
+ jest.setSystemTime(dateMock);
8
+ Date.now = jest.fn(() => dateMock.valueOf());
9
+
10
+ jest.spyOn(Date, 'now').mockImplementation(() => dateMock.valueOf());
11
+
12
+ it('renders DateSelector unchanged', () => {
13
+ const { container } = render(
14
+ <DateSelector defaultDate={new Date(Date.now())} onChange={jest.fn()} />
15
+ );
16
+ expect(container).toMatchSnapshot();
17
+ });
18
+
19
+ it('renders DateSelector with default value unchanged', () => {
20
+ const { container } = render(
21
+ <DateSelector
22
+ defaultDate={moment(`2022-08-24 00:00:00Z`)}
23
+ onChange={jest.fn()}
24
+ />
25
+ );
26
+ expect(container).toMatchSnapshot();
27
+ });
28
+
29
+ it('renders DateSelector disabled unchanged', () => {
30
+ const { container } = render(
31
+ <DateSelector
32
+ disabled
33
+ defaultDate={moment(`2022-08-24 00:00:00Z`)}
34
+ onChange={jest.fn()}
35
+ />
36
+ );
37
+ expect(container).toMatchSnapshot();
38
+ });
@@ -0,0 +1,203 @@
1
+ import { useEffect, useState, memo, Fragment } from 'react';
2
+ import { Listbox, Transition } from '@headlessui/react';
3
+ import moment from 'moment';
4
+ import { useTranslation } from 'react-i18next';
5
+ import SelectIcon from '../icons/SelectIcon';
6
+
7
+ export interface Props {
8
+ defaultDate?: moment.Moment | string | Date;
9
+ disabled?: boolean;
10
+ onChange: (date: moment.Moment) => void;
11
+ }
12
+
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
+ const DateSelector = memo(
45
+ ({ defaultDate, onChange, disabled = false }: Props) => {
46
+ const { t, i18n } = useTranslation();
47
+
48
+ const [date, setDate] = useState(moment(defaultDate || Date.now()));
49
+ useEffect(() => {
50
+ onChange(date);
51
+ }, [date, onChange]);
52
+
53
+ moment.locale(i18n.language);
54
+
55
+ return (
56
+ <div className="memori--date-selector">
57
+ <div className="memori--date-selector__select">
58
+ <Listbox
59
+ value={date}
60
+ onChange={value => {
61
+ setDate(value);
62
+ }}
63
+ disabled={disabled}
64
+ name="day"
65
+ >
66
+ <Listbox.Label className="memori--date-selector__select-label">
67
+ {t('day')}:
68
+ </Listbox.Label>
69
+ <Listbox.Button
70
+ aria-label={t('day')}
71
+ className="memori--date-selector__select-button"
72
+ >
73
+ <span className="memori--date-selector__select--value">
74
+ {date.date()}
75
+ </span>
76
+ <span className="memori--date-selector__select--icon">
77
+ <SelectIcon />
78
+ </span>
79
+ </Listbox.Button>
80
+ <Transition
81
+ as={Fragment}
82
+ leave="transition ease-in duration-100"
83
+ leaveFrom="opacity-100"
84
+ leaveTo="opacity-0"
85
+ >
86
+ <Listbox.Options className="memori--date-selector__select-options">
87
+ {[...Array(31).keys()].map(day => (
88
+ <Listbox.Option
89
+ key={day}
90
+ value={date.clone().date(day + 1)}
91
+ className="memori--date-selector__select-option"
92
+ >
93
+ {day + 1}
94
+ </Listbox.Option>
95
+ ))}
96
+ </Listbox.Options>
97
+ </Transition>
98
+ </Listbox>
99
+ </div>
100
+
101
+ <div className="memori--date-selector__select">
102
+ <Listbox
103
+ value={date}
104
+ onChange={value => {
105
+ setDate(value);
106
+ }}
107
+ disabled={disabled}
108
+ name="month"
109
+ >
110
+ <Listbox.Label className="memori--date-selector__select-label">
111
+ {t('month')}:
112
+ </Listbox.Label>
113
+ <Listbox.Button
114
+ aria-label={t('month')}
115
+ className="memori--date-selector__select-button"
116
+ >
117
+ <span className="memori--date-selector__select--value">
118
+ {months[i18n.language === 'it' ? 'it' : 'en'][date.month()]}
119
+ </span>
120
+ <span className="memori--date-selector__select--icon">
121
+ <SelectIcon />
122
+ </span>
123
+ </Listbox.Button>
124
+ <Transition
125
+ as={Fragment}
126
+ leave="transition ease-in duration-100"
127
+ leaveFrom="opacity-100"
128
+ leaveTo="opacity-0"
129
+ >
130
+ <Listbox.Options className="memori--date-selector__select-options">
131
+ {months[i18n.language === 'it' ? 'it' : 'en'].map(month => (
132
+ <Listbox.Option
133
+ key={month}
134
+ className="memori--date-selector__select-option"
135
+ value={date
136
+ .clone()
137
+ .month(
138
+ months[i18n.language === 'it' ? 'it' : 'en'].findIndex(
139
+ m => m === month
140
+ )
141
+ )}
142
+ >
143
+ {month}
144
+ </Listbox.Option>
145
+ ))}
146
+ </Listbox.Options>
147
+ </Transition>
148
+ </Listbox>
149
+ </div>
150
+
151
+ <div className="memori--date-selector__select">
152
+ <Listbox
153
+ value={date}
154
+ onChange={value => {
155
+ setDate(value);
156
+ }}
157
+ disabled={disabled}
158
+ name="year"
159
+ >
160
+ <Listbox.Label className="memori--date-selector__select-label">
161
+ {t('year')}:
162
+ </Listbox.Label>
163
+ <Listbox.Button
164
+ aria-label={t('year')}
165
+ className="memori--date-selector__select-button"
166
+ >
167
+ <span className="memori--date-selector__select--value">
168
+ {date.year()}
169
+ </span>
170
+ <span className="memori--date-selector__select--icon">
171
+ <SelectIcon />
172
+ </span>
173
+ </Listbox.Button>
174
+ <Transition
175
+ as={Fragment}
176
+ leave="transition ease-in duration-100"
177
+ leaveFrom="opacity-100"
178
+ leaveTo="opacity-0"
179
+ >
180
+ <Listbox.Options className="memori--date-selector__select-options">
181
+ {[...Array(moment().year() - 1899).keys()]
182
+ .sort((a, b) => b - a)
183
+ .map(year => (
184
+ <Listbox.Option
185
+ key={year}
186
+ value={date.clone().year(year + 1900)}
187
+ className="memori--date-selector__select-option"
188
+ >
189
+ {year + 1900}
190
+ </Listbox.Option>
191
+ ))}
192
+ </Listbox.Options>
193
+ </Transition>
194
+ </Listbox>
195
+ </div>
196
+ </div>
197
+ );
198
+ }
199
+ );
200
+
201
+ DateSelector.displayName = 'DateSelector';
202
+
203
+ export default DateSelector;