@sixthshift/design-system 0.3.0 → 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 (508) hide show
  1. package/README.md +114 -12
  2. package/dist/components/Badge/Badge.d.ts +64 -9
  3. package/dist/components/Badge/Badge.d.ts.map +1 -1
  4. package/dist/components/Badge/Badge.js +54 -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 +12 -0
  11. package/dist/components/BarChart/BarChart.d.ts.map +1 -1
  12. package/dist/components/BarChart/BarChart.js +12 -0
  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 +18 -4
  23. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  24. package/dist/components/Calendar/Calendar.js +19 -5
  25. package/dist/components/Calendar/Calendar.js.map +1 -1
  26. package/dist/components/Calendar/CalendarView.d.ts.map +1 -1
  27. package/dist/components/Calendar/CalendarView.js +10 -2
  28. package/dist/components/Calendar/CalendarView.js.map +1 -1
  29. package/dist/components/Calendar/calendar.types.d.ts +9 -0
  30. package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
  31. package/dist/components/Card/Card.d.ts +13 -0
  32. package/dist/components/Card/Card.d.ts.map +1 -1
  33. package/dist/components/Card/Card.js +15 -2
  34. package/dist/components/Card/Card.js.map +1 -1
  35. package/dist/components/Checkbox/Checkbox.d.ts +21 -0
  36. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  37. package/dist/components/Checkbox/Checkbox.js +22 -1
  38. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  39. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
  40. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  41. package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
  42. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  43. package/dist/components/Code/Editor/Editor.js +2 -2
  44. package/dist/components/Code/Editor/Editor.js.map +1 -1
  45. package/dist/components/Code/Editor/themes.d.ts +2 -2
  46. package/dist/components/Code/Editor/themes.d.ts.map +1 -1
  47. package/dist/components/Code/Editor/themes.js +50 -32
  48. package/dist/components/Code/Editor/themes.js.map +1 -1
  49. package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
  50. package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
  51. package/dist/components/DatePicker/DatePicker.d.ts +43 -0
  52. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  53. package/dist/components/DatePicker/DatePicker.js +166 -4
  54. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  55. package/dist/components/DatePicker/DateSegments.d.ts +60 -0
  56. package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
  57. package/dist/components/DatePicker/DateSegments.js +80 -0
  58. package/dist/components/DatePicker/DateSegments.js.map +1 -0
  59. package/dist/components/DatePicker/datepicker.types.d.ts +19 -1
  60. package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
  61. package/dist/components/DatePicker/index.d.ts +1 -1
  62. package/dist/components/DatePicker/index.d.ts.map +1 -1
  63. package/dist/components/DateRangePicker/DateRangePicker.d.ts +20 -2
  64. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  65. package/dist/components/DateRangePicker/DateRangePicker.js +22 -4
  66. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  67. package/dist/components/DateRangePicker/daterangepicker.types.d.ts +6 -1
  68. package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
  69. package/dist/components/DateTimePicker/DateTimePicker.d.ts +30 -2
  70. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  71. package/dist/components/DateTimePicker/DateTimePicker.js +105 -32
  72. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  73. package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
  74. package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
  75. package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
  76. package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
  77. package/dist/components/DateTimePicker/datetimepicker.types.d.ts +6 -1
  78. package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
  79. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +28 -2
  80. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  81. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +136 -58
  82. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  83. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +6 -1
  84. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
  85. package/dist/components/Field/Field.d.ts +15 -17
  86. package/dist/components/Field/Field.d.ts.map +1 -1
  87. package/dist/components/Field/Field.js +18 -3
  88. package/dist/components/Field/Field.js.map +1 -1
  89. package/dist/components/FormField/FormField.d.ts +15 -0
  90. package/dist/components/FormField/FormField.d.ts.map +1 -1
  91. package/dist/components/FormField/FormField.js +15 -0
  92. package/dist/components/FormField/FormField.js.map +1 -1
  93. package/dist/components/HoverCard/HoverCard.d.ts +6 -0
  94. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  95. package/dist/components/HoverCard/HoverCard.js +6 -0
  96. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  97. package/dist/components/Input/Input.d.ts +15 -0
  98. package/dist/components/Input/Input.d.ts.map +1 -1
  99. package/dist/components/Input/Input.js +18 -3
  100. package/dist/components/Input/Input.js.map +1 -1
  101. package/dist/components/LineChart/LineChart.d.ts +17 -0
  102. package/dist/components/LineChart/LineChart.d.ts.map +1 -1
  103. package/dist/components/LineChart/LineChart.js +17 -0
  104. package/dist/components/LineChart/LineChart.js.map +1 -1
  105. package/dist/components/Markdown/Markdown.d.ts +17 -0
  106. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  107. package/dist/components/Markdown/Markdown.js +17 -0
  108. package/dist/components/Markdown/Markdown.js.map +1 -1
  109. package/dist/components/Message/Message.d.ts +49 -4
  110. package/dist/components/Message/Message.d.ts.map +1 -1
  111. package/dist/components/Message/Message.js +53 -17
  112. package/dist/components/Message/Message.js.map +1 -1
  113. package/dist/components/Message/index.d.ts +1 -1
  114. package/dist/components/Message/index.d.ts.map +1 -1
  115. package/dist/components/Modal/Modal.d.ts +36 -0
  116. package/dist/components/Modal/Modal.d.ts.map +1 -1
  117. package/dist/components/Modal/Modal.js +37 -1
  118. package/dist/components/Modal/Modal.js.map +1 -1
  119. package/dist/components/Modal/components/ModalHeader.js +1 -1
  120. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  121. package/dist/components/Popover/Popover.d.ts +29 -0
  122. package/dist/components/Popover/Popover.d.ts.map +1 -1
  123. package/dist/components/Popover/Popover.js +29 -0
  124. package/dist/components/Popover/Popover.js.map +1 -1
  125. package/dist/components/ProgressBar/ProgressBar.d.ts +14 -0
  126. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  127. package/dist/components/ProgressBar/ProgressBar.js +14 -0
  128. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  129. package/dist/components/RadioButton/RadioButton.d.ts +26 -0
  130. package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
  131. package/dist/components/RadioButton/RadioButton.js +35 -1
  132. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  133. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
  134. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  135. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
  136. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  137. package/dist/components/SearchInput/SearchInput.d.ts +10 -0
  138. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  139. package/dist/components/SearchInput/SearchInput.js +12 -1
  140. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  141. package/dist/components/Select/Select.d.ts +4 -5
  142. package/dist/components/Select/Select.d.ts.map +1 -1
  143. package/dist/components/Select/Select.js +4 -5
  144. package/dist/components/Select/Select.js.map +1 -1
  145. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  146. package/dist/components/Select/SelectDropdown.js +4 -3
  147. package/dist/components/Select/SelectDropdown.js.map +1 -1
  148. package/dist/components/Select/SelectTrigger.js +2 -2
  149. package/dist/components/Select/SelectTrigger.js.map +1 -1
  150. package/dist/components/Separator/Separator.d.ts +10 -0
  151. package/dist/components/Separator/Separator.d.ts.map +1 -1
  152. package/dist/components/Separator/Separator.js +10 -0
  153. package/dist/components/Separator/Separator.js.map +1 -1
  154. package/dist/components/Sheet/Sheet.d.ts +6 -0
  155. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  156. package/dist/components/Sheet/Sheet.js +7 -1
  157. package/dist/components/Sheet/Sheet.js.map +1 -1
  158. package/dist/components/Sheet/components/SheetFooter.js +1 -1
  159. package/dist/components/Sheet/components/SheetFooter.js.map +1 -1
  160. package/dist/components/Sheet/components/SheetHeader.js +1 -1
  161. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  162. package/dist/components/Sparkline/Sparkline.d.ts +11 -0
  163. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  164. package/dist/components/Sparkline/Sparkline.js +11 -0
  165. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  166. package/dist/components/Spinner/Spinner.d.ts +27 -2
  167. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  168. package/dist/components/Spinner/Spinner.js +28 -3
  169. package/dist/components/Spinner/Spinner.js.map +1 -1
  170. package/dist/components/Switch/Switch.d.ts +18 -0
  171. package/dist/components/Switch/Switch.d.ts.map +1 -1
  172. package/dist/components/Switch/Switch.js +19 -1
  173. package/dist/components/Switch/Switch.js.map +1 -1
  174. package/dist/components/Tabs/Tabs.d.ts +6 -0
  175. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  176. package/dist/components/Tabs/Tabs.js +6 -0
  177. package/dist/components/Tabs/Tabs.js.map +1 -1
  178. package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
  179. package/dist/components/Tabs/components/TabsTrigger.js +22 -6
  180. package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
  181. package/dist/components/TagChip/TagChip.d.ts +14 -12
  182. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  183. package/dist/components/TagChip/TagChip.js +14 -1
  184. package/dist/components/TagChip/TagChip.js.map +1 -1
  185. package/dist/components/TagInput/TagInput.d.ts +11 -8
  186. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  187. package/dist/components/TagInput/TagInput.js +11 -0
  188. package/dist/components/TagInput/TagInput.js.map +1 -1
  189. package/dist/components/Text/Text.d.ts +9 -0
  190. package/dist/components/Text/Text.d.ts.map +1 -1
  191. package/dist/components/Text/Text.js +9 -0
  192. package/dist/components/Text/Text.js.map +1 -1
  193. package/dist/components/TextInline/TextInline.d.ts +15 -4
  194. package/dist/components/TextInline/TextInline.d.ts.map +1 -1
  195. package/dist/components/TextInline/TextInline.js +11 -0
  196. package/dist/components/TextInline/TextInline.js.map +1 -1
  197. package/dist/components/Textarea/Textarea.d.ts +12 -0
  198. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  199. package/dist/components/Textarea/Textarea.js +13 -1
  200. package/dist/components/Textarea/Textarea.js.map +1 -1
  201. package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
  202. package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
  203. package/dist/components/TimePicker/TimeColumn.js +8 -1
  204. package/dist/components/TimePicker/TimeColumn.js.map +1 -1
  205. package/dist/components/TimePicker/TimePicker.d.ts +32 -0
  206. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  207. package/dist/components/TimePicker/TimePicker.js +93 -6
  208. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  209. package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
  210. package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
  211. package/dist/components/TimePicker/TimeSegments.js +93 -0
  212. package/dist/components/TimePicker/TimeSegments.js.map +1 -0
  213. package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
  214. package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
  215. package/dist/components/TimePicker/timepicker.hooks.js +1 -23
  216. package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
  217. package/dist/components/TimePicker/timepicker.types.d.ts +0 -2
  218. package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
  219. package/dist/components/Toast/Toast.d.ts +27 -0
  220. package/dist/components/Toast/Toast.d.ts.map +1 -1
  221. package/dist/components/Toast/Toast.js +28 -1
  222. package/dist/components/Toast/Toast.js.map +1 -1
  223. package/dist/components/Toggle/Toggle.d.ts +31 -12
  224. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  225. package/dist/components/Toggle/Toggle.js +19 -31
  226. package/dist/components/Toggle/Toggle.js.map +1 -1
  227. package/dist/components/Toggle/index.d.ts +1 -1
  228. package/dist/components/Toggle/index.d.ts.map +1 -1
  229. package/dist/components/Toggle/index.js +1 -1
  230. package/dist/components/Toggle/index.js.map +1 -1
  231. package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
  232. package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
  233. package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
  234. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  235. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  236. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
  237. package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
  238. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  239. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
  240. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  241. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
  242. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  243. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
  244. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  245. package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
  246. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  247. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
  248. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  249. package/dist/components/Tooltip/Tooltip.d.ts +6 -0
  250. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  251. package/dist/components/Tooltip/Tooltip.js +6 -0
  252. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  253. package/dist/date-time/index.d.ts.map +1 -1
  254. package/dist/date-time/index.js +0 -1
  255. package/dist/date-time/index.js.map +1 -1
  256. package/dist/internal/PickerField.d.ts +45 -0
  257. package/dist/internal/PickerField.d.ts.map +1 -0
  258. package/dist/internal/PickerField.js +24 -0
  259. package/dist/internal/PickerField.js.map +1 -0
  260. package/dist/internal/SegmentedField.d.ts +98 -0
  261. package/dist/internal/SegmentedField.d.ts.map +1 -0
  262. package/dist/internal/SegmentedField.js +315 -0
  263. package/dist/internal/SegmentedField.js.map +1 -0
  264. package/dist/internal/index.d.ts +2 -0
  265. package/dist/internal/index.d.ts.map +1 -1
  266. package/dist/internal/index.js +2 -0
  267. package/dist/internal/index.js.map +1 -1
  268. package/dist/theme/index.d.ts +2 -2
  269. package/dist/theme/index.d.ts.map +1 -1
  270. package/dist/theme/index.js +1 -1
  271. package/dist/theme/index.js.map +1 -1
  272. package/dist/theme/schema.d.ts +0 -22
  273. package/dist/theme/schema.d.ts.map +1 -1
  274. package/dist/theme/schema.js +0 -9
  275. package/dist/theme/schema.js.map +1 -1
  276. package/package.json +3 -45
  277. package/src/components/Badge/Badge.tsx +85 -48
  278. package/src/components/Badge/index.ts +10 -1
  279. package/src/components/BarChart/BarChart.tsx +12 -0
  280. package/src/components/Button/Button.tsx +129 -106
  281. package/src/components/Button/index.ts +10 -1
  282. package/src/components/Calendar/Calendar.tsx +29 -16
  283. package/src/components/Calendar/CalendarView.tsx +10 -1
  284. package/src/components/Calendar/calendar.types.ts +10 -0
  285. package/src/components/Card/Card.tsx +15 -2
  286. package/src/components/Checkbox/Checkbox.tsx +22 -2
  287. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
  288. package/src/components/Code/Editor/Editor.tsx +2 -2
  289. package/src/components/Code/Editor/themes.ts +50 -32
  290. package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
  291. package/src/components/DatePicker/DatePicker.tsx +279 -28
  292. package/src/components/DatePicker/DateSegments.tsx +125 -0
  293. package/src/components/DatePicker/datepicker.types.ts +21 -1
  294. package/src/components/DatePicker/index.ts +8 -1
  295. package/src/components/DateRangePicker/DateRangePicker.tsx +22 -4
  296. package/src/components/DateRangePicker/daterangepicker.types.ts +7 -1
  297. package/src/components/DateTimePicker/DateTimePicker.tsx +143 -70
  298. package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
  299. package/src/components/DateTimePicker/datetimepicker.types.ts +7 -1
  300. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +195 -104
  301. package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +7 -1
  302. package/src/components/Field/Field.tsx +20 -22
  303. package/src/components/FormField/FormField.tsx +15 -0
  304. package/src/components/HoverCard/HoverCard.tsx +6 -0
  305. package/src/components/Input/Input.tsx +19 -4
  306. package/src/components/LineChart/LineChart.tsx +17 -0
  307. package/src/components/Markdown/Markdown.tsx +17 -0
  308. package/src/components/Message/Message.tsx +73 -23
  309. package/src/components/Message/index.ts +1 -1
  310. package/src/components/Modal/Modal.tsx +42 -3
  311. package/src/components/Modal/components/ModalHeader.tsx +1 -1
  312. package/src/components/Popover/Popover.tsx +29 -0
  313. package/src/components/ProgressBar/ProgressBar.tsx +14 -0
  314. package/src/components/RadioButton/RadioButton.tsx +34 -3
  315. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
  316. package/src/components/SearchInput/SearchInput.tsx +13 -2
  317. package/src/components/Select/Select.tsx +4 -5
  318. package/src/components/Select/SelectDropdown.tsx +13 -9
  319. package/src/components/Select/SelectTrigger.tsx +7 -7
  320. package/src/components/Separator/Separator.tsx +10 -0
  321. package/src/components/Sheet/Sheet.tsx +8 -2
  322. package/src/components/Sheet/components/SheetFooter.tsx +1 -1
  323. package/src/components/Sheet/components/SheetHeader.tsx +2 -2
  324. package/src/components/Sparkline/Sparkline.tsx +11 -0
  325. package/src/components/Spinner/Spinner.tsx +28 -3
  326. package/src/components/Switch/Switch.tsx +27 -4
  327. package/src/components/Tabs/Tabs.tsx +6 -0
  328. package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
  329. package/src/components/TagChip/TagChip.tsx +18 -16
  330. package/src/components/TagInput/TagInput.tsx +11 -8
  331. package/src/components/Text/Text.tsx +9 -0
  332. package/src/components/TextInline/TextInline.tsx +11 -0
  333. package/src/components/Textarea/Textarea.tsx +13 -1
  334. package/src/components/TimePicker/TimeColumn.tsx +24 -1
  335. package/src/components/TimePicker/TimePicker.tsx +127 -39
  336. package/src/components/TimePicker/TimeSegments.tsx +131 -0
  337. package/src/components/TimePicker/timepicker.hooks.ts +1 -24
  338. package/src/components/TimePicker/timepicker.types.ts +0 -3
  339. package/src/components/Toast/Toast.tsx +28 -1
  340. package/src/components/Toggle/Toggle.tsx +34 -32
  341. package/src/components/Toggle/index.ts +1 -1
  342. package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
  343. package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
  344. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
  345. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
  346. package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
  347. package/src/components/Tooltip/Tooltip.tsx +6 -0
  348. package/src/date-time/index.ts +0 -1
  349. package/src/internal/PickerField.tsx +90 -0
  350. package/src/internal/SegmentedField.tsx +445 -0
  351. package/src/internal/index.ts +2 -0
  352. package/src/theme/index.ts +0 -6
  353. package/src/theme/recipes/badge.css +140 -0
  354. package/src/theme/recipes/button.css +167 -0
  355. package/src/theme/recipes/card.css +26 -0
  356. package/src/theme/recipes/checkbox.css +44 -0
  357. package/src/theme/recipes/field.css +14 -0
  358. package/src/theme/recipes/index.css +28 -0
  359. package/src/theme/recipes/input.css +29 -0
  360. package/src/theme/recipes/message.css +47 -0
  361. package/src/theme/recipes/modal.css +31 -0
  362. package/src/theme/recipes/radio-button.css +42 -0
  363. package/src/theme/recipes/search-input.css +16 -0
  364. package/src/theme/recipes/select.css +105 -0
  365. package/src/theme/recipes/sheet.css +34 -0
  366. package/src/theme/recipes/spinner.css +17 -0
  367. package/src/theme/recipes/switch.css +39 -0
  368. package/src/theme/recipes/tabs.css +41 -0
  369. package/src/theme/recipes/tag-chip.css +27 -0
  370. package/src/theme/recipes/textarea.css +20 -0
  371. package/src/theme/recipes/toggle.css +92 -0
  372. package/src/theme/schema.ts +0 -27
  373. package/src/theme/tokens.css +26 -9
  374. package/dist/components/Avatar/Avatar.d.ts +0 -6
  375. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  376. package/dist/components/Avatar/Avatar.js +0 -11
  377. package/dist/components/Avatar/Avatar.js.map +0 -1
  378. package/dist/components/Avatar/index.d.ts +0 -2
  379. package/dist/components/Avatar/index.d.ts.map +0 -1
  380. package/dist/components/Avatar/index.js +0 -2
  381. package/dist/components/Avatar/index.js.map +0 -1
  382. package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
  383. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  384. package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
  385. package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
  386. package/dist/components/Breadcrumb/index.d.ts +0 -2
  387. package/dist/components/Breadcrumb/index.d.ts.map +0 -1
  388. package/dist/components/Breadcrumb/index.js +0 -2
  389. package/dist/components/Breadcrumb/index.js.map +0 -1
  390. package/dist/components/ColorDot/ColorDot.d.ts +0 -19
  391. package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
  392. package/dist/components/ColorDot/ColorDot.js +0 -36
  393. package/dist/components/ColorDot/ColorDot.js.map +0 -1
  394. package/dist/components/ColorDot/index.d.ts +0 -2
  395. package/dist/components/ColorDot/index.d.ts.map +0 -1
  396. package/dist/components/ColorDot/index.js +0 -2
  397. package/dist/components/ColorDot/index.js.map +0 -1
  398. package/dist/components/EmptyState/EmptyState.d.ts +0 -26
  399. package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
  400. package/dist/components/EmptyState/EmptyState.js +0 -9
  401. package/dist/components/EmptyState/EmptyState.js.map +0 -1
  402. package/dist/components/EmptyState/index.d.ts +0 -2
  403. package/dist/components/EmptyState/index.d.ts.map +0 -1
  404. package/dist/components/EmptyState/index.js +0 -2
  405. package/dist/components/EmptyState/index.js.map +0 -1
  406. package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
  407. package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
  408. package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
  409. package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
  410. package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
  411. package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
  412. package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
  413. package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
  414. package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
  415. package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
  416. package/dist/components/HeatMap/heat-map.utils.js +0 -10
  417. package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
  418. package/dist/components/HeatMap/index.d.ts +0 -4
  419. package/dist/components/HeatMap/index.d.ts.map +0 -1
  420. package/dist/components/HeatMap/index.js +0 -3
  421. package/dist/components/HeatMap/index.js.map +0 -1
  422. package/dist/components/MetricList/MetricList.d.ts +0 -9
  423. package/dist/components/MetricList/MetricList.d.ts.map +0 -1
  424. package/dist/components/MetricList/MetricList.js +0 -8
  425. package/dist/components/MetricList/MetricList.js.map +0 -1
  426. package/dist/components/MetricList/MetricRow.d.ts +0 -13
  427. package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
  428. package/dist/components/MetricList/MetricRow.js +0 -13
  429. package/dist/components/MetricList/MetricRow.js.map +0 -1
  430. package/dist/components/MetricList/index.d.ts +0 -3
  431. package/dist/components/MetricList/index.d.ts.map +0 -1
  432. package/dist/components/MetricList/index.js +0 -3
  433. package/dist/components/MetricList/index.js.map +0 -1
  434. package/dist/components/NavBottom/NavBottom.d.ts +0 -16
  435. package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
  436. package/dist/components/NavBottom/NavBottom.js +0 -21
  437. package/dist/components/NavBottom/NavBottom.js.map +0 -1
  438. package/dist/components/NavBottom/index.d.ts +0 -3
  439. package/dist/components/NavBottom/index.d.ts.map +0 -1
  440. package/dist/components/NavBottom/index.js +0 -2
  441. package/dist/components/NavBottom/index.js.map +0 -1
  442. package/dist/components/NavSide/NavItem.d.ts +0 -9
  443. package/dist/components/NavSide/NavItem.d.ts.map +0 -1
  444. package/dist/components/NavSide/NavItem.js +0 -13
  445. package/dist/components/NavSide/NavItem.js.map +0 -1
  446. package/dist/components/NavSide/NavSide.d.ts +0 -16
  447. package/dist/components/NavSide/NavSide.d.ts.map +0 -1
  448. package/dist/components/NavSide/NavSide.js +0 -12
  449. package/dist/components/NavSide/NavSide.js.map +0 -1
  450. package/dist/components/NavSide/index.d.ts +0 -3
  451. package/dist/components/NavSide/index.d.ts.map +0 -1
  452. package/dist/components/NavSide/index.js +0 -2
  453. package/dist/components/NavSide/index.js.map +0 -1
  454. package/dist/components/NavSide/types.d.ts +0 -38
  455. package/dist/components/NavSide/types.d.ts.map +0 -1
  456. package/dist/components/NavSide/types.js +0 -2
  457. package/dist/components/NavSide/types.js.map +0 -1
  458. package/dist/components/Pagination/Pagination.d.ts +0 -35
  459. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  460. package/dist/components/Pagination/Pagination.js +0 -26
  461. package/dist/components/Pagination/Pagination.js.map +0 -1
  462. package/dist/components/Pagination/index.d.ts +0 -3
  463. package/dist/components/Pagination/index.d.ts.map +0 -1
  464. package/dist/components/Pagination/index.js +0 -2
  465. package/dist/components/Pagination/index.js.map +0 -1
  466. package/dist/components/Skeleton/Skeleton.d.ts +0 -4
  467. package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
  468. package/dist/components/Skeleton/Skeleton.js +0 -9
  469. package/dist/components/Skeleton/Skeleton.js.map +0 -1
  470. package/dist/components/Skeleton/index.d.ts +0 -2
  471. package/dist/components/Skeleton/index.d.ts.map +0 -1
  472. package/dist/components/Skeleton/index.js +0 -2
  473. package/dist/components/Skeleton/index.js.map +0 -1
  474. package/dist/components/StatsCard/StatsCard.d.ts +0 -17
  475. package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
  476. package/dist/components/StatsCard/StatsCard.js +0 -15
  477. package/dist/components/StatsCard/StatsCard.js.map +0 -1
  478. package/dist/components/StatsCard/index.d.ts +0 -2
  479. package/dist/components/StatsCard/index.d.ts.map +0 -1
  480. package/dist/components/StatsCard/index.js +0 -2
  481. package/dist/components/StatsCard/index.js.map +0 -1
  482. package/src/components/Avatar/Avatar.tsx +0 -19
  483. package/src/components/Avatar/index.ts +0 -1
  484. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
  485. package/src/components/Breadcrumb/index.ts +0 -5
  486. package/src/components/ColorDot/ColorDot.tsx +0 -52
  487. package/src/components/ColorDot/index.ts +0 -1
  488. package/src/components/EmptyState/EmptyState.tsx +0 -30
  489. package/src/components/EmptyState/index.ts +0 -1
  490. package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
  491. package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
  492. package/src/components/HeatMap/heat-map.utils.ts +0 -15
  493. package/src/components/HeatMap/index.ts +0 -3
  494. package/src/components/MetricList/MetricList.tsx +0 -18
  495. package/src/components/MetricList/MetricRow.tsx +0 -30
  496. package/src/components/MetricList/index.ts +0 -2
  497. package/src/components/NavBottom/NavBottom.tsx +0 -55
  498. package/src/components/NavBottom/index.ts +0 -3
  499. package/src/components/NavSide/NavItem.tsx +0 -39
  500. package/src/components/NavSide/NavSide.tsx +0 -42
  501. package/src/components/NavSide/index.ts +0 -2
  502. package/src/components/NavSide/types.ts +0 -36
  503. package/src/components/Pagination/Pagination.tsx +0 -86
  504. package/src/components/Pagination/index.ts +0 -2
  505. package/src/components/Skeleton/Skeleton.tsx +0 -9
  506. package/src/components/Skeleton/index.ts +0 -1
  507. package/src/components/StatsCard/StatsCard.tsx +0 -41
  508. package/src/components/StatsCard/index.ts +0 -1
