@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
@@ -0,0 +1,511 @@
1
+ /**
2
+ * ISO 8601 string types — the public boundary of every date/time component.
3
+ *
4
+ * Components accept and emit canonical ISO strings, never Temporal objects. That
5
+ * keeps the engine (Temporal today, native Temporal or something else tomorrow)
6
+ * an implementation detail, and it means a consumer never has to adopt a date
7
+ * library to render a date picker.
8
+ *
9
+ * Two properties this module guarantees, which the components rely on:
10
+ *
11
+ * 1. **Canonical form.** Every value produced by `toISO*` is normalised via
12
+ * Temporal, so precision is fixed: dates are `YYYY-MM-DD`, times are
13
+ * `HH:MM:SS`, instants are `YYYY-MM-DDTHH:MM:SSZ`. Consumer input is *not*
14
+ * canonical — `"10:30"` and `"10:30:00"` are both valid input — so always
15
+ * normalise on entry rather than comparing raw props.
16
+ *
17
+ * 2. **Lexicographic order == chronological order**, but only once canonical.
18
+ * `"2026-08-26T00:30:00.250Z" < "2026-08-26T00:30Z"` sorts wrong as raw
19
+ * strings; both normalise to a form where `<` is correct. Compare with
20
+ * {@link compareISO}, never with `<` on a raw prop.
21
+ */
22
+
23
+ import { Temporal } from "@js-temporal/polyfill";
24
+ import type { WeekStartsOn } from "./boundaries";
25
+
26
+ // =============================================================================
27
+ // Types
28
+ // =============================================================================
29
+
30
+ /** Any numeric segment of an ISO string. */
31
+ type N = `${number}`;
32
+
33
+ /**
34
+ * An ISO 8601 calendar date: `YYYY-MM-DD`.
35
+ *
36
+ * The template literal rejects the obvious mistakes at compile time for literal
37
+ * values (a datetime passed where a date belongs, or outright garbage). It
38
+ * cannot check a value that arrives as a plain `string` — use
39
+ * {@link toISODate} for those.
40
+ *
41
+ * @example
42
+ * const d: ISODate = "2026-08-26"; // ok
43
+ * const d: ISODate = "2026-08-26T10:00"; // Error
44
+ */
45
+ export type ISODate = `${N}-${N}-${N}`;
46
+
47
+ /**
48
+ * An ISO 8601 wall-clock time: `HH:MM` or `HH:MM:SS`.
49
+ *
50
+ * Both precisions are accepted as input; components always emit `HH:MM:SS`.
51
+ */
52
+ export type ISOTime = `${N}:${N}` | `${N}:${N}:${N}`;
53
+
54
+ /** An ISO 8601 timezone-naive datetime: `YYYY-MM-DDTHH:MM:SS`. */
55
+ export type ISODateTime = `${ISODate}T${ISOTime}`;
56
+
57
+ /**
58
+ * An ISO 8601 absolute instant in UTC: `YYYY-MM-DDTHH:MM:SSZ`.
59
+ *
60
+ * The trailing `Z` is required. A numeric offset (`+10:00`) is a valid instant
61
+ * to Temporal but is rejected here, so that one instant has exactly one
62
+ * representation and string comparison stays meaningful.
63
+ */
64
+ export type ISOInstant = `${ISODate}T${string}Z`;
65
+
66
+ /** A date range, either end of which may be unset. */
67
+ export type ISODateRange = {
68
+ from: ISODate | undefined;
69
+ to: ISODate | undefined;
70
+ };
71
+
72
+ /** An instant range, either end of which may be unset. */
73
+ export type ISOInstantRange = {
74
+ from: ISOInstant | undefined;
75
+ to: ISOInstant | undefined;
76
+ };
77
+
78
+ /**
79
+ * Day of week by name.
80
+ *
81
+ * Named rather than numbered on purpose: `weekStartsOn` counts from 0 = Sunday
82
+ * while ISO-8601 `dayOfWeek` counts from 1 = Monday, and two numeric day props
83
+ * with different origins in the same object is a bug waiting to be filed.
84
+ */
85
+ export type Weekday = "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun";
86
+
87
+ /** ISO-8601 day numbers, indexed by {@link Weekday}. 1 = Monday. */
88
+ const WEEKDAY_NUMBER: Record<Weekday, number> = {
89
+ mon: 1,
90
+ tue: 2,
91
+ wed: 3,
92
+ thu: 4,
93
+ fri: 5,
94
+ sat: 6,
95
+ sun: 7,
96
+ };
97
+
98
+ /**
99
+ * Which dates a calendar should refuse.
100
+ *
101
+ * The declarative forms cover the cases that would otherwise force a consumer
102
+ * to do date arithmetic; the predicate remains as an escape hatch.
103
+ *
104
+ * @example
105
+ * disabled="2026-08-26" // one date
106
+ * disabled={["2026-08-26", "2026-08-27"]} // several
107
+ * disabled={{ before: "2026-01-01" }} // everything earlier
108
+ * disabled={{ from: "2026-08-01", to: "2026-08-07" }} // an inclusive span
109
+ * disabled={{ dayOfWeek: ["sat", "sun"] }} // weekends
110
+ * disabled={(date) => date.endsWith("-01")} // anything else
111
+ */
112
+ export type DisabledDates =
113
+ | ISODate
114
+ | readonly ISODate[]
115
+ | { before: ISODate }
116
+ | { after: ISODate }
117
+ | { from: ISODate; to: ISODate }
118
+ | { dayOfWeek: readonly Weekday[] }
119
+ | ((date: ISODate) => boolean);
120
+
121
+ // =============================================================================
122
+ // Narrowing: string | Temporal -> canonical branded ISO
123
+ // =============================================================================
124
+
125
+ /**
126
+ * Normalise a date to canonical `YYYY-MM-DD`.
127
+ *
128
+ * Accepts an ISO date string or a `Temporal.PlainDate`. Throws on anything that
129
+ * is not a valid date, and on a datetime string — a value carrying a time is a
130
+ * caller mistake here, not something to silently truncate.
131
+ */
132
+ export function toISODate(value: string | Temporal.PlainDate): ISODate {
133
+ if (value instanceof Temporal.PlainDate) return value.toString() as ISODate;
134
+ if (/[T ]/.test(value)) {
135
+ throw new RangeError(`Expected an ISO date (YYYY-MM-DD), got a datetime: ${value}`);
136
+ }
137
+ return Temporal.PlainDate.from(value).toString() as ISODate;
138
+ }
139
+
140
+ /** {@link toISODate}, passing `undefined` through. */
141
+ export function toISODateOrUndefined(value: string | Temporal.PlainDate | null | undefined): ISODate | undefined {
142
+ return value === null || value === undefined ? undefined : toISODate(value);
143
+ }
144
+
145
+ /**
146
+ * Normalise a time to canonical `HH:MM:SS`.
147
+ *
148
+ * Accepts `HH:MM`, `HH:MM:SS`, or a `Temporal.PlainTime`. Rejects a datetime,
149
+ * which `Temporal.PlainTime.from` would otherwise happily accept.
150
+ */
151
+ export function toISOTime(value: string | Temporal.PlainTime): ISOTime {
152
+ if (value instanceof Temporal.PlainTime) return value.toString() as ISOTime;
153
+ if (/[T ]/.test(value)) {
154
+ throw new RangeError(`Expected an ISO time (HH:MM or HH:MM:SS), got a datetime: ${value}`);
155
+ }
156
+ return Temporal.PlainTime.from(value).toString() as ISOTime;
157
+ }
158
+
159
+ /** {@link toISOTime}, passing `undefined` through. */
160
+ export function toISOTimeOrUndefined(value: string | Temporal.PlainTime | null | undefined): ISOTime | undefined {
161
+ return value === null || value === undefined ? undefined : toISOTime(value);
162
+ }
163
+
164
+ /**
165
+ * Normalise an instant to canonical `YYYY-MM-DDTHH:MM:SSZ` (UTC).
166
+ *
167
+ * Accepts any ISO instant — including one written with a numeric offset — and
168
+ * converts it to the `Z` form, so equal instants always compare equal as
169
+ * strings.
170
+ */
171
+ export function toISOInstant(value: string | Temporal.Instant): ISOInstant {
172
+ const instant = value instanceof Temporal.Instant ? value : Temporal.Instant.from(value);
173
+ return instant.toString() as ISOInstant;
174
+ }
175
+
176
+ /** {@link toISOInstant}, passing `undefined` through. */
177
+ export function toISOInstantOrUndefined(value: string | Temporal.Instant | null | undefined): ISOInstant | undefined {
178
+ return value === null || value === undefined ? undefined : toISOInstant(value);
179
+ }
180
+
181
+ /** Normalise a date range, dropping ends that are unset. */
182
+ export function toISODateRange(
183
+ range: { from?: string | Temporal.PlainDate | undefined; to?: string | Temporal.PlainDate | undefined } | null | undefined
184
+ ): ISODateRange | undefined {
185
+ if (!range) return undefined;
186
+ return { from: toISODateOrUndefined(range.from), to: toISODateOrUndefined(range.to) };
187
+ }
188
+
189
+ /** Normalise an instant range, dropping ends that are unset. */
190
+ export function toISOInstantRange(
191
+ range: { from?: string | Temporal.Instant | undefined; to?: string | Temporal.Instant | undefined } | null | undefined
192
+ ): ISOInstantRange | undefined {
193
+ if (!range) return undefined;
194
+ return { from: toISOInstantOrUndefined(range.from), to: toISOInstantOrUndefined(range.to) };
195
+ }
196
+
197
+ // =============================================================================
198
+ // Widening: branded ISO -> Temporal (for component internals)
199
+ // =============================================================================
200
+
201
+ /**
202
+ * Parse an {@link ISODate} to the `Temporal.PlainDate` the internals work in.
203
+ *
204
+ * Rejects a value carrying a time, exactly as {@link toISODate} does. The
205
+ * template literal type already catches that for a literal, but a value arriving
206
+ * as `string` from an API is unchecked — and `Temporal.PlainDate.from` would
207
+ * silently truncate `"2026-08-26T10:00:00"` to `2026-08-26`, which is the kind
208
+ * of quiet wrong answer this boundary exists to prevent.
209
+ */
210
+ export function fromISODate(value: ISODate | string): Temporal.PlainDate {
211
+ if (/[T ]/.test(value)) {
212
+ throw new RangeError(`Expected an ISO date (YYYY-MM-DD), got a datetime: ${value}`);
213
+ }
214
+ return Temporal.PlainDate.from(value);
215
+ }
216
+
217
+ /** {@link fromISODate}, passing `undefined` through. */
218
+ export function fromISODateOrUndefined(value: ISODate | string | null | undefined): Temporal.PlainDate | undefined {
219
+ return value === null || value === undefined ? undefined : fromISODate(value);
220
+ }
221
+
222
+ /**
223
+ * Parse an {@link ISOTime} to `Temporal.PlainTime`.
224
+ *
225
+ * Rejects a datetime, which `Temporal.PlainTime.from` would otherwise accept by
226
+ * discarding the date half.
227
+ */
228
+ export function fromISOTime(value: ISOTime | string): Temporal.PlainTime {
229
+ if (/[T ]/.test(value)) {
230
+ throw new RangeError(`Expected an ISO time (HH:MM or HH:MM:SS), got a datetime: ${value}`);
231
+ }
232
+ return Temporal.PlainTime.from(value);
233
+ }
234
+
235
+ /** {@link fromISOTime}, passing `undefined` through. */
236
+ export function fromISOTimeOrUndefined(value: ISOTime | string | null | undefined): Temporal.PlainTime | undefined {
237
+ return value === null || value === undefined ? undefined : fromISOTime(value);
238
+ }
239
+
240
+ /** Parse an {@link ISOInstant} to `Temporal.Instant`. */
241
+ export function fromISOInstant(value: ISOInstant | string): Temporal.Instant {
242
+ return Temporal.Instant.from(value);
243
+ }
244
+
245
+ /** {@link fromISOInstant}, passing `undefined` through. */
246
+ export function fromISOInstantOrUndefined(value: ISOInstant | string | null | undefined): Temporal.Instant | undefined {
247
+ return value === null || value === undefined ? undefined : Temporal.Instant.from(value);
248
+ }
249
+
250
+ /**
251
+ * A date range in Temporal terms.
252
+ *
253
+ * Structurally identical to each picker's internal `DateRangeValue`. Declared
254
+ * here so the widening helpers below can live alongside their narrowing
255
+ * counterparts without `date-time` importing from `components`.
256
+ */
257
+ export type TemporalDateRange = {
258
+ from: Temporal.PlainDate | undefined;
259
+ to: Temporal.PlainDate | undefined;
260
+ };
261
+
262
+ /** An instant range in Temporal terms. */
263
+ export type TemporalInstantRange = {
264
+ from: Temporal.Instant | undefined;
265
+ to: Temporal.Instant | undefined;
266
+ };
267
+
268
+ /** Widen an {@link ISODateRange} for the internals. Inverse of {@link toISODateRange}. */
269
+ export function fromISODateRange(range: ISODateRange | undefined): TemporalDateRange | undefined {
270
+ if (!range) return undefined;
271
+ return { from: fromISODateOrUndefined(range.from), to: fromISODateOrUndefined(range.to) };
272
+ }
273
+
274
+ /** Widen an {@link ISOInstantRange} for the internals. Inverse of {@link toISOInstantRange}. */
275
+ export function fromISOInstantRange(range: ISOInstantRange | undefined): TemporalInstantRange | undefined {
276
+ if (!range) return undefined;
277
+ return { from: fromISOInstantOrUndefined(range.from), to: fromISOInstantOrUndefined(range.to) };
278
+ }
279
+
280
+ // =============================================================================
281
+ // Validation
282
+ // =============================================================================
283
+
284
+ /**
285
+ * Whether `value` is a canonical-parseable ISO date, with no time component.
286
+ *
287
+ * Stricter than `isISODate` from `./validate`, which accepts a datetime because
288
+ * `Temporal.PlainDate.from` does. Use this one at a boundary.
289
+ */
290
+ export function isDateString(value: unknown): value is ISODate {
291
+ if (typeof value !== "string" || /[T ]/.test(value)) return false;
292
+ try {
293
+ Temporal.PlainDate.from(value);
294
+ return true;
295
+ } catch {
296
+ return false;
297
+ }
298
+ }
299
+
300
+ /** Whether `value` is an ISO time, with no date component. */
301
+ export function isTimeString(value: unknown): value is ISOTime {
302
+ if (typeof value !== "string" || /[T ]/.test(value)) return false;
303
+ try {
304
+ Temporal.PlainTime.from(value);
305
+ return true;
306
+ } catch {
307
+ return false;
308
+ }
309
+ }
310
+
311
+ /** Whether `value` is an ISO instant (any offset form; `Z` not required). */
312
+ export function isInstantString(value: unknown): value is ISOInstant {
313
+ if (typeof value !== "string") return false;
314
+ try {
315
+ Temporal.Instant.from(value);
316
+ return true;
317
+ } catch {
318
+ return false;
319
+ }
320
+ }
321
+
322
+ // =============================================================================
323
+ // Comparison
324
+ // =============================================================================
325
+
326
+ /**
327
+ * Compare two ISO strings of the same kind chronologically.
328
+ *
329
+ * Normalises first, so mixed input precision (`"10:30"` vs `"10:30:00"`) and
330
+ * mixed instant offsets compare correctly — which raw `<` does not.
331
+ *
332
+ * @returns negative if `a` is earlier, 0 if equal, positive if `a` is later.
333
+ */
334
+ export function compareISO(a: string, b: string): number {
335
+ if (isDateString(a) && isDateString(b)) {
336
+ return Temporal.PlainDate.compare(fromISODate(a), fromISODate(b));
337
+ }
338
+ if (isTimeString(a) && isTimeString(b)) {
339
+ return Temporal.PlainTime.compare(fromISOTime(a), fromISOTime(b));
340
+ }
341
+ return Temporal.Instant.compare(fromISOInstant(a), fromISOInstant(b));
342
+ }
343
+
344
+ // =============================================================================
345
+ // ISO-native arithmetic
346
+ // =============================================================================
347
+ //
348
+ // Enough to build the `presets` and `disabled` values a consumer actually needs
349
+ // without reaching for Temporal. Anything more involved is what
350
+ // `@sixthshift/design-system/date-time` is for.
351
+ //
352
+ // `todayISO()` and `nowISO()` live in ./now alongside their Temporal siblings.
353
+
354
+ /** Shift a date by whole days. Negative moves backwards. */
355
+ export function addDaysISO(date: ISODate, days: number): ISODate {
356
+ return fromISODate(date).add({ days }).toString() as ISODate;
357
+ }
358
+
359
+ /** Shift a date by whole months, clamping the day to the target month's length. */
360
+ export function addMonthsISO(date: ISODate, months: number): ISODate {
361
+ return fromISODate(date).add({ months }).toString() as ISODate;
362
+ }
363
+
364
+ /** The first day of `date`'s month. */
365
+ export function startOfMonthISO(date: ISODate): ISODate {
366
+ return fromISODate(date).with({ day: 1 }).toString() as ISODate;
367
+ }
368
+
369
+ /** The last day of `date`'s month. */
370
+ export function endOfMonthISO(date: ISODate): ISODate {
371
+ const plain = fromISODate(date);
372
+ return plain.with({ day: plain.daysInMonth }).toString() as ISODate;
373
+ }
374
+
375
+ /** The first day of `date`'s week. `weekStartsOn` counts from 0 = Sunday. */
376
+ export function startOfWeekISO(date: ISODate, weekStartsOn: WeekStartsOn = 0): ISODate {
377
+ const plain = fromISODate(date);
378
+ // Temporal's dayOfWeek is 1 = Monday..7 = Sunday; shift into 0 = Sunday..6.
379
+ const currentDay = plain.dayOfWeek % 7;
380
+ const diff = (currentDay - weekStartsOn + 7) % 7;
381
+ return plain.subtract({ days: diff }).toString() as ISODate;
382
+ }
383
+
384
+ /** The last day of `date`'s week. `weekStartsOn` counts from 0 = Sunday. */
385
+ export function endOfWeekISO(date: ISODate, weekStartsOn: WeekStartsOn = 0): ISODate {
386
+ return addDaysISO(startOfWeekISO(date, weekStartsOn), 6);
387
+ }
388
+
389
+ /**
390
+ * Shift an instant by whole minutes. Negative moves backwards.
391
+ *
392
+ * Instant arithmetic, unlike the date helpers above, is exact — there are no
393
+ * calendar boundaries to clamp against.
394
+ */
395
+ export function addMinutesISO(instant: ISOInstant, minutes: number): ISOInstant {
396
+ return fromISOInstant(instant).add({ minutes }).toString() as ISOInstant;
397
+ }
398
+
399
+ /** Shift an instant by whole hours. Negative moves backwards. */
400
+ export function addHoursISO(instant: ISOInstant, hours: number): ISOInstant {
401
+ return fromISOInstant(instant).add({ hours }).toString() as ISOInstant;
402
+ }
403
+
404
+ /** The first day of `date`'s year. */
405
+ export function startOfYearISO(date: ISODate): ISODate {
406
+ return fromISODate(date).with({ month: 1, day: 1 }).toString() as ISODate;
407
+ }
408
+
409
+ /** The last day of `date`'s year. */
410
+ export function endOfYearISO(date: ISODate): ISODate {
411
+ return fromISODate(date).with({ month: 12, day: 31 }).toString() as ISODate;
412
+ }
413
+
414
+ /** ISO-8601 day numbers to {@link Weekday} names. Index 0 is unused; 1 = Monday. */
415
+ const WEEKDAY_NAME: readonly Weekday[] = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
416
+
417
+ /**
418
+ * Which day of the week a date falls on, by name.
419
+ *
420
+ * The reason a consumer can filter dates without reaching for Temporal — see
421
+ * {@link isWeekendISO} for the common case.
422
+ *
423
+ * @example
424
+ * presets.filter((date) => weekdayISO(date) !== "sun")
425
+ */
426
+ export function weekdayISO(date: ISODate): Weekday {
427
+ // Temporal's dayOfWeek is 1 = Monday..7 = Sunday.
428
+ return WEEKDAY_NAME[fromISODate(date).dayOfWeek - 1] as Weekday;
429
+ }
430
+
431
+ /** Whether a date falls on a Saturday or Sunday. */
432
+ export function isWeekendISO(date: ISODate): boolean {
433
+ const day = weekdayISO(date);
434
+ return day === "sat" || day === "sun";
435
+ }
436
+
437
+ // =============================================================================
438
+ // Disabled-date adaptation
439
+ // =============================================================================
440
+
441
+ /**
442
+ * Convert one public {@link DisabledDates} matcher into the Temporal-shaped
443
+ * matcher the calendar internals evaluate.
444
+ *
445
+ * `dayOfWeek` has no declarative Temporal equivalent, so it becomes a predicate.
446
+ */
447
+ /**
448
+ * Narrow the array form out of {@link DisabledDates}.
449
+ *
450
+ * `Array.isArray` narrows to `any[]`, which does not remove a `readonly T[]`
451
+ * member from a union — so the object branches below would still see it.
452
+ */
453
+ function isDateList(matcher: DisabledDates): matcher is readonly ISODate[] {
454
+ return Array.isArray(matcher);
455
+ }
456
+
457
+ function adaptMatcher(matcher: DisabledDates): TemporalDisabledMatcher {
458
+ if (typeof matcher === "string") return fromISODate(matcher);
459
+
460
+ if (isDateList(matcher)) return matcher.map((date) => fromISODate(date));
461
+
462
+ if (typeof matcher === "function") {
463
+ return (date: Temporal.PlainDate) => matcher(date.toString() as ISODate);
464
+ }
465
+
466
+ if ("dayOfWeek" in matcher) {
467
+ const wanted = new Set(matcher.dayOfWeek.map((day) => WEEKDAY_NUMBER[day]));
468
+ return (date: Temporal.PlainDate) => wanted.has(date.dayOfWeek);
469
+ }
470
+
471
+ if ("before" in matcher) return { before: fromISODate(matcher.before) };
472
+ if ("after" in matcher) return { after: fromISODate(matcher.after) };
473
+ return { from: fromISODate(matcher.from), to: fromISODate(matcher.to) };
474
+ }
475
+
476
+ /**
477
+ * The Temporal-shaped matcher union consumed by `calendar.hooks`.
478
+ *
479
+ * Declared here rather than imported to keep `date-time` free of component
480
+ * imports; `calendar.types` re-exports it under its historical name.
481
+ */
482
+ export type TemporalDisabledMatcher =
483
+ | Temporal.PlainDate
484
+ | Temporal.PlainDate[]
485
+ | ((date: Temporal.PlainDate) => boolean)
486
+ | { before: Temporal.PlainDate }
487
+ | { after: Temporal.PlainDate }
488
+ | { from: Temporal.PlainDate; to: Temporal.PlainDate };
489
+
490
+ /**
491
+ * Convert the public `disabled` prop into internal matchers.
492
+ *
493
+ * Call this once per render behind a `useMemo` keyed on the prop — the result
494
+ * holds Temporal objects, which have no value identity, so recomputing it every
495
+ * render would invalidate every downstream `useCallback`.
496
+ */
497
+ export function adaptDisabledDates(disabled: DisabledDates | DisabledDates[] | undefined): TemporalDisabledMatcher | TemporalDisabledMatcher[] | undefined {
498
+ if (disabled === undefined) return undefined;
499
+
500
+ // A bare `ISODate[]` is itself one matcher, not a list of them. An array of
501
+ // anything else is a list. `["2026-08-26"]` is therefore adapted as a single
502
+ // array-matcher, which evaluates identically either way.
503
+ if (Array.isArray(disabled)) {
504
+ if (disabled.every((entry) => typeof entry === "string")) {
505
+ return adaptMatcher(disabled as ISODate[]);
506
+ }
507
+ return (disabled as DisabledDates[]).map(adaptMatcher);
508
+ }
509
+
510
+ return adaptMatcher(disabled);
511
+ }
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { Temporal } from "@js-temporal/polyfill";
8
+ import type { ISODate, ISODateTime, ISOInstant } from "./iso";
8
9
 
