@sixthshift/design-system 0.2.1 → 0.4.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 (604) hide show
  1. package/README.md +242 -33
  2. package/dist/components/Badge/Badge.d.ts +65 -7
  3. package/dist/components/Badge/Badge.d.ts.map +1 -1
  4. package/dist/components/Badge/Badge.js +56 -46
  5. package/dist/components/Badge/Badge.js.map +1 -1
  6. package/dist/components/Badge/index.d.ts +1 -1
  7. package/dist/components/Badge/index.d.ts.map +1 -1
  8. package/dist/components/Badge/index.js +1 -1
  9. package/dist/components/Badge/index.js.map +1 -1
  10. package/dist/components/BarChart/BarChart.d.ts +20 -2
  11. package/dist/components/BarChart/BarChart.d.ts.map +1 -1
  12. package/dist/components/BarChart/BarChart.js +17 -3
  13. package/dist/components/BarChart/BarChart.js.map +1 -1
  14. package/dist/components/Button/Button.d.ts +85 -6
  15. package/dist/components/Button/Button.d.ts.map +1 -1
  16. package/dist/components/Button/Button.js +97 -106
  17. package/dist/components/Button/Button.js.map +1 -1
  18. package/dist/components/Button/index.d.ts +1 -1
  19. package/dist/components/Button/index.d.ts.map +1 -1
  20. package/dist/components/Button/index.js +1 -1
  21. package/dist/components/Button/index.js.map +1 -1
  22. package/dist/components/Calendar/Calendar.d.ts +31 -1
  23. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  24. package/dist/components/Calendar/Calendar.js +94 -225
  25. package/dist/components/Calendar/Calendar.js.map +1 -1
  26. package/dist/components/Calendar/CalendarView.d.ts +15 -0
  27. package/dist/components/Calendar/CalendarView.d.ts.map +1 -0
  28. package/dist/components/Calendar/CalendarView.js +263 -0
  29. package/dist/components/Calendar/CalendarView.js.map +1 -0
  30. package/dist/components/Calendar/calendar.types.d.ts +87 -27
  31. package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
  32. package/dist/components/Calendar/calendar.types.js +10 -3
  33. package/dist/components/Calendar/calendar.types.js.map +1 -1
  34. package/dist/components/Calendar/index.d.ts +16 -2
  35. package/dist/components/Calendar/index.d.ts.map +1 -1
  36. package/dist/components/Calendar/index.js +15 -1
  37. package/dist/components/Calendar/index.js.map +1 -1
  38. package/dist/components/Card/Card.d.ts +13 -0
  39. package/dist/components/Card/Card.d.ts.map +1 -1
  40. package/dist/components/Card/Card.js +15 -2
  41. package/dist/components/Card/Card.js.map +1 -1
  42. package/dist/components/Checkbox/Checkbox.d.ts +21 -0
  43. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  44. package/dist/components/Checkbox/Checkbox.js +22 -1
  45. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  46. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
  47. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  48. package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
  49. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  50. package/dist/components/Code/Editor/Editor.js +2 -2
  51. package/dist/components/Code/Editor/Editor.js.map +1 -1
  52. package/dist/components/Code/Editor/themes.d.ts +2 -2
  53. package/dist/components/Code/Editor/themes.d.ts.map +1 -1
  54. package/dist/components/Code/Editor/themes.js +50 -32
  55. package/dist/components/Code/Editor/themes.js.map +1 -1
  56. package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
  57. package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
  58. package/dist/components/DatePicker/DatePicker.d.ts +45 -2
  59. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  60. package/dist/components/DatePicker/DatePicker.js +228 -11
  61. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  62. package/dist/components/DatePicker/DateSegments.d.ts +60 -0
  63. package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
  64. package/dist/components/DatePicker/DateSegments.js +80 -0
  65. package/dist/components/DatePicker/DateSegments.js.map +1 -0
  66. package/dist/components/DatePicker/datepicker.types.d.ts +53 -37
  67. package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
  68. package/dist/components/DatePicker/datepicker.types.js +5 -3
  69. package/dist/components/DatePicker/datepicker.types.js.map +1 -1
  70. package/dist/components/DatePicker/index.d.ts +10 -1
  71. package/dist/components/DatePicker/index.d.ts.map +1 -1
  72. package/dist/components/DatePicker/index.js +8 -0
  73. package/dist/components/DatePicker/index.js.map +1 -1
  74. package/dist/components/DateRangePicker/DateRangePicker.d.ts +22 -3
  75. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  76. package/dist/components/DateRangePicker/DateRangePicker.js +38 -24
  77. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  78. package/dist/components/DateRangePicker/daterangepicker.types.d.ts +26 -21
  79. package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
  80. package/dist/components/DateRangePicker/daterangepicker.types.js +6 -0
  81. package/dist/components/DateRangePicker/daterangepicker.types.js.map +1 -1
  82. package/dist/components/DateRangePicker/index.d.ts +8 -1
  83. package/dist/components/DateRangePicker/index.d.ts.map +1 -1
  84. package/dist/components/DateRangePicker/index.js +6 -0
  85. package/dist/components/DateRangePicker/index.js.map +1 -1
  86. package/dist/components/DateTimePicker/DateTimePicker.d.ts +32 -4
  87. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  88. package/dist/components/DateTimePicker/DateTimePicker.js +133 -42
  89. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  90. package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
  91. package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
  92. package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
  93. package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
  94. package/dist/components/DateTimePicker/datetimepicker.types.d.ts +26 -18
  95. package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
  96. package/dist/components/DateTimePicker/datetimepicker.types.js +10 -0
  97. package/dist/components/DateTimePicker/datetimepicker.types.js.map +1 -1
  98. package/dist/components/DateTimePicker/index.d.ts +8 -1
  99. package/dist/components/DateTimePicker/index.d.ts.map +1 -1
  100. package/dist/components/DateTimePicker/index.js +6 -0
  101. package/dist/components/DateTimePicker/index.js.map +1 -1
  102. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +30 -4
  103. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  104. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +171 -72
  105. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  106. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +28 -19
  107. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
  108. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js +8 -0
  109. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js.map +1 -1
  110. package/dist/components/DateTimeRangePicker/index.d.ts +8 -0
  111. package/dist/components/DateTimeRangePicker/index.d.ts.map +1 -1
  112. package/dist/components/DateTimeRangePicker/index.js +7 -0
  113. package/dist/components/DateTimeRangePicker/index.js.map +1 -1
  114. package/dist/components/Field/Field.d.ts +18 -20
  115. package/dist/components/Field/Field.d.ts.map +1 -1
  116. package/dist/components/Field/Field.js +22 -5
  117. package/dist/components/Field/Field.js.map +1 -1
  118. package/dist/components/FormField/FormField.d.ts +15 -0
  119. package/dist/components/FormField/FormField.d.ts.map +1 -1
  120. package/dist/components/FormField/FormField.js +15 -0
  121. package/dist/components/FormField/FormField.js.map +1 -1
  122. package/dist/components/HoverCard/HoverCard.d.ts +6 -0
  123. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  124. package/dist/components/HoverCard/HoverCard.js +6 -0
  125. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  126. package/dist/components/Input/Input.d.ts +15 -0
  127. package/dist/components/Input/Input.d.ts.map +1 -1
  128. package/dist/components/Input/Input.js +18 -3
  129. package/dist/components/Input/Input.js.map +1 -1
  130. package/dist/components/LineChart/LineChart.d.ts +35 -2
  131. package/dist/components/LineChart/LineChart.d.ts.map +1 -1
  132. package/dist/components/LineChart/LineChart.js +22 -3
  133. package/dist/components/LineChart/LineChart.js.map +1 -1
  134. package/dist/components/Markdown/Markdown.d.ts +19 -4
  135. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  136. package/dist/components/Markdown/Markdown.js +20 -2
  137. package/dist/components/Markdown/Markdown.js.map +1 -1
  138. package/dist/components/Message/Message.d.ts +49 -4
  139. package/dist/components/Message/Message.d.ts.map +1 -1
  140. package/dist/components/Message/Message.js +62 -11
  141. package/dist/components/Message/Message.js.map +1 -1
  142. package/dist/components/Message/index.d.ts +1 -1
  143. package/dist/components/Message/index.d.ts.map +1 -1
  144. package/dist/components/Modal/Modal.d.ts +60 -5
  145. package/dist/components/Modal/Modal.d.ts.map +1 -1
  146. package/dist/components/Modal/Modal.js +52 -6
  147. package/dist/components/Modal/Modal.js.map +1 -1
  148. package/dist/components/Modal/components/ModalContext.d.ts +14 -0
  149. package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
  150. package/dist/components/Modal/components/ModalContext.js.map +1 -1
  151. package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
  152. package/dist/components/Modal/components/ModalHeader.js +13 -2
  153. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  154. package/dist/components/Popover/Popover.d.ts +29 -0
  155. package/dist/components/Popover/Popover.d.ts.map +1 -1
  156. package/dist/components/Popover/Popover.js +36 -0
  157. package/dist/components/Popover/Popover.js.map +1 -1
  158. package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
  159. package/dist/components/Popover/components/PopoverBody.js +5 -2
  160. package/dist/components/Popover/components/PopoverBody.js.map +1 -1
  161. package/dist/components/Popover/components/PopoverContext.d.ts +1 -0
  162. package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
  163. package/dist/components/Popover/components/PopoverContext.js.map +1 -1
  164. package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
  165. package/dist/components/Popover/components/PopoverTrigger.js +2 -2
  166. package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
  167. package/dist/components/ProgressBar/ProgressBar.d.ts +16 -1
  168. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  169. package/dist/components/ProgressBar/ProgressBar.js +19 -3
  170. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  171. package/dist/components/RadioButton/RadioButton.d.ts +26 -0
  172. package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
  173. package/dist/components/RadioButton/RadioButton.js +35 -1
  174. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  175. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
  176. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  177. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
  178. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  179. package/dist/components/SearchInput/SearchInput.d.ts +10 -0
  180. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  181. package/dist/components/SearchInput/SearchInput.js +12 -1
  182. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  183. package/dist/components/Select/Select.d.ts +10 -2
  184. package/dist/components/Select/Select.d.ts.map +1 -1
  185. package/dist/components/Select/Select.js +63 -18
  186. package/dist/components/Select/Select.js.map +1 -1
  187. package/dist/components/Select/SelectDropdown.d.ts +14 -2
  188. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  189. package/dist/components/Select/SelectDropdown.js +20 -4
  190. package/dist/components/Select/SelectDropdown.js.map +1 -1
  191. package/dist/components/Select/SelectTrigger.d.ts +10 -3
  192. package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
  193. package/dist/components/Select/SelectTrigger.js +12 -3
  194. package/dist/components/Select/SelectTrigger.js.map +1 -1
  195. package/dist/components/Select/useSelectKeyboard.d.ts +15 -1
  196. package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
  197. package/dist/components/Select/useSelectKeyboard.js +73 -65
  198. package/dist/components/Select/useSelectKeyboard.js.map +1 -1
  199. package/dist/components/Separator/Separator.d.ts +10 -0
  200. package/dist/components/Separator/Separator.d.ts.map +1 -1
  201. package/dist/components/Separator/Separator.js +10 -0
  202. package/dist/components/Separator/Separator.js.map +1 -1
  203. package/dist/components/Sheet/Sheet.d.ts +25 -5
  204. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  205. package/dist/components/Sheet/Sheet.js +24 -6
  206. package/dist/components/Sheet/Sheet.js.map +1 -1
  207. package/dist/components/Sheet/components/SheetContext.d.ts +10 -0
  208. package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
  209. package/dist/components/Sheet/components/SheetContext.js.map +1 -1
  210. package/dist/components/Sheet/components/SheetFooter.js +1 -1
  211. package/dist/components/Sheet/components/SheetFooter.js.map +1 -1
  212. package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
  213. package/dist/components/Sheet/components/SheetHeader.js +11 -2
  214. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  215. package/dist/components/Sparkline/Sparkline.d.ts +21 -2
  216. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  217. package/dist/components/Sparkline/Sparkline.js +16 -3
  218. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  219. package/dist/components/Spinner/Spinner.d.ts +27 -2
  220. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  221. package/dist/components/Spinner/Spinner.js +28 -3
  222. package/dist/components/Spinner/Spinner.js.map +1 -1
  223. package/dist/components/Switch/Switch.d.ts +18 -0
  224. package/dist/components/Switch/Switch.d.ts.map +1 -1
  225. package/dist/components/Switch/Switch.js +19 -1
  226. package/dist/components/Switch/Switch.js.map +1 -1
  227. package/dist/components/Tabs/Tabs.d.ts +8 -2
  228. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  229. package/dist/components/Tabs/Tabs.js +6 -0
  230. package/dist/components/Tabs/Tabs.js.map +1 -1
  231. package/dist/components/Tabs/components/TabsList.d.ts +1 -1
  232. package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
  233. package/dist/components/Tabs/components/TabsList.js +5 -4
  234. package/dist/components/Tabs/components/TabsList.js.map +1 -1
  235. package/dist/components/Tabs/components/TabsPanels.d.ts +1 -1
  236. package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
  237. package/dist/components/Tabs/components/TabsPanels.js +5 -3
  238. package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
  239. package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
  240. package/dist/components/Tabs/components/TabsTrigger.js +22 -6
  241. package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
  242. package/dist/components/TagChip/TagChip.d.ts +16 -13
  243. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  244. package/dist/components/TagChip/TagChip.js +18 -3
  245. package/dist/components/TagChip/TagChip.js.map +1 -1
  246. package/dist/components/TagInput/TagInput.d.ts +12 -9
  247. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  248. package/dist/components/TagInput/TagInput.js +16 -4
  249. package/dist/components/TagInput/TagInput.js.map +1 -1
  250. package/dist/components/Text/Text.d.ts +9 -0
  251. package/dist/components/Text/Text.d.ts.map +1 -1
  252. package/dist/components/Text/Text.js +9 -0
  253. package/dist/components/Text/Text.js.map +1 -1
  254. package/dist/components/TextInline/TextInline.d.ts +15 -4
  255. package/dist/components/TextInline/TextInline.d.ts.map +1 -1
  256. package/dist/components/TextInline/TextInline.js +11 -0
  257. package/dist/components/TextInline/TextInline.js.map +1 -1
  258. package/dist/components/Textarea/Textarea.d.ts +12 -0
  259. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  260. package/dist/components/Textarea/Textarea.js +13 -1
  261. package/dist/components/Textarea/Textarea.js.map +1 -1
  262. package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
  263. package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
  264. package/dist/components/TimePicker/TimeColumn.js +8 -1
  265. package/dist/components/TimePicker/TimeColumn.js.map +1 -1
  266. package/dist/components/TimePicker/TimePicker.d.ts +34 -2
  267. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  268. package/dist/components/TimePicker/TimePicker.js +118 -15
  269. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  270. package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
  271. package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
  272. package/dist/components/TimePicker/TimeSegments.js +93 -0
  273. package/dist/components/TimePicker/TimeSegments.js.map +1 -0
  274. package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
  275. package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
  276. package/dist/components/TimePicker/timepicker.hooks.js +1 -23
  277. package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
  278. package/dist/components/TimePicker/timepicker.types.d.ts +14 -15
  279. package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
  280. package/dist/components/TimePicker/timepicker.types.js +4 -3
  281. package/dist/components/TimePicker/timepicker.types.js.map +1 -1
  282. package/dist/components/Toast/Toast.d.ts +27 -0
  283. package/dist/components/Toast/Toast.d.ts.map +1 -1
  284. package/dist/components/Toast/Toast.js +28 -1
  285. package/dist/components/Toast/Toast.js.map +1 -1
  286. package/dist/components/Toggle/Toggle.d.ts +31 -12
  287. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  288. package/dist/components/Toggle/Toggle.js +19 -31
  289. package/dist/components/Toggle/Toggle.js.map +1 -1
  290. package/dist/components/Toggle/index.d.ts +1 -1
  291. package/dist/components/Toggle/index.d.ts.map +1 -1
  292. package/dist/components/Toggle/index.js +1 -1
  293. package/dist/components/Toggle/index.js.map +1 -1
  294. package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
  295. package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
  296. package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
  297. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  298. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  299. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
  300. package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
  301. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  302. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
  303. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  304. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
  305. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  306. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
  307. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  308. package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
  309. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  310. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
  311. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  312. package/dist/components/Tooltip/Tooltip.d.ts +6 -0
  313. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  314. package/dist/components/Tooltip/Tooltip.js +6 -0
  315. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  316. package/dist/date-time/index.d.ts +2 -0
  317. package/dist/date-time/index.d.ts.map +1 -1
  318. package/dist/date-time/index.js +9 -1
  319. package/dist/date-time/index.js.map +1 -1
  320. package/dist/date-time/iso.d.ts +261 -0
  321. package/dist/date-time/iso.d.ts.map +1 -0
  322. package/dist/date-time/iso.js +358 -0
  323. package/dist/date-time/iso.js.map +1 -0
  324. package/dist/date-time/now.d.ts +7 -6
  325. package/dist/date-time/now.d.ts.map +1 -1
  326. package/dist/date-time/now.js +3 -3
  327. package/dist/date-time/now.js.map +1 -1
  328. package/dist/internal/PickerField.d.ts +45 -0
  329. package/dist/internal/PickerField.d.ts.map +1 -0
  330. package/dist/internal/PickerField.js +24 -0
  331. package/dist/internal/PickerField.js.map +1 -0
  332. package/dist/internal/SegmentedField.d.ts +98 -0
  333. package/dist/internal/SegmentedField.d.ts.map +1 -0
  334. package/dist/internal/SegmentedField.js +315 -0
  335. package/dist/internal/SegmentedField.js.map +1 -0
  336. package/dist/internal/index.d.ts +2 -0
  337. package/dist/internal/index.d.ts.map +1 -1
  338. package/dist/internal/index.js +2 -0
  339. package/dist/internal/index.js.map +1 -1
  340. package/dist/theme/index.d.ts +4 -3
  341. package/dist/theme/index.d.ts.map +1 -1
  342. package/dist/theme/index.js +3 -2
  343. package/dist/theme/index.js.map +1 -1
  344. package/dist/theme/schema.d.ts +49 -33
  345. package/dist/theme/schema.d.ts.map +1 -1
  346. package/dist/theme/schema.js +30 -21
  347. package/dist/theme/schema.js.map +1 -1
  348. package/package.json +11 -59
  349. package/src/components/Badge/Badge.tsx +87 -49
  350. package/src/components/Badge/index.ts +10 -1
  351. package/src/components/BarChart/BarChart.tsx +37 -30
  352. package/src/components/Button/Button.tsx +129 -106
  353. package/src/components/Button/index.ts +10 -1
  354. package/src/components/Calendar/Calendar.tsx +104 -401
  355. package/src/components/Calendar/CalendarView.tsx +454 -0
  356. package/src/components/Calendar/calendar.types.ts +104 -29
  357. package/src/components/Calendar/index.ts +16 -17
  358. package/src/components/Card/Card.tsx +15 -2
  359. package/src/components/Checkbox/Checkbox.tsx +22 -2
  360. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
  361. package/src/components/Code/Editor/Editor.tsx +2 -2
  362. package/src/components/Code/Editor/themes.ts +50 -32
  363. package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
  364. package/src/components/DatePicker/DatePicker.tsx +369 -42
  365. package/src/components/DatePicker/DateSegments.tsx +125 -0
  366. package/src/components/DatePicker/datepicker.types.ts +58 -39
  367. package/src/components/DatePicker/index.ts +11 -3
  368. package/src/components/DateRangePicker/DateRangePicker.tsx +38 -24
  369. package/src/components/DateRangePicker/daterangepicker.types.ts +29 -23
  370. package/src/components/DateRangePicker/index.ts +9 -1
  371. package/src/components/DateTimePicker/DateTimePicker.tsx +189 -88
  372. package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
  373. package/src/components/DateTimePicker/datetimepicker.types.ts +29 -19
  374. package/src/components/DateTimePicker/index.ts +9 -1
  375. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +251 -126
  376. package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +31 -20
  377. package/src/components/DateTimeRangePicker/index.ts +9 -0
  378. package/src/components/Field/Field.tsx +25 -26
  379. package/src/components/FormField/FormField.tsx +15 -0
  380. package/src/components/HoverCard/HoverCard.tsx +6 -0
  381. package/src/components/Input/Input.tsx +19 -4
  382. package/src/components/LineChart/LineChart.tsx +164 -141
  383. package/src/components/Markdown/Markdown.tsx +21 -3
  384. package/src/components/Message/Message.tsx +83 -17
  385. package/src/components/Message/index.ts +1 -1
  386. package/src/components/Modal/Modal.tsx +157 -86
  387. package/src/components/Modal/components/ModalContext.tsx +14 -0
  388. package/src/components/Modal/components/ModalHeader.tsx +15 -3
  389. package/src/components/Popover/Popover.tsx +36 -0
  390. package/src/components/Popover/components/PopoverBody.tsx +6 -1
  391. package/src/components/Popover/components/PopoverContext.tsx +1 -0
  392. package/src/components/Popover/components/PopoverTrigger.tsx +2 -1
  393. package/src/components/ProgressBar/ProgressBar.tsx +46 -28
  394. package/src/components/RadioButton/RadioButton.tsx +34 -3
  395. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
  396. package/src/components/SearchInput/SearchInput.tsx +13 -2
  397. package/src/components/Select/Select.tsx +75 -19
  398. package/src/components/Select/SelectDropdown.tsx +45 -12
  399. package/src/components/Select/SelectTrigger.tsx +31 -8
  400. package/src/components/Select/useSelectKeyboard.ts +20 -10
  401. package/src/components/Separator/Separator.tsx +10 -0
  402. package/src/components/Sheet/Sheet.tsx +114 -83
  403. package/src/components/Sheet/components/SheetContext.tsx +10 -0
  404. package/src/components/Sheet/components/SheetFooter.tsx +1 -1
  405. package/src/components/Sheet/components/SheetHeader.tsx +18 -3
  406. package/src/components/Sparkline/Sparkline.tsx +40 -36
  407. package/src/components/Spinner/Spinner.tsx +28 -3
  408. package/src/components/Switch/Switch.tsx +27 -4
  409. package/src/components/Tabs/Tabs.tsx +6 -0
  410. package/src/components/Tabs/components/TabsList.tsx +5 -3
  411. package/src/components/Tabs/components/TabsPanels.tsx +5 -3
  412. package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
  413. package/src/components/TagChip/TagChip.tsx +27 -18
  414. package/src/components/TagInput/TagInput.tsx +16 -11
  415. package/src/components/Text/Text.tsx +9 -0
  416. package/src/components/TextInline/TextInline.tsx +11 -0
  417. package/src/components/Textarea/Textarea.tsx +13 -1
  418. package/src/components/TimePicker/TimeColumn.tsx +24 -1
  419. package/src/components/TimePicker/TimePicker.tsx +157 -51
  420. package/src/components/TimePicker/TimeSegments.tsx +131 -0
  421. package/src/components/TimePicker/timepicker.hooks.ts +1 -24
  422. package/src/components/TimePicker/timepicker.types.ts +14 -16
  423. package/src/components/Toast/Toast.tsx +28 -1
  424. package/src/components/Toggle/Toggle.tsx +34 -32
  425. package/src/components/Toggle/index.ts +1 -1
  426. package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
  427. package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
  428. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
  429. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
  430. package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
  431. package/src/components/Tooltip/Tooltip.tsx +6 -0
  432. package/src/date-time/index.ts +61 -1
  433. package/src/date-time/iso.ts +511 -0
  434. package/src/date-time/now.ts +10 -9
  435. package/src/internal/PickerField.tsx +90 -0
  436. package/src/internal/SegmentedField.tsx +445 -0
  437. package/src/internal/index.ts +2 -0
  438. package/src/theme/index.ts +11 -9
  439. package/src/theme/recipes/badge.css +140 -0
  440. package/src/theme/recipes/button.css +167 -0
  441. package/src/theme/recipes/card.css +26 -0
  442. package/src/theme/recipes/checkbox.css +44 -0
  443. package/src/theme/recipes/field.css +14 -0
  444. package/src/theme/recipes/index.css +28 -0
  445. package/src/theme/recipes/input.css +29 -0
  446. package/src/theme/recipes/message.css +47 -0
  447. package/src/theme/recipes/modal.css +31 -0
  448. package/src/theme/recipes/radio-button.css +42 -0
  449. package/src/theme/recipes/search-input.css +16 -0
  450. package/src/theme/recipes/select.css +105 -0
  451. package/src/theme/recipes/sheet.css +34 -0
  452. package/src/theme/recipes/spinner.css +17 -0
  453. package/src/theme/recipes/switch.css +39 -0
  454. package/src/theme/recipes/tabs.css +41 -0
  455. package/src/theme/recipes/tag-chip.css +27 -0
  456. package/src/theme/recipes/textarea.css +20 -0
  457. package/src/theme/recipes/toggle.css +92 -0
  458. package/src/theme/schema.ts +59 -58
  459. package/src/theme/tokens.css +824 -0
  460. package/dist/components/Avatar/Avatar.d.ts +0 -6
  461. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  462. package/dist/components/Avatar/Avatar.js +0 -11
  463. package/dist/components/Avatar/Avatar.js.map +0 -1
  464. package/dist/components/Avatar/index.d.ts +0 -2
  465. package/dist/components/Avatar/index.d.ts.map +0 -1
  466. package/dist/components/Avatar/index.js +0 -2
  467. package/dist/components/Avatar/index.js.map +0 -1
  468. package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
  469. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  470. package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
  471. package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
  472. package/dist/components/Breadcrumb/index.d.ts +0 -2
  473. package/dist/components/Breadcrumb/index.d.ts.map +0 -1
  474. package/dist/components/Breadcrumb/index.js +0 -2
  475. package/dist/components/Breadcrumb/index.js.map +0 -1
  476. package/dist/components/ColorDot/ColorDot.d.ts +0 -13
  477. package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
  478. package/dist/components/ColorDot/ColorDot.js +0 -34
  479. package/dist/components/ColorDot/ColorDot.js.map +0 -1
  480. package/dist/components/ColorDot/index.d.ts +0 -2
  481. package/dist/components/ColorDot/index.d.ts.map +0 -1
  482. package/dist/components/ColorDot/index.js +0 -2
  483. package/dist/components/ColorDot/index.js.map +0 -1
  484. package/dist/components/EmptyState/EmptyState.d.ts +0 -15
  485. package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
  486. package/dist/components/EmptyState/EmptyState.js +0 -7
  487. package/dist/components/EmptyState/EmptyState.js.map +0 -1
  488. package/dist/components/EmptyState/index.d.ts +0 -2
  489. package/dist/components/EmptyState/index.d.ts.map +0 -1
  490. package/dist/components/EmptyState/index.js +0 -2
  491. package/dist/components/EmptyState/index.js.map +0 -1
  492. package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
  493. package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
  494. package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
  495. package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
  496. package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
  497. package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
  498. package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
  499. package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
  500. package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
  501. package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
  502. package/dist/components/HeatMap/heat-map.utils.js +0 -10
  503. package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
  504. package/dist/components/HeatMap/index.d.ts +0 -4
  505. package/dist/components/HeatMap/index.d.ts.map +0 -1
  506. package/dist/components/HeatMap/index.js +0 -3
  507. package/dist/components/HeatMap/index.js.map +0 -1
  508. package/dist/components/MetricList/MetricList.d.ts +0 -9
  509. package/dist/components/MetricList/MetricList.d.ts.map +0 -1
  510. package/dist/components/MetricList/MetricList.js +0 -6
  511. package/dist/components/MetricList/MetricList.js.map +0 -1
  512. package/dist/components/MetricList/MetricRow.d.ts +0 -13
  513. package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
  514. package/dist/components/MetricList/MetricRow.js +0 -13
  515. package/dist/components/MetricList/MetricRow.js.map +0 -1
  516. package/dist/components/MetricList/index.d.ts +0 -3
  517. package/dist/components/MetricList/index.d.ts.map +0 -1
  518. package/dist/components/MetricList/index.js +0 -3
  519. package/dist/components/MetricList/index.js.map +0 -1
  520. package/dist/components/NavBottom/NavBottom.d.ts +0 -15
  521. package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
  522. package/dist/components/NavBottom/NavBottom.js +0 -19
  523. package/dist/components/NavBottom/NavBottom.js.map +0 -1
  524. package/dist/components/NavBottom/index.d.ts +0 -3
  525. package/dist/components/NavBottom/index.d.ts.map +0 -1
  526. package/dist/components/NavBottom/index.js +0 -2
  527. package/dist/components/NavBottom/index.js.map +0 -1
  528. package/dist/components/NavSide/NavItem.d.ts +0 -9
  529. package/dist/components/NavSide/NavItem.d.ts.map +0 -1
  530. package/dist/components/NavSide/NavItem.js +0 -13
  531. package/dist/components/NavSide/NavItem.js.map +0 -1
  532. package/dist/components/NavSide/NavSide.d.ts +0 -15
  533. package/dist/components/NavSide/NavSide.d.ts.map +0 -1
  534. package/dist/components/NavSide/NavSide.js +0 -10
  535. package/dist/components/NavSide/NavSide.js.map +0 -1
  536. package/dist/components/NavSide/index.d.ts +0 -3
  537. package/dist/components/NavSide/index.d.ts.map +0 -1
  538. package/dist/components/NavSide/index.js +0 -2
  539. package/dist/components/NavSide/index.js.map +0 -1
  540. package/dist/components/NavSide/types.d.ts +0 -38
  541. package/dist/components/NavSide/types.d.ts.map +0 -1
  542. package/dist/components/NavSide/types.js +0 -2
  543. package/dist/components/NavSide/types.js.map +0 -1
  544. package/dist/components/Pagination/Pagination.d.ts +0 -35
  545. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  546. package/dist/components/Pagination/Pagination.js +0 -26
  547. package/dist/components/Pagination/Pagination.js.map +0 -1
  548. package/dist/components/Pagination/index.d.ts +0 -3
  549. package/dist/components/Pagination/index.d.ts.map +0 -1
  550. package/dist/components/Pagination/index.js +0 -2
  551. package/dist/components/Pagination/index.js.map +0 -1
  552. package/dist/components/Skeleton/Skeleton.d.ts +0 -3
  553. package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
  554. package/dist/components/Skeleton/Skeleton.js +0 -7
  555. package/dist/components/Skeleton/Skeleton.js.map +0 -1
  556. package/dist/components/Skeleton/index.d.ts +0 -2
  557. package/dist/components/Skeleton/index.d.ts.map +0 -1
  558. package/dist/components/Skeleton/index.js +0 -2
  559. package/dist/components/Skeleton/index.js.map +0 -1
  560. package/dist/components/StatsCard/StatsCard.d.ts +0 -17
  561. package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
  562. package/dist/components/StatsCard/StatsCard.js +0 -13
  563. package/dist/components/StatsCard/StatsCard.js.map +0 -1
  564. package/dist/components/StatsCard/index.d.ts +0 -2
  565. package/dist/components/StatsCard/index.d.ts.map +0 -1
  566. package/dist/components/StatsCard/index.js +0 -2
  567. package/dist/components/StatsCard/index.js.map +0 -1
  568. package/dist/styles.css +0 -2
  569. package/dist/theme.generated.css +0 -438
  570. package/src/components/Avatar/Avatar.tsx +0 -19
  571. package/src/components/Avatar/index.ts +0 -1
  572. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
  573. package/src/components/Breadcrumb/index.ts +0 -5
  574. package/src/components/ColorDot/ColorDot.tsx +0 -50
  575. package/src/components/ColorDot/index.ts +0 -1
  576. package/src/components/EmptyState/EmptyState.tsx +0 -29
  577. package/src/components/EmptyState/index.ts +0 -1
  578. package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
  579. package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
  580. package/src/components/HeatMap/heat-map.utils.ts +0 -15
  581. package/src/components/HeatMap/index.ts +0 -3
  582. package/src/components/MetricList/MetricList.tsx +0 -13
  583. package/src/components/MetricList/MetricRow.tsx +0 -30
  584. package/src/components/MetricList/index.ts +0 -2
  585. package/src/components/NavBottom/NavBottom.tsx +0 -53
  586. package/src/components/NavBottom/index.ts +0 -3
  587. package/src/components/NavSide/NavItem.tsx +0 -39
  588. package/src/components/NavSide/NavSide.tsx +0 -40
  589. package/src/components/NavSide/index.ts +0 -2
  590. package/src/components/NavSide/types.ts +0 -36
  591. package/src/components/Pagination/Pagination.tsx +0 -86
  592. package/src/components/Pagination/index.ts +0 -2
  593. package/src/components/Skeleton/Skeleton.tsx +0 -7
  594. package/src/components/Skeleton/index.ts +0 -1
  595. package/src/components/StatsCard/StatsCard.tsx +0 -40
  596. package/src/components/StatsCard/index.ts +0 -1
  597. package/src/styles/base.css +0 -41
  598. package/src/theme/palette.json +0 -100
  599. package/src/theme/palette.schema.json +0 -40
  600. package/src/theme/theme.json +0 -349
  601. package/src/theme/theme.schema.json +0 -876
  602. package/src/theme/typography.json +0 -7
  603. package/src/theme/typography.schema.json +0 -36
  604. package/tailwind.config.ts +0 -261