@@ -5,7 +5,7 @@ import { useCallback, useRef } from "react";
5
5
  import { useTheme } from "../../../hooks/useTheme";
6
6
  import type { ValidationError } from "../ValidationStatus";
7
7
  import { createSemanticTokensProvider, workerExtensionUrl } from "./semanticTokenProvider";
8
- import { defineThemes, PA_THEME_DARK, PA_THEME_LIGHT } from "./themes";
8
+ import { defineThemes, EDITOR_THEME_DARK, EDITOR_THEME_LIGHT } from "./themes";
9
9
 
10
10
  let semanticTokensRegistered = false;
11
11
  function registerSemanticTokenProviders(monaco: typeof import("monaco-editor")) {
@@ -51,7 +51,7 @@ export type EditorProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
51
51
  */
52
52
  export const Editor = ({ value, onChange, onValidate, readOnly = false, className, typeDefinitions, compilerOptions = {}, ...props }: EditorProps) => {
53
53
  const { resolvedTheme } = useTheme();
54
- const monacoTheme = resolvedTheme === "dark" ? PA_THEME_DARK : PA_THEME_LIGHT;
54
+ const monacoTheme = resolvedTheme === "dark" ? EDITOR_THEME_DARK : EDITOR_THEME_LIGHT;
55
55
  const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);
56
56
 
57
57
  const handleEditorDidMount = useCallback(
@@ -1,40 +1,58 @@
1
1
  import type { editor } from "monaco-editor";
2
2
 
3
- export const PA_THEME_LIGHT = "pa-light";
4
- export const PA_THEME_DARK = "pa-dark";
3
+ export const EDITOR_THEME_LIGHT = "ds-light";
4
+ export const EDITOR_THEME_DARK = "ds-dark";
5
5
 
6
+ /**
7
+ * The token palettes are One Light and One Dark, with every colour raised to
8
+ * 4.5:1 against the worst background it can land on — which is the active line's
9
+ * highlight, not the editor background, since that is the darker (light theme)
10
+ * or lighter (dark theme) of the two.
11
+ *
12
+ * Stock One Light fails that on 21 of its 25 token colours: syntax highlighting
13
+ * is text as far as axe is concerned, so it carries the full 4.5:1 obligation
14
+ * rather than the 3:1 that non-text contrast gets. Hue and saturation are kept;
15
+ * only lightness moves, and only as far as it has to. The most visible
16
+ * consequence is that comments recede less than in stock One Light — #a0a1a7
17
+ * managed 2.30.
18
+ *
19
+ * `scripts/check-contrast.ts` covers the design system's own tokens; these are
20
+ * Monaco's, so they are checked by the editor stories' a11y run instead. A story
21
+ * with a play function is what exercises it: without one, axe runs before Monaco
22
+ * has painted and sees nothing to measure.
23
+ */
6
24
  const lightTheme: editor.IStandaloneThemeData = {
7
25
  base: "vs",
8
26
  inherit: true,
9
27
  rules: [
10
28
  // Monarch tokenizer rules
11
- { token: "comment", foreground: "a0a1a7", fontStyle: "italic" },
29
+ { token: "comment", foreground: "6b6c73", fontStyle: "italic" },
12
30
  { token: "keyword", foreground: "a626a4" },
13
- { token: "string", foreground: "50a14f" },
14
- { token: "number", foreground: "986801" },
31
+ { token: "string", foreground: "3c7a3c" },
32
+ { token: "number", foreground: "906301" },
15
33
  { token: "delimiter", foreground: "383a42" },
16
34
  { token: "delimiter.bracket", foreground: "383a42" },
17
- { token: "tag", foreground: "e45649" },
18
- { token: "attribute.name", foreground: "986801" },
19
- { token: "attribute.value", foreground: "50a14f" },
20
- { token: "operator", foreground: "0184bc" },
21
- { token: "identifier", foreground: "e45649" },
35
+ { token: "tag", foreground: "cf2d1f" },
36
+ { token: "attribute.name", foreground: "906301" },
37
+ { token: "attribute.value", foreground: "3c7a3c" },
38
+ { token: "operator", foreground: "0174a5" },
39
+ { token: "identifier", foreground: "cf2d1f" },
22
40
 
23
41
  // Semantic token rules (TypeScript language service)
24
- { token: "variable", foreground: "e45649" },
25
- { token: "variable.readonly", foreground: "986801" },
42
+ { token: "variable", foreground: "cf2d1f" },
43
+ { token: "variable.readonly", foreground: "906301" },
26
44
  { token: "parameter", foreground: "383a42" },
27
- { token: "property", foreground: "e45649" },
28
- { token: "property.readonly", foreground: "986801" },
29
- { token: "function", foreground: "4078f2" },
30
- { token: "method", foreground: "4078f2" },
31
- { token: "type", foreground: "c18401" },
32
- { token: "type.identifier", foreground: "c18401" },
33
- { token: "class", foreground: "c18401" },
34
- { token: "interface", foreground: "c18401" },
35
- { token: "enum", foreground: "c18401" },
36
- { token: "enumMember", foreground: "986801" },
37
- { token: "namespace", foreground: "e45649" },
45
+ { token: "property", foreground: "cf2d1f" },
46
+ { token: "property.readonly", foreground: "906301" },
47
+ { token: "function", foreground: "2162f0" },
48
+ { token: "method", foreground: "2162f0" },
49
+ { token: "type", foreground: "916301" },
50
+ { token: "type.identifier", foreground: "916301" },
51
+ { token: "class", foreground: "916301" },
52
+ { token: "interface", foreground: "916301" },
53
+ { token: "enum", foreground: "916301" },
54
+ { token: "enumMember", foreground: "906301" },
55
+ { token: "namespace", foreground: "cf2d1f" },
38
56
  ],
39
57
  colors: {
40
58
  "editor.background": "#fafafa",
@@ -60,23 +78,23 @@ const darkTheme: editor.IStandaloneThemeData = {
60
78
  inherit: true,
61
79
  rules: [
62
80
  // Monarch tokenizer rules
63
- { token: "comment", foreground: "5c6370", fontStyle: "italic" },
64
- { token: "keyword", foreground: "c678dd" },
81
+ { token: "comment", foreground: "939aa6", fontStyle: "italic" },
82
+ { token: "keyword", foreground: "c97edf" },
65
83
  { token: "string", foreground: "98c379" },
66
84
  { token: "number", foreground: "d19a66" },
67
85
  { token: "delimiter", foreground: "abb2bf" },
68
86
  { token: "delimiter.bracket", foreground: "abb2bf" },
69
- { token: "tag", foreground: "e06c75" },
87
+ { token: "tag", foreground: "e37b83" },
70
88
  { token: "attribute.name", foreground: "d19a66" },
71
89
  { token: "attribute.value", foreground: "98c379" },
72
90
  { token: "operator", foreground: "56b6c2" },
73
- { token: "identifier", foreground: "e06c75" },
91
+ { token: "identifier", foreground: "e37b83" },
74
92
 
75
93
  // Semantic token rules (TypeScript language service)
76
- { token: "variable", foreground: "e06c75" },
94
+ { token: "variable", foreground: "e37b83" },
77
95
  { token: "variable.readonly", foreground: "d19a66" },
78
96
  { token: "parameter", foreground: "abb2bf" },
79
- { token: "property", foreground: "e06c75" },
97
+ { token: "property", foreground: "e37b83" },
80
98
  { token: "property.readonly", foreground: "d19a66" },
81
99
  { token: "function", foreground: "61afef" },
82
100
  { token: "method", foreground: "61afef" },
@@ -86,7 +104,7 @@ const darkTheme: editor.IStandaloneThemeData = {
86
104
  { token: "interface", foreground: "e5c07b" },
87
105
  { token: "enum", foreground: "e5c07b" },
88
106
  { token: "enumMember", foreground: "d19a66" },
89
- { token: "namespace", foreground: "e06c75" },
107
+ { token: "namespace", foreground: "e37b83" },
90
108
  ],
91
109
  colors: {
92
110
  "editor.background": "#282c34",
@@ -107,6 +125,6 @@ const darkTheme: editor.IStandaloneThemeData = {
107
125
  };
108
126
 
109
127
  export function defineThemes(monaco: typeof import("monaco-editor")) {
110
- monaco.editor.defineTheme(PA_THEME_LIGHT, lightTheme);
111
- monaco.editor.defineTheme(PA_THEME_DARK, darkTheme);
128
+ monaco.editor.defineTheme(EDITOR_THEME_LIGHT, lightTheme);
129
+ monaco.editor.defineTheme(EDITOR_THEME_DARK, darkTheme);
112
130
  }
@@ -1,7 +1,7 @@
1
- import { Message } from "@sixthshift/design-system/message";
1
+ import { Message, type MessageIntentName } from "@sixthshift/design-system/message";
2
2
  import { cn } from "@sixthshift/design-system/utils";
3
3
  import { AlertCircle, AlertTriangle, CheckCircle, Info } from "lucide-react";
4
- import type { ComponentProps, HTMLAttributes } from "react";
4
+ import type { HTMLAttributes } from "react";
5
5
 
6
6
  export type ValidationError = {
7
7
  line: number;
@@ -16,7 +16,10 @@ export type ValidationStatusProps = HTMLAttributes<HTMLDivElement> & {
16
16
  maxRows?: number;
17
17
  };
18
18
 
19
- type Intent = NonNullable<ComponentProps<typeof Message>["intent"]>;
19
+ // The closed union, not `ComponentProps<typeof Message>["intent"]`: that is now
20
+ // widened to admit any string so consumers can add intents in CSS, which would
21
+ // silently let a typo through this map.
22
+ type Intent = MessageIntentName;
20
23
 
21
24
  const SEVERITY_INTENT: Record<ValidationError["severity"], Intent> = {
22
25
  error: "danger",
@@ -3,7 +3,7 @@ import { useControllableState } from "@sixthshift/design-system/hooks";
3
3
  import { cn } from "@sixthshift/design-system/utils";
4
4
  import { Calendar as CalendarIcon, X } from "lucide-react";
5
5
  import * as React from "react";
6
- import { useCallback, useId, useMemo, useState } from "react";
6
+ import { useCallback, useId, useMemo, useRef, useState } from "react";
7
7
  import {
8
8
  adaptDisabledDates,
9
9
  fromISODate,
@@ -18,8 +18,11 @@ import {
18
18
  toISODateOrUndefined,
19
19
  toISODateRange,
20
20
  } from "../../date-time";
21
+ import { PickerField } from "../../internal";
21
22
  import { CalendarView } from "../Calendar/CalendarView";
23
+ import { isDateDisabled } from "../Calendar/calendar.hooks";
22
24
  import type { PresetOption } from "../Calendar/calendar.types";
25
+ import { DateSegments } from "./DateSegments";
23
26
  import { defaultFormatDisplay, getDisplayValue, temporalToISO } from "./datepicker.hooks";
24
27
  import type { DatePickerProps, DateRangeValue } from "./datepicker.types";
25
28
 
@@ -35,6 +38,49 @@ function toTemporal(mode: DatePickerProps["mode"], value: ISODate | ISODateRange
35
38
  return fromISODateOrUndefined(value as ISODate | undefined);
36
39
  }
37
40
 
41
+ /**
42
+ * A typeable date field and a `Calendar` popover, as one control. `mode`
43
+ * (`"single" | "range" | "multiple"`, default `"single"`) decides the shape of
44
+ * `value`/`defaultValue`/`onChange`: an `ISODate` string, an `ISODateRange`
45
+ * (`{ from?, to? }`), or an `ISODate[]`.
46
+ *
47
+ * In `single` mode the field is three `role="spinbutton"` segments rather than a
48
+ * text box. It is built to be typed straight through: `152026` is January the
49
+ * 5th 2026, because a digit that cannot extend the segment being typed rolls
50
+ * into the next one instead of restarting it. Separators (`/`, `-`, `.`) say
51
+ * done-with-this-one, arrows step a segment, `Backspace` takes back one digit
52
+ * (then clears, then steps back), `Alt+ArrowDown` opens the grid and moves focus
53
+ * there, and a paste fills all three. Segments rather than free
54
+ * text because `08/09` cannot be read without knowing the order: `segmentOrder`
55
+ * (default `mdy`) says which, the labels say it to a screen reader, and no
56
+ * parser has to guess. `range` and `multiple` keep the read-only text trigger —
57
+ * a list of dates has no sensible typed form.
58
+ *
59
+ * Typing and picking move one value. The segments show the draft while the
60
+ * popover is open and the committed value while it is closed, so typing a date
61
+ * moves the grid to it and picking a day shows up in the segments. The commit
62
+ * contract stays single: while the popover is open its Apply/Cancel owns the
63
+ * value (`Enter` in a segment is Apply); while it is closed, a date commits as
64
+ * soon as all three segments describe one. A partial date is never reported —
65
+ * clearing a segment reports `undefined`.
66
+ *
67
+ * Supports both controlled (`value`/`onChange`) and uncontrolled
68
+ * (`defaultValue`) use. Opening the popover seeds a draft from the committed
69
+ * value; picking a date only updates the draft; the footer's Apply commits it
70
+ * and closes, Cancel discards it and reverts to the last committed value. The
71
+ * clear button (hidden when `clearable={false}`) bypasses the draft and
72
+ * commits immediately.
73
+ *
74
+ * `minDate`/`maxDate` bound selectable dates inclusively; `disabled` accepts a
75
+ * single date, a list, or a declarative matcher (before/after/range/weekday)
76
+ * or predicate — see `DisabledDates`. `presets` renders a sidebar of quick
77
+ * picks whose values must match `mode`. When `name` is set, the committed
78
+ * value is mirrored into hidden `<input>`s for native form submission
79
+ * (`name.from`/`name.to` in range mode, `name[]` per entry in multiple mode).
80
+ *
81
+ * Keyboard interaction — arrow keys/Home/End/PageUp/PageDown on the day
82
+ * grid — is inherited from `Calendar`.
83
+ */
38
84
  export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
39
85
  const {
40
86
  mode = "single",
@@ -50,6 +96,7 @@ export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((pro
50
96
  className,
51
97
  align = "end",
52
98
  clearable = true,
99
+ segmentOrder = "mdy",
53
100
  } = props;
54
101
 
55
102
  // Get mode-specific props
@@ -60,6 +107,9 @@ export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((pro
60
107
 
61
108
  // Open state
62
109
  const [open, setOpen] = useState(false);
110
+ // Whether the day grid should take focus when the popover mounts — true only
111
+ // when the popover was opened from the keyboard. See `openWithGridFocus`.
112
+ const [autoFocusDay, setAutoFocusDay] = useState(false);
63
113
 
64
114
  // ---------------------------------------------------------------------------
65
115
  // The ISO boundary.
@@ -127,6 +177,8 @@ export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((pro
127
177
  (newOpen: boolean) => {
128
178
  if (newOpen) {
129
179
  setDraftValue(committedValue);
180
+ } else {
181
+ setAutoFocusDay(false);
130
182
  }
131
183
  setOpen(newOpen);
132
184
  },
@@ -219,35 +271,233 @@ export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((pro
219
271
 
220
272
  const rangeFormValues = getRangeFormValues();
221
273
 
274
+ // ---------------------------------------------------------------------------
275
+ // The typeable field (single mode).
276
+ //
277
+ // One value, two ways to move it. The segments show the draft while the
278
+ // popover is open and the committed value while it is closed, which is what
279
+ // makes typing and clicking feel like one control: type a date and the grid
280
+ // follows it, click a day and the segments follow that. The commit contract
281
+ // stays single — open means the popover's Apply/Cancel owns it, closed means a
282
+ // complete date commits as soon as it is complete.
283
+ // ---------------------------------------------------------------------------
284
+
285
+ const segmentSource = open ? draftValue : committedValue;
286
+ const segmentValue = isPlainDate(segmentSource) ? segmentSource : undefined;
287
+
288
+ /**
289
+ * A typed date can be one the grid would refuse — nothing stops you typing
290
+ * past `maxDate`. Rather than silently clamping it (which loses what was
291
+ * typed) or refusing it (which strands the field mid-edit), the field says so:
292
+ * `aria-invalid` and the danger border, with the value still reported so the
293
+ * caller's own validation sees the attempt.
294
+ */
295
+ const outOfBounds = useCallback(
296
+ (date: Temporal.PlainDate | undefined) => date !== undefined && isDateDisabled(date, temporalDisabled, temporalMinDate, temporalMaxDate),
297
+ [temporalDisabled, temporalMaxDate, temporalMinDate]
298
+ );
299
+
300
+ const handleSegmentsChange = useCallback(
301
+ (date: Temporal.PlainDate | undefined) => {
302
+ // Keep the grid on the month being typed, so opening it lands where the
303
+ // user already is rather than on today.
304
+ if (date) setMonth(date);
305
+ if (open) {
306
+ setDraftValue(date);
307
+ return;
308
+ }
309
+ setCommittedValue(date as Temporal.PlainDate | DateRangeValue | Temporal.PlainDate[]);
310
+ },
311
+ [open, setCommittedValue]
312
+ );
313
+
314
+ /** `Alt+ArrowDown` from a segment: open the grid *and* go there. */
315
+ const openWithGridFocus = useCallback(() => {
316
+ setAutoFocusDay(true);
317
+ handleOpenChange(true);
318
+ }, [handleOpenChange]);
319
+
320
+ /** `Enter` in a segment commits the draft, matching the popover's Apply. */
321
+ const handleFieldSubmit = useCallback(() => {
322
+ if (open) handleApply();
323
+ }, [handleApply, open]);
324
+
325
+ // ---------------------------------------------------------------------------
326
+ // Range mode: two fields, not one.
327
+ //
328
+ // A range is two dates, and typing one of them should not require knowing
329
+ // where the other ends. Each half is its own segmented field with its own
330
+ // clear button; they share the one popover, which anchors to whichever half
331
+ // you are in so it opens under the date you are editing.
332
+ // ---------------------------------------------------------------------------
333
+
334
+ const rangeSource = (open ? draftValue : committedValue) as DateRangeValue | undefined;
335
+
336
+ const setRangeEnd = useCallback(
337
+ (end: "from" | "to", date: Temporal.PlainDate | undefined) => {
338
+ if (date) setMonth(date);
339
+ const current = (open ? draftValue : committedValue) as DateRangeValue | undefined;
340
+ const next: DateRangeValue = { from: current?.from, to: current?.to, [end]: date };
341
+ if (open) {
342
+ setDraftValue(next);
343
+ return;
344
+ }
345
+ setCommittedValue(next as Temporal.PlainDate | DateRangeValue | Temporal.PlainDate[]);
346
+ },
347
+ [committedValue, draftValue, open, setCommittedValue]
348
+ );
349
+
350
+ const clearRangeEnd = useCallback(
351
+ (end: "from" | "to") => (event: React.MouseEvent) => {
352
+ event.stopPropagation();
353
+ event.preventDefault();
354
+ const existing = committedValue as DateRangeValue | undefined;
355
+ const next: DateRangeValue = {
356
+ from: end === "from" ? undefined : existing?.from,
357
+ to: end === "to" ? undefined : existing?.to,
358
+ };
359
+ // Clearing the last remaining end clears the range itself, so a consumer
360
+ // gets `undefined` rather than a husk with two empty ends.
361
+ const cleared = !next.from && !next.to;
362
+ setCommittedValue((cleared ? undefined : next) as Temporal.PlainDate | DateRangeValue | Temporal.PlainDate[]);
363
+ },
364
+ [committedValue, setCommittedValue]
365
+ );
366
+
367
+ // The popover anchors to the half being edited, so it opens under the date in
368
+ // question rather than under the middle of a wide trigger.
369
+ const rangeHalves = useRef<Record<"from" | "to", HTMLDivElement | null>>({ from: null, to: null });
370
+ const anchorToHalf = useCallback(
371
+ (end: "from" | "to") => {
372
+ const node = rangeHalves.current[end];
373
+ if (node) refs.setPositionReference(node);
374
+ },
375
+ [refs]
376
+ );
377
+
378
+ /**
379
+ * One end of the range. A render function rather than a component so the
380
+ * fields are not remounted — and so focus is not dropped — on every keystroke.
381
+ */
382
+ const renderRangeHalf = (end: "from" | "to", label: string) => {
383
+ const shown = end === "from" ? rangeSource?.from : rangeSource?.to;
384
+ const settled = end === "from" ? (committedValue as DateRangeValue | undefined)?.from : (committedValue as DateRangeValue | undefined)?.to;
385
+
386
+ return (
387
+ <PickerField
388
+ ref={(node) => {
389
+ rangeHalves.current[end] = node;
390
+ }}
391
+ onFocusCapture={() => anchorToHalf(end)}
392
+ className="min-w-45 flex-1"
393
+ icon={<CalendarIcon className="h-4 w-4" />}
394
+ toggleLabel={`Open calendar for ${label.toLowerCase()}`}
395
+ // Both handlers have to run: Floating UI's opens the popover, and ours
396
+ // points it at this half. Spreading after `onClick` would drop ours on
397
+ // the floor, which is how the popover ended up anchored to the whole
398
+ // trigger.
399
+ toggleProps={getReferenceProps({ onClick: () => anchorToHalf(end) })}
400
+ isOpen={open}
401
+ contentId={contentId}
402
+ isDisabled={isDisabled}
403
+ isInvalid={isInvalid || outOfBounds(shown)}
404
+ onClear={clearable && settled && !isDisabled ? clearRangeEnd(end) : undefined}
405
+ clearLabel={`Clear ${label.toLowerCase()}`}
406
+ >
407
+ <DateSegments
408
+ className="h-full flex-1"
409
+ label={label}
410
+ value={shown}
411
+ onChange={(date) => setRangeEnd(end, date)}
412
+ order={segmentOrder}
413
+ isDisabled={isDisabled}
414
+ isInvalid={isInvalid || outOfBounds(shown)}
415
+ onOpenRequest={() => {
416
+ anchorToHalf(end);
417
+ openWithGridFocus();
418
+ }}
419
+ onSubmit={handleFieldSubmit}
420
+ />
421
+ </PickerField>
422
+ );
423
+ };
424
+
222
425
  return (
223
426
  <>
224
427
  {/* Trigger Input */}
225
- <div ref={ref} className={cn("relative flex items-center", mode === "range" && "min-w-91.25", mode !== "range" && "min-w-65")}>
226
- <CalendarIcon className="pointer-events-none absolute left-3 h-4 w-4 text-fg-subtle" />
227
- <input
228
- ref={refs.setReference as React.Ref<HTMLInputElement>}
229
- id={inputId}
230
- type="text"
231
- readOnly
232
- value={displayValue}
233
- placeholder={placeholder}
234
- disabled={isDisabled}
235
- role="combobox"
236
- aria-invalid={isInvalid}
237
- aria-haspopup="dialog"
238
- aria-expanded={open}
239
- aria-controls={open ? contentId : undefined}
240
- className={cn(
241
- `flex h-9 w-full cursor-pointer rounded-md border border-border-normal bg-transparent py-1 pl-9 text-sm shadow-xs transition-colors placeholder:text-fg-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`,
242
- mode === "range" && "min-w-91.25",
243
- mode !== "range" && "min-w-65",
244
- clearable && hasValue ? "pr-9" : "pr-3",
245
- isInvalid && "border-border-danger",
246
- className
247
- )}
248
- {...getReferenceProps()}
249
- />
250
- {clearable && hasValue && !isDisabled && (
428
+ <div
429
+ ref={(node) => {
430
+ // The container is the interaction reference, so a click in either
431
+ // range half counts as inside; range mode then re-points the
432
+ // *position* reference at the half being edited.
433
+ refs.setReference(node);
434
+ if (typeof ref === "function") ref(node);
435
+ else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;
436
+ }}
437
+ className={cn("relative flex items-center gap-2", mode === "range" && "min-w-91.25", mode !== "range" && "min-w-65")}
438
+ >
439
+ {mode === "range" ? (
440
+ <>
441
+ {renderRangeHalf("from", "Start date")}
442
+ <span aria-hidden="true" className="text-fg-subtle">
443
+ –
444
+ </span>
445
+ {renderRangeHalf("to", "End date")}
446
+ </>
447
+ ) : mode === "single" ? (
448
+ <PickerField
449
+ className={cn("w-full min-w-65", className)}
450
+ icon={<CalendarIcon className="h-4 w-4" />}
451
+ toggleLabel="Open calendar"
452
+ toggleProps={getReferenceProps()}
453
+ isOpen={open}
454
+ contentId={contentId}
455
+ isDisabled={isDisabled}
456
+ isInvalid={isInvalid || outOfBounds(segmentValue)}
457
+ onClear={clearable && hasValue && !isDisabled ? handleClear : undefined}
458
+ clearLabel="Clear date"
459
+ >
460
+ <DateSegments
461
+ className="h-full flex-1"
462
+ id={inputId}
463
+ value={segmentValue}
464
+ onChange={handleSegmentsChange}
465
+ order={segmentOrder}
466
+ isDisabled={isDisabled}
467
+ isInvalid={isInvalid || outOfBounds(segmentValue)}
468
+ onOpenRequest={openWithGridFocus}
469
+ onSubmit={handleFieldSubmit}
470
+ />
471
+ </PickerField>
472
+ ) : (
473
+ <>
474
+ <CalendarIcon className="pointer-events-none absolute left-3 h-4 w-4 text-fg-subtle" />
475
+ <input
476
+ id={inputId}
477
+ type="text"
478
+ readOnly
479
+ value={displayValue}
480
+ placeholder={placeholder}
481
+ disabled={isDisabled}
482
+ role="combobox"
483
+ aria-invalid={isInvalid}
484
+ aria-haspopup="dialog"
485
+ aria-expanded={open}
486
+ aria-controls={open ? contentId : undefined}
487
+ className={cn(
488
+ `flex h-9 w-full cursor-pointer rounded-md border border-border-normal bg-transparent py-1 pl-9 text-sm shadow-xs transition-colors placeholder:text-fg-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`,
489
+ "min-w-65",
490
+ clearable && hasValue ? "pr-9" : "pr-3",
491
+ isInvalid && "border-border-danger",
492
+ className
493
+ )}
494
+ {...getReferenceProps()}
495
+ />
496
+ </>
497
+ )}
498
+ {/* `multiple` mode still uses the read-only input, so its clear button
499
+ stays here; the other two modes get theirs from `PickerField`. */}
500
+ {clearable && hasValue && !isDisabled && mode === "multiple" && (
251
501
  <button
252
502
  type="button"
253
503
  onClick={handleClear}
@@ -280,7 +530,7 @@ export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((pro
280
530
  ref={refs.setFloating}
281
531
  id={contentId}
282
532
  role="dialog"
283
- aria-modal="true"
533
+ aria-label="Choose date"
284
534
  style={floatingStyles}
285
535
  className="z-popover rounded-xl border border-border-normal bg-bg-normal p-4 shadow-lg"
286
536
  {...getFloatingProps()}
@@ -301,6 +551,7 @@ export const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>((pro
301
551
  showToday={mode !== "range"}
302
552
  onApply={handleApply}
303
553
  onCancel={handleCancel}
554
+ autoFocusDay={autoFocusDay}
304
555
  {...(mode === "multiple" && max ? { max } : {})}
305
556
  />
306
557
  </div>
@@ -0,0 +1,125 @@
1
+ import { type Temporal, today, toISODate } from "../../date-time";
2
+ import { SegmentedField, type SegmentSpec, type SegmentValues } from "../../internal";
3
+ import type { DateSegmentOrder } from "./datepicker.types";
4
+
5
+ type SegmentName = "day" | "month" | "year";
6
+
7
+ export type DateSegmentsProps = {
8
+ /** The date the segments display. `undefined` leaves them empty. */
9
+ value: Temporal.PlainDate | undefined;
10
+ /**
11
+ * Fires with a complete date, or `undefined` the moment the segments stop
12
+ * describing one. Never fires a partial date.
13
+ */
14
+ onChange: (date: Temporal.PlainDate | undefined) => void;
15
+ order?: DateSegmentOrder | undefined;
16
+ isDisabled?: boolean | undefined;
17
+ isInvalid?: boolean | undefined;
18
+ /** Accessible name for the segment group. */
19
+ label?: string | undefined;
20
+ /** `Alt+ArrowDown` — the combobox convention for "open the popup". */
21
+ onOpenRequest?: (() => void) | undefined;
22
+ /** `Enter` — the caller decides whether that means commit, submit or nothing. */
23
+ onSubmit?: (() => void) | undefined;
24
+ id?: string | undefined;
25
+ className?: string | undefined;
26
+ };
27
+
28
+ export const DATE_ORDERS: Record<DateSegmentOrder, SegmentName[]> = {
29
+ mdy: ["month", "day", "year"],
30
+ dmy: ["day", "month", "year"],
31
+ ymd: ["year", "month", "day"],
32
+ };
33
+
34
+ const BASE: Record<SegmentName, Omit<Extract<SegmentSpec, { kind?: "numeric" }>, "separatorBefore" | "stepFrom">> = {
35
+ day: { name: "day", label: "Day", placeholder: "dd", digits: 2, min: 1, max: 31 },
36
+ month: { name: "month", label: "Month", placeholder: "mm", digits: 2, min: 1, max: 12 },
37
+ year: { name: "year", label: "Year", placeholder: "yyyy", digits: 4, min: 1, max: 9999 },
38
+ };
39
+
40
+ /** Days in a (year, month). `day: 1` keeps `with` from constraining a stale day. */
41
+ const daysInMonth = (year: number, month: number) => today().with({ year, month, day: 1 }).daysInMonth;
42
+
43
+ export const dateToSegments = (date: Temporal.PlainDate | undefined): SegmentValues =>
44
+ date ? { day: date.day, month: date.month, year: date.year } : { day: null, month: null, year: null };
45
+
46
+ /**
47
+ * The day is clamped rather than rejected: typing `31` and then moving the month
48
+ * to February is a normal editing path, and snapping to the 28th keeps the field
49
+ * describing a date the user can see and correct. Nothing else can be out of
50
+ * range — the segments cap themselves as they are typed.
51
+ */
52
+ export const dateFromSegments = (values: Record<string, number>): Temporal.PlainDate => {
53
+ const year = values.year!;
54
+ const month = values.month!;
55
+ return today().with({ year, month, day: Math.min(values.day!, daysInMonth(year, month)) });
56
+ };
57
+
58
+ /**
59
+ * ISO is always accepted — it is unambiguous, and it is what the rest of the
60
+ * library speaks. Anything else is read in the field's own segment order, which
61
+ * is the only reading that cannot be wrong.
62
+ */
63
+ export function parseDatePasteIn(order: DateSegmentOrder) {
64
+ return (text: string): SegmentValues | null => {
65
+ const iso = /^(\d{4})-(\d{2})-(\d{2})$/.exec(text);
66
+ const parts = iso ? [iso[1]!, iso[2]!, iso[3]!] : text.split(/[/\-.\s]+/);
67
+ const names = iso ? DATE_ORDERS.ymd : DATE_ORDERS[order];
68
+ if (parts.length !== 3 || parts.some((part) => !/^\d+$/.test(part))) return null;
69
+
70
+ const next: SegmentValues = { day: null, month: null, year: null };
71
+ names.forEach((name, index) => {
72
+ const numeric = Number(parts[index]);
73
+ next[name] = numeric >= BASE[name].min && numeric <= BASE[name].max ? numeric : null;
74
+ });
75
+ return next;
76
+ };
77
+ }
78
+
79
+ /**
80
+ * The typeable half of `DatePicker`: a date as three spinbutton segments.
81
+ *
82
+ * A thin spec over `SegmentedField`, which owns the keyboard model — digits
83
+ * rolling forward, separators, digit-aware `Backspace`, deferred `onChange`.
84
+ * What belongs to dates specifically lives here: the segment order (never
85
+ * inferred from the locale, because `08/09` is a different date under each),
86
+ * clamping the day to the month, and accepting a pasted ISO date.
87
+ *
88
+ * Internal to `DatePicker`; not exported from `./index.ts`.
89
+ */
90
+ /**
91
+ * The three date segments in the given order.
92
+ *
93
+ * Exported because `DateTimePicker` builds one field out of these plus the time
94
+ * segments, rather than two fields glued together.
95
+ */
96
+ export function dateSpec(order: DateSegmentOrder): SegmentSpec[] {
97
+ const separator = order === "ymd" ? "-" : "/";
98
+ const current = dateToSegments(today());
99
+
100
+ return DATE_ORDERS[order].map((name, index) => ({
101
+ ...BASE[name],
102
+ // An arrow key on an empty segment starts from today, not from 1: the year
103
+ // is the segment most likely to already be right.
104
+ stepFrom: current[name] ?? BASE[name].min,
105
+ separatorBefore: index > 0 ? separator : undefined,
106
+ }));
107
+ }
108
+
109
+ export function DateSegments({ value, onChange, order = "mdy", label = "Date", ...rest }: DateSegmentsProps) {
110
+ const spec = dateSpec(order);
111
+
112
+ return (
113
+ <SegmentedField<Temporal.PlainDate>
114
+ spec={spec}
115
+ value={value}
116
+ toSegments={dateToSegments}
117
+ fromSegments={dateFromSegments}
118
+ keyOf={toISODate}
119
+ onChange={onChange}
120
+ parsePaste={parseDatePasteIn(order)}
121
+ label={label}
122
+ {...rest}
123
+ />
124
+ );
125
+ }