@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,242 +1,97 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { cn } from "@sixthshift/design-system/utils";
3
- import { ChevronLeft, ChevronRight } from "lucide-react";
4
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
- import { addDays, addMonths, endOfWeek, formatMonthYear, isPlainDate, isSameMonth, parseDate, startOfMonth, startOfWeek, today, } from "../../date-time/index.js";
6
- import { Button } from "../Button/index.js";
7
- import { Separator } from "../Separator/index.js";
8
- import { defaultFormatDisplay, getDateSelectionState, isBeforeTemporal, isDateDisabled, isSameDateTemporal, temporalToISO, useCalendarDays, } from "./calendar.hooks.js";
9
- const DAY_LABELS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
10
- function getDayLabels(weekStartsOn) {
11
- return [...DAY_LABELS.slice(weekStartsOn), ...DAY_LABELS.slice(0, weekStartsOn)];
12
- }
13
- function getRangePositionClasses(rangePosition, isSelected) {
14
- if (!isSelected)
15
- return "";
16
- switch (rangePosition) {
17
- case "start":
18
- return "rounded-l-full rounded-r-none bg-bg-brand text-fg-on-brand";
19
- case "end":
20
- return "rounded-r-full rounded-l-none bg-bg-brand text-fg-on-brand";
21
- case "middle":
22
- return "rounded-none bg-bg-brand-subtle text-fg-normal";
23
- case "single":
24
- return "bg-bg-brand text-fg-on-brand";
25
- default:
26
- return "";
27
- }
28
- }
29
- export const Calendar = (props) => {
30
- const { mode, month, onMonthChange, minDate, maxDate, disabled, weekStartsOn = 0, showFooter = false, showToday = true, onApply, onCancel, className, } = props;
31
- // Get mode-specific props
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Calendar — the public, ISO-string-typed calendar.
4
+ *
5
+ * A thin adapter over {@link CalendarView}: it parses incoming ISO strings and
6
+ * serialises outgoing selections. All the behaviour lives in CalendarView.
7
+ *
8
+ * Every conversion is memoised on the string it came from, and every handler is
9
+ * stable. Temporal objects have no value identity — `PlainDate.from("2026-08-26")`
10
+ * is never `===` another PlainDate for the same day — and CalendarView keys
11
+ * `useMemo`/`useCallback` on these values directly, so converting unmemoised
12
+ * would invalidate the whole grid on every render.
13
+ *
14
+ * Props are read with `"key" in props` rather than destructured per mode,
15
+ * because every hook here has to run unconditionally.
16
+ */
17
+ import * as React from "react";
18
+ import { useCallback, useMemo } from "react";
19
+ import { adaptDisabledDates, fromISODate, fromISODateOrUndefined, fromISODateRange, toISODate, toISODateOrUndefined, toISODateRange, } from "../../date-time/index.js";
20
+ import { CalendarView } from "./CalendarView.js";
21
+ export const Calendar = React.forwardRef((props, ref) => {
22
+ const { mode, month, onMonthChange, minDate, maxDate, disabled, weekStartsOn, showFooter, showToday, onApply, onCancel, className } = props;
32
23
  const value = "value" in props ? props.value : undefined;
33
24
  const onSelect = "onSelect" in props ? props.onSelect : undefined;
34
25
  const presets = "presets" in props ? props.presets : undefined;
35
26
  const max = mode === "multiple" && "max" in props ? props.max : undefined;
36
- // Selection handler
37
- const handleSelect = useCallback((temporalDate) => {
38
- if (!onSelect)
39
- return;
27
+ // ---------------------------------------------------------------------------
28
+ // Inbound: ISO strings -> Temporal, each keyed on the string it derives from.
29
+ // ---------------------------------------------------------------------------
30
+ const temporalMonth = useMemo(() => fromISODate(month), [month]);
31
+ const temporalMinDate = useMemo(() => fromISODateOrUndefined(minDate), [minDate]);
32
+ const temporalMaxDate = useMemo(() => fromISODateOrUndefined(maxDate), [maxDate]);
33
+ const temporalDisabled = useMemo(() => adaptDisabledDates(disabled), [disabled]);
34
+ const temporalValue = useMemo(() => {
35
+ if (mode === "single")
36
+ return fromISODateOrUndefined(value);
37
+ if (mode === "multiple")
38
+ return (value ?? []).map(fromISODate);
39
+ return fromISODateRange(value);
40
+ }, [mode, value]);
41
+ const temporalPresets = useMemo(() => {
42
+ if (!presets)
43
+ return undefined;
40
44
  if (mode === "single") {
41
- const currentValue = value;
42
- if (currentValue && isSameDateTemporal(temporalDate, currentValue)) {
43
- onSelect(undefined);
44
- }
45
- else {
46
- onSelect(temporalDate);
47
- }
48
- return;
45
+ return presets.map((preset) => ({ label: preset.label, value: fromISODate(preset.value) }));
49
46
  }
50
47
  if (mode === "multiple") {
51
- const currentValue = value || [];
52
- const existingIndex = currentValue.findIndex((d) => isSameDateTemporal(temporalDate, d));
53
- if (existingIndex >= 0) {
54
- onSelect(currentValue.filter((_, i) => i !== existingIndex));
55
- }
56
- else if (!max || currentValue.length < max) {
57
- onSelect([...currentValue, temporalDate]);
58
- }
59
- return;
48
+ return presets.map((preset) => ({ label: preset.label, value: preset.value.map(fromISODate) }));
60
49
  }
61
- // Range mode
62
- const currentRange = value || {
63
- from: undefined,
64
- to: undefined,
65
- };
66
- if (!currentRange.from) {
67
- onSelect({ from: temporalDate, to: undefined });
68
- return;
69
- }
70
- if (!currentRange.to) {
71
- if (isBeforeTemporal(temporalDate, currentRange.from)) {
72
- onSelect({ from: temporalDate, to: currentRange.from });
73
- }
74
- else {
75
- onSelect({ from: currentRange.from, to: temporalDate });
76
- }
77
- return;
78
- }
79
- onSelect({ from: temporalDate, to: undefined });
80
- }, [mode, value, onSelect, max]);
81
- // Today button
82
- const handleToday = useCallback(() => {
50
+ return presets.map((preset) => ({
51
+ label: preset.label,
52
+ value: fromISODateRange(preset.value) ?? { from: undefined, to: undefined },
53
+ }));
54
+ }, [mode, presets]);
55
+ // ---------------------------------------------------------------------------
56
+ // Outbound: Temporal -> ISO strings.
57
+ // ---------------------------------------------------------------------------
58
+ const handleMonthChange = useCallback((next) => onMonthChange(toISODate(next)), [onMonthChange]);
59
+ const handleSelect = useCallback((next) => {
83
60
  if (!onSelect)
84
61
  return;
85
- const todayDate = today();
86
62
  if (mode === "single") {
87
- onSelect(todayDate);
88
- }
89
- else if (mode === "multiple") {
90
- const current = value || [];
91
- if (!current.some((d) => isSameDateTemporal(d, todayDate))) {
92
- if (!max || current.length < max) {
93
- onSelect([...current, todayDate]);
94
- }
95
- }
96
- }
97
- onMonthChange(todayDate);
98
- }, [mode, value, onSelect, max, onMonthChange]);
99
- // Preset selection
100
- const handlePresetClick = useCallback((preset) => {
101
- if (!onSelect)
63
+ onSelect(toISODateOrUndefined(next));
102
64
  return;
103
- if (mode === "single" && isPlainDate(preset.value)) {
104
- onSelect(preset.value);
105
- }
106
- else if (mode === "range" && typeof preset.value === "object" && preset.value !== null && "from" in preset.value) {
107
- onSelect(preset.value);
108
65
  }
109
- else if (mode === "multiple" && Array.isArray(preset.value)) {
110
- onSelect(preset.value);
66
+ if (mode === "multiple") {
67
+ onSelect((next ?? []).map(toISODate));
68
+ return;
111
69
  }
70
+ onSelect(toISODateRange(next));
112
71
  }, [mode, onSelect]);
113
- // Calendar navigation
114
- const handlePrevMonth = () => onMonthChange(addMonths(month, -1));
115
- const handleNextMonth = () => onMonthChange(addMonths(month, 1));
116
- const days = useCalendarDays(month, weekStartsOn);
117
- const dayLabels = getDayLabels(weekStartsOn);
118
- const handleDayClick = (date) => {
119
- if (!isDateDisabled(date, disabled, minDate, maxDate)) {
120
- handleSelect(date);
121
- }
72
+ // One cast, at the single point where the two discriminated unions meet: the
73
+ // mode discriminant and its matching value/onSelect/presets have all been
74
+ // converted in step above, but TypeScript cannot follow that across the
75
+ // separate useMemo calls.
76
+ const viewProps = {
77
+ mode,
78
+ month: temporalMonth,
79
+ onMonthChange: handleMonthChange,
80
+ minDate: temporalMinDate,
81
+ maxDate: temporalMaxDate,
82
+ disabled: temporalDisabled,
83
+ weekStartsOn,
84
+ showFooter,
85
+ showToday,
86
+ onApply,
87
+ onCancel,
88
+ className,
89
+ max,
90
+ value: temporalValue,
91
+ onSelect: handleSelect,
92
+ presets: temporalPresets,
122
93
  };
123
- // ---------------------------------------------------------------------------
124
- // Roving focus
125
- //
126
- // A grid is a single tab stop: exactly one cell carries tabIndex={0} and the
127
- // arrow keys move between cells. `focusedDate` is null until the user actually
128
- // navigates, so we never steal focus on mount.
129
- // ---------------------------------------------------------------------------
130
- const [focusedDate, setFocusedDate] = useState(null);
131
- const gridRef = useRef(null);
132
- const firstSelected = useMemo(() => {
133
- if (mode === "single")
134
- return isPlainDate(value) ? value : undefined;
135
- if (mode === "multiple")
136
- return value?.[0];
137
- return value?.from;
138
- }, [mode, value]);
139
- const activeDate = useMemo(() => {
140
- const isUsable = (date) => isSameMonth(date, month) && !isDateDisabled(date, disabled, minDate, maxDate);
141
- // Prefer where the user last was, then their selection, then today.
142
- for (const candidate of [focusedDate, firstSelected, today()]) {
143
- if (candidate && isUsable(candidate))
144
- return candidate;
145
- }
146
- // Otherwise the first day of the month that can actually take focus, so the
147
- // grid never ends up with zero tab stops.
148
- const first = startOfMonth(month);
149
- for (let i = 0; i < first.daysInMonth; i++) {
150
- const candidate = addDays(first, i);
151
- if (isUsable(candidate))
152
- return candidate;
153
- }
154
- return first;
155
- }, [focusedDate, firstSelected, month, disabled, minDate, maxDate]);
156
- const moveFocus = useCallback((next) => {
157
- setFocusedDate(next);
158
- if (!isSameMonth(next, month))
159
- onMonthChange(next);
160
- }, [month, onMonthChange]);
161
- const handleGridKeyDown = useCallback((event) => {
162
- // Navigate from the cell that actually has focus, not from the derived
163
- // tab stop — otherwise focusing a day without selecting it would make the
164
- // arrow keys jump back to today.
165
- const focusedIso = event.target?.closest?.("[data-date]")?.getAttribute("data-date");
166
- const origin = focusedIso ? parseDate(focusedIso) : activeDate;
167
- const dayStep = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };
168
- const step = dayStep[event.key];
169
- if (step !== undefined) {
170
- event.preventDefault();
171
- moveFocus(addDays(origin, step));
172
- return;
173
- }
174
- switch (event.key) {
175
- case "Home":
176
- event.preventDefault();
177
- moveFocus(startOfWeek(origin, weekStartsOn));
178
- break;
179
- case "End":
180
- event.preventDefault();
181
- moveFocus(endOfWeek(origin, weekStartsOn));
182
- break;
183
- case "PageUp":
184
- event.preventDefault();
185
- moveFocus(addMonths(origin, -1));
186
- break;
187
- case "PageDown":
188
- event.preventDefault();
189
- moveFocus(addMonths(origin, 1));
190
- break;
191
- default:
192
- break;
193
- }
194
- }, [activeDate, moveFocus, weekStartsOn]);
195
- // Follow the roving tabIndex with real DOM focus, but only once the user has
196
- // started navigating.
197
- useEffect(() => {
198
- if (!focusedDate)
199
- return;
200
- gridRef.current?.querySelector(`[data-date="${temporalToISO(focusedDate)}"]`)?.focus();
201
- }, [focusedDate]);
202
- // useCalendarDays always returns 42 days, so this is always 6 rows of 7.
203
- const weeks = useMemo(() => {
204
- const chunked = [];
205
- for (let i = 0; i < days.length; i += 7)
206
- chunked.push(days.slice(i, i + 7));
207
- return chunked;
208
- }, [days]);
209
- // Check if a preset is currently active
210
- const isPresetActive = useCallback((preset) => {
211
- if (mode === "single" && isPlainDate(preset.value)) {
212
- return isPlainDate(value) && isSameDateTemporal(value, preset.value);
213
- }
214
- if (mode === "range" && typeof preset.value === "object" && preset.value !== null && "from" in preset.value) {
215
- const draft = value;
216
- const presetVal = preset.value;
217
- const fromMatch = (!draft?.from && !presetVal.from) || (draft?.from && presetVal.from && isSameDateTemporal(draft.from, presetVal.from));
218
- const toMatch = (!draft?.to && !presetVal.to) || (draft?.to && presetVal.to && isSameDateTemporal(draft.to, presetVal.to));
219
- return Boolean(fromMatch && toMatch);
220
- }
221
- if (mode === "multiple" && Array.isArray(preset.value)) {
222
- const draft = value || [];
223
- const presetVal = preset.value;
224
- return draft.length === presetVal.length && draft.every((d) => presetVal.some((p) => isSameDateTemporal(d, p)));
225
- }
226
- return false;
227
- }, [mode, value]);
228
- return (_jsxs("div", { className: cn("flex", className), children: [presets && presets.length > 0 && (_jsx("div", { className: "mr-3 flex flex-col gap-1 border-border-normal border-r pr-3", children: presets.map((preset) => (_jsx("button", { type: "button", onClick: () => handlePresetClick(preset), className: cn(`rounded-md px-3 py-1.5 text-left text-sm transition-colors`, `hover:bg-bg-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-inset`, isPresetActive(preset) && "bg-bg-brand-subtle text-fg-brand"), children: preset.label }, preset.label))) })), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("button", { type: "button", onClick: handlePrevMonth, className: "rounded-lg p-2 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring", "aria-label": "Previous month", children: _jsx(ChevronLeft, { className: "h-5 w-5" }) }), _jsx("span", { className: "font-semibold text-sm", children: formatMonthYear(month) }), _jsx("button", { type: "button", onClick: handleNextMonth, className: "rounded-lg p-2 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring", "aria-label": "Next month", children: _jsx(ChevronRight, { className: "h-5 w-5" }) })] }), _jsxs("table", { ref: gridRef, role: "grid", "aria-label": formatMonthYear(month), className: "border-separate border-spacing-1", onKeyDown: handleGridKeyDown, children: [_jsx("thead", { children: _jsx("tr", { children: dayLabels.map((label) => (_jsx("th", { scope: "col", className: "h-10 w-10 font-medium text-fg-subtle text-sm", children: label }, label))) }) }), _jsx("tbody", { children: weeks.map((week) => (_jsx("tr", { children: week.map((day) => {
229
- const isDisabledDay = isDateDisabled(day.date, disabled, minDate, maxDate);
230
- const selectionState = getDateSelectionState(day.date, mode, value);
231
- if (!day.isCurrentMonth) {
232
- return _jsx("td", { className: "h-10 w-10" }, temporalToISO(day.date));
233
- }
234
- return (
235
- // Biome resolves <td> to role "cell" because it does not track the
236
- // ancestor role="grid", under which a <td> is a gridcell and
237
- // aria-selected is valid. axe, which does track it, passes.
238
- // biome-ignore lint/a11y/useAriaPropsSupportedByRole: <td> in a grid is a gridcell
239
- _jsx("td", { "aria-selected": selectionState.isSelected, className: "p-0", children: _jsx("button", { type: "button", "data-date": temporalToISO(day.date), onClick: () => handleDayClick(day.date), disabled: isDisabledDay, tabIndex: isSameDateTemporal(day.date, activeDate) ? 0 : -1, className: cn(`flex h-10 w-10 cursor-pointer items-center justify-center rounded-full text-sm transition-colors`, `hover:bg-bg-brand-strong hover:text-fg-on-brand-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-inset`, day.isToday && !selectionState.isSelected && "font-medium ring-1 ring-border-normal ring-inset", isDisabledDay && "cursor-not-allowed opacity-50", getRangePositionClasses(selectionState.rangePosition, selectionState.isSelected)), "aria-label": defaultFormatDisplay(day.date), children: day.date.day }) }, temporalToISO(day.date)));
240
- }) }, temporalToISO(week[0].date)))) })] }), showFooter && (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { children: showToday && mode !== "range" && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: handleToday, children: "Today" })) }), _jsxs("div", { className: "flex gap-2", children: [onCancel && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onCancel, children: "Cancel" })), onApply && (_jsx(Button, { type: "button", variant: "solid", size: "sm", onClick: onApply, children: "Apply" }))] })] })] }))] })] }));
241
- };
94
+ return _jsx(CalendarView, { ref: ref, ...viewProps });
95
+ });
96
+ Calendar.displayName = "Calendar";
242
97
  //# sourceMappingURL=Calendar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CalendarView — the Temporal-typed calendar grid.