@@ -1,433 +1,136 @@
1
- import { cn } from "@sixthshift/design-system/utils";
2
- import { ChevronLeft, ChevronRight } from "lucide-react";
3
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
1
+ import * as React from "react";
2
+ import { useCallback, useMemo } from "react";
4
3
  import {
5
- addDays,
6
- addMonths,
7
- endOfWeek,
8
- formatMonthYear,
9
- isPlainDate,
10
- isSameMonth,
11
- parseDate,
12
- startOfMonth,
13
- startOfWeek,
4
+ adaptDisabledDates,
5
+ fromISODate,
6
+ fromISODateOrUndefined,
7
+ fromISODateRange,
8
+ type ISODate,
9
+ type ISODateRange,
14
10
  type Temporal,
15
- today,
11
+ toISODate,
12
+ toISODateOrUndefined,
13
+ toISODateRange,
16
14
  } from "../../date-time";
17
- import { Button } from "../Button";
18
- import { Separator } from "../Separator";
19
- import {
20
- defaultFormatDisplay,
21
- getDateSelectionState,
22
- isBeforeTemporal,
23
- isDateDisabled,
24
- isSameDateTemporal,
25
- temporalToISO,
26
- useCalendarDays,
27
- } from "./calendar.hooks";
28
- import type { CalendarProps, DateRangeValue, DisabledDateMatcher, PresetOption, RangePosition } from "./calendar.types";
15
+ import { CalendarView } from "./CalendarView";
16
+ import type { CalendarProps, CalendarViewProps, DateRangeValue, PresetOption } from "./calendar.types";
29
17
 
