@toptal/picasso-lab 9.1.1-alpha-sat-750--poc-picasso-with-ssr.2531 → 9.3.1

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 (374) hide show
  1. package/CHANGELOG.md +1385 -0
  2. package/{Calendar → dist-package/Calendar}/Calendar.d.ts +0 -0
  3. package/{Calendar → dist-package/Calendar}/Calendar.js +0 -0
  4. package/{Calendar → dist-package/Calendar}/Calendar.js.map +0 -0
  5. package/{Calendar → dist-package/Calendar}/index.d.ts +0 -0
  6. package/{Calendar → dist-package/Calendar}/index.js +0 -0
  7. package/{Calendar → dist-package/Calendar}/index.js.map +0 -0
  8. package/{Calendar → dist-package/Calendar}/styles.d.ts +0 -0
  9. package/{Calendar → dist-package/Calendar}/styles.js +0 -0
  10. package/{Calendar → dist-package/Calendar}/styles.js.map +0 -0
  11. package/{Calendar → dist-package/Calendar}/types.d.ts +0 -0
  12. package/{Calendar → dist-package/Calendar}/types.js +0 -0
  13. package/{Calendar → dist-package/Calendar}/types.js.map +0 -0
  14. package/{DatePicker → dist-package/DatePicker}/DatePicker.d.ts +9 -9
  15. package/{DatePicker → dist-package/DatePicker}/DatePicker.js +24 -14
  16. package/dist-package/DatePicker/DatePicker.js.map +1 -0
  17. package/dist-package/DatePicker/constants.d.ts +2 -0
  18. package/dist-package/DatePicker/constants.js +3 -0
  19. package/dist-package/DatePicker/constants.js.map +1 -0
  20. package/dist-package/DatePicker/index.d.ts +5 -0
  21. package/dist-package/DatePicker/index.js +4 -0
  22. package/{DatePicker → dist-package/DatePicker}/index.js.map +1 -1
  23. package/{DatePicker → dist-package/DatePicker}/styles.d.ts +0 -0
  24. package/{DatePicker → dist-package/DatePicker}/styles.js +0 -0
  25. package/{DatePicker → dist-package/DatePicker}/styles.js.map +0 -0
  26. package/dist-package/DatePicker/types.d.ts +8 -0
  27. package/dist-package/DatePicker/types.js +2 -0
  28. package/dist-package/DatePicker/types.js.map +1 -0
  29. package/{DatePicker → dist-package/DatePicker}/utils.d.ts +3 -0
  30. package/{DatePicker → dist-package/DatePicker}/utils.js +12 -0
  31. package/{DatePicker → dist-package/DatePicker}/utils.js.map +1 -1
  32. package/{Drawer → dist-package/Drawer}/Drawer.d.ts +0 -0
  33. package/{Drawer → dist-package/Drawer}/Drawer.js +0 -0
  34. package/{Drawer → dist-package/Drawer}/Drawer.js.map +0 -0
  35. package/{Drawer → dist-package/Drawer}/index.d.ts +0 -0
  36. package/{Drawer → dist-package/Drawer}/index.js +0 -0
  37. package/{Drawer → dist-package/Drawer}/index.js.map +0 -0
  38. package/{Drawer → dist-package/Drawer}/styles.d.ts +0 -0
  39. package/{Drawer → dist-package/Drawer}/styles.js +0 -0
  40. package/{Drawer → dist-package/Drawer}/styles.js.map +0 -0
  41. package/{DrawerTitle → dist-package/DrawerTitle}/DrawerTitle.d.ts +0 -0
  42. package/{DrawerTitle → dist-package/DrawerTitle}/DrawerTitle.js +0 -0
  43. package/{DrawerTitle → dist-package/DrawerTitle}/DrawerTitle.js.map +0 -0
  44. package/{DrawerTitle → dist-package/DrawerTitle}/index.d.ts +0 -0
  45. package/{DrawerTitle → dist-package/DrawerTitle}/index.js +0 -0
  46. package/{DrawerTitle → dist-package/DrawerTitle}/index.js.map +0 -0
  47. package/{DrawerTitle → dist-package/DrawerTitle}/styles.d.ts +0 -0
  48. package/{DrawerTitle → dist-package/DrawerTitle}/styles.js +0 -0
  49. package/{DrawerTitle → dist-package/DrawerTitle}/styles.js.map +0 -0
  50. package/{Dropzone → dist-package/Dropzone}/Dropzone.d.ts +0 -0
  51. package/{Dropzone → dist-package/Dropzone}/Dropzone.js +1 -1
  52. package/{Dropzone → dist-package/Dropzone}/Dropzone.js.map +1 -1
  53. package/{Dropzone → dist-package/Dropzone}/index.d.ts +0 -0
  54. package/{Dropzone → dist-package/Dropzone}/index.js +0 -0
  55. package/{Dropzone → dist-package/Dropzone}/index.js.map +0 -0
  56. package/{Dropzone → dist-package/Dropzone}/styles.d.ts +1 -1
  57. package/{Dropzone → dist-package/Dropzone}/styles.js +0 -0
  58. package/{Dropzone → dist-package/Dropzone}/styles.js.map +0 -0
  59. package/{Dropzone → dist-package/Dropzone}/types.d.ts +0 -0
  60. package/{Dropzone → dist-package/Dropzone}/types.js +0 -0
  61. package/{Dropzone → dist-package/Dropzone}/types.js.map +0 -0
  62. package/{EmptyState → dist-package/EmptyState}/EmptyState.d.ts +0 -0
  63. package/{EmptyState → dist-package/EmptyState}/EmptyState.js +0 -0
  64. package/{EmptyState → dist-package/EmptyState}/EmptyState.js.map +0 -0
  65. package/{EmptyState → dist-package/EmptyState}/index.d.ts +0 -0
  66. package/{EmptyState → dist-package/EmptyState}/index.js +0 -0
  67. package/{EmptyState → dist-package/EmptyState}/index.js.map +0 -0
  68. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/EmptyStateCollection.d.ts +0 -0
  69. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/EmptyStateCollection.js +0 -0
  70. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/EmptyStateCollection.js.map +0 -0
  71. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/index.d.ts +0 -0
  72. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/index.js +0 -0
  73. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/index.js.map +0 -0
  74. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/styles.d.ts +0 -0
  75. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/styles.js +0 -0
  76. package/{EmptyStateCollection → dist-package/EmptyStateCollection}/styles.js.map +0 -0
  77. package/{EmptyStatePage → dist-package/EmptyStatePage}/EmptyStatePage.d.ts +0 -0
  78. package/{EmptyStatePage → dist-package/EmptyStatePage}/EmptyStatePage.js +0 -0
  79. package/{EmptyStatePage → dist-package/EmptyStatePage}/EmptyStatePage.js.map +0 -0
  80. package/{EmptyStatePage → dist-package/EmptyStatePage}/index.d.ts +0 -0
  81. package/{EmptyStatePage → dist-package/EmptyStatePage}/index.js +0 -0
  82. package/{EmptyStatePage → dist-package/EmptyStatePage}/index.js.map +0 -0
  83. package/{EmptyStatePage → dist-package/EmptyStatePage}/styles.d.ts +0 -0
  84. package/{EmptyStatePage → dist-package/EmptyStatePage}/styles.js +0 -0
  85. package/{EmptyStatePage → dist-package/EmptyStatePage}/styles.js.map +0 -0
  86. package/{Note → dist-package/Note}/Note.d.ts +0 -0
  87. package/{Note → dist-package/Note}/Note.js +0 -0
  88. package/{Note → dist-package/Note}/Note.js.map +0 -0
  89. package/{Note → dist-package/Note}/index.d.ts +0 -0
  90. package/{Note → dist-package/Note}/index.js +0 -0
  91. package/{Note → dist-package/Note}/index.js.map +0 -0
  92. package/{Note → dist-package/Note}/styles.d.ts +0 -0
  93. package/{Note → dist-package/Note}/styles.js +0 -0
  94. package/{Note → dist-package/Note}/styles.js.map +0 -0
  95. package/{NoteContent → dist-package/NoteContent}/NoteContent.d.ts +0 -0
  96. package/{NoteContent → dist-package/NoteContent}/NoteContent.js +0 -0
  97. package/{NoteContent → dist-package/NoteContent}/NoteContent.js.map +0 -0
  98. package/{NoteContent → dist-package/NoteContent}/index.d.ts +0 -0
  99. package/{NoteContent → dist-package/NoteContent}/index.js +0 -0
  100. package/{NoteContent → dist-package/NoteContent}/index.js.map +0 -0
  101. package/{NoteSubtitle → dist-package/NoteSubtitle}/NoteSubtitle.d.ts +0 -0
  102. package/{NoteSubtitle → dist-package/NoteSubtitle}/NoteSubtitle.js +0 -0
  103. package/{NoteSubtitle → dist-package/NoteSubtitle}/NoteSubtitle.js.map +0 -0
  104. package/{NoteSubtitle → dist-package/NoteSubtitle}/index.d.ts +0 -0
  105. package/{NoteSubtitle → dist-package/NoteSubtitle}/index.js +0 -0
  106. package/{NoteSubtitle → dist-package/NoteSubtitle}/index.js.map +0 -0
  107. package/{NoteTitle → dist-package/NoteTitle}/NoteTitle.d.ts +0 -0
  108. package/{NoteTitle → dist-package/NoteTitle}/NoteTitle.js +0 -0
  109. package/{NoteTitle → dist-package/NoteTitle}/NoteTitle.js.map +0 -0
  110. package/{NoteTitle → dist-package/NoteTitle}/index.d.ts +0 -0
  111. package/{NoteTitle → dist-package/NoteTitle}/index.js +0 -0
  112. package/{NoteTitle → dist-package/NoteTitle}/index.js.map +0 -0
  113. package/{NoteTitle → dist-package/NoteTitle}/styles.d.ts +0 -0
  114. package/{NoteTitle → dist-package/NoteTitle}/styles.js +0 -0
  115. package/{NoteTitle → dist-package/NoteTitle}/styles.js.map +0 -0
  116. package/{OverviewBlock → dist-package/OverviewBlock}/OverviewBlock.d.ts +0 -0
  117. package/{OverviewBlock → dist-package/OverviewBlock}/OverviewBlock.js +0 -0
  118. package/{OverviewBlock → dist-package/OverviewBlock}/OverviewBlock.js.map +0 -0
  119. package/{OverviewBlock → dist-package/OverviewBlock}/index.d.ts +0 -0
  120. package/{OverviewBlock → dist-package/OverviewBlock}/index.js +0 -0
  121. package/{OverviewBlock → dist-package/OverviewBlock}/index.js.map +0 -0
  122. package/{OverviewBlock → dist-package/OverviewBlock}/styles.d.ts +0 -0
  123. package/{OverviewBlock → dist-package/OverviewBlock}/styles.js +0 -0
  124. package/{OverviewBlock → dist-package/OverviewBlock}/styles.js.map +0 -0
  125. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/OverviewBlockGroup.d.ts +0 -0
  126. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/OverviewBlockGroup.js +0 -0
  127. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/OverviewBlockGroup.js.map +0 -0
  128. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/OverviewBlockGroupContext.d.ts +0 -0
  129. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/OverviewBlockGroupContext.js +0 -0
  130. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/OverviewBlockGroupContext.js.map +0 -0
  131. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/index.d.ts +0 -0
  132. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/index.js +0 -0
  133. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/index.js.map +0 -0
  134. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/settings.d.ts +0 -0
  135. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/settings.js +0 -0
  136. package/{OverviewBlockGroup → dist-package/OverviewBlockGroup}/settings.js.map +0 -0
  137. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/OverviewBlockRow.d.ts +0 -0
  138. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/OverviewBlockRow.js +0 -0
  139. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/OverviewBlockRow.js.map +0 -0
  140. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/index.d.ts +0 -0
  141. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/index.js +0 -0
  142. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/index.js.map +0 -0
  143. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/styles.d.ts +0 -0
  144. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/styles.js +0 -0
  145. package/{OverviewBlockRow → dist-package/OverviewBlockRow}/styles.js.map +0 -0
  146. package/dist-package/README.md +26 -0
  147. package/{Section → dist-package/Section}/Section.d.ts +1 -1
  148. package/{Section → dist-package/Section}/Section.js +6 -5
  149. package/dist-package/Section/Section.js.map +1 -0
  150. package/{Section → dist-package/Section}/index.d.ts +0 -0
  151. package/{Section → dist-package/Section}/index.js +0 -0
  152. package/{Section → dist-package/Section}/index.js.map +0 -0
  153. package/dist-package/Section/styles.d.ts +3 -0
  154. package/dist-package/Section/styles.js +60 -0
  155. package/dist-package/Section/styles.js.map +1 -0
  156. package/{Timeline → dist-package/Timeline}/Timeline.d.ts +0 -0
  157. package/{Timeline → dist-package/Timeline}/Timeline.js +0 -0
  158. package/{Timeline → dist-package/Timeline}/Timeline.js.map +0 -0
  159. package/{Timeline → dist-package/Timeline}/index.d.ts +0 -0
  160. package/{Timeline → dist-package/Timeline}/index.js +0 -0
  161. package/{Timeline → dist-package/Timeline}/index.js.map +0 -0
  162. package/{TimelineRow → dist-package/TimelineRow}/TimelineRow.d.ts +0 -0
  163. package/{TimelineRow → dist-package/TimelineRow}/TimelineRow.js +0 -0
  164. package/{TimelineRow → dist-package/TimelineRow}/TimelineRow.js.map +0 -0
  165. package/{TimelineRow → dist-package/TimelineRow}/index.d.ts +0 -0
  166. package/{TimelineRow → dist-package/TimelineRow}/index.js +0 -0
  167. package/{TimelineRow → dist-package/TimelineRow}/index.js.map +0 -0
  168. package/{TimelineRow → dist-package/TimelineRow}/styles.d.ts +0 -0
  169. package/{TimelineRow → dist-package/TimelineRow}/styles.js +0 -0
  170. package/{TimelineRow → dist-package/TimelineRow}/styles.js.map +0 -0
  171. package/{TypographyOverflow → dist-package/TypographyOverflow}/TypographyOverflow.d.ts +0 -0
  172. package/{TypographyOverflow → dist-package/TypographyOverflow}/TypographyOverflow.js +0 -0
  173. package/{TypographyOverflow → dist-package/TypographyOverflow}/TypographyOverflow.js.map +0 -0
  174. package/{TypographyOverflow → dist-package/TypographyOverflow}/index.d.ts +0 -0
  175. package/{TypographyOverflow → dist-package/TypographyOverflow}/index.js +0 -0
  176. package/{TypographyOverflow → dist-package/TypographyOverflow}/index.js.map +0 -0
  177. package/{TypographyOverflow → dist-package/TypographyOverflow}/styles.d.ts +0 -0
  178. package/{TypographyOverflow → dist-package/TypographyOverflow}/styles.js +0 -0
  179. package/{TypographyOverflow → dist-package/TypographyOverflow}/styles.js.map +0 -0
  180. package/{index.d.ts → dist-package/index.d.ts} +2 -2
  181. package/{index.js → dist-package/index.js} +1 -1
  182. package/dist-package/index.js.map +1 -0
  183. package/dist-package/package.json +53 -0
  184. package/package.json +4 -5
  185. package/src/Calendar/Calendar.tsx +215 -0
  186. package/src/Calendar/__snapshots__/test.tsx.snap +447 -0
  187. package/src/Calendar/index.ts +2 -0
  188. package/src/Calendar/styles.ts +104 -0
  189. package/src/Calendar/test.tsx +20 -0
  190. package/src/Calendar/types.ts +42 -0
  191. package/src/DatePicker/DatePicker.tsx +366 -0
  192. package/src/DatePicker/__image_snapshots__/datepicker-full-width-snap.png +0 -0
  193. package/src/DatePicker/__image_snapshots__/datepicker-with-custom-day-rendering-snap.png +0 -0
  194. package/src/DatePicker/__snapshots__/test.tsx.snap +51 -0
  195. package/src/DatePicker/constants.ts +2 -0
  196. package/src/DatePicker/index.ts +5 -0
  197. package/src/DatePicker/story/AllowCustomValue.example.tsx +33 -0
  198. package/src/DatePicker/story/Autocomplete.example.tsx +47 -0
  199. package/src/DatePicker/story/Default.example.tsx +19 -0
  200. package/src/DatePicker/story/Error.example.tsx +26 -0
  201. package/src/DatePicker/story/Range.example.tsx +22 -0
  202. package/src/DatePicker/story/WithCustomDayRendering.example.tsx +47 -0
  203. package/src/DatePicker/story/WithInitialValue.example.tsx +19 -0
  204. package/src/DatePicker/story/WithInputProps.example.tsx +24 -0
  205. package/src/DatePicker/story/WithNoHideOnSelect.example.tsx +20 -0
  206. package/src/DatePicker/story/WithOnBlurHandler.example.tsx +22 -0
  207. package/src/DatePicker/story/WithSelectionLimits.example.tsx +32 -0
  208. package/src/DatePicker/story/WithTimezone.example.tsx +25 -0
  209. package/src/DatePicker/story/index.jsx +50 -0
  210. package/src/DatePicker/styles.ts +8 -0
  211. package/src/DatePicker/test.tsx +370 -0
  212. package/src/DatePicker/types.ts +13 -0
  213. package/src/DatePicker/utils.ts +123 -0
  214. package/src/Drawer/Drawer.tsx +105 -0
  215. package/src/Drawer/__image_snapshots__/drawer-custom-title-effect-1-snap.png +0 -0
  216. package/src/Drawer/__image_snapshots__/drawer-custom-title-snap.png +0 -0
  217. package/src/Drawer/__image_snapshots__/drawer-default-effect-1-snap.png +0 -0
  218. package/src/Drawer/__image_snapshots__/drawer-default-snap.png +0 -0
  219. package/src/Drawer/__image_snapshots__/drawer-width-effect-1-snap.png +0 -0
  220. package/src/Drawer/__image_snapshots__/drawer-width-effect-2-snap.png +0 -0
  221. package/src/Drawer/__image_snapshots__/drawer-width-effect-3-snap.png +0 -0
  222. package/src/Drawer/__image_snapshots__/drawer-width-effect-4-snap.png +0 -0
  223. package/src/Drawer/__image_snapshots__/drawer-width-effect-5-snap.png +0 -0
  224. package/src/Drawer/__image_snapshots__/drawer-width-snap.png +0 -0
  225. package/src/Drawer/__image_snapshots__/drawer-without-title-effect-1-snap.png +0 -0
  226. package/src/Drawer/__image_snapshots__/drawer-without-title-snap.png +0 -0
  227. package/src/Drawer/index.ts +6 -0
  228. package/src/Drawer/story/CustomTitle.example.tsx +32 -0
  229. package/src/Drawer/story/Default.example.tsx +29 -0
  230. package/src/Drawer/story/DrawerAndNotification.example.tsx +34 -0
  231. package/src/Drawer/story/Widths.example.tsx +46 -0
  232. package/src/Drawer/story/WithoutTitle.example.tsx +22 -0
  233. package/src/Drawer/story/index.jsx +80 -0
  234. package/src/Drawer/styles.ts +42 -0
  235. package/src/DrawerTitle/DrawerTitle.tsx +35 -0
  236. package/src/DrawerTitle/index.ts +1 -0
  237. package/src/DrawerTitle/styles.ts +12 -0
  238. package/src/Dropzone/Dropzone.tsx +146 -0
  239. package/src/Dropzone/__snapshots__/test.tsx.snap +40 -0
  240. package/src/Dropzone/index.ts +7 -0
  241. package/src/Dropzone/story/Default.example.tsx +8 -0
  242. package/src/Dropzone/story/Disabled.example.tsx +25 -0
  243. package/src/Dropzone/story/Error.example.tsx +16 -0
  244. package/src/Dropzone/story/Multiple.example.tsx +30 -0
  245. package/src/Dropzone/story/Uploader.example.tsx +116 -0
  246. package/src/Dropzone/story/Uploading.example.tsx +16 -0
  247. package/src/Dropzone/story/index.jsx +85 -0
  248. package/src/Dropzone/styles.ts +43 -0
  249. package/src/Dropzone/test.tsx +33 -0
  250. package/src/Dropzone/types.ts +56 -0
  251. package/src/EmptyState/EmptyState.tsx +7 -0
  252. package/src/EmptyState/index.tsx +1 -0
  253. package/src/EmptyState/story/index.jsx +13 -0
  254. package/src/EmptyStateCollection/EmptyStateCollection.tsx +56 -0
  255. package/src/EmptyStateCollection/__image_snapshots__/emptystate-collection-emptystatecollection-snap.png +0 -0
  256. package/src/EmptyStateCollection/index.tsx +1 -0
  257. package/src/EmptyStateCollection/story/Default.example.tsx +11 -0
  258. package/src/EmptyStateCollection/story/index.jsx +20 -0
  259. package/src/EmptyStateCollection/styles.ts +10 -0
  260. package/src/EmptyStatePage/EmptyStatePage.tsx +65 -0
  261. package/src/EmptyStatePage/__image_snapshots__/emptystate-page-emptystatepage-snap.png +0 -0
  262. package/src/EmptyStatePage/index.tsx +1 -0
  263. package/src/EmptyStatePage/story/Default.example.tsx +21 -0
  264. package/src/EmptyStatePage/story/index.jsx +21 -0
  265. package/src/EmptyStatePage/styles.ts +9 -0
  266. package/src/Note/Note.tsx +36 -0
  267. package/src/Note/__snapshots__/test.tsx.snap +37 -0
  268. package/src/Note/index.ts +6 -0
  269. package/src/Note/story/Default.example.tsx +14 -0
  270. package/src/Note/story/index.jsx +23 -0
  271. package/src/Note/styles.ts +27 -0
  272. package/src/Note/test.tsx +22 -0
  273. package/src/NoteContent/NoteContent.tsx +23 -0
  274. package/src/NoteContent/index.ts +1 -0
  275. package/src/NoteContent/story/index.jsx +12 -0
  276. package/src/NoteSubtitle/NoteSubtitle.tsx +25 -0
  277. package/src/NoteSubtitle/index.ts +1 -0
  278. package/src/NoteSubtitle/story/index.jsx +12 -0
  279. package/src/NoteTitle/NoteTitle.tsx +34 -0
  280. package/src/NoteTitle/index.ts +1 -0
  281. package/src/NoteTitle/story/index.jsx +12 -0
  282. package/src/NoteTitle/styles.ts +8 -0
  283. package/src/OverviewBlock/OverviewBlock.tsx +125 -0
  284. package/src/OverviewBlock/__image_snapshots__/overviewblock-default-snap.png +0 -0
  285. package/src/OverviewBlock/__image_snapshots__/overviewblock-multi-line-snap.png +0 -0
  286. package/src/OverviewBlock/__image_snapshots__/overviewblock-number-snap.png +0 -0
  287. package/src/OverviewBlock/__image_snapshots__/overviewblock-routing-snap.png +0 -0
  288. package/src/OverviewBlock/__image_snapshots__/overviewblock-text-snap.png +0 -0
  289. package/src/OverviewBlock/index.ts +6 -0
  290. package/src/OverviewBlock/story/Default.example.tsx +35 -0
  291. package/src/OverviewBlock/story/Multiline.example.tsx +51 -0
  292. package/src/OverviewBlock/story/Number.example.tsx +20 -0
  293. package/src/OverviewBlock/story/Routing.example.tsx +40 -0
  294. package/src/OverviewBlock/story/Text.example.tsx +15 -0
  295. package/src/OverviewBlock/story/index.jsx +100 -0
  296. package/src/OverviewBlock/styles.ts +44 -0
  297. package/src/OverviewBlock/test.tsx +111 -0
  298. package/src/OverviewBlockGroup/OverviewBlockGroup.tsx +56 -0
  299. package/src/OverviewBlockGroup/OverviewBlockGroupContext.tsx +21 -0
  300. package/src/OverviewBlockGroup/__image_snapshots__/visual-variants-of-the-groups-block-width-snap.png +0 -0
  301. package/src/OverviewBlockGroup/__image_snapshots__/visual-variants-of-the-groups-center-aligned-snap.png +0 -0
  302. package/src/OverviewBlockGroup/index.ts +1 -0
  303. package/src/OverviewBlockGroup/settings.ts +2 -0
  304. package/src/OverviewBlockGroup/story/BlockWidth.example.tsx +38 -0
  305. package/src/OverviewBlockGroup/story/CenterAligned.example.tsx +17 -0
  306. package/src/OverviewBlockGroup/story/index.jsx +25 -0
  307. package/src/OverviewBlockGroup/test.tsx +17 -0
  308. package/src/OverviewBlockRow/OverviewBlockRow.tsx +22 -0
  309. package/src/OverviewBlockRow/index.ts +1 -0
  310. package/src/OverviewBlockRow/story/index.jsx +11 -0
  311. package/src/OverviewBlockRow/styles.ts +27 -0
  312. package/src/Section/Section.tsx +163 -0
  313. package/src/Section/__snapshots__/test.tsx.snap +186 -0
  314. package/src/Section/index.ts +6 -0
  315. package/src/Section/story/Actions.example.tsx +85 -0
  316. package/src/Section/story/Collapsible.example.tsx +113 -0
  317. package/src/Section/story/Default.example.tsx +77 -0
  318. package/src/Section/story/TitleSize.example.tsx +34 -0
  319. package/src/Section/story/Variant.example.tsx +108 -0
  320. package/src/Section/story/index.jsx +35 -0
  321. package/src/Section/styles.ts +65 -0
  322. package/src/Section/test.tsx +115 -0
  323. package/src/Timeline/Timeline.tsx +25 -0
  324. package/src/Timeline/__snapshots__/test.tsx.snap +332 -0
  325. package/src/Timeline/index.ts +6 -0
  326. package/src/Timeline/story/Dates.example.tsx +52 -0
  327. package/src/Timeline/story/Default.example.tsx +34 -0
  328. package/src/Timeline/story/TrimLastConnector.example.tsx +29 -0
  329. package/src/Timeline/story/index.jsx +27 -0
  330. package/src/Timeline/test.tsx +101 -0
  331. package/src/TimelineRow/TimelineRow.tsx +83 -0
  332. package/src/TimelineRow/index.ts +6 -0
  333. package/src/TimelineRow/story/index.jsx +11 -0
  334. package/src/TimelineRow/styles.ts +47 -0
  335. package/src/TypographyOverflow/TypographyOverflow.tsx +153 -0
  336. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-checkbox-label-effect-1-snap.png +0 -0
  337. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-checkbox-label-snap.png +0 -0
  338. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-custom-tooltip-content-effect-1-snap.png +0 -0
  339. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-custom-tooltip-content-snap.png +0 -0
  340. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-default-effect-1-snap.png +0 -0
  341. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-default-effect-2-snap.png +0 -0
  342. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-default-snap.png +0 -0
  343. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-delay-effect-1-snap.png +0 -0
  344. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-delay-effect-2-snap.png +0 -0
  345. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-delay-snap.png +0 -0
  346. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-light-tooltip-background-effect-1-snap.png +0 -0
  347. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-light-tooltip-background-effect-2-snap.png +0 -0
  348. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-light-tooltip-background-snap.png +0 -0
  349. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-multiline-effect-1-snap.png +0 -0
  350. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-multiline-effect-2-snap.png +0 -0
  351. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-multiline-effect-3-snap.png +0 -0
  352. package/src/TypographyOverflow/__image_snapshots__/typographyoverflow-multiline-snap.png +0 -0
  353. package/src/TypographyOverflow/index.ts +6 -0
  354. package/src/TypographyOverflow/story/CheckboxLabel.example.tsx +21 -0
  355. package/src/TypographyOverflow/story/CustomTooltip.example.tsx +22 -0
  356. package/src/TypographyOverflow/story/Default.example.tsx +32 -0
  357. package/src/TypographyOverflow/story/Delay.example.tsx +29 -0
  358. package/src/TypographyOverflow/story/GridWithControls.example.tsx +64 -0
  359. package/src/TypographyOverflow/story/Multiline.example.tsx +59 -0
  360. package/src/TypographyOverflow/story/TooltipVariants.example.tsx +23 -0
  361. package/src/TypographyOverflow/story/index.jsx +83 -0
  362. package/src/TypographyOverflow/styles.ts +29 -0
  363. package/src/TypographyOverflow/test.tsx +60 -0
  364. package/src/index.ts +35 -0
  365. package/src/story/index.jsx +10 -0
  366. package/tsconfig.build.json +7 -0
  367. package/DatePicker/DatePicker.js.map +0 -1
  368. package/DatePicker/index.d.ts +0 -2
  369. package/DatePicker/index.js +0 -2
  370. package/Section/Section.js.map +0 -1
  371. package/Section/styles.d.ts +0 -3
  372. package/Section/styles.js +0 -36
  373. package/Section/styles.js.map +0 -1
  374. package/index.js.map +0 -1