3
+ *
4
+ * Internal. Not reachable through the package's `exports` map: `./calendar`
5
+ * resolves to this directory's `index.ts`, which deliberately does not re-export
6
+ * it. Every picker composes this directly so that values cross the ISO boundary
7
+ * exactly once, at the picker's own edge, rather than being serialised and
8
+ * re-parsed on the way down to the grid.
9
+ *
10
+ * The public, ISO-typed `Calendar` is a thin wrapper in ./Calendar.tsx.
11
+ */
12
+ import * as React from "react";
13
+ import type { CalendarViewProps } from "./calendar.types.js";
14
+ export declare const CalendarView: React.ForwardRefExoticComponent<CalendarViewProps & React.RefAttributes<HTMLDivElement>>;
15
+ //# sourceMappingURL=CalendarView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/CalendarView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA0B/B,OAAO,KAAK,EAAE,iBAAiB,EAAoE,MAAM,kBAAkB,CAAC;AAyB5H,eAAO,MAAM,YAAY,0FA0XvB,CAAC"}
@@ -0,0 +1,255 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * CalendarView — the Temporal-typed calendar grid.
4
+ *
5
+ * Internal. Not reachable through the package's `exports` map: `./calendar`
6
+ * resolves to this directory's `index.ts`, which deliberately does not re-export
7
+ * it. Every picker composes this directly so that values cross the ISO boundary
8
+ * exactly once, at the picker's own edge, rather than being serialised and
9
+ * re-parsed on the way down to the grid.
10
+ *
11
+ * The public, ISO-typed `Calendar` is a thin wrapper in ./Calendar.tsx.
12
+ */
13
+ import { cn } from "@sixthshift/design-system/utils";
14
+ import { ChevronLeft, ChevronRight } from "lucide-react";
15
+ import * as React from "react";
16
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
17
+ import { addDays, addMonths, endOfWeek, formatMonthYear, isPlainDate, isSameMonth, parseDate, startOfMonth, startOfWeek, today, } from "../../date-time/index.js";
18
+ import { Button } from "../Button/index.js";
19
+ import { Separator } from "../Separator/index.js";
20
+ import { defaultFormatDisplay, getDateSelectionState, isBeforeTemporal, isDateDisabled, isSameDateTemporal, temporalToISO, useCalendarDays, } from "./calendar.hooks.js";
21
+ const DAY_LABELS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
22
+ function getDayLabels(weekStartsOn) {
23
+ return [...DAY_LABELS.slice(weekStartsOn), ...DAY_LABELS.slice(0, weekStartsOn)];
24
+ }
25
+ function getRangePositionClasses(rangePosition, isSelected) {
26
+ if (!isSelected)
27
+ return "";
28
+ switch (rangePosition) {
29
+ case "start":
30
+ return "rounded-l-full rounded-r-none bg-bg-brand text-fg-on-brand";
31
+ case "end":
32
+ return "rounded-r-full rounded-l-none bg-bg-brand text-fg-on-brand";
33
+ case "middle":
34
+ return "rounded-none bg-bg-brand-subtle text-fg-normal";
35
+ case "single":
36
+ return "bg-bg-brand text-fg-on-brand";
37
+ default:
38
+ return "";
39
+ }
40
+ }
41
+ export const CalendarView = React.forwardRef((props, ref) => {
42
+ const { mode, month, onMonthChange, minDate, maxDate, disabled, weekStartsOn = 0, showFooter = false, showToday = true, onApply, onCancel, className, } = props;
43
+ // Get mode-specific props
44
+ const value = "value" in props ? props.value : undefined;
45
+ const onSelect = "onSelect" in props ? props.onSelect : undefined;
46
+ const presets = "presets" in props ? props.presets : undefined;
47
+ const max = mode === "multiple" && "max" in props ? props.max : undefined;
48
+ // Selection handler
49
+ const handleSelect = useCallback((temporalDate) => {
50
+ if (!onSelect)
51
+ return;
52
+ if (mode === "single") {
53
+ const currentValue = value;
54
+ if (currentValue && isSameDateTemporal(temporalDate, currentValue)) {
55
+ onSelect(undefined);
56
+ }
57
+ else {
58
+ onSelect(temporalDate);
59
+ }
60
+ return;
61
+ }
62
+ if (mode === "multiple") {
63
+ const currentValue = value || [];
64
+ const existingIndex = currentValue.findIndex((d) => isSameDateTemporal(temporalDate, d));
65
+ if (existingIndex >= 0) {
66
+ onSelect(currentValue.filter((_, i) => i !== existingIndex));
67
+ }
68
+ else if (!max || currentValue.length < max) {
69
+ onSelect([...currentValue, temporalDate]);
70
+ }
71
+ return;
72
+ }
73
+ // Range mode
74
+ const currentRange = value || {
75
+ from: undefined,
76
+ to: undefined,
77
+ };
78
+ if (!currentRange.from) {
79
+ onSelect({ from: temporalDate, to: undefined });
80
+ return;
81
+ }
82
+ if (!currentRange.to) {
83
+ if (isBeforeTemporal(temporalDate, currentRange.from)) {
84
+ onSelect({ from: temporalDate, to: currentRange.from });
85
+ }
86
+ else {
87
+ onSelect({ from: currentRange.from, to: temporalDate });
88
+ }
89
+ return;
90
+ }
91
+ onSelect({ from: temporalDate, to: undefined });
92
+ }, [mode, value, onSelect, max]);
93
+ // Today button
94
+ const handleToday = useCallback(() => {
95
+ if (!onSelect)
96
+ return;
97
+ const todayDate = today();
98
+ if (mode === "single") {
99
+ onSelect(todayDate);
100
+ }
101
+ else if (mode === "multiple") {
102
+ const current = value || [];
103
+ if (!current.some((d) => isSameDateTemporal(d, todayDate))) {
104
+ if (!max || current.length < max) {
105
+ onSelect([...current, todayDate]);
106
+ }
107
+ }
108
+ }
109
+ onMonthChange(todayDate);
110
+ }, [mode, value, onSelect, max, onMonthChange]);
111
+ // Preset selection
112
+ const handlePresetClick = useCallback((preset) => {
113
+ if (!onSelect)
114
+ return;
115
+ if (mode === "single" && isPlainDate(preset.value)) {
116
+ onSelect(preset.value);
117
+ }
118
+ else if (mode === "range" && typeof preset.value === "object" && preset.value !== null && "from" in preset.value) {
119
+ onSelect(preset.value);
120
+ }
121
+ else if (mode === "multiple" && Array.isArray(preset.value)) {
122
+ onSelect(preset.value);
123
+ }
124
+ }, [mode, onSelect]);
125
+ // Calendar navigation
126
+ const handlePrevMonth = () => onMonthChange(addMonths(month, -1));
127
+ const handleNextMonth = () => onMonthChange(addMonths(month, 1));
128
+ const days = useCalendarDays(month, weekStartsOn);
129
+ const dayLabels = getDayLabels(weekStartsOn);
130
+ const handleDayClick = (date) => {
131
+ if (!isDateDisabled(date, disabled, minDate, maxDate)) {
132
+ handleSelect(date);
133
+ }
134
+ };
135
+ // ---------------------------------------------------------------------------
136
+ // Roving focus
137
+ //
138
+ // A grid is a single tab stop: exactly one cell carries tabIndex={0} and the
139
+ // arrow keys move between cells. `focusedDate` is null until the user actually
140
+ // navigates, so we never steal focus on mount.
141
+ // ---------------------------------------------------------------------------
142
+ const [focusedDate, setFocusedDate] = useState(null);
143
+ const gridRef = useRef(null);
144
+ const firstSelected = useMemo(() => {
145
+ if (mode === "single")
146
+ return isPlainDate(value) ? value : undefined;
147
+ if (mode === "multiple")
148
+ return value?.[0];
149
+ return value?.from;
150
+ }, [mode, value]);
151
+ const activeDate = useMemo(() => {
152
+ const isUsable = (date) => isSameMonth(date, month) && !isDateDisabled(date, disabled, minDate, maxDate);
153
+ // Prefer where the user last was, then their selection, then today.
154
+ for (const candidate of [focusedDate, firstSelected, today()]) {
155
+ if (candidate && isUsable(candidate))
156
+ return candidate;
157
+ }
158
+ // Otherwise the first day of the month that can actually take focus, so the
159
+ // grid never ends up with zero tab stops.
160
+ const first = startOfMonth(month);
161
+ for (let i = 0; i < first.daysInMonth; i++) {
162
+ const candidate = addDays(first, i);
163
+ if (isUsable(candidate))
164
+ return candidate;
165
+ }
166
+ return first;
167
+ }, [focusedDate, firstSelected, month, disabled, minDate, maxDate]);
168
+ const moveFocus = useCallback((next) => {
169
+ setFocusedDate(next);
170
+ if (!isSameMonth(next, month))
171
+ onMonthChange(next);
172
+ }, [month, onMonthChange]);
173
+ const handleGridKeyDown = useCallback((event) => {
174
+ // Navigate from the cell that actually has focus, not from the derived
175
+ // tab stop — otherwise focusing a day without selecting it would make the
176
+ // arrow keys jump back to today.
177
+ const focusedIso = event.target?.closest?.("[data-date]")?.getAttribute("data-date");
178
+ const origin = focusedIso ? parseDate(focusedIso) : activeDate;
179
+ const dayStep = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };
180
+ const step = dayStep[event.key];
181
+ if (step !== undefined) {
182
+ event.preventDefault();
183
+ moveFocus(addDays(origin, step));
184
+ return;
185
+ }
186
+ switch (event.key) {
187
+ case "Home":
188
+ event.preventDefault();
189
+ moveFocus(startOfWeek(origin, weekStartsOn));
190
+ break;
191
+ case "End":
192
+ event.preventDefault();
193
+ moveFocus(endOfWeek(origin, weekStartsOn));
194
+ break;
195
+ case "PageUp":
196
+ event.preventDefault();
197
+ moveFocus(addMonths(origin, -1));
198
+ break;
199
+ case "PageDown":
200
+ event.preventDefault();
201
+ moveFocus(addMonths(origin, 1));
202
+ break;
203
+ default:
204
+ break;
205
+ }
206
+ }, [activeDate, moveFocus, weekStartsOn]);
207
+ // Follow the roving tabIndex with real DOM focus, but only once the user has
208
+ // started navigating.
209
+ useEffect(() => {
210
+ if (!focusedDate)
211
+ return;
212
+ gridRef.current?.querySelector(`[data-date="${temporalToISO(focusedDate)}"]`)?.focus();
213
+ }, [focusedDate]);
214
+ // useCalendarDays always returns 42 days, so this is always 6 rows of 7.
215
+ const weeks = useMemo(() => {
216
+ const chunked = [];
217
+ for (let i = 0; i < days.length; i += 7)
218
+ chunked.push(days.slice(i, i + 7));
219
+ return chunked;
220
+ }, [days]);
221
+ // Check if a preset is currently active
222
+ const isPresetActive = useCallback((preset) => {
223
+ if (mode === "single" && isPlainDate(preset.value)) {
224
+ return isPlainDate(value) && isSameDateTemporal(value, preset.value);
225
+ }
226
+ if (mode === "range" && typeof preset.value === "object" && preset.value !== null && "from" in preset.value) {
227
+ const draft = value;
228
+ const presetVal = preset.value;
229
+ const fromMatch = (!draft?.from && !presetVal.from) || (draft?.from && presetVal.from && isSameDateTemporal(draft.from, presetVal.from));
230
+ const toMatch = (!draft?.to && !presetVal.to) || (draft?.to && presetVal.to && isSameDateTemporal(draft.to, presetVal.to));
231
+ return Boolean(fromMatch && toMatch);
232
+ }
233
+ if (mode === "multiple" && Array.isArray(preset.value)) {
234
+ const draft = value || [];
235
+ const presetVal = preset.value;
236
+ return draft.length === presetVal.length && draft.every((d) => presetVal.some((p) => isSameDateTemporal(d, p)));
237
+ }
238
+ return false;
239
+ }, [mode, value]);
240
+ return (_jsxs("div", { ref: ref, className: cn("flex", className), children: [presets && presets.length > 0 && (_jsx("div", { className: "mr-3 flex flex-col gap-1 border-border-normal border-r pr-3", children: presets.map((preset) => (_jsx("button", { type: "button", onClick: () => handlePresetClick(preset), className: cn(`rounded-md px-3 py-1.5 text-left text-sm transition-colors`, `hover:bg-bg-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-inset`, isPresetActive(preset) && "bg-bg-brand-subtle text-fg-brand"), children: preset.label }, preset.label))) })), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("button", { type: "button", onClick: handlePrevMonth, className: "rounded-lg p-2 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring", "aria-label": "Previous month", children: _jsx(ChevronLeft, { className: "h-5 w-5" }) }), _jsx("span", { className: "font-semibold text-sm", children: formatMonthYear(month) }), _jsx("button", { type: "button", onClick: handleNextMonth, className: "rounded-lg p-2 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring", "aria-label": "Next month", children: _jsx(ChevronRight, { className: "h-5 w-5" }) })] }), _jsxs("table", { ref: gridRef, role: "grid", "aria-label": formatMonthYear(month), className: "border-separate border-spacing-1", onKeyDown: handleGridKeyDown, children: [_jsx("thead", { children: _jsx("tr", { children: dayLabels.map((label) => (_jsx("th", { scope: "col", className: "h-10 w-10 font-medium text-fg-subtle text-sm", children: label }, label))) }) }), _jsx("tbody", { children: weeks.map((week) => (_jsx("tr", { children: week.map((day) => {
241
+ const isDisabledDay = isDateDisabled(day.date, disabled, minDate, maxDate);
242
+ const selectionState = getDateSelectionState(day.date, mode, value);
243
+ if (!day.isCurrentMonth) {
244
+ return _jsx("td", { className: "h-10 w-10" }, temporalToISO(day.date));
245
+ }
246
+ return (
247
+ // Biome resolves <td> to role "cell" because it does not track the
248
+ // ancestor role="grid", under which a <td> is a gridcell and
249
+ // aria-selected is valid. axe, which does track it, passes.
250
+ // biome-ignore lint/a11y/useAriaPropsSupportedByRole: <td> in a grid is a gridcell
251
+ _jsx("td", { "aria-selected": selectionState.isSelected, className: "p-0", children: _jsx("button", { type: "button", "data-date": temporalToISO(day.date), onClick: () => handleDayClick(day.date), disabled: isDisabledDay, tabIndex: isSameDateTemporal(day.date, activeDate) ? 0 : -1, className: cn(`flex h-10 w-10 cursor-pointer items-center justify-center rounded-full text-sm transition-colors`, `hover:bg-bg-brand-strong hover:text-fg-on-brand-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-inset`, day.isToday && !selectionState.isSelected && "font-medium ring-1 ring-border-normal ring-inset", isDisabledDay && "cursor-not-allowed opacity-50", getRangePositionClasses(selectionState.rangePosition, selectionState.isSelected)), "aria-label": defaultFormatDisplay(day.date), children: day.date.day }) }, temporalToISO(day.date)));
252
+ }) }, temporalToISO(week[0].date)))) })] }), showFooter && (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { children: showToday && mode !== "range" && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: handleToday, children: "Today" })) }), _jsxs("div", { className: "flex gap-2", children: [onCancel && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onCancel, children: "Cancel" })), onApply && (_jsx(Button, { type: "button", variant: "solid", size: "sm", onClick: onApply, children: "Apply" }))] })] })] }))] })] }));
253
+ });
254
+ CalendarView.displayName = "CalendarView";
255
+ //# sourceMappingURL=CalendarView.js.map