@navikt/ds-react 5.5.0 → 5.6.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 (342) hide show
  1. package/_docs.json +507 -106
  2. package/cjs/accordion/Accordion.js +1 -0
  3. package/cjs/accordion/AccordionContext.js +1 -1
  4. package/cjs/accordion/AccordionHeader.js +2 -2
  5. package/cjs/accordion/AccordionItem.js +6 -2
  6. package/cjs/date/datepicker/DatePicker.js +30 -34
  7. package/cjs/date/datepicker/DatePickerStandalone.js +23 -26
  8. package/cjs/date/datepicker/parts/Caption.js +28 -0
  9. package/cjs/date/datepicker/{DayButton.js → parts/DayButton.js} +1 -2
  10. package/cjs/date/datepicker/{caption → parts}/DropdownCaption.js +13 -7
  11. package/cjs/date/datepicker/parts/HeadRow.js +36 -0
  12. package/cjs/date/datepicker/parts/Row.js +23 -0
  13. package/cjs/date/datepicker/{TableHead.js → parts/TableHead.js} +4 -3
  14. package/cjs/date/datepicker/parts/WeekNumber.js +35 -0
  15. package/cjs/date/datepicker/parts/WeekRow.js +34 -0
  16. package/cjs/date/hooks/useDatepicker.js +2 -2
  17. package/cjs/date/hooks/useMonthPicker.js +2 -2
  18. package/cjs/date/hooks/useRangeDatepicker.js +3 -3
  19. package/cjs/date/monthpicker/MonthSelector.js +1 -1
  20. package/cjs/date/utils/get-month-weeks.js +46 -0
  21. package/cjs/date/utils/labels.js +40 -1
  22. package/cjs/dropdown/Toggle.js +2 -2
  23. package/cjs/dropdown/index.js +0 -15
  24. package/cjs/form/Select.js +1 -1
  25. package/cjs/form/checkbox/useCheckbox.js +3 -4
  26. package/cjs/form/combobox/Combobox.js +1 -1
  27. package/cjs/form/combobox/Input/Input.js +1 -1
  28. package/cjs/form/search/Search.js +3 -1
  29. package/cjs/index.js +1 -0
  30. package/cjs/layout/bleed/Bleed.js +69 -0
  31. package/cjs/layout/bleed/index.js +5 -0
  32. package/cjs/layout/bleed/package.json +6 -0
  33. package/cjs/layout/box/Box.js +1 -1
  34. package/cjs/layout/responsive/Responsive.js +8 -6
  35. package/cjs/layout/sidemal-test/AvatarPanel.js +18 -0
  36. package/cjs/layout/sidemal-test/Content.js +66 -0
  37. package/cjs/layout/sidemal-test/Filter.js +48 -0
  38. package/cjs/layout/sidemal-test/Header.js +48 -0
  39. package/cjs/layout/sidemal-test/Intro.js +36 -0
  40. package/cjs/layout/sidemal-test/Sidebar.js +49 -0
  41. package/cjs/layout/sidemal-test/content-box/ContentBox.js +65 -0
  42. package/cjs/layout/sidemal-test/content-box/index.js +8 -0
  43. package/cjs/layout/sidemal-test/content-box/package.json +6 -0
  44. package/cjs/layout/stack/Stack.js +2 -2
  45. package/cjs/layout/stack/index.js +3 -1
  46. package/cjs/layout/utilities/css.js +37 -14
  47. package/cjs/loader/Loader.js +2 -2
  48. package/cjs/modal/dialog-polyfill.js +2 -0
  49. package/cjs/popover/Popover.js +3 -2
  50. package/cjs/tabs/TabList.js +6 -7
  51. package/cjs/timeline/Pin.js +20 -20
  52. package/cjs/timeline/Timeline.js +4 -4
  53. package/cjs/timeline/period/ClickablePeriod.js +19 -19
  54. package/cjs/timeline/period/index.js +1 -1
  55. package/cjs/timeline/utils/timeline.js +3 -3
  56. package/cjs/toggle-group/ToggleGroup.js +1 -1
  57. package/cjs/tooltip/Tooltip.js +1 -1
  58. package/cjs/typography/Heading.js +1 -1
  59. package/cjs/util/RandomIcon.js +1 -0
  60. package/cjs/util/Slot.js +88 -0
  61. package/cjs/util/useId.js +2 -4
  62. package/esm/accordion/Accordion.js +1 -0
  63. package/esm/accordion/Accordion.js.map +1 -1
  64. package/esm/accordion/AccordionContext.d.ts +1 -0
  65. package/esm/accordion/AccordionContext.js +1 -1
  66. package/esm/accordion/AccordionContext.js.map +1 -1
  67. package/esm/accordion/AccordionHeader.js +2 -2
  68. package/esm/accordion/AccordionHeader.js.map +1 -1
  69. package/esm/accordion/AccordionItem.js +6 -2
  70. package/esm/accordion/AccordionItem.js.map +1 -1
  71. package/esm/date/datepicker/DatePicker.d.ts +14 -5
  72. package/esm/date/datepicker/DatePicker.js +29 -33
  73. package/esm/date/datepicker/DatePicker.js.map +1 -1
  74. package/esm/date/datepicker/DatePickerStandalone.d.ts +3 -2
  75. package/esm/date/datepicker/DatePickerStandalone.js +22 -25
  76. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
  77. package/esm/date/datepicker/{caption → parts}/Caption.d.ts +3 -0
  78. package/esm/date/datepicker/parts/Caption.js +22 -0
  79. package/esm/date/datepicker/parts/Caption.js.map +1 -0
  80. package/esm/date/datepicker/parts/DayButton.d.ts +4 -0
  81. package/esm/date/datepicker/{DayButton.js → parts/DayButton.js} +2 -1
  82. package/esm/date/datepicker/parts/DayButton.js.map +1 -0
  83. package/esm/date/datepicker/{caption → parts}/DropdownCaption.d.ts +3 -0
  84. package/esm/date/datepicker/parts/DropdownCaption.js +44 -0
  85. package/esm/date/datepicker/parts/DropdownCaption.js.map +1 -0
  86. package/esm/date/datepicker/parts/HeadRow.d.ts +11 -0
  87. package/esm/date/datepicker/parts/HeadRow.js +29 -0
  88. package/esm/date/datepicker/parts/HeadRow.js.map +1 -0
  89. package/esm/date/datepicker/parts/Row.d.ts +17 -0
  90. package/esm/date/datepicker/parts/Row.js +19 -0
  91. package/esm/date/datepicker/parts/Row.js.map +1 -0
  92. package/esm/date/datepicker/parts/TableHead.d.ts +6 -0
  93. package/esm/date/datepicker/{TableHead.js → parts/TableHead.js} +5 -2
  94. package/esm/date/datepicker/parts/TableHead.js.map +1 -0
  95. package/esm/date/datepicker/parts/WeekNumber.d.ts +13 -0
  96. package/esm/date/datepicker/parts/WeekNumber.js +31 -0
  97. package/esm/date/datepicker/parts/WeekNumber.js.map +1 -0
  98. package/esm/date/datepicker/parts/WeekRow.d.ts +5 -0
  99. package/esm/date/datepicker/parts/WeekRow.js +30 -0
  100. package/esm/date/datepicker/parts/WeekRow.js.map +1 -0
  101. package/esm/date/hooks/useDatepicker.js +2 -2
  102. package/esm/date/hooks/useDatepicker.js.map +1 -1
  103. package/esm/date/hooks/useMonthPicker.js +2 -2
  104. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  105. package/esm/date/hooks/useRangeDatepicker.js +3 -3
  106. package/esm/date/hooks/useRangeDatepicker.js.map +1 -1
  107. package/esm/date/monthpicker/MonthButton.d.ts +2 -2
  108. package/esm/date/monthpicker/MonthPicker.d.ts +1 -1
  109. package/esm/date/monthpicker/MonthSelector.js +1 -1
  110. package/esm/date/monthpicker/MonthSelector.js.map +1 -1
  111. package/esm/date/utils/get-month-weeks.d.ts +16 -0
  112. package/esm/date/utils/get-month-weeks.js +42 -0
  113. package/esm/date/utils/get-month-weeks.js.map +1 -0
  114. package/esm/date/utils/labels.d.ts +9 -0
  115. package/esm/date/utils/labels.js +36 -0
  116. package/esm/date/utils/labels.js.map +1 -1
  117. package/esm/date/utils/navigation.d.ts +1 -1
  118. package/esm/date/utils/navigation.js.map +1 -1
  119. package/esm/dropdown/Toggle.js +1 -1
  120. package/esm/dropdown/Toggle.js.map +1 -1
  121. package/esm/dropdown/index.d.ts +1 -2
  122. package/esm/dropdown/index.js +0 -1
  123. package/esm/dropdown/index.js.map +1 -1
  124. package/esm/form/Select.js +1 -1
  125. package/esm/form/Select.js.map +1 -1
  126. package/esm/form/checkbox/useCheckbox.d.ts +1 -1
  127. package/esm/form/checkbox/useCheckbox.js +3 -4
  128. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  129. package/esm/form/combobox/Combobox.d.ts +1 -1
  130. package/esm/form/combobox/Combobox.js +1 -1
  131. package/esm/form/combobox/Combobox.js.map +1 -1
  132. package/esm/form/combobox/Input/Input.d.ts +0 -2
  133. package/esm/form/combobox/Input/Input.js +1 -1
  134. package/esm/form/combobox/Input/Input.js.map +1 -1
  135. package/esm/form/search/Search.js +3 -1
  136. package/esm/form/search/Search.js.map +1 -1
  137. package/esm/index.d.ts +1 -0
  138. package/esm/index.js +1 -0
  139. package/esm/index.js.map +1 -1
  140. package/esm/layout/bleed/Bleed.d.ts +47 -0
  141. package/esm/layout/bleed/Bleed.js +41 -0
  142. package/esm/layout/bleed/Bleed.js.map +1 -0
  143. package/esm/layout/bleed/index.d.ts +1 -0
  144. package/esm/layout/bleed/index.js +2 -0
  145. package/esm/layout/bleed/index.js.map +1 -0
  146. package/esm/layout/box/Box.d.ts +1 -2
  147. package/esm/layout/box/Box.js +1 -1
  148. package/esm/layout/box/Box.js.map +1 -1
  149. package/esm/layout/responsive/Responsive.d.ts +8 -4
  150. package/esm/layout/responsive/Responsive.js +8 -6
  151. package/esm/layout/responsive/Responsive.js.map +1 -1
  152. package/esm/layout/sidemal-test/AvatarPanel.d.ts +4 -0
  153. package/esm/layout/sidemal-test/AvatarPanel.js +12 -0
  154. package/esm/layout/sidemal-test/AvatarPanel.js.map +1 -0
  155. package/esm/layout/sidemal-test/Content.d.ts +2 -0
  156. package/esm/layout/sidemal-test/Content.js +60 -0
  157. package/esm/layout/sidemal-test/Content.js.map +1 -0
  158. package/esm/layout/sidemal-test/Filter.d.ts +2 -0
  159. package/esm/layout/sidemal-test/Filter.js +22 -0
  160. package/esm/layout/sidemal-test/Filter.js.map +1 -0
  161. package/esm/layout/sidemal-test/Header.d.ts +2 -0
  162. package/esm/layout/sidemal-test/Header.js +42 -0
  163. package/esm/layout/sidemal-test/Header.js.map +1 -0
  164. package/esm/layout/sidemal-test/Intro.d.ts +2 -0
  165. package/esm/layout/sidemal-test/Intro.js +30 -0
  166. package/esm/layout/sidemal-test/Intro.js.map +1 -0
  167. package/esm/layout/sidemal-test/Sidebar.d.ts +4 -0
  168. package/esm/layout/sidemal-test/Sidebar.js +41 -0
  169. package/esm/layout/sidemal-test/Sidebar.js.map +1 -0
  170. package/esm/layout/sidemal-test/content-box/ContentBox.d.ts +8 -0
  171. package/esm/layout/sidemal-test/content-box/ContentBox.js +37 -0
  172. package/esm/layout/sidemal-test/content-box/ContentBox.js.map +1 -0
  173. package/esm/layout/sidemal-test/content-box/index.d.ts +1 -0
  174. package/esm/layout/sidemal-test/content-box/index.js +2 -0
  175. package/esm/layout/sidemal-test/content-box/index.js.map +1 -0
  176. package/esm/layout/stack/Stack.d.ts +7 -3
  177. package/esm/layout/stack/Stack.js +3 -3
  178. package/esm/layout/stack/Stack.js.map +1 -1
  179. package/esm/layout/stack/index.d.ts +1 -0
  180. package/esm/layout/stack/index.js +1 -0
  181. package/esm/layout/stack/index.js.map +1 -1
  182. package/esm/layout/utilities/css.d.ts +1 -1
  183. package/esm/layout/utilities/css.js +37 -14
  184. package/esm/layout/utilities/css.js.map +1 -1
  185. package/esm/loader/Loader.js +3 -3
  186. package/esm/loader/Loader.js.map +1 -1
  187. package/esm/modal/dialog-polyfill.js +2 -0
  188. package/esm/modal/dialog-polyfill.js.map +1 -1
  189. package/esm/popover/Popover.js +3 -2
  190. package/esm/popover/Popover.js.map +1 -1
  191. package/esm/tabs/TabList.js +6 -7
  192. package/esm/tabs/TabList.js.map +1 -1
  193. package/esm/timeline/Pin.js +21 -21
  194. package/esm/timeline/Pin.js.map +1 -1
  195. package/esm/timeline/Timeline.js +4 -4
  196. package/esm/timeline/Timeline.js.map +1 -1
  197. package/esm/timeline/TimelineRow.js.map +1 -1
  198. package/esm/timeline/hooks/usePeriodContext.d.ts +1 -1
  199. package/esm/timeline/period/ClickablePeriod.js +20 -20
  200. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  201. package/esm/timeline/period/index.d.ts +2 -2
  202. package/esm/timeline/period/index.js +1 -1
  203. package/esm/timeline/period/index.js.map +1 -1
  204. package/esm/timeline/utils/timeline.js +3 -3
  205. package/esm/timeline/utils/timeline.js.map +1 -1
  206. package/esm/toggle-group/ToggleGroup.js +1 -1
  207. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  208. package/esm/tooltip/Tooltip.js +1 -1
  209. package/esm/tooltip/Tooltip.js.map +1 -1
  210. package/esm/typography/Heading.js +1 -1
  211. package/esm/typography/Heading.js.map +1 -1
  212. package/esm/util/RandomIcon.js +1 -0
  213. package/esm/util/RandomIcon.js.map +1 -1
  214. package/esm/util/Slot.d.ts +6 -0
  215. package/esm/util/Slot.js +60 -0
  216. package/esm/util/Slot.js.map +1 -0
  217. package/esm/util/mergeRefs.d.ts +1 -1
  218. package/esm/util/useId.js +2 -4
  219. package/esm/util/useId.js.map +1 -1
  220. package/package.json +4 -4
  221. package/src/accordion/Accordion.tsx +1 -0
  222. package/src/accordion/AccordionContext.tsx +2 -1
  223. package/src/accordion/AccordionHeader.tsx +2 -2
  224. package/src/accordion/AccordionItem.tsx +7 -5
  225. package/src/accordion/accordion.stories.tsx +21 -34
  226. package/src/alert/alert.stories.tsx +2 -2
  227. package/src/chips/chips.stories.tsx +29 -32
  228. package/src/date/datepicker/DatePicker.tsx +63 -58
  229. package/src/date/datepicker/DatePickerStandalone.tsx +36 -39
  230. package/src/date/datepicker/datepicker.stories.tsx +67 -2
  231. package/src/date/datepicker/datepicker.test.tsx +5 -4
  232. package/src/date/datepicker/{caption → parts}/Caption.tsx +19 -17
  233. package/src/date/datepicker/{DayButton.tsx → parts/DayButton.tsx} +3 -1
  234. package/src/date/datepicker/parts/DropdownCaption.tsx +113 -0
  235. package/src/date/datepicker/parts/HeadRow.tsx +56 -0
  236. package/src/date/datepicker/parts/Row.tsx +47 -0
  237. package/src/date/datepicker/{TableHead.tsx → parts/TableHead.tsx} +6 -2
  238. package/src/date/datepicker/parts/WeekNumber.tsx +79 -0
  239. package/src/date/datepicker/parts/WeekRow.tsx +60 -0
  240. package/src/date/hooks/useDatepicker.tsx +2 -2
  241. package/src/date/hooks/useMonthPicker.tsx +2 -2
  242. package/src/date/hooks/useRangeDatepicker.test.tsx +11 -11
  243. package/src/date/hooks/useRangeDatepicker.tsx +3 -3
  244. package/src/date/monthpicker/MonthButton.tsx +2 -2
  245. package/src/date/monthpicker/MonthPicker.tsx +1 -1
  246. package/src/date/monthpicker/MonthSelector.tsx +3 -3
  247. package/src/date/monthpicker/monthpicker.stories.tsx +1 -1
  248. package/src/date/utils/__tests__/get-initial-year.test.ts +0 -12
  249. package/src/date/utils/__tests__/get-month-weeks.test.ts +113 -0
  250. package/src/date/utils/__tests__/is-match.test.ts +3 -3
  251. package/src/date/utils/__tests__/parse-dates.test.ts +4 -2
  252. package/src/date/utils/get-month-weeks.ts +93 -0
  253. package/src/date/utils/labels.ts +51 -0
  254. package/src/date/utils/navigation.ts +3 -3
  255. package/src/dropdown/Toggle.tsx +1 -1
  256. package/src/dropdown/dropdown.stories.tsx +25 -28
  257. package/src/dropdown/index.ts +1 -2
  258. package/src/expansion-card/expansion-card.stories.tsx +143 -161
  259. package/src/form/ConfirmationPanel.test.tsx +5 -5
  260. package/src/form/Select.tsx +1 -1
  261. package/src/form/checkbox/Checkbox.test.tsx +14 -26
  262. package/src/form/checkbox/checkbox.stories.tsx +66 -71
  263. package/src/form/checkbox/useCheckbox.ts +3 -4
  264. package/src/form/combobox/Combobox.tsx +2 -3
  265. package/src/form/combobox/Input/Input.tsx +1 -3
  266. package/src/form/combobox/combobox.stories.tsx +20 -23
  267. package/src/form/combobox/combobox.test.tsx +22 -20
  268. package/src/form/radio/radio.stories.tsx +39 -44
  269. package/src/form/search/Search.tsx +1 -0
  270. package/src/form/search/search.stories.tsx +22 -26
  271. package/src/form/stories/fieldset.stories.tsx +1 -1
  272. package/src/index.ts +1 -0
  273. package/src/layout/bleed/Bleed.stories.tsx +381 -0
  274. package/src/layout/bleed/Bleed.tsx +130 -0
  275. package/src/layout/bleed/index.ts +1 -0
  276. package/src/layout/box/Box.stories.tsx +251 -256
  277. package/src/layout/box/Box.tsx +2 -1
  278. package/src/layout/responsive/Responsive.tsx +21 -6
  279. package/src/layout/responsive/hide.stories.tsx +35 -0
  280. package/src/layout/responsive/show.stories.tsx +35 -0
  281. package/src/layout/sidemal-test/AvatarPanel.tsx +27 -0
  282. package/src/layout/sidemal-test/Content.tsx +129 -0
  283. package/src/layout/sidemal-test/Filter.tsx +46 -0
  284. package/src/layout/sidemal-test/Header.tsx +96 -0
  285. package/src/layout/sidemal-test/Intro.tsx +91 -0
  286. package/src/layout/sidemal-test/Sidebar.tsx +77 -0
  287. package/src/layout/sidemal-test/content-box/ContentBox.tsx +46 -0
  288. package/src/layout/sidemal-test/content-box/index.ts +1 -0
  289. package/src/layout/sidemal-test/navno-sidemal.stories.mdx +29 -0
  290. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +65 -0
  291. package/src/layout/sidemal-test/styling.css +43 -0
  292. package/src/layout/stack/Stack.tsx +14 -8
  293. package/src/layout/stack/index.ts +1 -0
  294. package/src/layout/stack/stack.stories.tsx +23 -1
  295. package/src/layout/utilities/css.ts +59 -20
  296. package/src/loader/Loader.tsx +2 -3
  297. package/src/modal/dialog-polyfill.ts +2 -0
  298. package/src/pagination/pagination.stories.tsx +35 -42
  299. package/src/popover/Popover.test.tsx +21 -35
  300. package/src/popover/Popover.tsx +2 -2
  301. package/src/popover/popover.stories.tsx +25 -41
  302. package/src/react-css.d.ts +0 -1
  303. package/src/read-more/readmore.stories.tsx +35 -36
  304. package/src/stepper/stepper.stories.tsx +45 -52
  305. package/src/table/stories/table-expandable.stories.tsx +59 -63
  306. package/src/tabs/TabList.tsx +4 -6
  307. package/src/tabs/Tabs.stories.tsx +3 -3
  308. package/src/tag/tag.stories.tsx +4 -4
  309. package/src/timeline/Pin.tsx +44 -39
  310. package/src/timeline/Timeline.tsx +6 -6
  311. package/src/timeline/TimelineRow.tsx +1 -0
  312. package/src/timeline/hooks/usePeriodContext.tsx +1 -1
  313. package/src/timeline/period/ClickablePeriod.tsx +42 -38
  314. package/src/timeline/period/index.tsx +5 -4
  315. package/src/timeline/timeline.stories.tsx +11 -10
  316. package/src/timeline/utils/timeline.ts +3 -3
  317. package/src/toggle-group/ToggleGroup.stories.tsx +25 -29
  318. package/src/toggle-group/ToggleGroup.tsx +0 -1
  319. package/src/tooltip/Tooltip.test.tsx +40 -54
  320. package/src/tooltip/Tooltip.tsx +1 -1
  321. package/src/typography/Heading.tsx +1 -1
  322. package/src/util/RandomIcon.tsx +1 -0
  323. package/src/util/Slot.tsx +69 -0
  324. package/src/util/__tests__/Slot.test.tsx +98 -0
  325. package/src/util/mergeRefs.tsx +1 -1
  326. package/src/util/useId.ts +1 -3
  327. package/cjs/date/datepicker/caption/Caption.js +0 -23
  328. package/cjs/date/datepicker/caption/index.js +0 -10
  329. package/cjs/date/datepicker/caption/package.json +0 -6
  330. package/esm/date/datepicker/DayButton.d.ts +0 -3
  331. package/esm/date/datepicker/DayButton.js.map +0 -1
  332. package/esm/date/datepicker/TableHead.d.ts +0 -3
  333. package/esm/date/datepicker/TableHead.js.map +0 -1
  334. package/esm/date/datepicker/caption/Caption.js +0 -17
  335. package/esm/date/datepicker/caption/Caption.js.map +0 -1
  336. package/esm/date/datepicker/caption/DropdownCaption.js +0 -38
  337. package/esm/date/datepicker/caption/DropdownCaption.js.map +0 -1
  338. package/esm/date/datepicker/caption/index.d.ts +0 -2
  339. package/esm/date/datepicker/caption/index.js +0 -3
  340. package/esm/date/datepicker/caption/index.js.map +0 -1
  341. package/src/date/datepicker/caption/DropdownCaption.tsx +0 -108
  342. package/src/date/datepicker/caption/index.ts +0 -2
