@sixthshift/design-system 0.2.1 → 0.3.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 (288) hide show
  1. package/README.md +135 -28
  2. package/dist/components/Badge/Badge.d.ts +5 -2
  3. package/dist/components/Badge/Badge.d.ts.map +1 -1
  4. package/dist/components/Badge/Badge.js +5 -3
  5. package/dist/components/Badge/Badge.js.map +1 -1
  6. package/dist/components/BarChart/BarChart.d.ts +8 -2
  7. package/dist/components/BarChart/BarChart.d.ts.map +1 -1
  8. package/dist/components/BarChart/BarChart.js +5 -3
  9. package/dist/components/BarChart/BarChart.js.map +1 -1
  10. package/dist/components/Calendar/Calendar.d.ts +17 -1
  11. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  12. package/dist/components/Calendar/Calendar.js +80 -225
  13. package/dist/components/Calendar/Calendar.js.map +1 -1
  14. package/dist/components/Calendar/CalendarView.d.ts +15 -0
  15. package/dist/components/Calendar/CalendarView.d.ts.map +1 -0
  16. package/dist/components/Calendar/CalendarView.js +255 -0
  17. package/dist/components/Calendar/CalendarView.js.map +1 -0
  18. package/dist/components/Calendar/calendar.types.d.ts +78 -27
  19. package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
  20. package/dist/components/Calendar/calendar.types.js +10 -3
  21. package/dist/components/Calendar/calendar.types.js.map +1 -1
  22. package/dist/components/Calendar/index.d.ts +16 -2
  23. package/dist/components/Calendar/index.d.ts.map +1 -1
  24. package/dist/components/Calendar/index.js +15 -1
  25. package/dist/components/Calendar/index.js.map +1 -1
  26. package/dist/components/ColorDot/ColorDot.d.ts +9 -3
  27. package/dist/components/ColorDot/ColorDot.d.ts.map +1 -1
  28. package/dist/components/ColorDot/ColorDot.js +5 -3
  29. package/dist/components/ColorDot/ColorDot.js.map +1 -1
  30. package/dist/components/DatePicker/DatePicker.d.ts +2 -2
  31. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  32. package/dist/components/DatePicker/DatePicker.js +65 -10
  33. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  34. package/dist/components/DatePicker/datepicker.types.d.ts +34 -36
  35. package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
  36. package/dist/components/DatePicker/datepicker.types.js +5 -3
  37. package/dist/components/DatePicker/datepicker.types.js.map +1 -1
  38. package/dist/components/DatePicker/index.d.ts +10 -1
  39. package/dist/components/DatePicker/index.d.ts.map +1 -1
  40. package/dist/components/DatePicker/index.js +8 -0
  41. package/dist/components/DatePicker/index.js.map +1 -1
  42. package/dist/components/DateRangePicker/DateRangePicker.d.ts +3 -2
  43. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  44. package/dist/components/DateRangePicker/DateRangePicker.js +17 -21
  45. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  46. package/dist/components/DateRangePicker/daterangepicker.types.d.ts +20 -20
  47. package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
  48. package/dist/components/DateRangePicker/daterangepicker.types.js +6 -0
  49. package/dist/components/DateRangePicker/daterangepicker.types.js.map +1 -1
  50. package/dist/components/DateRangePicker/index.d.ts +8 -1
  51. package/dist/components/DateRangePicker/index.d.ts.map +1 -1
  52. package/dist/components/DateRangePicker/index.js +6 -0
  53. package/dist/components/DateRangePicker/index.js.map +1 -1
  54. package/dist/components/DateTimePicker/DateTimePicker.d.ts +3 -3
  55. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  56. package/dist/components/DateTimePicker/DateTimePicker.js +30 -12
  57. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  58. package/dist/components/DateTimePicker/datetimepicker.types.d.ts +20 -17
  59. package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
  60. package/dist/components/DateTimePicker/datetimepicker.types.js +10 -0
  61. package/dist/components/DateTimePicker/datetimepicker.types.js.map +1 -1
  62. package/dist/components/DateTimePicker/index.d.ts +8 -1
  63. package/dist/components/DateTimePicker/index.d.ts.map +1 -1
  64. package/dist/components/DateTimePicker/index.js +6 -0
  65. package/dist/components/DateTimePicker/index.js.map +1 -1
  66. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +3 -3
  67. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  68. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +41 -20
  69. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  70. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +22 -18
  71. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
  72. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js +8 -0
  73. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js.map +1 -1
  74. package/dist/components/DateTimeRangePicker/index.d.ts +8 -0
  75. package/dist/components/DateTimeRangePicker/index.d.ts.map +1 -1
  76. package/dist/components/DateTimeRangePicker/index.js +7 -0
  77. package/dist/components/DateTimeRangePicker/index.js.map +1 -1
  78. package/dist/components/EmptyState/EmptyState.d.ts +16 -5
  79. package/dist/components/EmptyState/EmptyState.d.ts.map +1 -1
  80. package/dist/components/EmptyState/EmptyState.js +5 -3
  81. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  82. package/dist/components/Field/Field.d.ts +3 -3
  83. package/dist/components/Field/Field.d.ts.map +1 -1
  84. package/dist/components/Field/Field.js +6 -4
  85. package/dist/components/Field/Field.js.map +1 -1
  86. package/dist/components/LineChart/LineChart.d.ts +18 -2
  87. package/dist/components/LineChart/LineChart.d.ts.map +1 -1
  88. package/dist/components/LineChart/LineChart.js +5 -3
  89. package/dist/components/LineChart/LineChart.js.map +1 -1
  90. package/dist/components/Markdown/Markdown.d.ts +2 -4
  91. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  92. package/dist/components/Markdown/Markdown.js +3 -2
  93. package/dist/components/Markdown/Markdown.js.map +1 -1
  94. package/dist/components/Message/Message.d.ts.map +1 -1
  95. package/dist/components/Message/Message.js +16 -1
  96. package/dist/components/Message/Message.js.map +1 -1
  97. package/dist/components/MetricList/MetricList.d.ts +3 -3
  98. package/dist/components/MetricList/MetricList.d.ts.map +1 -1
  99. package/dist/components/MetricList/MetricList.js +5 -3
  100. package/dist/components/MetricList/MetricList.js.map +1 -1
  101. package/dist/components/Modal/Modal.d.ts +24 -5
  102. package/dist/components/Modal/Modal.d.ts.map +1 -1
  103. package/dist/components/Modal/Modal.js +16 -6
  104. package/dist/components/Modal/Modal.js.map +1 -1
  105. package/dist/components/Modal/components/ModalContext.d.ts +14 -0
  106. package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
  107. package/dist/components/Modal/components/ModalContext.js.map +1 -1
  108. package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
  109. package/dist/components/Modal/components/ModalHeader.js +13 -2
  110. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  111. package/dist/components/NavBottom/NavBottom.d.ts +2 -1
  112. package/dist/components/NavBottom/NavBottom.d.ts.map +1 -1
  113. package/dist/components/NavBottom/NavBottom.js +6 -4
  114. package/dist/components/NavBottom/NavBottom.js.map +1 -1
  115. package/dist/components/NavSide/NavItem.js +1 -1
  116. package/dist/components/NavSide/NavItem.js.map +1 -1
  117. package/dist/components/NavSide/NavSide.d.ts +2 -1
  118. package/dist/components/NavSide/NavSide.d.ts.map +1 -1
  119. package/dist/components/NavSide/NavSide.js +5 -3
  120. package/dist/components/NavSide/NavSide.js.map +1 -1
  121. package/dist/components/Popover/Popover.d.ts.map +1 -1
  122. package/dist/components/Popover/Popover.js +7 -0
  123. package/dist/components/Popover/Popover.js.map +1 -1
  124. package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
  125. package/dist/components/Popover/components/PopoverBody.js +5 -2
  126. package/dist/components/Popover/components/PopoverBody.js.map +1 -1
  127. package/dist/components/Popover/components/PopoverContext.d.ts +1 -0
  128. package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
  129. package/dist/components/Popover/components/PopoverContext.js.map +1 -1
  130. package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
  131. package/dist/components/Popover/components/PopoverTrigger.js +2 -2
  132. package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
  133. package/dist/components/ProgressBar/ProgressBar.d.ts +2 -1
  134. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  135. package/dist/components/ProgressBar/ProgressBar.js +5 -3
  136. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  137. package/dist/components/Select/Select.d.ts +11 -2
  138. package/dist/components/Select/Select.d.ts.map +1 -1
  139. package/dist/components/Select/Select.js +64 -18
  140. package/dist/components/Select/Select.js.map +1 -1
  141. package/dist/components/Select/SelectDropdown.d.ts +14 -2
  142. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  143. package/dist/components/Select/SelectDropdown.js +19 -4
  144. package/dist/components/Select/SelectDropdown.js.map +1 -1
  145. package/dist/components/Select/SelectTrigger.d.ts +10 -3
  146. package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
  147. package/dist/components/Select/SelectTrigger.js +12 -3
  148. package/dist/components/Select/SelectTrigger.js.map +1 -1
  149. package/dist/components/Select/useSelectKeyboard.d.ts +15 -1
  150. package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
  151. package/dist/components/Select/useSelectKeyboard.js +73 -65
  152. package/dist/components/Select/useSelectKeyboard.js.map +1 -1
  153. package/dist/components/Sheet/Sheet.d.ts +19 -5
  154. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  155. package/dist/components/Sheet/Sheet.js +18 -6
  156. package/dist/components/Sheet/Sheet.js.map +1 -1
  157. package/dist/components/Sheet/components/SheetContext.d.ts +10 -0
  158. package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
  159. package/dist/components/Sheet/components/SheetContext.js.map +1 -1
  160. package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
  161. package/dist/components/Sheet/components/SheetHeader.js +11 -2
  162. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  163. package/dist/components/Skeleton/Skeleton.d.ts +2 -1
  164. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  165. package/dist/components/Skeleton/Skeleton.js +5 -3
  166. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  167. package/dist/components/Sparkline/Sparkline.d.ts +10 -2
  168. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  169. package/dist/components/Sparkline/Sparkline.js +5 -3
  170. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  171. package/dist/components/StatsCard/StatsCard.d.ts +4 -4
  172. package/dist/components/StatsCard/StatsCard.d.ts.map +1 -1
  173. package/dist/components/StatsCard/StatsCard.js +5 -3
  174. package/dist/components/StatsCard/StatsCard.js.map +1 -1
  175. package/dist/components/Tabs/Tabs.d.ts +2 -2
  176. package/dist/components/Tabs/components/TabsList.d.ts +1 -1
  177. package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
  178. package/dist/components/Tabs/components/TabsList.js +5 -4
  179. package/dist/components/Tabs/components/TabsList.js.map +1 -1
  180. package/dist/components/Tabs/components/TabsPanels.d.ts +1 -1
  181. package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
  182. package/dist/components/Tabs/components/TabsPanels.js +5 -3
  183. package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
  184. package/dist/components/TagChip/TagChip.d.ts +2 -1
  185. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  186. package/dist/components/TagChip/TagChip.js +5 -3
  187. package/dist/components/TagChip/TagChip.js.map +1 -1
  188. package/dist/components/TagInput/TagInput.d.ts +1 -1
  189. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  190. package/dist/components/TagInput/TagInput.js +5 -4
  191. package/dist/components/TagInput/TagInput.js.map +1 -1
  192. package/dist/components/TimePicker/TimePicker.d.ts +2 -2
  193. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  194. package/dist/components/TimePicker/TimePicker.js +27 -11
  195. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  196. package/dist/components/TimePicker/timepicker.types.d.ts +14 -13
  197. package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
  198. package/dist/components/TimePicker/timepicker.types.js +4 -3
  199. package/dist/components/TimePicker/timepicker.types.js.map +1 -1
  200. package/dist/date-time/index.d.ts +2 -0
  201. package/dist/date-time/index.d.ts.map +1 -1
  202. package/dist/date-time/index.js +9 -0
  203. package/dist/date-time/index.js.map +1 -1
  204. package/dist/date-time/iso.d.ts +261 -0
  205. package/dist/date-time/iso.d.ts.map +1 -0
  206. package/dist/date-time/iso.js +358 -0
  207. package/dist/date-time/iso.js.map +1 -0
  208. package/dist/date-time/now.d.ts +7 -6
  209. package/dist/date-time/now.d.ts.map +1 -1
  210. package/dist/date-time/now.js +3 -3
  211. package/dist/date-time/now.js.map +1 -1
  212. package/dist/theme/index.d.ts +4 -3
  213. package/dist/theme/index.d.ts.map +1 -1
  214. package/dist/theme/index.js +3 -2
  215. package/dist/theme/index.js.map +1 -1
  216. package/dist/theme/schema.d.ts +70 -32
  217. package/dist/theme/schema.d.ts.map +1 -1
  218. package/dist/theme/schema.js +36 -18
  219. package/dist/theme/schema.js.map +1 -1
  220. package/package.json +9 -15
  221. package/src/components/Badge/Badge.tsx +5 -4
  222. package/src/components/BarChart/BarChart.tsx +25 -30
  223. package/src/components/Calendar/Calendar.tsx +91 -401
  224. package/src/components/Calendar/CalendarView.tsx +445 -0
  225. package/src/components/Calendar/calendar.types.ts +94 -29
  226. package/src/components/Calendar/index.ts +16 -17
  227. package/src/components/ColorDot/ColorDot.tsx +6 -4
  228. package/src/components/DatePicker/DatePicker.tsx +92 -16
  229. package/src/components/DatePicker/datepicker.types.ts +38 -39
  230. package/src/components/DatePicker/index.ts +11 -10
  231. package/src/components/DateRangePicker/DateRangePicker.tsx +17 -21
  232. package/src/components/DateRangePicker/daterangepicker.types.ts +22 -22
  233. package/src/components/DateRangePicker/index.ts +9 -1
  234. package/src/components/DateTimePicker/DateTimePicker.tsx +46 -18
  235. package/src/components/DateTimePicker/datetimepicker.types.ts +22 -18
  236. package/src/components/DateTimePicker/index.ts +9 -1
  237. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +62 -28
  238. package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +24 -19
  239. package/src/components/DateTimeRangePicker/index.ts +9 -0
  240. package/src/components/EmptyState/EmptyState.tsx +8 -7
  241. package/src/components/Field/Field.tsx +7 -6
  242. package/src/components/LineChart/LineChart.tsx +147 -141
  243. package/src/components/Markdown/Markdown.tsx +4 -3
  244. package/src/components/Message/Message.tsx +17 -1
  245. package/src/components/MetricList/MetricList.tsx +10 -5
  246. package/src/components/Modal/Modal.tsx +119 -87
  247. package/src/components/Modal/components/ModalContext.tsx +14 -0
  248. package/src/components/Modal/components/ModalHeader.tsx +14 -2
  249. package/src/components/NavBottom/NavBottom.tsx +6 -4
  250. package/src/components/NavSide/NavItem.tsx +1 -1
  251. package/src/components/NavSide/NavSide.tsx +5 -3
  252. package/src/components/Popover/Popover.tsx +7 -0
  253. package/src/components/Popover/components/PopoverBody.tsx +6 -1
  254. package/src/components/Popover/components/PopoverContext.tsx +1 -0
  255. package/src/components/Popover/components/PopoverTrigger.tsx +2 -1
  256. package/src/components/ProgressBar/ProgressBar.tsx +32 -28
  257. package/src/components/Select/Select.tsx +76 -19
  258. package/src/components/Select/SelectDropdown.tsx +32 -3
  259. package/src/components/Select/SelectTrigger.tsx +26 -3
  260. package/src/components/Select/useSelectKeyboard.ts +20 -10
  261. package/src/components/Sheet/Sheet.tsx +108 -83
  262. package/src/components/Sheet/components/SheetContext.tsx +10 -0
  263. package/src/components/Sheet/components/SheetHeader.tsx +17 -2
  264. package/src/components/Skeleton/Skeleton.tsx +5 -3
  265. package/src/components/Sparkline/Sparkline.tsx +29 -36
  266. package/src/components/StatsCard/StatsCard.tsx +7 -6
  267. package/src/components/Tabs/components/TabsList.tsx +5 -3
  268. package/src/components/Tabs/components/TabsPanels.tsx +5 -3
  269. package/src/components/TagChip/TagChip.tsx +10 -3
  270. package/src/components/TagInput/TagInput.tsx +5 -3
  271. package/src/components/TimePicker/TimePicker.tsx +31 -13
  272. package/src/components/TimePicker/timepicker.types.ts +14 -13
  273. package/src/date-time/index.ts +61 -0
  274. package/src/date-time/iso.ts +511 -0
  275. package/src/date-time/now.ts +10 -9
  276. package/src/theme/index.ts +11 -3
  277. package/src/theme/schema.ts +82 -54
  278. package/src/theme/tokens.css +807 -0
  279. package/dist/styles.css +0 -2
  280. package/dist/theme.generated.css +0 -438
  281. package/src/styles/base.css +0 -41
  282. package/src/theme/palette.json +0 -100
  283. package/src/theme/palette.schema.json +0 -40
  284. package/src/theme/theme.json +0 -349
  285. package/src/theme/theme.schema.json +0 -876
  286. package/src/theme/typography.json +0 -7
  287. package/src/theme/typography.schema.json +0 -36
  288. package/tailwind.config.ts +0 -261