@@ -0,0 +1,22 @@
1
+ import React, { useState } from 'react'
2
+ import { DatePicker, DatePickerValue } from '@toptal/picasso-lab'
3
+
4
+ const WithOnBlurHandlerExample = () => {
5
+ const [datepickerValue, setDatepickerValue] = useState<DatePickerValue>()
6
+
7
+ return (
8
+ <div style={{ height: '50vh' }}>
9
+ <DatePicker
10
+ value={datepickerValue}
11
+ onBlur={() => {
12
+ // handle on blur
13
+ }}
14
+ onChange={(date: DatePickerValue) => {
15
+ setDatepickerValue(date)
16
+ }}
17
+ />
18
+ </div>
19
+ )
20
+ }
21
+
22
+ export default WithOnBlurHandlerExample
@@ -0,0 +1,32 @@
1
+ import React, { useState } from 'react'
2
+ import { DatePicker } from '@toptal/picasso-lab'
3
+ import { Search16 } from '@toptal/picasso'
4
+
5
+ const WithSelectionLimitsExample = () => {
6
+ const [value, setValue] = useState(new Date('2015-12-12'))
7
+ const minDate = new Date('2015-12-01')
8
+ const maxDate = new Date('2015-12-30')
9
+ const disabledIntervals = [
10
+ { start: new Date('2015-12-03'), end: new Date('2015-12-08') },
11
+ { start: new Date('2015-12-20'), end: new Date('2015-12-30') }
12
+ ]
13
+
14
+ return (
15
+ <div style={{ height: '50vh', width: '100%' }}>
16
+ <DatePicker
17
+ value={value}
18
+ minDate={minDate}
19
+ maxDate={maxDate}
20
+ icon={<Search16 />}
21
+ iconPosition='end'
22
+ placeholder='Please select date...'
23
+ disabledIntervals={disabledIntervals}
24
+ onChange={date => {
25
+ setValue(date as Date)
26
+ }}
27
+ />
28
+ </div>
29
+ )
30
+ }
31
+
32
+ export default WithSelectionLimitsExample
@@ -0,0 +1,25 @@
1
+ import React, { useState } from 'react'
2
+ import { DatePicker } from '@toptal/picasso-lab'
3
+ import { Search16 } from '@toptal/picasso'
4
+
5
+ const WithTimezoneExample = () => {
6
+ const timezone = 'Asia/Tokyo'
7
+ const [value, setValue] = useState(new Date('2015-12-12T16:00:00'))
8
+
9
+ return (
10
+ <div style={{ height: '50vh', width: '100%' }}>
11
+ <DatePicker
12
+ value={value}
13
+ timezone={timezone}
14
+ icon={<Search16 />}
15
+ iconPosition='end'
16
+ placeholder='Please select date...'
17
+ onChange={date => {
18
+ setValue(date as Date)
19
+ }}
20
+ />
21
+ </div>
22
+ )
23
+ }
24
+
25
+ export default WithTimezoneExample
@@ -0,0 +1,50 @@
1
+ import { DatePicker } from '../DatePicker'
2
+ import PicassoBook from '~/.storybook/components/PicassoBook'
3
+
4
+ const page = PicassoBook.section('Picasso Lab').createPage(
5
+ 'DatePicker',
6
+ `
7
+ Date Picker component
8
+
9
+ ${PicassoBook.createBaseDocsLink(
10
+ 'https://share.goabstract.com/cc5f669e-ee2c-4375-946d-93b20db16ecc?collectionLayerId=10d3230f-5c9c-4fed-85b2-5cfda0bcd25f&mode=design&present=true'
11
+ )}
12
+ `
13
+ )
14
+
15
+ page
16
+ .createTabChapter('Props')
17
+ .addComponentDocs({ component: DatePicker, name: 'DatePicker' })
18
+
19
+ page
20
+ .createChapter()
21
+ .addExample('DatePicker/story/Default.example.tsx', 'Default') // picasso-skip-visuals
22
+ .addExample('DatePicker/story/Range.example.tsx', 'Range Mode') // picasso-skip-visuals
23
+ .addExample('DatePicker/story/WithOnBlurHandler.example.tsx', {
24
+ title: 'With onBlur handler',
25
+ description: 'Fire onBlur handler on click outside or navigate with tab'
26
+ }) // picasso-skip-visuals
27
+ .addExample('DatePicker/story/WithNoHideOnSelect.example.tsx', {
28
+ title: 'With no hideOnSelect',
29
+ description: 'Do not hide calendar on date select'
30
+ }) // picasso-skip-visuals
31
+ .addExample(
32
+ 'DatePicker/story/WithInitialValue.example.tsx',
33
+ 'With initial value specified'
34
+ ) // picasso-skip-visuals
35
+ .addExample('DatePicker/story/WithInputProps.example.tsx', 'With Input Props') // picasso-skip-visuals
36
+ .addExample('DatePicker/story/Autocomplete.example.tsx', 'Autocomplete') // picasso-skip-visuals
37
+ .addExample('DatePicker/story/Error.example.tsx', 'Error') // picasso-skip-visuals
38
+ .addExample(
39
+ 'DatePicker/story/WithSelectionLimits.example.tsx',
40
+ 'With Selection Limits'
41
+ ) // picasso-skip-visuals
42
+ .addExample(
43
+ 'DatePicker/story/WithCustomDayRendering.example.tsx',
44
+ 'With Custom Day rendering'
45
+ ) // picasso-skip-visuals
46
+ .addExample('DatePicker/story/WithTimezone.example.tsx', 'With Timezone') // picasso-skip-visuals
47
+ .addExample(
48
+ 'DatePicker/story/AllowCustomValue.example.tsx',
49
+ 'With custom value'
50
+ ) // picasso-skip-visuals
@@ -0,0 +1,8 @@
1
+ import { createStyles } from '@material-ui/core/styles'
2
+
3
+ export default () =>
4
+ createStyles({
5
+ calendar: {
6
+ outline: 'none'
7
+ }
8
+ })
@@ -0,0 +1,370 @@
1
+ /* eslint-disable max-lines-per-function */
2
+ import { Tooltip } from '@toptal/picasso'
3
+ import { act, fireEvent, render } from '@toptal/picasso/test-utils'
4
+ import React, { useState } from 'react'
5
+
6
+ import { DateOrDateRangeType } from '../Calendar'
7
+ import DatePicker, { Props } from './DatePicker'
8
+ import {
9
+ datePickerParseDateString,
10
+ DEFAULT_DATE_PICKER_EDIT_DATE_FORMAT
11
+ } from './'
12
+
13
+ // eslint-disable-next-line max-lines-per-function
14
+ describe('DatePicker', () => {
15
+ beforeAll(() => {
16
+ jest.useFakeTimers()
17
+ })
18
+
19
+ afterAll(() => {
20
+ jest.useRealTimers()
21
+ })
22
+
23
+ it('renders', () => {
24
+ const date = new Date('12-12-2019')
25
+
26
+ const { container } = render(
27
+ <DatePicker value={date} onChange={() => {}} />
28
+ )
29
+
30
+ expect(container).toMatchSnapshot()
31
+ })
32
+
33
+ it('custom day rendering', () => {
34
+ const date = new Date('12-12-2019')
35
+
36
+ const { getByPlaceholderText, getByText } = render(
37
+ <DatePicker
38
+ placeholder='dateInput'
39
+ value={date}
40
+ onChange={() => {}}
41
+ renderDay={({ key, children }) => (
42
+ <Tooltip key={key} content='tooltip content'>
43
+ {children}
44
+ </Tooltip>
45
+ )}
46
+ />
47
+ )
48
+
49
+ const input = getByPlaceholderText('dateInput')
50
+
51
+ fireEvent.click(input)
52
+
53
+ const day15 = getByText(/15/)
54
+
55
+ fireEvent.mouseOver(day15)
56
+
57
+ act(() => {
58
+ // wait for tooltip's "enterDelay"
59
+ jest.advanceTimersByTime(600)
60
+ })
61
+
62
+ const tooltip = getByText('tooltip content')
63
+
64
+ expect(tooltip).toBeInTheDocument()
65
+ })
66
+
67
+ describe('Input', () => {
68
+ it('should display date in default displayDateFormat', () => {
69
+ const { getByPlaceholderText } = renderDatePicker()
70
+
71
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
72
+ 'value',
73
+ 'Dec 24, 2020'
74
+ )
75
+ })
76
+
77
+ it('should display date in given displayDateFormat', () => {
78
+ const { getByPlaceholderText } = renderDatePicker({
79
+ ...defaultProps,
80
+ displayDateFormat: 'MMM|d|yyyy'
81
+ })
82
+
83
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
84
+ 'value',
85
+ 'Dec|24|2020'
86
+ )
87
+ })
88
+
89
+ it('should display date range in default displayDateFormat', () => {
90
+ const { getByPlaceholderText } = renderDatePicker({
91
+ ...defaultProps,
92
+ range: true,
93
+ value: [new Date(2020, 11, 24), new Date(2020, 11, 27)]
94
+ })
95
+
96
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
97
+ 'value',
98
+ 'Dec 24, 2020 - Dec 27, 2020'
99
+ )
100
+ })
101
+
102
+ it('should display date range in given displayDateFormat', () => {
103
+ const { getByPlaceholderText } = renderDatePicker({
104
+ ...defaultProps,
105
+ range: true,
106
+ value: [new Date(2020, 11, 24), new Date(2020, 11, 27)],
107
+ displayDateFormat: 'MMM|d|yyyy'
108
+ })
109
+
110
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
111
+ 'value',
112
+ 'Dec|24|2020 - Dec|27|2020'
113
+ )
114
+ })
115
+
116
+ it('should display date in default editDateFormat', () => {
117
+ const { getByPlaceholderText } = renderDatePicker()
118
+ const input = getByPlaceholderText(defaultProps.placeholder)
119
+
120
+ fireEvent.focus(input)
121
+
122
+ expect(input).toHaveAttribute('value', '12-24-2020')
123
+ })
124
+
125
+ it('should display date in given editDateFormat', () => {
126
+ const { getByPlaceholderText } = renderDatePicker({
127
+ ...defaultProps,
128
+ editDateFormat: 'MM|dd|yyyy'
129
+ })
130
+ const input = getByPlaceholderText(defaultProps.placeholder)
131
+
132
+ fireEvent.focus(input)
133
+
134
+ expect(input).toHaveAttribute('value', '12|24|2020')
135
+ })
136
+
137
+ it('should turn autoComplete off by default', () => {
138
+ const { getByPlaceholderText } = renderDatePicker()
139
+
140
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
141
+ 'autocomplete',
142
+ 'off'
143
+ )
144
+ })
145
+
146
+ it('should turn autoComplete on', () => {
147
+ const { getByPlaceholderText } = renderDatePicker({
148
+ ...defaultProps,
149
+ autoComplete: 'on'
150
+ })
151
+
152
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
153
+ 'autocomplete',
154
+ 'on'
155
+ )
156
+ })
157
+
158
+ it('should display date in given timezone', () => {
159
+ const { getByPlaceholderText } = renderDatePicker({
160
+ ...defaultProps,
161
+ timezone: FAR_EAST_TIMEZONE,
162
+ value: new Date(2020, 6, 24, 18)
163
+ })
164
+
165
+ expect(getByPlaceholderText(defaultProps.placeholder)).toHaveAttribute(
166
+ 'value',
167
+ `Jul 25, 2020`
168
+ )
169
+ })
170
+
171
+ it('should work within interval', () => {
172
+ const MIN_DATE = new Date(2020, 6, 10)
173
+ const MAX_DATE = new Date(2020, 6, 25)
174
+
175
+ const handleChange = jest.fn()
176
+
177
+ const { getByPlaceholderText } = renderDatePicker({
178
+ ...defaultProps,
179
+ minDate: MIN_DATE,
180
+ maxDate: MAX_DATE,
181
+ onChange: handleChange
182
+ })
183
+
184
+ const input = getByPlaceholderText(defaultProps.placeholder)
185
+
186
+ fireEvent.change(input, { target: { value: '07-09-2020' } })
187
+ expect(handleChange).not.toHaveBeenCalled()
188
+
189
+ fireEvent.change(input, { target: { value: '07-26-2020' } })
190
+ expect(handleChange).not.toHaveBeenCalled()
191
+
192
+ fireEvent.change(input, { target: { value: '07-22-2020' } })
193
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 22))
194
+
195
+ // check min edge
196
+ fireEvent.change(input, { target: { value: '07-10-2020' } })
197
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 10))
198
+
199
+ // check max edge
200
+ fireEvent.change(input, { target: { value: '07-25-2020' } })
201
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 25))
202
+ })
203
+
204
+ it('should work with minDate only', () => {
205
+ const MIN_DATE = new Date(2020, 6, 10)
206
+
207
+ const handleChange = jest.fn()
208
+
209
+ const { getByPlaceholderText } = renderDatePicker({
210
+ ...defaultProps,
211
+ minDate: MIN_DATE,
212
+ onChange: handleChange
213
+ })
214
+
215
+ const input = getByPlaceholderText(defaultProps.placeholder)
216
+
217
+ fireEvent.change(input, { target: { value: '07-09-2020' } })
218
+ expect(handleChange).not.toHaveBeenCalled()
219
+
220
+ fireEvent.change(input, { target: { value: '07-22-2020' } })
221
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 22))
222
+
223
+ // check min edge
224
+ fireEvent.change(input, { target: { value: '07-10-2020' } })
225
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 10))
226
+ })
227
+
228
+ it('should work with maxDate', () => {
229
+ const MAX_DATE = new Date(2020, 6, 25)
230
+
231
+ const handleChange = jest.fn()
232
+
233
+ const { getByPlaceholderText } = renderDatePicker({
234
+ ...defaultProps,
235
+ maxDate: MAX_DATE,
236
+ onChange: handleChange
237
+ })
238
+
239
+ const input = getByPlaceholderText(defaultProps.placeholder)
240
+
241
+ fireEvent.change(input, { target: { value: '07-26-2020' } })
242
+ expect(handleChange).not.toHaveBeenCalled()
243
+
244
+ fireEvent.change(input, { target: { value: '07-22-2020' } })
245
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 22))
246
+
247
+ // check max edge
248
+ fireEvent.change(input, { target: { value: '07-25-2020' } })
249
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 25))
250
+ })
251
+
252
+ describe('should work with overwritten `parseInputValue`', () => {
253
+ const parseInputValue = (value: string) => {
254
+ const result = datePickerParseDateString(value, {
255
+ dateFormat: DEFAULT_DATE_PICKER_EDIT_DATE_FORMAT
256
+ })
257
+
258
+ return result ?? value
259
+ }
260
+
261
+ it('emits `string` if value is not a valid date', () => {
262
+ const handleChange = jest.fn()
263
+
264
+ const { getByPlaceholderText } = renderDatePicker({
265
+ ...defaultProps,
266
+ parseInputValue,
267
+ onChange: handleChange
268
+ })
269
+
270
+ const input = getByPlaceholderText(defaultProps.placeholder)
271
+
272
+ fireEvent.change(input, { target: { value: 'some random text' } })
273
+ expect(handleChange).toHaveBeenCalledWith('some random text')
274
+ })
275
+
276
+ it('emits `Date` if value is a valid date', () => {
277
+ const handleChange = jest.fn()
278
+
279
+ const { getByPlaceholderText } = renderDatePicker({
280
+ ...defaultProps,
281
+ parseInputValue,
282
+ onChange: handleChange
283
+ })
284
+
285
+ const input = getByPlaceholderText(defaultProps.placeholder)
286
+
287
+ fireEvent.change(input, { target: { value: '07-25-2020' } })
288
+ expect(handleChange).toHaveBeenCalledWith(new Date(2020, 6, 25))
289
+ })
290
+
291
+ it('opens `Calendar` on `Input` focus with invalid date', () => {
292
+ const handleChange = jest.fn()
293
+
294
+ const { getByPlaceholderText, getByTestId } = renderDatePicker({
295
+ ...defaultProps,
296
+ parseInputValue,
297
+ value: 'some random text',
298
+ onChange: handleChange
299
+ })
300
+
301
+ const input = getByPlaceholderText(defaultProps.placeholder)
302
+
303
+ fireEvent.focus(input)
304
+
305
+ expect(getByTestId('calendar')).toBeInTheDocument()
306
+ })
307
+
308
+ it("doesn't clear `Input` after `blur` with invalid date", () => {
309
+ const placeholder = 'Pick a date'
310
+ const TestComponent = () => {
311
+ const [value, setValue] = useState<
312
+ string | DateOrDateRangeType | null
313
+ >(new Date(2020, 6, 25))
314
+
315
+ return (
316
+ <DatePicker
317
+ placeholder={placeholder}
318
+ parseInputValue={parseInputValue}
319
+ value={value}
320
+ onChange={setValue}
321
+ />
322
+ )
323
+ }
324
+
325
+ const renderTestComponentPicker = () => render(<TestComponent />)
326
+
327
+ const { getByPlaceholderText } = renderTestComponentPicker()
328
+
329
+ const input = getByPlaceholderText(placeholder)
330
+
331
+ fireEvent.focus(input)
332
+
333
+ fireEvent.change(input, { target: { value: 'some random text' } })
334
+
335
+ fireEvent.blur(input)
336
+
337
+ expect(getByPlaceholderText(placeholder)).toHaveAttribute(
338
+ 'value',
339
+ `some random text`
340
+ )
341
+ })
342
+ })
343
+ })
344
+
345
+ describe('Calendar', () => {
346
+ it('should display date in given timezone', () => {
347
+ const { getByPlaceholderText, getByTestId } = renderDatePicker({
348
+ ...defaultProps,
349
+ timezone: FAR_EAST_TIMEZONE,
350
+ value: new Date(2020, 6, 24, 18)
351
+ })
352
+
353
+ fireEvent.focus(getByPlaceholderText(defaultProps.placeholder))
354
+
355
+ expect(getByTestId('day-button-selected')).toHaveTextContent('25')
356
+ })
357
+ })
358
+
359
+ const FAR_EAST_TIMEZONE = 'Asia/Tokyo'
360
+
361
+ const defaultProps = {
362
+ onChange: () => {},
363
+ value: new Date(2020, 11, 24),
364
+ placeholder: 'Pick a date'
365
+ }
366
+
367
+ const renderDatePicker = (props: Props = defaultProps) => {
368
+ return render(<DatePicker {...props} />)
369
+ }
370
+ })
@@ -0,0 +1,13 @@
1
+ import { DateOrDateRangeType } from '../Calendar'
2
+
3
+ export type DatePickerValue = DateOrDateRangeType | string | null
4
+
5
+ export type DatePickerStringParser = (
6
+ value: string,
7
+ params: {
8
+ dateFormat: string
9
+ timezone?: string
10
+ minDate?: Date
11
+ maxDate?: Date
12
+ }
13
+ ) => DateOrDateRangeType | string | undefined
@@ -0,0 +1,123 @@
1
+ import parse from 'date-fns/parse'
2
+ import isValid from 'date-fns/isValid'
3
+ import formatDate from 'date-fns/format'
4
+ import isWithinInterval from 'date-fns/isWithinInterval'
5
+ import isEqual from 'date-fns/isEqual'
6
+ import isBefore from 'date-fns/isBefore'
7
+ import isAfter from 'date-fns/isAfter'
8
+ import { utcToZonedTime, format as tzFormat } from 'date-fns-tz'
9
+
10
+ import { DatePickerStringParser } from './types'
11
+ import { DateOrDateRangeType, DateRangeType } from '../Calendar'
12
+
13
+ // Convert date to given timezone. If timezone is undefined, return given date as is.
14
+ export const timezoneConvert = (
15
+ date: DateOrDateRangeType,
16
+ timeZone?: string
17
+ ): DateOrDateRangeType => {
18
+ const convert = (dateToConvert: Date) => {
19
+ if (timeZone) {
20
+ /**
21
+ * Prevent invalid IANA timezone error. This is likely to happen
22
+ * when someone is editing properties in a Storybook examples.
23
+ */
24
+ try {
25
+ return utcToZonedTime(dateToConvert, timeZone)
26
+ } catch {
27
+ return dateToConvert
28
+ }
29
+ }
30
+
31
+ return dateToConvert
32
+ }
33
+
34
+ return Array.isArray(date)
35
+ ? (date.map(convert) as DateRangeType)
36
+ : (convert(date) as Date)
37
+ }
38
+
39
+ // Format date in given timezone. If timezone is undefined, return given date as is.
40
+ export const timezoneFormat = (date: Date, timeZone?: string) => {
41
+ if (timeZone) {
42
+ /**
43
+ * Prevent invalid IANA timezone error. This is likely to happen
44
+ * when someone is editing properties in a Storybook examples.
45
+ */
46
+ try {
47
+ /**
48
+ * Maintain the same date and time, but formatted in the given timezone
49
+ * so next time the user edits the date it's not recalculated.
50
+ */
51
+ return new Date(tzFormat(date, 'MMM dd yyyy HH:mm:ss OOOO', { timeZone }))
52
+ } catch {
53
+ return date
54
+ }
55
+ }
56
+
57
+ return date
58
+ }
59
+
60
+ export const formatDateRange = (dates: DateRangeType, format: string) =>
61
+ dates.map(date => formatDate(date, format)).join(' - ')
62
+
63
+ export const isDateValid = (date: string, pattern: string) => {
64
+ return (
65
+ date.length === pattern.length && isValid(parse(date, pattern, new Date()))
66
+ )
67
+ }
68
+
69
+ export const isDateAfter = (date: Date, dateToCompare: Date) =>
70
+ isEqual(date, dateToCompare) || isAfter(date, dateToCompare)
71
+
72
+ export const isDateBefore = (date: Date, dateToCompare: Date) =>
73
+ isEqual(date, dateToCompare) || isBefore(date, dateToCompare)
74
+
75
+ // eslint-disable-next-line complexity
76
+ export const isDateWithinInterval = (
77
+ date: Date,
78
+ minDate: Date | undefined,
79
+ maxDate: Date | undefined
80
+ ) => {
81
+ if (!minDate && !maxDate) {
82
+ return true
83
+ }
84
+
85
+ if (minDate && maxDate) {
86
+ return isWithinInterval(date, {
87
+ start: minDate,
88
+ end: maxDate
89
+ })
90
+ }
91
+
92
+ if (minDate) {
93
+ return isDateAfter(date, minDate)
94
+ }
95
+
96
+ if (maxDate) {
97
+ return isDateBefore(date, maxDate)
98
+ }
99
+
100
+ return false
101
+ }
102
+
103
+ export const datePickerParseDateString: DatePickerStringParser = (
104
+ value,
105
+ { dateFormat, timezone, minDate, maxDate }
106
+ ) => {
107
+ if (!isDateValid(value, dateFormat)) {
108
+ return
109
+ }
110
+
111
+ const parsedNextValue = parse(value, dateFormat, new Date())
112
+ const nextTimezoneValue = timezoneFormat(parsedNextValue, timezone)
113
+
114
+ if (!isDateWithinInterval(nextTimezoneValue, minDate, maxDate)) {
115
+ return
116
+ }
117
+
118
+ return nextTimezoneValue
119
+ }
120
+
121
+ export const isValidDateValue = (
122
+ dateValue: DateOrDateRangeType | string
123
+ ): dateValue is DateOrDateRangeType => typeof dateValue !== 'string'