@@ -2,7 +2,7 @@ import format from "date-fns/format";
2
2
  import React, { useRef } from "react";
3
3
  import { Button, DayProps, useDayPicker, useDayRender } from "react-day-picker";
4
4
 
5
- export const DayButton = (props: DayProps) => {
5
+ const DayButton = (props: DayProps) => {
6
6
  const buttonRef = useRef<HTMLButtonElement>(null);
7
7
  const dayRender = useDayRender(props.date, props.displayMonth, buttonRef);
8
8
  const { locale } = useDayPicker();
@@ -25,3 +25,5 @@ export const DayButton = (props: DayProps) => {
25
25
  />
26
26
  );
27
27
  };
28
+
29
+ export default DayButton;
@@ -0,0 +1,113 @@
1
+ import { ArrowLeftIcon, ArrowRightIcon } from "@navikt/aksel-icons";
2
+ import setMonth from "date-fns/setMonth";
3
+ import setYear from "date-fns/setYear";
4
+ import startOfMonth from "date-fns/startOfMonth";
5
+ import React from "react";
6
+ import { CaptionProps, useDayPicker, useNavigation } from "react-day-picker";
7
+ import { Button, Select } from "../../..";
8
+ import { getMonths, getYears } from "../../utils/get-dates";
9
+ import { labelMonthDropdown, labelYearDropdown } from "../../utils/labels";
10
+ import { max, min } from "date-fns";
11
+ import WeekRow from "./WeekRow";
12
+
13
+ /**
14
+ * https://github.com/gpbl/react-day-picker/tree/main/src/components/CaptionDropdowns
15
+ */
16
+ export const DropdownCaption = ({ displayMonth, id }: CaptionProps) => {
17
+ const { goToMonth, nextMonth, previousMonth } = useNavigation();
18
+ const {
19
+ fromDate,
20
+ toDate,
21
+ formatters: { formatYearCaption, formatMonthCaption, formatCaption },
22
+ labels: { labelPrevious, labelNext },
23
+ locale,
24
+ } = useDayPicker();
25
+
26
+ if (!fromDate || !toDate) {
27
+ console.warn("Using dropdownCaption required fromDate and toDate");
28
+ return null;
29
+ }
30
+
31
+ const handleYearChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {
32
+ const newMonth = setYear(
33
+ startOfMonth(displayMonth),
34
+ Number(e.target.value)
35
+ );
36
+ goToMonth(startOfMonth(min([max([newMonth, fromDate]), toDate])));
37
+ };
38
+
39
+ const handleMonthChange: React.ChangeEventHandler<HTMLSelectElement> = (e) =>
40
+ goToMonth(setMonth(startOfMonth(displayMonth), Number(e.target.value)));
41
+
42
+ const years = getYears(fromDate, toDate, displayMonth.getFullYear());
43
+ const months = getMonths(fromDate, toDate, displayMonth);
44
+
45
+ const previousLabel = labelPrevious(previousMonth, { locale });
46
+ const nextLabel = labelNext(nextMonth, { locale });
47
+ const yearDropdownLabel = labelYearDropdown(locale);
48
+ const MonthDropdownLabel = labelMonthDropdown(locale);
49
+
50
+ return (
51
+ <>
52
+ <div className="navds-date__caption">
53
+ <span
54
+ aria-live="polite"
55
+ aria-atomic="true"
56
+ id={id}
57
+ className="navds-sr-only"
58
+ >
59
+ {formatCaption(displayMonth, { locale })}
60
+ </span>
61
+ <Button
62
+ variant="tertiary"
63
+ disabled={!previousMonth}
64
+ onClick={() => previousMonth && goToMonth(previousMonth)}
65
+ icon={<ArrowLeftIcon title={previousLabel} />}
66
+ className="navds-date__caption-button"
67
+ type="button"
68
+ />
69
+
70
+ <div className="navds-date__caption">
71
+ <Select
72
+ label={MonthDropdownLabel}
73
+ hideLabel
74
+ className="navds-date__caption__month"
75
+ value={displayMonth.getMonth()}
76
+ onChange={handleMonthChange}
77
+ >
78
+ {months.map((m) => (
79
+ <option key={m.getMonth()} value={m.getMonth()}>
80
+ {formatMonthCaption(m, { locale })}
81
+ </option>
82
+ ))}
83
+ </Select>
84
+ <Select
85
+ label={yearDropdownLabel}
86
+ hideLabel
87
+ value={displayMonth.getFullYear()}
88
+ onChange={handleYearChange}
89
+ className="navds-date__caption__year"
90
+ >
91
+ {years.map((year) => (
92
+ <option key={year.getFullYear()} value={year.getFullYear()}>
93
+ {formatYearCaption(year, { locale })}
94
+ </option>
95
+ ))}
96
+ </Select>
97
+ </div>
98
+
99
+ <Button
100
+ icon={<ArrowRightIcon title={nextLabel} />}
101
+ onClick={() => nextMonth && goToMonth(nextMonth)}
102
+ disabled={!nextMonth}
103
+ variant="tertiary"
104
+ className="navds-date__caption-button"
105
+ type="button"
106
+ />
107
+ </div>
108
+ <WeekRow displayMonth={displayMonth} />
109
+ </>
110
+ );
111
+ };
112
+
113
+ export default DropdownCaption;
@@ -0,0 +1,56 @@
1
+ import React from "react";
2
+ import { addDays, Locale, startOfWeek } from "date-fns";
3
+ import { useDayPicker } from "react-day-picker";
4
+ import { Hide } from "../../../layout/responsive";
5
+
6
+ /**
7
+ * https://github.com/gpbl/react-day-picker/tree/main/src/components/HeadRow
8
+ */
9
+ export function HeadRow(): JSX.Element {
10
+ const {
11
+ classNames,
12
+ styles,
13
+ showWeekNumber,
14
+ locale,
15
+ formatters: { formatWeekdayName },
16
+ labels: { labelWeekday },
17
+ } = useDayPicker();
18
+
19
+ const weekdays = getWeekdays(locale);
20
+
21
+ return (
22
+ <tr style={styles.head_row} className={classNames.head_row}>
23
+ {showWeekNumber && (
24
+ <Hide below="sm" asChild>
25
+ <td style={styles.head_cell} className={classNames.head_cell}></td>
26
+ </Hide>
27
+ )}
28
+ {weekdays.map((weekday, i) => (
29
+ <th
30
+ key={i}
31
+ scope="col"
32
+ className={classNames.head_cell}
33
+ style={styles.head_cell}
34
+ aria-label={labelWeekday(weekday, { locale })}
35
+ >
36
+ {formatWeekdayName(weekday, { locale })}
37
+ </th>
38
+ ))}
39
+ </tr>
40
+ );
41
+ }
42
+
43
+ /**
44
+ * Generate a series of 7 days, starting from the week, to use for formatting
45
+ * the weekday names (Monday, Tuesday, etc.).
46
+ */
47
+ export function getWeekdays(locale?: Locale): Date[] {
48
+ const start = startOfWeek(new Date(), { locale, weekStartsOn: 1 });
49
+
50
+ const days: Date[] = [];
51
+ for (let i = 0; i < 7; i++) {
52
+ const day = addDays(start, i);
53
+ days.push(day);
54
+ }
55
+ return days;
56
+ }
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import { getUnixTime } from "date-fns";
3
+ import { useDayPicker, Day } from "react-day-picker";
4
+ import WeekNumber from "./WeekNumber";
5
+ import { Hide } from "../../../layout/responsive";
6
+
7
+ /**
8
+ * The props for the {@link Row} component.
9
+ */
10
+ export interface RowProps {
11
+ /** The month where the row is displayed. */
12
+ displayMonth: Date;
13
+ /** The number of the week to render. */
14
+ weekNumber: number;
15
+ /** The days contained in the week. */
16
+ dates: Date[];
17
+ }
18
+
19
+ /**
20
+ * https://github.com/gpbl/react-day-picker/tree/main/src/components/Row
21
+ */
22
+ function Row(props: RowProps): JSX.Element {
23
+ const { styles, classNames, showWeekNumber } = useDayPicker();
24
+
25
+ return (
26
+ <tr className={classNames.row} style={styles.row}>
27
+ {showWeekNumber && (
28
+ <Hide below="sm" asChild>
29
+ <td className={classNames.cell} style={styles.cell}>
30
+ <WeekNumber number={props.weekNumber} dates={props.dates} />
31
+ </td>
32
+ </Hide>
33
+ )}
34
+ {props.dates.map((date) => (
35
+ <td
36
+ className={classNames.cell}
37
+ style={styles.cell}
38
+ key={getUnixTime(date)}
39
+ >
40
+ <Day displayMonth={props.displayMonth} date={date} />
41
+ </td>
42
+ ))}
43
+ </tr>
44
+ );
45
+ }
46
+
47
+ export default Row;
@@ -1,8 +1,10 @@
1
1
  import React from "react";
2
2
  import { HeadRow, useDayPicker } from "react-day-picker";
3
3
 
4
- /** Render the table head. */
5
- export function TableHead(): JSX.Element {
4
+ /**
5
+ * https://github.com/gpbl/react-day-picker/tree/main/src/components/Head
6
+ */
7
+ function TableHead(): JSX.Element {
6
8
  const { classNames, styles, components } = useDayPicker();
7
9
  const HeadRowComponent = components?.HeadRow ?? HeadRow;
8
10
  return (
@@ -11,3 +13,5 @@ export function TableHead(): JSX.Element {
11
13
  </thead>
12
14
  );
13
15
  }
16
+
17
+ export default TableHead;
@@ -0,0 +1,79 @@
1
+ /* https://github.com/gpbl/react-day-picker/blob/7f78cd5/src/components/WeekNumber/WeekNumber.tsx#L21 */
2
+ import React from "react";
3
+ import { Button, useDayPicker } from "react-day-picker";
4
+ import { labelWeekNumber, labelWeekNumberButton } from "../../utils/labels";
5
+
6
+ export interface WeekNumberProps {
7
+ /** The number of the week. */
8
+ number: number;
9
+ /** The dates in the week. */
10
+ dates: Date[];
11
+ headerVersion?: boolean;
12
+ }
13
+
14
+ /**
15
+ * https://github.com/gpbl/react-day-picker/tree/main/src/components/WeekNumber
16
+ */
17
+ function WeekNumber(props: WeekNumberProps): JSX.Element {
18
+ const { number: weekNumber, dates } = props;
19
+ const {
20
+ onWeekNumberClick,
21
+ styles,
22
+ classNames,
23
+ locale: { code },
24
+ } = useDayPicker();
25
+
26
+ const weekLabel = labelWeekNumber({
27
+ week: Number(weekNumber),
28
+ localeCode: code,
29
+ });
30
+
31
+ if (!onWeekNumberClick) {
32
+ return (
33
+ <span
34
+ className={classNames.weeknumber}
35
+ style={styles.weeknumber}
36
+ aria-label={weekLabel}
37
+ >
38
+ {weekNumber}
39
+ </span>
40
+ );
41
+ }
42
+
43
+ const label = labelWeekNumberButton({
44
+ week: Number(weekNumber),
45
+ localeCode: code,
46
+ });
47
+
48
+ const handleClick: React.MouseEventHandler = function (e) {
49
+ onWeekNumberClick(weekNumber, dates, e);
50
+ };
51
+
52
+ if (props?.headerVersion) {
53
+ return (
54
+ <Button
55
+ name="week-number"
56
+ aria-label={label}
57
+ className={classNames.weeknumber}
58
+ style={styles.weeknumber}
59
+ onClick={handleClick}
60
+ >
61
+ {weekNumber}
62
+ </Button>
63
+ );
64
+ }
65
+
66
+ return (
67
+ <Button
68
+ name="week-number"
69
+ aria-label={label}
70
+ className={classNames.weeknumber}
71
+ style={styles.weeknumber}
72
+ onClick={handleClick}
73
+ >
74
+ {weekNumber}
75
+ </Button>
76
+ );
77
+ }
78
+
79
+ export default WeekNumber;
@@ -0,0 +1,60 @@
1
+ import React from "react";
2
+ import { useDayPicker } from "react-day-picker";
3
+ import { Show } from "../../../layout/responsive";
4
+ import { Detail } from "../../../typography";
5
+ import { getMonthWeeks } from "../../utils/get-month-weeks";
6
+ import { labelWeek } from "../../utils/labels";
7
+ import WeekNumber from "./WeekNumber";
8
+ import { useId } from "../../../util";
9
+
10
+ const WeekRow = ({ displayMonth }: { displayMonth: Date }) => {
11
+ const { locale, fixedWeeks, onWeekNumberClick } = useDayPicker();
12
+
13
+ const labelId = useId();
14
+
15
+ if (!onWeekNumberClick) {
16
+ return null;
17
+ }
18
+
19
+ const weeks = getMonthWeeks(displayMonth, {
20
+ useFixedWeeks: Boolean(fixedWeeks),
21
+ locale,
22
+ });
23
+
24
+ return (
25
+ <Show below="sm" asChild>
26
+ <table className="rdp-table" role="grid">
27
+ <tbody className="rdp-tbody">
28
+ <tr className="rdp-row navds-date__week-row">
29
+ <Detail
30
+ as="th"
31
+ weight="semibold"
32
+ className="rdp-cell navds-date__week-cell"
33
+ >
34
+ <span className="navds-date__week-wrapper" id={labelId}>
35
+ {labelWeek(locale?.code)}
36
+ </span>
37
+ </Detail>
38
+
39
+ {weeks.map((week) => (
40
+ <td
41
+ key={week.weekNumber}
42
+ className="rdp-cell navds-date__week-cell"
43
+ >
44
+ <span className="navds-date__week-wrapper">
45
+ <WeekNumber
46
+ number={week.weekNumber}
47
+ dates={week.dates}
48
+ headerVersion
49
+ />
50
+ </span>
51
+ </td>
52
+ ))}
53
+ </tr>
54
+ </tbody>
55
+ </table>
56
+ </Show>
57
+ );
58
+ };
59
+
60
+ export default WeekRow;
@@ -207,7 +207,7 @@ export const useDatepicker = (
207
207
  return;
208
208
  }
209
209
  !open && openOnFocus && handleOpen(true);
210
- let day = parseDate(
210
+ const day = parseDate(
211
211
  e.target.value,
212
212
  today,
213
213
  locale,
@@ -227,7 +227,7 @@ export const useDatepicker = (
227
227
  };
228
228
 
229
229
  const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {
230
- let day = parseDate(
230
+ const day = parseDate(
231
231
  e.target.value,
232
232
  today,
233
233
  locale,
@@ -204,7 +204,7 @@ export const useMonthpicker = (
204
204
  return;
205
205
  }
206
206
  !open && openOnFocus && handleOpen(true);
207
- let day = parseDate(
207
+ const day = parseDate(
208
208
  e.target.value,
209
209
  today,
210
210
  locale,
@@ -223,7 +223,7 @@ export const useMonthpicker = (
223
223
  };
224
224
 
225
225
  const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {
226
- let day = parseDate(
226
+ const day = parseDate(
227
227
  e.target.value,
228
228
  today,
229
229
  locale,
@@ -1,5 +1,5 @@
1
- /* eslint-disable react/jsx-pascal-case */
2
- import { act, render } from "@testing-library/react";
1
+ /* eslint-disable testing-library/no-unnecessary-act -- https://kentcdodds.com/blog/fix-the-not-wrapped-in-act-warning */
2
+ import { act, render, screen } from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import React from "react";
5
5
  import { DatePicker, useRangeDatepicker } from "..";
@@ -23,15 +23,15 @@ const RangeDemo = () => {
23
23
 
24
24
  describe("Writing in input sets correct values", () => {
25
25
  it("useRangeDatepicker same date", async () => {
26
- const utils = render(<RangeDemo />);
26
+ render(<RangeDemo />);
27
27
 
28
- const fraInput = utils.getByRole("textbox", { name: "Fra" });
29
- const tilInput = utils.getByRole("textbox", { name: "Til" });
28
+ const fraInput = screen.getByRole("textbox", { name: "Fra" });
29
+ const tilInput = screen.getByRole("textbox", { name: "Til" });
30
30
  await act(async () => {
31
31
  await userEvent.type(fraInput, "03.08.2022");
32
32
  await userEvent.type(tilInput, "03.08.2022");
33
33
  });
34
- const res = utils.getByTitle("res");
34
+ const res = screen.getByTitle("res");
35
35
  expect(res.innerHTML).toEqual(
36
36
  JSON.stringify({
37
37
  from: "2022-08-03T00:00:00.000Z",
@@ -40,16 +40,16 @@ describe("Writing in input sets correct values", () => {
40
40
  );
41
41
  });
42
42
 
43
- it("useRangeDatepicker before after to ", async () => {
44
- const utils = render(<RangeDemo />);
43
+ it("useRangeDatepicker before after to", async () => {
44
+ render(<RangeDemo />);
45
45
 
46
- const fraInput = utils.getByRole("textbox", { name: "Fra" });
47
- const tilInput = utils.getByRole("textbox", { name: "Til" });
46
+ const fraInput = screen.getByRole("textbox", { name: "Fra" });
47
+ const tilInput = screen.getByRole("textbox", { name: "Til" });
48
48
  await act(async () => {
49
49
  await userEvent.type(fraInput, "03.08.2022");
50
50
  await userEvent.type(tilInput, "02.08.2022");
51
51
  });
52
- const res = utils.getByTitle("res");
52
+ const res = screen.getByTitle("res");
53
53
  expect(res.innerHTML).toEqual(
54
54
  JSON.stringify({
55
55
  from: "2022-08-03T00:00:00.000Z",
@@ -325,7 +325,7 @@ export const useRangeDatepicker = (
325
325
  return;
326
326
  }
327
327
  !open && openOnFocus && setOpen(true);
328
- let day = parseDate(
328
+ const day = parseDate(
329
329
  e.target.value,
330
330
  today,
331
331
  locale,
@@ -349,7 +349,7 @@ export const useRangeDatepicker = (
349
349
  };
350
350
 
351
351
  const handleBlur = (e, src: RangeT) => {
352
- let day = parseDate(
352
+ const day = parseDate(
353
353
  e.target.value,
354
354
  today,
355
355
  locale,
@@ -379,7 +379,7 @@ export const useRangeDatepicker = (
379
379
  if (range?.from && range?.to) {
380
380
  setOpen(false);
381
381
  }
382
- let prevToRange =
382
+ const prevToRange =
383
383
  !selectedRange?.from && selectedRange?.to ? selectedRange?.to : range?.to;
384
384
 
385
385
  const resetTo = isBefore(prevToRange, range?.from);
@@ -13,9 +13,9 @@ interface MonthType {
13
13
  month: Date;
14
14
  months: Date[];
15
15
  focus: Date | undefined;
16
- setFocus: Function;
16
+ setFocus: (date?: Date) => void;
17
17
  tabRoot?: Date;
18
- setTabRoot: Function;
18
+ setTabRoot: (date?: Date) => void;
19
19
  }
20
20
 
21
21
  const disableMonth = (month: Date, fromDate?: Date, toDate?: Date) => {
@@ -70,7 +70,7 @@ export interface MonthPickerProps extends React.HTMLAttributes<HTMLDivElement> {
70
70
  /**
71
71
  * Callback for user-controlled state
72
72
  */
73
- onMonthSelect?: Function;
73
+ onMonthSelect?: (month?: Date) => void;
74
74
  /**
75
75
  * Used to set visible year programmatically. Component controlled by default
76
76
  */
@@ -62,9 +62,9 @@ export const MonthSelector = () => {
62
62
  return (
63
63
  <BodyShort as="table" className="rdp-table">
64
64
  <tbody className="rdp-tbody">
65
- {tableMonths.map((x, y) => (
66
- <tr className="rdp-row" key={y}>
67
- {x.map((month: Date, y) => {
65
+ {tableMonths.map((months, i) => (
66
+ <tr className="rdp-row" key={i}>
67
+ {months.map((month: Date) => {
68
68
  return (
69
69
  <td key={month.toDateString()} className="rdp-cell">
70
70
  <MonthButton
@@ -42,7 +42,7 @@ Default.argTypes = {
42
42
  },
43
43
  };
44
44
 
45
- export const dropdownCaption = () => {
45
+ export const DropdownCaption = () => {
46
46
  return (
47
47
  <MonthPicker.Standalone
48
48
  dropdownCaption
@@ -22,18 +22,6 @@ describe("Returns initial year for monthpicker", () => {
22
22
  )
23
23
  ).toBeFalsy();
24
24
  });
25
- test("Default selected should not be valid (false)", () => {
26
- expect(
27
- isSameYear(
28
- new Date("Oct 4 2021"),
29
- getInitialYear({
30
- defaultMonth: new Date("Aug 4 2020"),
31
- /* toDate: new Date("Oct 4 2021"), */
32
- /* fromDate: new Date("Oct 4 2021"), */
33
- })
34
- )
35
- ).toBeFalsy();
36
- });
37
25
  test("Default selected should be valid with fromDate", () => {
38
26
  expect(
39
27
  isSameYear(