@@ -1,27 +1,31 @@
1
- import type { Temporal, WeekStartsOn } from "../../date-time";
2
-
3
- export type DisabledDateMatcher =
4
- | Temporal.PlainDate
5
- | Temporal.PlainDate[]
6
- | ((date: Temporal.PlainDate) => boolean)
7
- | { before: Temporal.PlainDate }
8
- | { after: Temporal.PlainDate }
9
- | { from: Temporal.PlainDate; to: Temporal.PlainDate };
1
+ /**
2
+ * DateTimePicker types.
3
+ *
4
+ * The value is an absolute instant, exchanged as a canonical UTC ISO string
5
+ * (`"2026-08-26T00:30:00Z"`). Input written with a numeric offset is accepted and
6
+ * normalised to the `Z` form, so one instant always has one representation.
7
+ *
8
+ * Date and time constraints are plain dates and wall-clock times, since they
9
+ * describe the picker's grid rather than an absolute moment.
10
+ */
11
+
12
+ import type { DisabledDates, ISODate, ISOInstant, ISOTime, WeekStartsOn } from "../../date-time";
10
13
 
11
14
  export type DateTimePickerProps = {
12
- // Value (controlled/uncontrolled) - NOW USES INSTANT
13
- value?: Temporal.Instant | undefined;
14
- defaultValue?: Temporal.Instant | undefined;
15
- onChange?: (instant: Temporal.Instant | undefined) => void;
15
+ // Value (controlled/uncontrolled) — an absolute instant, in UTC
16
+ value?: ISOInstant | undefined;
17
+ defaultValue?: ISOInstant | undefined;
18
+ /** Called with a canonical UTC instant string, or undefined when cleared. */
19
+ onChange?: (instant: ISOInstant | undefined) => void;
16
20
 
17
21
  // Date constraints
18
- minDate?: Temporal.PlainDate;
19
- maxDate?: Temporal.PlainDate;
20
- disabledDates?: DisabledDateMatcher | DisabledDateMatcher[];
22
+ minDate?: ISODate;
23
+ maxDate?: ISODate;
24
+ disabledDates?: DisabledDates | DisabledDates[];
21
25
 
22
26
  // Time constraints
23
- minTime?: Temporal.PlainTime;
24
- maxTime?: Temporal.PlainTime;
27
+ minTime?: ISOTime;
28
+ maxTime?: ISOTime;
25
29
  minuteStep?: 1 | 5 | 10 | 15 | 30;
26
30
 
27
31
  // Time format
@@ -1,2 +1,10 @@
1
+ /**
2
+ * Public surface of `@sixthshift/design-system/datetime-picker`.
3
+ *
4
+ * `DisabledDateMatcher` was a Temporal-shaped type and is gone; the ISO
5
+ * equivalent `DisabledDates` is re-exported here.
6
+ */
7
+
8
+ export type { DisabledDates, ISODate, ISOInstant, ISOTime } from "../../date-time";
1
9
  export { DateTimePicker } from "./DateTimePicker";
2
- export type { DateTimePickerProps, DisabledDateMatcher } from "./datetimepicker.types";
10
+ export type { DateTimePickerProps } from "./datetimepicker.types";
@@ -2,12 +2,23 @@ import { autoUpdate, FloatingPortal, flip, offset, shift, useClick, useDismiss,
2
2
  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
- import type * as React from "react";
5
+ import * as React from "react";
6
6
  import { useCallback, useId, useMemo, useState } from "react";
7
- import { now, Temporal, today } from "../../date-time";
7
+ import {
8
+ adaptDisabledDates,
9
+ fromISODateOrUndefined,
10
+ fromISOInstantRange,
11
+ fromISOTimeOrUndefined,
12
+ now,
13
+ Temporal,
14
+ type TemporalInstantRange,
15
+ today,
16
+ toISOInstant,
17
+ toISOInstantRange,
18
+ } from "../../date-time";
8
19
 
9
20
  import { Button } from "../Button";
10
- import { Calendar } from "../Calendar";
21
+ import { CalendarView } from "../Calendar/CalendarView";
11
22
  import type { DateRangeValue } from "../Calendar/calendar.types";
12
23
  import { Separator } from "../Separator";
13
24
  import { PeriodSelector } from "../TimePicker/PeriodSelector";
@@ -57,9 +68,12 @@ function formatInstantDisplay(instant: Temporal.Instant, clockFormat: "12h" | "2
57
68
  }
58
69
 
59
70
  /**
60
- * Format an Instant range for display
71
+ * Format an Instant range for display.
72
+ *
73
+ * Takes the internal Temporal range, not the public ISO shape — display runs
74
+ * below the boundary.
61
75
  */
62
- function formatRangeDisplay(range: DateTimeRangeValue | undefined, clockFormat: "12h" | "24h", showSeconds: boolean): string {
76
+ function formatRangeDisplay(range: TemporalInstantRange | undefined, clockFormat: "12h" | "24h", showSeconds: boolean): string {
63
77
  if (!range?.from && !range?.to) {
64
78
  return "";
65
79
  }
@@ -78,7 +92,7 @@ function formatRangeDisplay(range: DateTimeRangeValue | undefined, clockFormat:
78
92
  /**
79
93
  * Default preset ranges for DateTimeRangePicker
80
94
  *
81
- * Uses clean hour boundaries and returns Instant values
95
+ * Uses clean hour boundaries and returns canonical UTC instant strings
82
96
  */
83
97
  function getDefaultPresets(): DateTimeRangePresetOption[] {
84
98
  return [
@@ -87,7 +101,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
87
101
  value: () => {
88
102
  const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
89
103
  const start = end.subtract({ hours: 1 });
90
- return { from: start, to: end };
104
+ return { from: toISOInstant(start), to: toISOInstant(end) };
91
105
  },
92
106
  },
93
107
  {
@@ -95,7 +109,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
95
109
  value: () => {
96
110
  const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
97
111
  const start = end.subtract({ hours: 24 });
98
- return { from: start, to: end };
112
+ return { from: toISOInstant(start), to: toISOInstant(end) };
99
113
  },
100
114
  },
101
115
  {
@@ -103,7 +117,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
103
117
  value: () => {
104
118
  const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
105
119
  const start = end.subtract({ hours: 7 * 24 });
106
- return { from: start, to: end };
120
+ return { from: toISOInstant(start), to: toISOInstant(end) };
107
121
  },
108
122
  },
109
123
  {
@@ -111,7 +125,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
111
125
  value: () => {
112
126
  const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
113
127
  const start = end.subtract({ hours: 30 * 24 });
114
- return { from: start, to: end };
128
+ return { from: toISOInstant(start), to: toISOInstant(end) };
115
129
  },
116
130
  },
117
131
  {
@@ -121,7 +135,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
121
135
  const tz = Temporal.Now.timeZoneId();
122
136
  const zonedNow = end.toZonedDateTimeISO(tz);
123
137
  const startOfMonth = zonedNow.toPlainDate().with({ day: 1 }).toPlainDateTime(Temporal.PlainTime.from("00:00:00")).toZonedDateTime(tz).toInstant();
124
- return { from: startOfMonth, to: end };
138
+ return { from: toISOInstant(startOfMonth), to: toISOInstant(end) };
125
139
  },
126
140
  },
127
141
  ];
@@ -131,9 +145,9 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
131
145
  * DateTimeRangePicker - A component for selecting a datetime range
132
146
  *
133
147
  * Combines date range selection with separate time pickers for start and end times.
134
- * Uses Temporal.PlainDateTime for all values.
148
+ * All values cross the boundary as canonical UTC instant strings.
135
149
  */
136
- export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
150
+ export const DateTimeRangePicker = React.forwardRef<HTMLDivElement, DateTimeRangePickerProps>((props, ref) => {
137
151
  const {
138
152
  value,
139
153
  defaultValue,
@@ -161,11 +175,30 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
161
175
  // Open state
162
176
  const [open, setOpen] = useState(false);
163
177
 
178
+ // ---------------------------------------------------------------------------
179
+ // The ISO boundary.
180
+ //
181
+ // Both ends of the range cross as canonical UTC instant strings; constraints
182
+ // cross as ISO dates and times. Below this block everything is Temporal, as
183
+ // before. Each conversion is memoised on its source value so the Temporal
184
+ // objects handed downstream stay referentially stable.
185
+ // ---------------------------------------------------------------------------
186
+
187
+ const temporalValue = useMemo(() => fromISOInstantRange(value), [value]);
188
+ const temporalDefaultValue = useMemo(() => fromISOInstantRange(defaultValue), [defaultValue]);
189
+ const temporalMinDate = useMemo(() => fromISODateOrUndefined(minDate), [minDate]);
190
+ const temporalMaxDate = useMemo(() => fromISODateOrUndefined(maxDate), [maxDate]);
191
+ const temporalMinTime = useMemo(() => fromISOTimeOrUndefined(minTime), [minTime]);
192
+ const temporalMaxTime = useMemo(() => fromISOTimeOrUndefined(maxTime), [maxTime]);
193
+ const temporalDisabledDates = useMemo(() => adaptDisabledDates(disabledDates), [disabledDates]);
194
+
195
+ const handleChange = useCallback((next: TemporalInstantRange | undefined) => onChange?.(toISOInstantRange(next)), [onChange]);
196
+
164
197
  // Controllable value state (external/committed value)
165
- const [committedValue, setCommittedValue] = useControllableState({
166
- value,
167
- defaultValue,
168
- onChange,
198
+ const [committedValue, setCommittedValue] = useControllableState<TemporalInstantRange | undefined>({
199
+ value: temporalValue,
200
+ defaultValue: temporalDefaultValue,
201
+ onChange: handleChange,
169
202
  });
170
203
 
171
204
  // Draft state (date range + time parts for both start and end)
@@ -303,8 +336,8 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
303
336
  };
304
337
  }, [clockFormat, draftEndHour, draftEndMinute, draftEndSecond, draftEndPeriod]);
305
338
 
306
- // Combine draft dates and times into DateTimeRangeValue
307
- const getDraftRange = useCallback((): DateTimeRangeValue => {
339
+ // Combine draft dates and times into the internal Temporal range
340
+ const getDraftRange = useCallback((): TemporalInstantRange => {
308
341
  const tz = Temporal.Now.timeZoneId();
309
342
 
310
343
  const from = draftDateRange?.from
@@ -392,7 +425,7 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
392
425
  // Apply preset
393
426
  const _handlePresetClick = useCallback(
394
427
  (preset: { label: string; value: DateTimeRangeValue }) => {
395
- setCommittedValue(preset.value);
428
+ setCommittedValue(fromISOInstantRange(preset.value));
396
429
  setOpen(false);
397
430
  },
398
431
  [setCommittedValue]
@@ -445,15 +478,15 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
445
478
  const checkTimeDisabled = useCallback(
446
479
  (hour: number, minute: number, second: number): boolean => {
447
480
  const temporal = Temporal.PlainTime.from({ hour, minute, second });
448
- return isTimeDisabled(temporal, minTime, maxTime);
481
+ return isTimeDisabled(temporal, temporalMinTime, temporalMaxTime);
449
482
  },
450
- [minTime, maxTime]
483
+ [temporalMinTime, temporalMaxTime]
451
484
  );
452
485
 
453
486
  return (
454
487
  <>
455
488
  {/* Trigger Input */}
456
- <div className="relative flex min-w-125 items-center">
489
+ <div ref={ref} className="relative flex min-w-125 items-center">
457
490
  <CalendarIcon className="pointer-events-none absolute left-3 h-4 w-4 text-fg-subtle" />
458
491
  <input
459
492
  ref={refs.setReference as React.Ref<HTMLInputElement>}
@@ -531,15 +564,15 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
531
564
  )}
532
565
 
533
566
  {/* Date Calendar */}
534
- <Calendar
567
+ <CalendarView
535
568
  mode="range"
536
569
  value={draftDateRange}
537
570
  onSelect={setDraftDateRange as (range: DateRangeValue | undefined) => void}
538
571
  month={month}
539
572
  onMonthChange={setMonth}
540
- minDate={minDate}
541
- maxDate={maxDate}
542
- disabled={disabledDates}
573
+ minDate={temporalMinDate}
574
+ maxDate={temporalMaxDate}
575
+ disabled={temporalDisabledDates}
543
576
  weekStartsOn={weekStartsOn}
544
577
  showFooter={false}
545
578
  />
@@ -676,4 +709,5 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
676
709
  )}
677
710
  </>
678
711
  );
679
- };
712
+ });
713
+ DateTimeRangePicker.displayName = "DateTimeRangePicker";
@@ -1,20 +1,25 @@
1
- import type { Temporal, WeekStartsOn } from "../../date-time";
2
-
3
- export type DisabledDateMatcher =
4
- | Temporal.PlainDate
5
- | Temporal.PlainDate[]
6
- | ((date: Temporal.PlainDate) => boolean)
7
- | { before: Temporal.PlainDate }
8
- | { after: Temporal.PlainDate }
9
- | { from: Temporal.PlainDate; to: Temporal.PlainDate };
10
-
11
- export type DateTimeRangeValue = {
12
- from: Temporal.Instant | undefined;
13
- to: Temporal.Instant | undefined;
14
- };
1
+ /**
2
+ * DateTimeRangePicker types.
3
+ *
4
+ * Both ends of the range are absolute instants, exchanged as canonical UTC ISO
5
+ * strings (`"2026-08-26T00:30:00Z"`). Date and time constraints are plain dates
6
+ * and wall-clock times, since they describe the picker's grid rather than an
7
+ * absolute moment.
8
+ */
9
+
10
+ import type { DisabledDates, ISODate, ISOInstantRange, ISOTime, WeekStartsOn } from "../../date-time";
11
+
12
+ /**
13
+ * A datetime range.
14
+ *
15
+ * Alias of `ISOInstantRange`, kept under this name because it is the historical
16
+ * public type for this component.
17
+ */
18
+ export type DateTimeRangeValue = ISOInstantRange;
15
19
 
16
20
  export type DateTimeRangePresetOption = {
17
21
  label: string;
22
+ /** Called when the picker renders, so relative ranges stay current. */
18
23
  value: () => DateTimeRangeValue;
19
24
  };
20
25
 
@@ -29,13 +34,13 @@ export type DateTimeRangePickerProps = {
29
34
  showPresets?: boolean; // Default: true
30
35
 
31
36
  // Date constraints
32
- minDate?: Temporal.PlainDate;
33
- maxDate?: Temporal.PlainDate;
34
- disabledDates?: DisabledDateMatcher | DisabledDateMatcher[];
37
+ minDate?: ISODate;
38
+ maxDate?: ISODate;
39
+ disabledDates?: DisabledDates | DisabledDates[];
35
40
 
36
41
  // Time constraints (apply to both start and end times)
37
- minTime?: Temporal.PlainTime;
38
- maxTime?: Temporal.PlainTime;
42
+ minTime?: ISOTime;
43
+ maxTime?: ISOTime;
39
44
  minuteStep?: 1 | 5 | 10 | 15 | 30;
40
45
 
41
46
  // Time format
@@ -1,2 +1,11 @@
1
+ /**
2
+ * Public surface of `@sixthshift/design-system/datetime-range-picker`.
3
+ *
4
+ * `DisabledDateMatcher` was a Temporal-shaped type and is gone; the ISO
5
+ * equivalent `DisabledDates` is re-exported here. `DateTimeRangeValue` survives
6
+ * as an alias of `ISOInstantRange`.
7
+ */
8
+
9
+ export type { DisabledDates, ISODate, ISOInstant, ISOInstantRange, ISOTime } from "../../date-time";
1
10
  export { DateTimeRangePicker } from "./DateTimeRangePicker";
2
11
  export type { DateTimeRangePickerProps, DateTimeRangePresetOption, DateTimeRangeValue } from "./datetimerangepicker.types";
@@ -1,23 +1,23 @@
1
1
  import { Muted } from "@sixthshift/design-system/muted";
2
2
  import { cn } from "@sixthshift/design-system/utils";
3
- import type { HTMLAttributes, ReactNode } from "react";
3
+ import * as React from "react";
4
4
 
5
- export type EmptyStateProps = HTMLAttributes<HTMLDivElement> & {
5
+ export type EmptyStateProps = React.HTMLAttributes<HTMLDivElement> & {
6
6
  /** Optional icon to display */
7
- icon?: ReactNode;
7
+ icon?: React.ReactNode;
8
8
  /** Message to display */
9
9
  message: string;
10
10
  /** Optional description for more context */
11
11
  description?: string;
12
12
  /** Optional action button or element */
13
- action?: ReactNode;
13
+ action?: React.ReactNode;
14
14
  /** Additional CSS classes */
15
15
  className?: string;
16
16
  };
17
17
 
18
- export const EmptyState = ({ icon, message, description, action, className, ...props }: EmptyStateProps) => {
18
+ export const EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(({ icon, message, description, action, className, ...props }, ref) => {
19
19
  return (
20
- <div className={cn("flex flex-col items-center justify-center gap-3 p-8 text-center", className)} {...props}>
20
+ <div ref={ref} className={cn("flex flex-col items-center justify-center gap-3 p-8 text-center", className)} {...props}>
21
21
  {icon && <div className="text-fg-subtle">{icon}</div>}
22
22
  <div className="flex flex-col gap-1">
23
23
  <Muted>{message}</Muted>
@@ -26,4 +26,5 @@ export const EmptyState = ({ icon, message, description, action, className, ...p
26
26
  {action && <div className="mt-2">{action}</div>}
27
27
  </div>
28
28
  );
29
- };
29
+ });
30
+ EmptyState.displayName = "EmptyState";
@@ -1,5 +1,5 @@
1
1
  import { cn } from "@sixthshift/design-system/utils";
2
- import type { ReactNode } from "react";
2
+ import * as React from "react";
3
3
 
4
4
  /**
5
5
  * The labelled identifier carve-out used by identity-disclosure surfaces
@@ -22,7 +22,7 @@ export type FieldProps = {
22
22
  /** The humane label for what the identifier identifies ("WhatsApp", "Email"). */
23
23
  label: string;
24
24
  /** The identifier itself. Rendered monospaced + breakable by default. */
25
- children: ReactNode;
25
+ children: React.ReactNode;
26
26
  /**
27
27
  * `stacked` (default): label above, value below — best for long identifiers
28
28
  * that need horizontal room to wrap.
@@ -39,12 +39,12 @@ export type FieldProps = {
39
39
  className?: string;
40
40
  };
41
41
 
42
- export const Field = ({ label, children, layout = "stacked", mono = true, className }: FieldProps) => {
42
+ export const Field = React.forwardRef<HTMLDivElement, FieldProps>(({ label, children, layout = "stacked", mono = true, className }, ref) => {
43
43
  const valueClass = cn("text-fg-subtle text-xs", mono && "break-all font-mono");
44
44
 
45
45
  if (layout === "row") {
46
46
  return (
47
- <div className={cn("flex items-baseline justify-between gap-3", className)}>
47
+ <div ref={ref} className={cn("flex items-baseline justify-between gap-3", className)}>
48
48
  <span className="shrink-0 text-fg-subtle text-sm">{label}</span>
49
49
  <span className={cn(valueClass, "min-w-0 text-right")}>{children}</span>
50
50
  </div>
@@ -52,9 +52,10 @@ export const Field = ({ label, children, layout = "stacked", mono = true, classN
52
52
  }
53
53
 
54
54
  return (
55
- <div className={cn("flex flex-col gap-1", className)}>
55
+ <div ref={ref} className={cn("flex flex-col gap-1", className)}>
56
56
  <span className="text-fg-subtle text-xs uppercase tracking-wide">{label}</span>
57
57
  <span className={valueClass}>{children}</span>
58
58
  </div>
59
59
  );
60
- };
60
+ });
61
+ Field.displayName = "Field";