30
18
  export type { CalendarProps };
31
19
 
32
- const DAY_LABELS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] as const;
33
-
34
- function getDayLabels(weekStartsOn: number): string[] {
35
- return [...DAY_LABELS.slice(weekStartsOn), ...DAY_LABELS.slice(0, weekStartsOn)];
36
- }
37
-
38
- function getRangePositionClasses(rangePosition: RangePosition, isSelected: boolean): string {
39
- if (!isSelected) return "";
40
-
41
- switch (rangePosition) {
42
- case "start":
43
- return "rounded-l-full rounded-r-none bg-bg-brand text-fg-on-brand";
44
- case "end":
45
- return "rounded-r-full rounded-l-none bg-bg-brand text-fg-on-brand";
46
- case "middle":
47
- return "rounded-none bg-bg-brand-subtle text-fg-normal";
48
- case "single":
49
- return "bg-bg-brand text-fg-on-brand";
50
- default:
51
- return "";
52
- }
53
- }
54
-
55
- export const Calendar = (props: CalendarProps) => {
56
- const {
57
- mode,
58
- month,
59
- onMonthChange,
60
- minDate,
61
- maxDate,
62
- disabled,
63
- weekStartsOn = 0,
64
- showFooter = false,
65
- showToday = true,
66
- onApply,
67
- onCancel,
68
- className,
69
- } = props;
20
+ /**
21
+ * Inline month grid for picking one date, a range, or several dates — the
22
+ * building block `DatePicker` puts behind a popover trigger. Reach for
23
+ * `Calendar` directly when the grid should be always visible rather than
24
+ * opened on demand.
25
+ *
26
+ * `mode` (`"single" | "range" | "multiple"`) decides the shape of `value` and
27
+ * `onSelect`: an `ISODate` string, an `ISODateRange` (`{ from?, to? }`), or an
28
+ * `ISODate[]` respectively. There is no uncontrolled form — `value` and
29
+ * `onSelect` are both required, so the caller always owns the selection.
30
+ *
31
+ * `minDate`/`maxDate` bound the selectable range inclusively; `disabled` takes
32
+ * a single date, a list, or a declarative matcher (before/after/range/weekday)
33
+ * or predicate — see `DisabledDates`. Day cells form a roving-tabindex grid:
34
+ * arrow keys move by day, Home/End jump to the start/end of the week, and
35
+ * PageUp/PageDown request a month change.
36
+ *
37
+ * A thin adapter over {@link CalendarView}: it parses incoming ISO strings and
38
+ * serialises outgoing selections. All the behaviour lives in CalendarView.
39
+ *
40
+ * Every conversion is memoised on the string it came from, and every handler is
41
+ * stable. Temporal objects have no value identity — `PlainDate.from("2026-08-26")`
42
+ * is never `===` another PlainDate for the same day — and CalendarView keys
43
+ * `useMemo`/`useCallback` on these values directly, so converting unmemoised
44
+ * would invalidate the whole grid on every render.
45
+ *
46
+ * Props are read with `"key" in props` rather than destructured per mode,
47
+ * because every hook here has to run unconditionally.
48
+ */
49
+ export const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>((props, ref) => {
50
+ const { mode, month, onMonthChange, minDate, maxDate, disabled, weekStartsOn, showFooter, showToday, onApply, onCancel, className } = props;
70
51
 
71
- // Get mode-specific props
72
52
  const value = "value" in props ? props.value : undefined;
73
53
  const onSelect = "onSelect" in props ? props.onSelect : undefined;
74
54
  const presets = "presets" in props ? props.presets : undefined;
75
55
  const max = mode === "multiple" && "max" in props ? props.max : undefined;
76
56
 
77
- // Selection handler
78
- const handleSelect = useCallback(
79
- (temporalDate: Temporal.PlainDate) => {
80
- if (!onSelect) return;
81
-
82
- if (mode === "single") {
83
- const currentValue = value as Temporal.PlainDate | undefined;
84
- if (currentValue && isSameDateTemporal(temporalDate, currentValue)) {
85
- (onSelect as (date: Temporal.PlainDate | undefined) => void)(undefined);
86
- } else {
87
- (onSelect as (date: Temporal.PlainDate | undefined) => void)(temporalDate);
88
- }
89
- return;
90
- }
91
-
92
- if (mode === "multiple") {
93
- const currentValue = (value as Temporal.PlainDate[]) || [];
94
- const existingIndex = currentValue.findIndex((d) => isSameDateTemporal(temporalDate, d));
95
-
96
- if (existingIndex >= 0) {
97
- (onSelect as (dates: Temporal.PlainDate[]) => void)(currentValue.filter((_, i) => i !== existingIndex));
98
- } else if (!max || currentValue.length < max) {
99
- (onSelect as (dates: Temporal.PlainDate[]) => void)([...currentValue, temporalDate]);
100
- }
101
- return;
102
- }
103
-
104
- // Range mode
105
- const currentRange = (value as DateRangeValue) || {
106
- from: undefined,
107
- to: undefined,
108
- };
109
-
110
- if (!currentRange.from) {
111
- (onSelect as (range: DateRangeValue | undefined) => void)({ from: temporalDate, to: undefined });
112
- return;
113
- }
57
+ // ---------------------------------------------------------------------------
58
+ // Inbound: ISO strings -> Temporal, each keyed on the string it derives from.
59
+ // ---------------------------------------------------------------------------
114
60
 
115
- if (!currentRange.to) {
116
- if (isBeforeTemporal(temporalDate, currentRange.from)) {
117
- (onSelect as (range: DateRangeValue | undefined) => void)({ from: temporalDate, to: currentRange.from });
118
- } else {
119
- (onSelect as (range: DateRangeValue | undefined) => void)({ from: currentRange.from, to: temporalDate });
120
- }
121
- return;
122
- }
61
+ const temporalMonth = useMemo(() => fromISODate(month), [month]);
62
+ const temporalMinDate = useMemo(() => fromISODateOrUndefined(minDate), [minDate]);
63
+ const temporalMaxDate = useMemo(() => fromISODateOrUndefined(maxDate), [maxDate]);
64
+ const temporalDisabled = useMemo(() => adaptDisabledDates(disabled), [disabled]);
123
65
 
124
- (onSelect as (range: DateRangeValue | undefined) => void)({ from: temporalDate, to: undefined });
125
- },
126
- [mode, value, onSelect, max]
127
- );
128
-
129
- // Today button
130
- const handleToday = useCallback(() => {
131
- if (!onSelect) return;
66
+ const temporalValue = useMemo(() => {
67
+ if (mode === "single") return fromISODateOrUndefined(value as ISODate | undefined);
68
+ if (mode === "multiple") return ((value as ISODate[] | undefined) ?? []).map(fromISODate);
69
+ return fromISODateRange(value as ISODateRange | undefined);
70
+ }, [mode, value]);
132
71
 
133
- const todayDate = today();
72
+ const temporalPresets = useMemo(() => {
73
+ if (!presets) return undefined;
134
74
  if (mode === "single") {
135
- (onSelect as (date: Temporal.PlainDate | undefined) => void)(todayDate);
136
- } else if (mode === "multiple") {
137
- const current = (value as Temporal.PlainDate[]) || [];
138
- if (!current.some((d) => isSameDateTemporal(d, todayDate))) {
139
- if (!max || current.length < max) {
140
- (onSelect as (dates: Temporal.PlainDate[]) => void)([...current, todayDate]);
141
- }
142
- }
75
+ return (presets as PresetOption<ISODate>[]).map((preset) => ({ label: preset.label, value: fromISODate(preset.value) }));
143
76
  }
144
- onMonthChange(todayDate);
145
- }, [mode, value, onSelect, max, onMonthChange]);
146
-
147
- // Preset selection
148
- const handlePresetClick = useCallback(
149
- (preset: PresetOption<unknown>) => {
150
- if (!onSelect) return;
151
-
152
- if (mode === "single" && isPlainDate(preset.value)) {
153
- (onSelect as (date: Temporal.PlainDate | undefined) => void)(preset.value);
154
- } else if (mode === "range" && typeof preset.value === "object" && preset.value !== null && "from" in preset.value) {
155
- (onSelect as (range: DateRangeValue | undefined) => void)(preset.value as DateRangeValue);
156
- } else if (mode === "multiple" && Array.isArray(preset.value)) {
157
- (onSelect as (dates: Temporal.PlainDate[]) => void)(preset.value as Temporal.PlainDate[]);
158
- }
159
- },
160
- [mode, onSelect]
161
- );
162
-
163
- // Calendar navigation
164
- const handlePrevMonth = () => onMonthChange(addMonths(month, -1));
165
- const handleNextMonth = () => onMonthChange(addMonths(month, 1));
166
-
167
- const days = useCalendarDays(month, weekStartsOn as 0 | 1 | 2 | 3 | 4 | 5 | 6);
168
- const dayLabels = getDayLabels(weekStartsOn);
169
-
170
- const handleDayClick = (date: Temporal.PlainDate) => {
171
- if (!isDateDisabled(date, disabled, minDate, maxDate)) {
172
- handleSelect(date);
77
+ if (mode === "multiple") {
78
+ return (presets as PresetOption<ISODate[]>[]).map((preset) => ({ label: preset.label, value: preset.value.map(fromISODate) }));
173
79
  }
174
- };
80
+ return (presets as PresetOption<ISODateRange>[]).map((preset) => ({
81
+ label: preset.label,
82
+ value: fromISODateRange(preset.value) ?? { from: undefined, to: undefined },
83
+ }));
84
+ }, [mode, presets]);
175
85
 
176
86
  // ---------------------------------------------------------------------------
177
- // Roving focus
178
- //
179
- // A grid is a single tab stop: exactly one cell carries tabIndex={0} and the
180
- // arrow keys move between cells. `focusedDate` is null until the user actually
181
- // navigates, so we never steal focus on mount.
87
+ // Outbound: Temporal -> ISO strings.
182
88
  // ---------------------------------------------------------------------------
183
- const [focusedDate, setFocusedDate] = useState<Temporal.PlainDate | null>(null);
184
- const gridRef = useRef<HTMLTableElement>(null);
185
-
186
- const firstSelected = useMemo((): Temporal.PlainDate | undefined => {
187
- if (mode === "single") return isPlainDate(value) ? value : undefined;
188
- if (mode === "multiple") return (value as Temporal.PlainDate[] | undefined)?.[0];
189
- return (value as DateRangeValue | undefined)?.from;
190
- }, [mode, value]);
191
89
 
192
- const activeDate = useMemo(() => {
193
- const isUsable = (date: Temporal.PlainDate) =>
194
- isSameMonth(date, month) && !isDateDisabled(date, disabled as DisabledDateMatcher | DisabledDateMatcher[] | undefined, minDate, maxDate);
90
+ const handleMonthChange = useCallback((next: Temporal.PlainDate) => onMonthChange(toISODate(next)), [onMonthChange]);
195
91
 
196
- // Prefer where the user last was, then their selection, then today.
197
- for (const candidate of [focusedDate, firstSelected, today()]) {
198
- if (candidate && isUsable(candidate)) return candidate;
199
- }
200
- // Otherwise the first day of the month that can actually take focus, so the
201
- // grid never ends up with zero tab stops.
202
- const first = startOfMonth(month);
203
- for (let i = 0; i < first.daysInMonth; i++) {
204
- const candidate = addDays(first, i);
205
- if (isUsable(candidate)) return candidate;
206
- }
207
- return first;
208
- }, [focusedDate, firstSelected, month, disabled, minDate, maxDate]);
209
-
210
- const moveFocus = useCallback(
211
- (next: Temporal.PlainDate) => {
212
- setFocusedDate(next);
213
- if (!isSameMonth(next, month)) onMonthChange(next);
214
- },
215
- [month, onMonthChange]
216
- );
217
-
218
- const handleGridKeyDown = useCallback(
219
- (event: React.KeyboardEvent<HTMLTableElement>) => {
220
- // Navigate from the cell that actually has focus, not from the derived
221
- // tab stop — otherwise focusing a day without selecting it would make the
222
- // arrow keys jump back to today.
223
- const focusedIso = (event.target as HTMLElement | null)?.closest?.("[data-date]")?.getAttribute("data-date");
224
- const origin = focusedIso ? parseDate(focusedIso) : activeDate;
225
-
226
- const dayStep: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };
227
- const step = dayStep[event.key];
92
+ const handleSelect = useCallback(
93
+ (next: Temporal.PlainDate | Temporal.PlainDate[] | DateRangeValue | undefined) => {
94
+ if (!onSelect) return;
228
95
 
229
- if (step !== undefined) {
230
- event.preventDefault();
231
- moveFocus(addDays(origin, step));
96
+ if (mode === "single") {
97
+ (onSelect as (date: ISODate | undefined) => void)(toISODateOrUndefined(next as Temporal.PlainDate | undefined));
232
98
  return;
233
99
  }
234
100
 
235
- switch (event.key) {
236
- case "Home":
237
- event.preventDefault();
238
- moveFocus(startOfWeek(origin, weekStartsOn));
239
- break;
240
- case "End":
241
- event.preventDefault();
242
- moveFocus(endOfWeek(origin, weekStartsOn));
243
- break;
244
- case "PageUp":
245
- event.preventDefault();
246
- moveFocus(addMonths(origin, -1));
247
- break;
248
- case "PageDown":
249
- event.preventDefault();
250
- moveFocus(addMonths(origin, 1));
251
- break;
252
- default:
253
- break;
101
+ if (mode === "multiple") {
102
+ (onSelect as (dates: ISODate[]) => void)(((next as Temporal.PlainDate[] | undefined) ?? []).map(toISODate));
103
+ return;
254
104
  }
255
- },
256
- [activeDate, moveFocus, weekStartsOn]
257
- );
258
-
259
- // Follow the roving tabIndex with real DOM focus, but only once the user has
260
- // started navigating.
261
- useEffect(() => {
262
- if (!focusedDate) return;
263
- gridRef.current?.querySelector<HTMLButtonElement>(`[data-date="${temporalToISO(focusedDate)}"]`)?.focus();
264
- }, [focusedDate]);
265
-
266
- // useCalendarDays always returns 42 days, so this is always 6 rows of 7.
267
- const weeks = useMemo(() => {
268
- const chunked: (typeof days)[] = [];
269
- for (let i = 0; i < days.length; i += 7) chunked.push(days.slice(i, i + 7));
270
- return chunked;
271
- }, [days]);
272
105
 
273
- // Check if a preset is currently active
274
- const isPresetActive = useCallback(
275
- (preset: PresetOption<unknown>): boolean => {
276
- if (mode === "single" && isPlainDate(preset.value)) {
277
- return isPlainDate(value) && isSameDateTemporal(value, preset.value);
278
- }
279
- if (mode === "range" && typeof preset.value === "object" && preset.value !== null && "from" in preset.value) {
280
- const draft = value as DateRangeValue | undefined;
281
- const presetVal = preset.value as DateRangeValue;
282
- const fromMatch = (!draft?.from && !presetVal.from) || (draft?.from && presetVal.from && isSameDateTemporal(draft.from, presetVal.from));
283
- const toMatch = (!draft?.to && !presetVal.to) || (draft?.to && presetVal.to && isSameDateTemporal(draft.to, presetVal.to));
284
- return Boolean(fromMatch && toMatch);
285
- }
286
- if (mode === "multiple" && Array.isArray(preset.value)) {
287
- const draft = (value as Temporal.PlainDate[]) || [];
288
- const presetVal = preset.value as Temporal.PlainDate[];
289
- return draft.length === presetVal.length && draft.every((d) => presetVal.some((p) => isSameDateTemporal(d, p)));
290
- }
291
- return false;
106
+ (onSelect as (range: ISODateRange | undefined) => void)(toISODateRange(next as DateRangeValue | undefined));
292
107
  },
293
- [mode, value]
108
+ [mode, onSelect]
294
109
  );
295
110
 
296
- return (
297
- <div className={cn("flex", className)}>
298
- {/* Presets Sidebar */}
299
- {presets && presets.length > 0 && (
300
- <div className="mr-3 flex flex-col gap-1 border-border-normal border-r pr-3">
301
- {presets.map((preset) => (
302
- <button
303
- key={preset.label}
304
- type="button"
305
- onClick={() => handlePresetClick(preset)}
306
- className={cn(
307
- `rounded-md px-3 py-1.5 text-left text-sm transition-colors`,
308
- `hover:bg-bg-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-inset`,
309
- isPresetActive(preset) && "bg-bg-brand-subtle text-fg-brand"
310
- )}
311
- >
312
- {preset.label}
313
- </button>
314
- ))}
315
- </div>
316
- )}
317
-
318
- {/* Calendar */}
319
- <div className="flex flex-col gap-3">
320
- {/* Header with navigation */}
321
- <div className="flex items-center justify-between">
322
- <button
323
- type="button"
324
- onClick={handlePrevMonth}
325
- className="rounded-lg p-2 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring"
326
- aria-label="Previous month"
327
- >
328
- <ChevronLeft className="h-5 w-5" />
329
- </button>
330
-
331
- <span className="font-semibold text-sm">{formatMonthYear(month)}</span>
332
-
333
- <button
334
- type="button"
335
- onClick={handleNextMonth}
336
- className="rounded-lg p-2 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring"
337
- aria-label="Next month"
338
- >
339
- <ChevronRight className="h-5 w-5" />
340
- </button>
341
- </div>
342
-
343
- {/* Day grid — the ARIA grid pattern on real table semantics, so <tr>/<th>/<td>
344
- supply row/columnheader/gridcell roles implicitly. One tab stop, arrow-key
345
- navigation, and aria-selected on the cell (where it is valid) rather than
346
- on the button (where it is not). */}
347
- {/* biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: the ARIA grid
348
- pattern is defined on <table>; a date picker is an interactive composite widget,
349
- not a static table. Unlike the suppression this replaced, nothing here is being
350
- hidden — the axe checks in the story tests verify the resulting ARIA for real. */}
351
- <table ref={gridRef} role="grid" aria-label={formatMonthYear(month)} className="border-separate border-spacing-1" onKeyDown={handleGridKeyDown}>
352
- <thead>
353
- <tr>
354
- {dayLabels.map((label) => (
355
- <th key={label} scope="col" className="h-10 w-10 font-medium text-fg-subtle text-sm">
356
- {label}
357
- </th>
358
- ))}
359
- </tr>
360
- </thead>
361
- <tbody>
362
- {weeks.map((week) => (
363
- <tr key={temporalToISO(week[0]!.date)}>
364
- {week.map((day) => {
365
- const isDisabledDay = isDateDisabled(day.date, disabled as DisabledDateMatcher | DisabledDateMatcher[] | undefined, minDate, maxDate);
366
- const selectionState = getDateSelectionState(day.date, mode, value);
367
-
368
- if (!day.isCurrentMonth) {
369
- return <td key={temporalToISO(day.date)} className="h-10 w-10" />;
370
- }
371
-
372
- return (
373
- // Biome resolves <td> to role "cell" because it does not track the
374
- // ancestor role="grid", under which a <td> is a gridcell and
375
- // aria-selected is valid. axe, which does track it, passes.
376
- // biome-ignore lint/a11y/useAriaPropsSupportedByRole: <td> in a grid is a gridcell
377
- <td key={temporalToISO(day.date)} aria-selected={selectionState.isSelected} className="p-0">
378
- <button
379
- type="button"
380
- data-date={temporalToISO(day.date)}
381
- onClick={() => handleDayClick(day.date)}
382
- disabled={isDisabledDay}
383
- tabIndex={isSameDateTemporal(day.date, activeDate) ? 0 : -1}
384
- className={cn(
385
- `flex h-10 w-10 cursor-pointer items-center justify-center rounded-full text-sm transition-colors`,
386
- `hover:bg-bg-brand-strong hover:text-fg-on-brand-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-inset`,
387
- day.isToday && !selectionState.isSelected && "font-medium ring-1 ring-border-normal ring-inset",
388
- isDisabledDay && "cursor-not-allowed opacity-50",
389
- getRangePositionClasses(selectionState.rangePosition, selectionState.isSelected)
390
- )}
391
- aria-label={defaultFormatDisplay(day.date)}
392
- >
393
- {day.date.day}
394
- </button>
395
- </td>
396
- );
397
- })}
398
- </tr>
399
- ))}
400
- </tbody>
401
- </table>
402
-
403
- {/* Footer */}
404
- {showFooter && (
405
- <>
406
- <Separator />
407
- <div className="flex items-center justify-between">
408
- <div>
409
- {showToday && mode !== "range" && (
410
- <Button type="button" variant="ghost" size="sm" onClick={handleToday}>
411
- Today
412
- </Button>
413
- )}
414
- </div>
415
- <div className="flex gap-2">
416
- {onCancel && (
417
- <Button type="button" variant="ghost" size="sm" onClick={onCancel}>
418
- Cancel
419
- </Button>
420
- )}
421
- {onApply && (
422
- <Button type="button" variant="solid" size="sm" onClick={onApply}>
423
- Apply
424
- </Button>
425
- )}
426
- </div>
427
- </div>
428
- </>
429
- )}
430
- </div>
431
- </div>
432
- );
433
- };
111
+ // One cast, at the single point where the two discriminated unions meet: the
112
+ // mode discriminant and its matching value/onSelect/presets have all been
113
+ // converted in step above, but TypeScript cannot follow that across the
114
+ // separate useMemo calls.
115
+ const viewProps = {
116
+ mode,
117
+ month: temporalMonth,
118
+ onMonthChange: handleMonthChange,
119
+ minDate: temporalMinDate,
120
+ maxDate: temporalMaxDate,
121
+ disabled: temporalDisabled,
122
+ weekStartsOn,
123
+ showFooter,
124
+ showToday,
125
+ onApply,
126
+ onCancel,
127
+ className,
128
+ max,
129
+ value: temporalValue,
130
+ onSelect: handleSelect,
131
+ presets: temporalPresets,
132
+ } as unknown as CalendarViewProps;
133
+
134
+ return <CalendarView ref={ref} {...viewProps} />;
135
+ });
136
+ Calendar.displayName = "Calendar";