@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
@@ -19,6 +19,16 @@ import type { PresetOption as CalendarPresetOption } from "../Calendar/calendar.
19
19
  */
20
20
  export type DatePickerMode = "single" | "range" | "multiple";
21
21
 
22
+ /**
23
+ * Which order the typeable segments read in.
24
+ *
25
+ * Explicit rather than inferred from the runtime locale: `08/09` is a different
26
+ * date under `mdy` than under `dmy`, and a component that guesses is wrong for
27
+ * half its users. Defaults to `mdy`, matching the `en-US` formatting the rest
28
+ * of the library's display helpers use.
29
+ */
30
+ export type DateSegmentOrder = "mdy" | "dmy" | "ymd";
31
+
22
32
  // =============================================================================
23
33
  // Internal (Temporal) types
24
34
  // =============================================================================
@@ -56,7 +66,11 @@ type DatePickerBaseProps = {
56
66
  /** Which dates to refuse. See `DisabledDates`. */
57
67
  disabled?: DisabledDates | DisabledDates[];
58
68
 
59
- /** Placeholder text */
69
+ /**
70
+ * Placeholder for the read-only text trigger, which only `multiple` mode
71
+ * still uses. `single` and `range` are typeable fields whose segments show
72
+ * their own placeholders (`mm/dd/yyyy`).
73
+ */
60
74
  placeholder?: string;
61
75
 
62
76
  /** Input name for form submission */
@@ -76,6 +90,12 @@ type DatePickerBaseProps = {
76
90
 
77
91
  /** Whether the clear button is shown when a value is present (default: true) */
78
92
  clearable?: boolean;
93
+
94
+ /**
95
+ * Segment order for the typeable field (`single` mode only; default `mdy`).
96
+ * See {@link DateSegmentOrder}.
97
+ */
98
+ segmentOrder?: DateSegmentOrder;
79
99
  };
80
100
 
81
101
  export type DatePickerSingleProps = DatePickerBaseProps & {
@@ -10,4 +10,11 @@
10
10
  export type { DisabledDates, ISODate, ISODateRange } from "../../date-time";
11
11
  export type { PresetOption } from "../Calendar/calendar.types";
12
12
  export { DatePicker } from "./DatePicker";
13
- export type { DatePickerMode, DatePickerMultipleProps, DatePickerProps, DatePickerRangeProps, DatePickerSingleProps } from "./datepicker.types";
13
+ export type {
14
+ DatePickerMode,
15
+ DatePickerMultipleProps,
16
+ DatePickerProps,
17
+ DatePickerRangeProps,
18
+ DatePickerSingleProps,
19
+ DateSegmentOrder,
20
+ } from "./datepicker.types";
@@ -60,8 +60,26 @@ function getDefaultPresets(): PresetOption[] {
60
60
  /**
61
61
  * DateRangePicker - A specialized date range picker component
62
62
  *
63
- * Wraps DatePicker with mode="range" and adds common range presets.
64
- * All date values are canonical ISO 8601 strings ("2026-08-26").
63
+ * Wraps `DatePicker` with `mode="range"` and adds common range presets
64
+ * ("Today", "Last 7 days", "This month", …). Anything `DatePicker` does in
65
+ * range mode — two typeable fields, draft/commit via Apply/Cancel, keyboard
66
+ * navigation, form submission via hidden `name.from`/`name.to` inputs — carries
67
+ * over unchanged.
68
+ *
69
+ * Range mode renders the two ends as separate segmented fields rather than one
70
+ * field holding both: each end is typed and cleared on its own, and the shared
71
+ * popover anchors to whichever half you are editing.
72
+ *
73
+ * The value is an `ISODateRange` (`{ from?: ISODate, to?: ISODate }`), both
74
+ * ends canonical ISO 8601 date strings ("2026-08-26"). Supports controlled
75
+ * (`value`/`onChange`) and uncontrolled (`defaultValue`) use.
76
+ *
77
+ * `presets` (a `PresetOption[]` whose `value` is a zero-arg function) replaces
78
+ * the built-in list; the function form lets relative ranges like "Last 7 days"
79
+ * compute from the current date on every render rather than being frozen when
80
+ * the preset list is defined. Set `showPresets={false}` to hide the sidebar
81
+ * entirely. `minDate`/`maxDate`/`disabled` bound and exclude dates exactly as
82
+ * in `DatePicker`.
65
83
  */
66
84
  export const DateRangePicker = React.forwardRef<HTMLDivElement, DateRangePickerProps>((props, ref) => {
67
85
  const {
@@ -73,8 +91,8 @@ export const DateRangePicker = React.forwardRef<HTMLDivElement, DateRangePickerP
73
91
  disabled,
74
92
  presets: customPresets,
75
93
  showPresets = true,
76
- placeholder = "Select date range...",
77
94
  weekStartsOn,
95
+ segmentOrder,
78
96
  name,
79
97
  isDisabled,
80
98
  isInvalid,
@@ -101,7 +119,6 @@ export const DateRangePicker = React.forwardRef<HTMLDivElement, DateRangePickerP
101
119
  // Build props for DatePicker (only include defined values)
102
120
  const datePickerProps: Record<string, unknown> = {
103
121
  mode: "range",
104
- placeholder,
105
122
  ...(value !== undefined && { value }),
106
123
  ...(defaultValue !== undefined && { defaultValue }),
107
124
  ...(onChange !== undefined && { onChange }),
@@ -110,6 +127,7 @@ export const DateRangePicker = React.forwardRef<HTMLDivElement, DateRangePickerP
110
127
  ...(disabled && { disabled }),
111
128
  ...(datePickerPresets && { presets: datePickerPresets }),
112
129
  ...(weekStartsOn !== undefined && { weekStartsOn }),
130
+ ...(segmentOrder !== undefined && { segmentOrder }),
113
131
  ...(name && { name }),
114
132
  ...(isDisabled && { isDisabled }),
115
133
  ...(isInvalid && { isInvalid }),
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import type { DisabledDates, ISODate, ISODateRange, WeekStartsOn } from "../../date-time";
9
+ import type { DateSegmentOrder } from "../DatePicker/datepicker.types";
9
10
 
10
11
  /**
11
12
  * A preset range.
@@ -34,9 +35,14 @@ export type DateRangePickerProps = {
34
35
  showPresets?: boolean; // Default: true
35
36
 
36
37
  // Display
37
- placeholder?: string;
38
38
  weekStartsOn?: WeekStartsOn;
39
39
 
40
+ /**
41
+ * Segment order for both typeable fields (default `mdy`). Never inferred from
42
+ * the locale — `08/09` is a different date under each.
43
+ */
44
+ segmentOrder?: DateSegmentOrder;
45
+
40
46
  // Form
41
47
  name?: string;
42
48
 
@@ -1,7 +1,7 @@
1
1
  import { autoUpdate, FloatingPortal, flip, offset, shift, useClick, useDismiss, useFloating, useInteractions } from "@floating-ui/react";
2
2
  import { useControllableState } from "@sixthshift/design-system/hooks";
3
3
  import { cn } from "@sixthshift/design-system/utils";
4
- import { Clock, X } from "lucide-react";
4
+ import { Clock } from "lucide-react";
5
5
  import * as React from "react";
6
6
  import { useCallback, useId, useMemo, useState } from "react";
7
7
  import {
@@ -14,8 +14,10 @@ import {
14
14
  toISOInstantOrUndefined,
15
15
  } from "../../date-time";
16
16
 
17
+ import { PickerField } from "../../internal";
17
18
  import { Button } from "../Button";
18
19
  import { CalendarView } from "../Calendar/CalendarView";
20
+ import { isDateDisabled } from "../Calendar/calendar.hooks";
19
21
  import { Separator } from "../Separator";
20
22
  import { PeriodSelector } from "../TimePicker/PeriodSelector";
21
23
  import { TimeColumn } from "../TimePicker/TimeColumn";
@@ -30,44 +32,42 @@ import {
30
32
  to24Hour,
31
33
  } from "../TimePicker/timepicker.hooks";
32
34
  import type { ParsedTime, TimePeriod } from "../TimePicker/timepicker.types";
35
+ import { DateTimeSegments } from "./DateTimeSegments";
33
36
  import type { DateTimePickerProps } from "./datetimepicker.types";
34
37
 
35
- /**
36
- * Format an Instant for display
37
- */
38
- function formatInstantDisplay(instant: Temporal.Instant, clockFormat: "12h" | "24h", showSeconds: boolean, timeZone?: string): string {
39
- const tz = timeZone ?? Temporal.Now.timeZoneId();
40
- const zoned = instant.toZonedDateTimeISO(tz);
41
- const plainDateTime = zoned.toPlainDateTime();
42
-
43
- // Format date part
44
- const datePart = plainDateTime.toLocaleString("en-US", {
45
- month: "long",
46
- day: "numeric",
47
- year: "numeric",
48
- });
49
-
50
- // Format time part based on props
51
- const timeOptions: Intl.DateTimeFormatOptions = {
52
- hour: "numeric",
53
- minute: "2-digit",
54
- hour12: clockFormat === "12h",
55
- };
56
-
57
- if (showSeconds) {
58
- timeOptions.second = "2-digit";
59
- }
60
-
61
- const timePart = plainDateTime.toLocaleString("en-US", timeOptions);
62
-
63
- return `${datePart}, ${timePart}`;
64
- }
65
-
66
38
  /**
67
39
  * DateTimePicker - A component for selecting both date and time
68
40
  *
69
- * Combines date and time selection in a single popup with side-by-side layout.
70
- * Values cross the boundary as canonical UTC instant strings.
41
+ * Combines date and time selection in a single popup with side-by-side layout:
42
+ * a `Calendar` grid on the left, hour/minute(/second) columns on the right.
43
+ *
44
+ * The trigger is one typeable field of date *and* time segments — one value, so
45
+ * the digits roll straight from the year into the hour: `1520260330p` is January
46
+ * 5th 2026 at 3:30pm, typed without a tab. `segmentOrder` sets the date half's
47
+ * order (never inferred from the locale), `clockFormat` decides the hour's range
48
+ * and whether there is an AM/PM segment, and `Alt+ArrowDown` opens the popover
49
+ * on the month being typed. See `SegmentedField` for the whole keyboard model.
50
+ * It is not a composition of `DatePicker` and `TimePicker` — it builds
51
+ * directly on the same internal calendar grid and time-column primitives
52
+ * those two use, so the two stay visually consistent without either being
53
+ * mounted as a component.
54
+ *
55
+ * The value is a single absolute instant: an `ISOInstant` string
56
+ * (`"2026-08-26T00:30:00Z"`), always UTC and always ending in `Z`. It is
57
+ * edited in the viewer's local timezone (`Temporal.Now.timeZoneId()`) and
58
+ * converted to/from UTC at the boundary, so the same stored instant displays
59
+ * differently to viewers in different timezones. Input written with a
60
+ * numeric offset is normalised to the `Z` form. Supports controlled
61
+ * (`value`/`onChange`) and uncontrolled (`defaultValue`) use.
62
+ *
63
+ * Opening the popover seeds date and time drafts from the committed value (or
64
+ * today + the current time, if none); the footer's Apply combines them into
65
+ * an instant and commits, Cancel discards the draft. `minDate`/`maxDate` and
66
+ * `disabledDates` bound the date grid; `minTime`/`maxTime` bound the wall-clock
67
+ * time columns — these are plain date/time constraints on the picker's grid,
68
+ * not constraints on the resulting instant. `clockFormat` and `showSeconds`
69
+ * control the time columns; `clearable` (default `true`) shows the clear
70
+ * button.
71
71
  */
72
72
  export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>((props, ref) => {
73
73
  const {
@@ -82,7 +82,6 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
82
82
  minuteStep = 1,
83
83
  clockFormat = "12h",
84
84
  showSeconds = false,
85
- placeholder = "Select date and time...",
86
85
  weekStartsOn = 0,
87
86
  name,
88
87
  isDisabled = false,
@@ -90,10 +89,13 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
90
89
  className,
91
90
  align = "end",
92
91
  clearable = true,
92
+ segmentOrder = "mdy",
93
93
  } = props;
94
94
 
95
95
  // Open state
96
96
  const [open, setOpen] = useState(false);
97
+ // The day grid takes focus only when the popover was opened from the keyboard.
98
+ const [autoFocusDay, setAutoFocusDay] = useState(false);
97
99
 
98
100
  // ---------------------------------------------------------------------------
99
101
  // The ISO boundary.
@@ -144,6 +146,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
144
146
  // Sync draft when popup opens
145
147
  const handleOpenChange = useCallback(
146
148
  (newOpen: boolean) => {
149
+ if (!newOpen) setAutoFocusDay(false);
147
150
  if (newOpen) {
148
151
  const tz = Temporal.Now.timeZoneId();
149
152
  if (committedValue) {
@@ -256,9 +259,82 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
256
259
  const inputId = `datetimepicker-input-${id}`;
257
260
 
258
261
  // Display value (from committed value)
259
- const displayValue = committedValue ? formatInstantDisplay(committedValue, clockFormat, showSeconds) : "";
260
262
  const hasValue = Boolean(committedValue);
261
263
 
264
+ // ---------------------------------------------------------------------------
265
+ // The typeable field.
266
+ //
267
+ // The segments show the draft while the popover is open and the committed
268
+ // value while it is closed, so typing moves the grid and columns, and picking
269
+ // in either shows up in the segments. Open means the popover's Apply/Cancel
270
+ // owns the value; closed means a complete date-time commits as soon as it is
271
+ // complete.
272
+ //
273
+ // The draft is a date plus loose time parts, so it only composes into an
274
+ // instant once the date exists. Until then the field has nothing to show,
275
+ // which is exactly `undefined`.
276
+ // ---------------------------------------------------------------------------
277
+
278
+ const userZone = Temporal.Now.timeZoneId();
279
+
280
+ const draftInstant = useMemo(() => {
281
+ if (!draftDate) return undefined;
282
+ const parsed = getDraftTime();
283
+ return draftDate
284
+ .toPlainDateTime({ hour: parsed.hour, minute: parsed.minute, second: showSeconds ? parsed.second : 0 })
285
+ .toZonedDateTime(userZone)
286
+ .toInstant();
287
+ }, [draftDate, getDraftTime, showSeconds, userZone]);
288
+
289
+ const segmentValue = open ? draftInstant : committedValue;
290
+
291
+ /**
292
+ * A typed instant can fall outside what the grid and columns allow — the date
293
+ * past `maxDate`, or the time outside `minTime`/`maxTime`. The field flags it
294
+ * rather than clamping; see `DatePicker` for why.
295
+ */
296
+ const outOfBounds = useMemo(() => {
297
+ if (!segmentValue) return false;
298
+ const zoned = segmentValue.toZonedDateTimeISO(userZone);
299
+ return (
300
+ isDateDisabled(zoned.toPlainDate(), temporalDisabledDates, temporalMinDate, temporalMaxDate) ||
301
+ isTimeDisabled(zoned.toPlainTime(), temporalMinTime, temporalMaxTime)
302
+ );
303
+ }, [segmentValue, temporalDisabledDates, temporalMaxDate, temporalMaxTime, temporalMinDate, temporalMinTime, userZone]);
304
+
305
+ const handleSegmentsChange = useCallback(
306
+ (instant: Temporal.Instant | undefined) => {
307
+ if (!open) {
308
+ setCommittedValue(instant);
309
+ return;
310
+ }
311
+ if (!instant) {
312
+ setDraftDate(undefined);
313
+ return;
314
+ }
315
+ const zoned = instant.toZonedDateTimeISO(userZone);
316
+ const parsed = temporalToParsed(zoned.toPlainTime());
317
+ setDraftDate(zoned.toPlainDate());
318
+ setMonth(zoned.toPlainDate());
319
+ setDraftHour(clockFormat === "12h" ? to12Hour(parsed.hour).hour12 : parsed.hour);
320
+ setDraftMinute(parsed.minute);
321
+ setDraftSecond(parsed.second);
322
+ setDraftPeriod(to12Hour(parsed.hour).period);
323
+ },
324
+ [clockFormat, open, setCommittedValue, userZone]
325
+ );
326
+
327
+ /** `Alt+ArrowDown` from a segment: open the popover *and* go to the grid. */
328
+ const openWithGridFocus = useCallback(() => {
329
+ setAutoFocusDay(true);
330
+ handleOpenChange(true);
331
+ }, [handleOpenChange]);
332
+
333
+ /** `Enter` in a segment commits the draft, matching the popover's Apply. */
334
+ const handleFieldSubmit = useCallback(() => {
335
+ if (open) handleApply();
336
+ }, [handleApply, open]);
337
+
262
338
  // Time selection handlers
263
339
  const handleHourChange = (hour: number) => setDraftHour(hour);
264
340
  const handleMinuteChange = (minute: number) => setDraftMinute(minute);
@@ -286,38 +362,34 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
286
362
  <>
287
363
  {/* Trigger Input */}
288
364
  <div ref={ref} className="relative flex items-center">
289
- <Clock className="pointer-events-none absolute left-3 h-4 w-4 text-fg-subtle" />
290
- <input
291
- ref={refs.setReference as React.Ref<HTMLInputElement>}
292
- id={inputId}
293
- type="text"
294
- readOnly
295
- value={displayValue}
296
- placeholder={placeholder}
297
- disabled={isDisabled}
298
- role="combobox"
299
- aria-invalid={isInvalid}
300
- aria-haspopup="dialog"
301
- aria-expanded={open}
302
- aria-controls={open ? contentId : undefined}
303
- className={cn(
304
- `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`,
305
- clearable && hasValue ? "pr-9" : "pr-3",
306
- isInvalid && "border-border-danger",
307
- className
308
- )}
309
- {...getReferenceProps()}
310
- />
311
- {clearable && hasValue && !isDisabled && (
312
- <button
313
- type="button"
314
- onClick={handleClear}
315
- 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"
316
- aria-label="Clear date and time"
317
- >
318
- <X className="h-3.5 w-3.5" />
319
- </button>
320
- )}
365
+ <PickerField
366
+ ref={refs.setReference as React.Ref<HTMLDivElement>}
367
+ className={cn("w-full min-w-80", className)}
368
+ icon={<Clock className="h-4 w-4" />}
369
+ toggleLabel="Open date and time picker"
370
+ toggleProps={getReferenceProps()}
371
+ isOpen={open}
372
+ contentId={contentId}
373
+ isDisabled={isDisabled}
374
+ isInvalid={isInvalid || outOfBounds}
375
+ onClear={clearable && hasValue && !isDisabled ? handleClear : undefined}
376
+ clearLabel="Clear date and time"
377
+ >
378
+ <DateTimeSegments
379
+ className="h-full flex-1"
380
+ id={inputId}
381
+ value={segmentValue}
382
+ onChange={handleSegmentsChange}
383
+ timeZone={userZone}
384
+ order={segmentOrder}
385
+ clockFormat={clockFormat}
386
+ showSeconds={showSeconds}
387
+ isDisabled={isDisabled}
388
+ isInvalid={isInvalid || outOfBounds}
389
+ onOpenRequest={openWithGridFocus}
390
+ onSubmit={handleFieldSubmit}
391
+ />
392
+ </PickerField>
321
393
 
322
394
  {/* Hidden input for form submission */}
323
395
  {name && committedValue && <input type="hidden" name={name} value={committedValue.toString()} />}
@@ -330,7 +402,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
330
402
  ref={refs.setFloating}
331
403
  id={contentId}
332
404
  role="dialog"
333
- aria-modal="true"
405
+ aria-label="Choose date and time"
334
406
  style={floatingStyles}
335
407
  className="z-popover rounded-xl border border-border-normal bg-bg-normal p-4 shadow-lg"
336
408
  {...getFloatingProps()}
@@ -348,6 +420,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
348
420
  disabled={temporalDisabledDates}
349
421
  weekStartsOn={weekStartsOn}
350
422
  showFooter={false}
423
+ autoFocusDay={autoFocusDay}
351
424
  />
352
425
 
353
426
  <Separator orientation="vertical" />
@@ -414,7 +487,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
414
487
  <Button type="button" variant="ghost" size="sm" onClick={handleCancel}>
415
488
  Cancel
416
489
  </Button>
417
- <Button type="button" variant="solid" size="sm" onClick={handleApply}>
490
+ <Button type="button" variant="solid" intent="brand" size="sm" onClick={handleApply}>
418
491
  Apply
419
492
  </Button>
420
493
  </div>
@@ -0,0 +1,113 @@
1
+ import { Temporal } from "../../date-time";
2
+ import { SegmentedField, type SegmentSpec, type SegmentValues } from "../../internal";
3
+ import { dateFromSegments, dateSpec, dateToSegments, parseDatePasteIn } from "../DatePicker/DateSegments";
4
+ import type { DateSegmentOrder } from "../DatePicker/datepicker.types";
5
+ import { timeCodec, timeSpec } from "../TimePicker/TimeSegments";
6
+ import type { ClockFormat } from "../TimePicker/timepicker.types";
7
+
8
+ export type DateTimeSegmentsProps = {
9
+ /** The instant the segments display, or `undefined` for an empty field. */
10
+ value: Temporal.Instant | undefined;
11
+ /**
12
+ * Fires with a complete instant, or `undefined` the moment the segments stop
13
+ * describing one. Never fires a partial value.
14
+ */
15
+ onChange: (instant: Temporal.Instant | undefined) => void;
16
+ /** The zone the segments are read and written in. */
17
+ timeZone: string;
18
+ order?: DateSegmentOrder | undefined;
19
+ clockFormat?: ClockFormat | undefined;
20
+ showSeconds?: boolean | undefined;
21
+ isDisabled?: boolean | undefined;
22
+ isInvalid?: boolean | undefined;
23
+ label?: string | undefined;
24
+ onOpenRequest?: (() => void) | undefined;
25
+ onSubmit?: (() => void) | undefined;
26
+ id?: string | undefined;
27
+ className?: string | undefined;
28
+ };
29
+
30
+ /**
31
+ * The typeable half of `DateTimePicker`: one field of date *and* time segments.
32
+ *
33
+ * Deliberately one `SegmentedField` rather than a date field beside a time
34
+ * field: it is one value, so `Tab` and the digit roll-forward should carry
35
+ * straight from the year into the hour. `152026330p` is January 5th 2026 at
36
+ * 3:30pm, typed without a single tab.
37
+ *
38
+ * The date and time halves reuse the specs and codecs from `DatePicker` and
39
+ * `TimePicker`, so the three fields cannot drift apart in behaviour. What is
40
+ * specific here is the zone: segments are wall-clock, the value is an instant,
41
+ * and this is where that conversion happens.
42
+ *
43
+ * Internal to `DateTimePicker`; not exported from `./index.ts`.
44
+ */
45
+ export function DateTimeSegments({
46
+ value,
47
+ onChange,
48
+ timeZone,
49
+ order = "mdy",
50
+ clockFormat = "12h",
51
+ showSeconds = false,
52
+ label = "Date and time",
53
+ ...rest
54
+ }: DateTimeSegmentsProps) {
55
+ const format = showSeconds ? "HH:mm:ss" : "HH:mm";
56
+ // A space, not a slash: it separates the date from the time rather than one
57
+ // number from the next.
58
+ const spec: SegmentSpec[] = [...dateSpec(order), ...timeSpec(format, clockFormat, " ")];
59
+ const time = timeCodec(format, clockFormat);
60
+
61
+ const toSegments = (instant: Temporal.Instant | undefined): SegmentValues => {
62
+ if (!instant) return { ...dateToSegments(undefined), ...time.toSegments(undefined) };
63
+ const zoned = instant.toZonedDateTimeISO(timeZone);
64
+ return { ...dateToSegments(zoned.toPlainDate()), ...time.toSegments(zoned.toPlainTime()) };
65
+ };
66
+
67
+ const fromSegments = (values: Record<string, number>): Temporal.Instant => {
68
+ const date = dateFromSegments(values);
69
+ const plainTime = time.fromSegments(values);
70
+ return date.toPlainDateTime(plainTime).toZonedDateTime(timeZone).toInstant();
71
+ };
72
+
73
+ /**
74
+ * A pasted string is split at the first space: the date half is read by the
75
+ * date field's rules (ISO always, otherwise the segment order) and the time
76
+ * half by the clock's. Either half alone is accepted, leaving the other empty.
77
+ */
78
+ const parsePaste = (text: string): SegmentValues | null => {
79
+ const trimmed = text.trim();
80
+ // An ISO instant pastes as a whole.
81
+ try {
82
+ if (/\d{4}-\d{2}-\d{2}T/.test(trimmed)) return toSegments(Temporal.Instant.from(trimmed));
83
+ } catch {
84
+ // Not an instant after all; fall through to the halves below.
85
+ }
86
+
87
+ const [datePart, ...timeParts] = trimmed.split(/\s+/);
88
+ const datePasted = datePart ? parseDatePasteIn(order)(datePart) : null;
89
+ const timePasted = timeParts.length > 0 ? time.parsePaste(timeParts.join(" ")) : null;
90
+ if (!datePasted && !timePasted) return null;
91
+
92
+ return {
93
+ ...dateToSegments(undefined),
94
+ ...time.toSegments(undefined),
95
+ ...(datePasted ?? {}),
96
+ ...(timePasted ?? {}),
97
+ };
98
+ };
99
+
100
+ return (
101
+ <SegmentedField<Temporal.Instant>
102
+ spec={spec}
103
+ value={value}
104
+ toSegments={toSegments}
105
+ fromSegments={fromSegments}
106
+ keyOf={(instant) => instant.toString()}
107
+ onChange={onChange}
108
+ parsePaste={parsePaste}
109
+ label={label}
110
+ {...rest}
111
+ />
112
+ );
113
+ }
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import type { DisabledDates, ISODate, ISOInstant, ISOTime, WeekStartsOn } from "../../date-time";
13
+ import type { DateSegmentOrder } from "../DatePicker/datepicker.types";
13
14
 
14
15
  export type DateTimePickerProps = {
15
16
  // Value (controlled/uncontrolled) — an absolute instant, in UTC
@@ -33,9 +34,14 @@ export type DateTimePickerProps = {
33
34
  showSeconds?: boolean; // Default: false
34
35
 
35
36
  // Display
36
- placeholder?: string;
37
37
  weekStartsOn?: WeekStartsOn;
38
38
 
39
+ /**
40
+ * Segment order for the date half of the typeable field (default `mdy`).
41
+ * Never inferred from the locale — `08/09` is a different date under each.
42
+ */
43
+ segmentOrder?: DateSegmentOrder;
44
+
39
45
  // Form
40
46
  name?: string;
41
47