9
10
  /**
10
11
  * Get the current instant (point in time)
@@ -14,10 +15,10 @@ export function now(): Temporal.Instant {
14
15
  }
15
16
 
16
17
  /**
17
- * Get the current instant as an ISO 8601 string
18
+ * Get the current instant as a canonical ISO 8601 string (UTC, `...Z`)
18
19
  */
19
- export function nowISO(): string {
20
- return Temporal.Now.instant().toString();
20
+ export function nowISO(): ISOInstant {
21
+ return Temporal.Now.instant().toString() as ISOInstant;
21
22
  }
22
23
 
23
24
  /**
@@ -28,10 +29,10 @@ export function today(): Temporal.PlainDate {
28
29
  }
29
30
 
30
31
  /**
31
- * Get today's date as an ISO 8601 string
32
+ * Get today's date as a canonical ISO 8601 string (`YYYY-MM-DD`)
32
33
  */
33
- export function todayISO(): string {
34
- return Temporal.Now.plainDateISO().toString();
34
+ export function todayISO(): ISODate {
35
+ return Temporal.Now.plainDateISO().toString() as ISODate;
35
36
  }
36
37
 
37
38
  /**
@@ -49,10 +50,10 @@ export function nowDateTime(): Temporal.PlainDateTime {
49
50
  }
50
51
 
51
52
  /**
52
- * Get the current date/time as an ISO 8601 string (without timezone info)
53
+ * Get the current date/time as a canonical ISO 8601 string (no timezone)
53
54
  */
54
- export function nowDateTimeISO(): string {
55
- return Temporal.Now.plainDateTimeISO().toString();
55
+ export function nowDateTimeISO(): ISODateTime {
56
+ return Temporal.Now.plainDateTimeISO().toString() as ISODateTime;
56
57
  }
57
58
 
58
59
  /**
@@ -0,0 +1,90 @@
1
+ import { cn } from "@sixthshift/design-system/utils";
2
+ import { X } from "lucide-react";
3
+ import * as React from "react";
4
+
5
+ export type PickerFieldProps = {
6
+ /** The segments, or whatever the field holds. */
7
+ children: React.ReactNode;
8
+ /** Icon for the button that opens the popover — a calendar or a clock. */
9
+ icon: React.ReactNode;
10
+ /** Accessible name for that button, e.g. `"Open calendar for start date"`. */
11
+ toggleLabel: string;
12
+ /**
13
+ * Props for the toggle button — in practice Floating UI's
14
+ * `getReferenceProps()`, spread last so its handlers win.
15
+ */
16
+ toggleProps?: React.ButtonHTMLAttributes<HTMLButtonElement> | undefined;
17
+ /** Drives `aria-expanded` and whether `aria-controls` is set. */
18
+ isOpen: boolean;
19
+ /** Id of the popover this field opens. */
20
+ contentId: string;
21
+ isDisabled?: boolean | undefined;
22
+ isInvalid?: boolean | undefined;
23
+ /** Omit to render no clear button. */
24
+ onClear?: ((event: React.MouseEvent) => void) | undefined;
25
+ /** Accessible name for the clear button, e.g. `"Clear end date"`. */
26
+ clearLabel?: string | undefined;
27
+ className?: string | undefined;
28
+ onFocusCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
29
+ };
30
+
31
+ /**
32
+ * The bordered box every picker trigger is: an icon button that opens the
33
+ * popover, the field itself, and an optional clear button.
34
+ *
35
+ * Extracted because there were six of these — `DatePicker` alone had three, one
36
+ * per mode plus the two range halves — and they had already started to drift in
37
+ * padding. The field height, the `focus-within` ring, the invalid border and the
38
+ * disabled treatment are decided once here, so changing them is one edit rather
39
+ * than six.
40
+ *
41
+ * Width is deliberately not decided here: a time field is narrower than a
42
+ * date-and-time field, so callers pass their own `min-w-*` through `className`.
43
+ *
44
+ * The ref is the box element — what Floating UI anchors to.
45
+ *
46
+ * Internal. Not exported from the package.
47
+ */
48
+ export const PickerField = React.forwardRef<HTMLDivElement, PickerFieldProps>(
49
+ (
50
+ { children, icon, toggleLabel, toggleProps, isOpen, contentId, isDisabled = false, isInvalid = false, onClear, clearLabel, className, onFocusCapture },
51
+ ref
52
+ ) => (
53
+ <div
54
+ ref={ref}
55
+ onFocusCapture={onFocusCapture}
56
+ className={cn(
57
+ "relative flex h-9 items-center gap-1 rounded-md border border-border-normal bg-transparent py-1 pl-1.5 shadow-xs transition-colors focus-within:ring-2 focus-within:ring-focus-ring",
58
+ onClear ? "pr-9" : "pr-3",
59
+ isInvalid && "border-border-danger",
60
+ isDisabled && "cursor-not-allowed opacity-50",
61
+ className
62
+ )}
63
+ >
64
+ <button
65
+ type="button"
66
+ disabled={isDisabled}
67
+ aria-label={toggleLabel}
68
+ aria-haspopup="dialog"
69
+ aria-expanded={isOpen}
70
+ aria-controls={isOpen ? contentId : undefined}
71
+ className="rounded-sm p-1 text-fg-subtle transition-colors hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed"
72
+ {...toggleProps}
73
+ >
74
+ {icon}
75
+ </button>
76
+ {children}
77
+ {onClear && (
78
+ <button
79
+ type="button"
80
+ onClick={onClear}
81
+ aria-label={clearLabel}
82
+ className="absolute right-3 rounded-sm p-0.5 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring"
83
+ >
84
+ <X className="h-3.5 w-3.5" />
85
+ </button>
86
+ )}
87
+ </div>
88
+ )
89
+ );
90
+ PickerField.displayName = "PickerField";