@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
@@ -2,8 +2,9 @@ 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 { Clock, X } from "lucide-react";
5
- import type * as React from "react";
6
- import { useCallback, useId, useState } from "react";
5
+ import * as React from "react";
6
+ import { useCallback, useId, useMemo, useState } from "react";
7
+ import { fromISOTime, fromISOTimeOrUndefined, type Temporal, toISOTimeOrUndefined } from "../../date-time";
7
8
  import { Button } from "../Button";
8
9
  import { Separator } from "../Separator";
9
10
  import { PeriodSelector } from "./PeriodSelector";
@@ -25,7 +26,7 @@ import type { ParsedTime, TimePeriod, TimePickerProps, TimePresetOption } from "
25
26
 
26
27
  export type { TimePickerProps };
27
28
 
28
- export const TimePicker = (props: TimePickerProps) => {
29
+ export const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>((props, ref) => {
29
30
  const {
30
31
  value,
31
32
  defaultValue,
@@ -46,11 +47,27 @@ export const TimePicker = (props: TimePickerProps) => {
46
47
  // Open state
47
48
  const [open, setOpen] = useState(false);
48
49
 
50
+ // ---------------------------------------------------------------------------
51
+ // The ISO boundary.
52
+ //
53
+ // Props arrive as ISO time strings and onChange emits the canonical
54
+ // `HH:MM:SS` form; everything below works in Temporal.PlainTime as before.
55
+ // Each conversion is memoised on its source string, so the Temporal values
56
+ // handed to the hooks below stay referentially stable across renders.
57
+ // ---------------------------------------------------------------------------
58
+
59
+ const temporalValue = useMemo(() => fromISOTimeOrUndefined(value), [value]);
60
+ const temporalDefaultValue = useMemo(() => fromISOTimeOrUndefined(defaultValue), [defaultValue]);
61
+ const temporalMinTime = useMemo(() => fromISOTimeOrUndefined(minTime), [minTime]);
62
+ const temporalMaxTime = useMemo(() => fromISOTimeOrUndefined(maxTime), [maxTime]);
63
+
64
+ const handleChange = useCallback((next: Temporal.PlainTime | undefined) => onChange?.(toISOTimeOrUndefined(next)), [onChange]);
65
+
49
66
  // Controllable value state (external/committed value)
50
- const [committedValue, setCommittedValue] = useControllableState({
51
- value,
52
- defaultValue,
53
- onChange,
67
+ const [committedValue, setCommittedValue] = useControllableState<Temporal.PlainTime | undefined>({
68
+ value: temporalValue,
69
+ defaultValue: temporalDefaultValue,
70
+ onChange: handleChange,
54
71
  });
55
72
 
56
73
  // Parse committed value
@@ -108,13 +125,13 @@ export const TimePicker = (props: TimePickerProps) => {
108
125
  const temporalTime = parsedToTemporal(parsed);
109
126
 
110
127
  // Check if disabled
111
- if (isTimeDisabled(temporalTime, minTime, maxTime)) {
128
+ if (isTimeDisabled(temporalTime, temporalMinTime, temporalMaxTime)) {
112
129
  return;
113
130
  }
114
131
 
115
132
  setCommittedValue(temporalTime);
116
133
  setOpen(false);
117
- }, [getDraftTime, minTime, maxTime, setCommittedValue]);
134
+ }, [getDraftTime, temporalMinTime, temporalMaxTime, setCommittedValue]);
118
135
 
119
136
  // Cancel changes
120
137
  const handleCancel = useCallback(() => {
@@ -144,7 +161,7 @@ export const TimePicker = (props: TimePickerProps) => {
144
161
  // Preset selection
145
162
  const handlePresetClick = useCallback(
146
163
  (preset: TimePresetOption) => {
147
- const parsed = temporalToParsed(preset.value);
164
+ const parsed = temporalToParsed(fromISOTime(preset.value));
148
165
  setDraftHour(clockFormat === "12h" ? to12Hour(parsed.hour).hour12 : parsed.hour);
149
166
  setDraftMinute(parsed.minute);
150
167
  setDraftSecond(parsed.second);
@@ -157,7 +174,7 @@ export const TimePicker = (props: TimePickerProps) => {
157
174
  const isPresetActive = useCallback(
158
175
  (preset: TimePresetOption): boolean => {
159
176
  const draftTime = getDraftTime();
160
- const presetParsed = temporalToParsed(preset.value);
177
+ const presetParsed = temporalToParsed(fromISOTime(preset.value));
161
178
 
162
179
  return (
163
180
  draftTime.hour === presetParsed.hour && draftTime.minute === presetParsed.minute && (format === "HH:mm" || draftTime.second === presetParsed.second)
@@ -196,7 +213,7 @@ export const TimePicker = (props: TimePickerProps) => {
196
213
  return (
197
214
  <>
198
215
  {/* Trigger Input */}
199
- <div className="relative flex items-center">
216
+ <div ref={ref} className="relative flex items-center">
200
217
  <Clock className="pointer-events-none absolute left-3 h-4 w-4 text-fg-subtle" />
201
218
  <input
202
219
  ref={refs.setReference as React.Ref<HTMLInputElement>}
@@ -320,4 +337,5 @@ export const TimePicker = (props: TimePickerProps) => {
320
337
  )}
321
338
  </>
322
339
  );
323
- };
340
+ });
341
+ TimePicker.displayName = "TimePicker";
@@ -1,11 +1,12 @@
1
1
  /**
2
- * TimePicker types
2
+ * TimePicker types.
3
3
  *
4
- * All time values use Temporal.PlainTime at the component boundary.
5
- * This provides type safety and semantic clarity about what kind of time is expected.
4
+ * All time values at the public boundary are ISO 8601 time strings. `"09:30"`
5
+ * and `"09:30:00"` are both accepted as input; `onChange` always emits the
6
+ * canonical `HH:MM:SS` form.
6
7
  */
7
8
 
8
- import type { Temporal } from "../../date-time";
9
+ import type { ISOTime } from "../../date-time";
9
10
 
10
11
  // =============================================================================
11
12
  // Value Types
@@ -31,7 +32,7 @@ export type ClockFormat = "12h" | "24h";
31
32
 
32
33
  export type TimePresetOption = {
33
34
  label: string;
34
- value: Temporal.PlainTime;
35
+ value: ISOTime;
35
36
  };
36
37
 
37
38
  // =============================================================================
@@ -40,13 +41,13 @@ export type TimePresetOption = {
40
41
 
41
42
  export type TimePickerProps = {
42
43
  /** Controlled value */
43
- value?: Temporal.PlainTime | undefined;
44
+ value?: ISOTime | undefined;
44
45
 
45
46
  /** Default value for uncontrolled mode */
46
- defaultValue?: Temporal.PlainTime | undefined;
47
+ defaultValue?: ISOTime | undefined;
47
48
 
48
- /** Called when time changes */
49
- onChange?: (time: Temporal.PlainTime | undefined) => void;
49
+ /** Called when time changes. Always canonical `HH:MM:SS`. */
50
+ onChange?: (time: ISOTime | undefined) => void;
50
51
 
51
52
  /** Time format for the value (affects seconds visibility) */
52
53
  format?: TimeFormat;
@@ -57,11 +58,11 @@ export type TimePickerProps = {
57
58
  /** Minute step interval (default: 1) */
58
59
  minuteStep?: 1 | 5 | 10 | 15 | 30;
59
60
 
60
- /** Minimum selectable time */
61
- minTime?: Temporal.PlainTime;
61
+ /** Earliest selectable time, inclusive */
62
+ minTime?: ISOTime;
62
63
 
63
- /** Maximum selectable time */
64
- maxTime?: Temporal.PlainTime;
64
+ /** Latest selectable time, inclusive */
65
+ maxTime?: ISOTime;
65
66
 
66
67
  /** Preset options (shown in sidebar) */
67
68
  presets?: TimePresetOption[];
@@ -38,6 +38,67 @@
38
38
  export type { Temporal as TemporalNamespace } from "@js-temporal/polyfill";
39
39
  export { Temporal } from "@js-temporal/polyfill";
40
40
 
41
+ // =============================================================================
42
+ // ISO 8601 strings — the component boundary
43
+ // =============================================================================
44
+ //
45
+ // Every date/time component accepts and emits these types, never Temporal. This
46
+ // section is the only part of the module a consumer needs in order to use the
47
+ // pickers; everything below it is for date arithmetic they choose to opt into.
48
+
49
+ export type {
50
+ DisabledDates,
51
+ ISODate,
52
+ ISODateRange,
53
+ ISODateTime,
54
+ ISOInstant,
55
+ ISOInstantRange,
56
+ ISOTime,
57
+ TemporalDateRange,
58
+ TemporalDisabledMatcher,
59
+ TemporalInstantRange,
60
+ Weekday,
61
+ } from "./iso";
62
+ export {
63
+ adaptDisabledDates,
64
+ // ISO-native arithmetic (no Temporal needed at the call site)
65
+ addDaysISO,
66
+ addHoursISO,
67
+ addMinutesISO,
68
+ addMonthsISO,
69
+ compareISO,
70
+ endOfMonthISO,
71
+ endOfWeekISO,
72
+ endOfYearISO,
73
+ // Widening: ISO string -> Temporal
74
+ fromISODate,
75
+ fromISODateOrUndefined,
76
+ fromISODateRange,
77
+ fromISOInstant,
78
+ fromISOInstantOrUndefined,
79
+ fromISOInstantRange,
80
+ fromISOTime,
81
+ fromISOTimeOrUndefined,
82
+ // Strict boundary guards
83
+ isDateString,
84
+ isInstantString,
85
+ isTimeString,
86
+ isWeekendISO,
87
+ startOfMonthISO,
88
+ startOfWeekISO,
89
+ startOfYearISO,
90
+ // Narrowing: string | Temporal -> canonical ISO
91
+ toISODate,
92
+ toISODateOrUndefined,
93
+ toISODateRange,
94
+ toISOInstant,
95
+ toISOInstantOrUndefined,
96
+ toISOInstantRange,
97
+ toISOTime,
98
+ toISOTimeOrUndefined,
99
+ weekdayISO,
100
+ } from "./iso";
101
+
41
102
  // =============================================================================
42
103
  // Parsing: ISO 8601 string → Temporal
43
104
  // =============================================================================