@blurrow/ui 0.2.0 → 0.2.1

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 (271) hide show
  1. package/README.md +48 -36
  2. package/dist/Accordion.d.ts +17 -0
  3. package/dist/Accordion.js +138 -0
  4. package/dist/Accordion.js.map +1 -0
  5. package/dist/Alert.d.ts +13 -0
  6. package/dist/Alert.js +69 -0
  7. package/dist/Alert.js.map +1 -0
  8. package/dist/AuthorCard.d.ts +12 -0
  9. package/dist/AuthorCard.js +57 -0
  10. package/dist/AuthorCard.js.map +1 -0
  11. package/dist/Avatar.d.ts +21 -0
  12. package/dist/Avatar.js +96 -0
  13. package/dist/Avatar.js.map +1 -0
  14. package/dist/Badge.d.ts +12 -0
  15. package/dist/Badge.js +46 -0
  16. package/dist/Badge.js.map +1 -0
  17. package/dist/Banner.d.ts +15 -0
  18. package/dist/Banner.js +68 -0
  19. package/dist/Banner.js.map +1 -0
  20. package/dist/Breadcrumb.d.ts +13 -0
  21. package/dist/Breadcrumb.js +45 -0
  22. package/dist/Breadcrumb.js.map +1 -0
  23. package/dist/Button.d.ts +19 -0
  24. package/dist/Button.js +282 -0
  25. package/dist/Button.js.map +1 -0
  26. package/dist/ButtonGroup.d.ts +19 -0
  27. package/dist/ButtonGroup.js +62 -0
  28. package/dist/ButtonGroup.js.map +1 -0
  29. package/dist/Card.d.ts +40 -0
  30. package/dist/Card.js +175 -0
  31. package/dist/Card.js.map +1 -0
  32. package/dist/CardShell.d.ts +18 -0
  33. package/dist/CardShell.js +58 -0
  34. package/dist/CardShell.js.map +1 -0
  35. package/dist/Carousel.d.ts +22 -0
  36. package/dist/Carousel.js +247 -0
  37. package/dist/Carousel.js.map +1 -0
  38. package/dist/Checkbox.d.ts +15 -0
  39. package/dist/Checkbox.js +84 -0
  40. package/dist/Checkbox.js.map +1 -0
  41. package/dist/CloseButton.d.ts +12 -0
  42. package/dist/CloseButton.js +63 -0
  43. package/dist/CloseButton.js.map +1 -0
  44. package/dist/CodeBlock.d.ts +12 -0
  45. package/dist/CodeBlock.js +221 -0
  46. package/dist/CodeBlock.js.map +1 -0
  47. package/dist/ColorPicker.d.ts +24 -0
  48. package/dist/ColorPicker.js +366 -0
  49. package/dist/ColorPicker.js.map +1 -0
  50. package/dist/Combobox.d.ts +34 -0
  51. package/dist/Combobox.js +255 -0
  52. package/dist/Combobox.js.map +1 -0
  53. package/dist/CommandPalette.d.ts +25 -0
  54. package/dist/CommandPalette.js +304 -0
  55. package/dist/CommandPalette.js.map +1 -0
  56. package/dist/ContextMenu.d.ts +16 -0
  57. package/dist/ContextMenu.js +209 -0
  58. package/dist/ContextMenu.js.map +1 -0
  59. package/dist/DataList.d.ts +15 -0
  60. package/dist/DataList.js +42 -0
  61. package/dist/DataList.js.map +1 -0
  62. package/dist/DatePicker.d.ts +65 -0
  63. package/dist/DatePicker.js +391 -0
  64. package/dist/DatePicker.js.map +1 -0
  65. package/dist/DateRangePicker.d.ts +34 -0
  66. package/dist/DateRangePicker.js +180 -0
  67. package/dist/DateRangePicker.js.map +1 -0
  68. package/dist/Drawer.d.ts +17 -0
  69. package/dist/Drawer.js +132 -0
  70. package/dist/Drawer.js.map +1 -0
  71. package/dist/DropdownMenu.d.ts +23 -0
  72. package/dist/DropdownMenu.js +185 -0
  73. package/dist/DropdownMenu.js.map +1 -0
  74. package/dist/EmptyState.d.ts +13 -0
  75. package/dist/EmptyState.js +55 -0
  76. package/dist/EmptyState.js.map +1 -0
  77. package/dist/FieldMessage.d.ts +26 -0
  78. package/dist/FieldMessage.js +95 -0
  79. package/dist/FieldMessage.js.map +1 -0
  80. package/dist/FileUpload.d.ts +32 -0
  81. package/dist/FileUpload.js +253 -0
  82. package/dist/FileUpload.js.map +1 -0
  83. package/dist/Floating.d.ts +32 -0
  84. package/dist/Floating.js +95 -0
  85. package/dist/Floating.js.map +1 -0
  86. package/dist/HoverCard.d.ts +18 -0
  87. package/dist/HoverCard.js +90 -0
  88. package/dist/HoverCard.js.map +1 -0
  89. package/dist/Input.d.ts +17 -0
  90. package/dist/Input.js +96 -0
  91. package/dist/Input.js.map +1 -0
  92. package/dist/Kbd.d.ts +9 -0
  93. package/dist/Kbd.js +24 -0
  94. package/dist/Kbd.js.map +1 -0
  95. package/dist/Modal.d.ts +15 -0
  96. package/dist/Modal.js +109 -0
  97. package/dist/Modal.js.map +1 -0
  98. package/dist/NumberInput.d.ts +23 -0
  99. package/dist/NumberInput.js +162 -0
  100. package/dist/NumberInput.js.map +1 -0
  101. package/dist/OtpInput.d.ts +26 -0
  102. package/dist/OtpInput.js +173 -0
  103. package/dist/OtpInput.js.map +1 -0
  104. package/dist/Pagination.d.ts +11 -0
  105. package/dist/Pagination.js +148 -0
  106. package/dist/Pagination.js.map +1 -0
  107. package/dist/Popover.d.ts +13 -0
  108. package/dist/Popover.js +98 -0
  109. package/dist/Popover.js.map +1 -0
  110. package/dist/Progress.d.ts +12 -0
  111. package/dist/Progress.js +61 -0
  112. package/dist/Progress.js.map +1 -0
  113. package/dist/QuoteCard.d.ts +13 -0
  114. package/dist/QuoteCard.js +92 -0
  115. package/dist/QuoteCard.js.map +1 -0
  116. package/dist/Radio.d.ts +19 -0
  117. package/dist/Radio.js +161 -0
  118. package/dist/Radio.js.map +1 -0
  119. package/dist/RadioCards.d.ts +27 -0
  120. package/dist/RadioCards.js +205 -0
  121. package/dist/RadioCards.js.map +1 -0
  122. package/dist/ReactionBar.d.ts +15 -0
  123. package/dist/ReactionBar.js +92 -0
  124. package/dist/ReactionBar.js.map +1 -0
  125. package/dist/ReadingProgress.d.ts +8 -0
  126. package/dist/ReadingProgress.js +51 -0
  127. package/dist/ReadingProgress.js.map +1 -0
  128. package/dist/ReadingTime.d.ts +9 -0
  129. package/dist/ReadingTime.js +39 -0
  130. package/dist/ReadingTime.js.map +1 -0
  131. package/dist/Select.d.ts +20 -0
  132. package/dist/Select.js +244 -0
  133. package/dist/Select.js.map +1 -0
  134. package/dist/Separator.d.ts +14 -0
  135. package/dist/Separator.js +33 -0
  136. package/dist/Separator.js.map +1 -0
  137. package/dist/ShareButtons.d.ts +10 -0
  138. package/dist/ShareButtons.js +107 -0
  139. package/dist/ShareButtons.js.map +1 -0
  140. package/dist/Sidebar.d.ts +30 -0
  141. package/dist/Sidebar.js +140 -0
  142. package/dist/Sidebar.js.map +1 -0
  143. package/dist/Skeleton.d.ts +15 -0
  144. package/dist/Skeleton.js +67 -0
  145. package/dist/Skeleton.js.map +1 -0
  146. package/dist/Slider.d.ts +27 -0
  147. package/dist/Slider.js +182 -0
  148. package/dist/Slider.js.map +1 -0
  149. package/dist/Spinner.d.ts +12 -0
  150. package/dist/Spinner.js +24 -0
  151. package/dist/Spinner.js.map +1 -0
  152. package/dist/SpotlightCard.d.ts +17 -0
  153. package/dist/SpotlightCard.js +87 -0
  154. package/dist/SpotlightCard.js.map +1 -0
  155. package/dist/Stat.d.ts +19 -0
  156. package/dist/Stat.js +71 -0
  157. package/dist/Stat.js.map +1 -0
  158. package/dist/StatCard.d.ts +24 -0
  159. package/dist/StatCard.js +212 -0
  160. package/dist/StatCard.js.map +1 -0
  161. package/dist/Steps.d.ts +14 -0
  162. package/dist/Steps.js +94 -0
  163. package/dist/Steps.js.map +1 -0
  164. package/dist/Table.d.ts +21 -0
  165. package/dist/Table.js +93 -0
  166. package/dist/Table.js.map +1 -0
  167. package/dist/TableOfContents.d.ts +17 -0
  168. package/dist/TableOfContents.js +92 -0
  169. package/dist/TableOfContents.js.map +1 -0
  170. package/dist/Tabs.d.ts +17 -0
  171. package/dist/Tabs.js +123 -0
  172. package/dist/Tabs.js.map +1 -0
  173. package/dist/TagInput.d.ts +16 -0
  174. package/dist/TagInput.js +169 -0
  175. package/dist/TagInput.js.map +1 -0
  176. package/dist/Textarea.d.ts +13 -0
  177. package/dist/Textarea.js +74 -0
  178. package/dist/Textarea.js.map +1 -0
  179. package/dist/TimePicker.d.ts +28 -0
  180. package/dist/TimePicker.js +264 -0
  181. package/dist/TimePicker.js.map +1 -0
  182. package/dist/Timeline.d.ts +19 -0
  183. package/dist/Timeline.js +76 -0
  184. package/dist/Timeline.js.map +1 -0
  185. package/dist/Toast.d.ts +18 -0
  186. package/dist/Toast.js +318 -0
  187. package/dist/Toast.js.map +1 -0
  188. package/dist/Toggle.d.ts +13 -0
  189. package/dist/Toggle.js +84 -0
  190. package/dist/Toggle.js.map +1 -0
  191. package/dist/Tooltip.d.ts +13 -0
  192. package/dist/Tooltip.js +138 -0
  193. package/dist/Tooltip.js.map +1 -0
  194. package/dist/cli.js +172 -5
  195. package/dist/index.d.ts +68 -631
  196. package/dist/index.js +67 -5558
  197. package/dist/index.js.map +1 -1
  198. package/dist/registry/Accordion.tsx +6 -6
  199. package/dist/registry/Alert.tsx +13 -10
  200. package/dist/registry/AuthorCard.tsx +7 -7
  201. package/dist/registry/Avatar.tsx +5 -5
  202. package/dist/registry/Badge.tsx +12 -15
  203. package/dist/registry/Banner.tsx +15 -18
  204. package/dist/registry/Breadcrumb.tsx +3 -3
  205. package/dist/registry/Button.tsx +58 -69
  206. package/dist/registry/ButtonGroup.tsx +9 -9
  207. package/dist/registry/Card.tsx +15 -15
  208. package/dist/registry/CardShell.tsx +6 -6
  209. package/dist/registry/Carousel.tsx +19 -15
  210. package/dist/registry/Checkbox.tsx +14 -9
  211. package/dist/registry/CloseButton.tsx +2 -2
  212. package/dist/registry/CodeBlock.tsx +15 -15
  213. package/dist/registry/ColorPicker.tsx +404 -0
  214. package/dist/registry/Combobox.tsx +318 -0
  215. package/dist/registry/CommandPalette.tsx +31 -24
  216. package/dist/registry/ContextMenu.tsx +241 -0
  217. package/dist/registry/DataList.tsx +4 -4
  218. package/dist/registry/DatePicker.tsx +494 -0
  219. package/dist/registry/DateRangePicker.tsx +232 -0
  220. package/dist/registry/Drawer.tsx +17 -15
  221. package/dist/registry/DropdownMenu.tsx +39 -77
  222. package/dist/registry/EmptyState.tsx +8 -8
  223. package/dist/registry/FieldMessage.tsx +123 -0
  224. package/dist/registry/FileUpload.tsx +318 -0
  225. package/dist/registry/Floating.tsx +134 -0
  226. package/dist/registry/HoverCard.tsx +113 -0
  227. package/dist/registry/Input.tsx +54 -43
  228. package/dist/registry/Kbd.tsx +4 -5
  229. package/dist/registry/Modal.tsx +17 -15
  230. package/dist/registry/NumberInput.tsx +183 -0
  231. package/dist/registry/OtpInput.tsx +219 -0
  232. package/dist/registry/Pagination.tsx +15 -18
  233. package/dist/registry/Popover.tsx +40 -45
  234. package/dist/registry/Progress.tsx +4 -4
  235. package/dist/registry/QuoteCard.tsx +7 -7
  236. package/dist/registry/Radio.tsx +24 -21
  237. package/dist/registry/RadioCards.tsx +247 -0
  238. package/dist/registry/ReactionBar.tsx +5 -5
  239. package/dist/registry/ReadingProgress.tsx +2 -2
  240. package/dist/registry/ReadingTime.tsx +2 -2
  241. package/dist/registry/Select.tsx +28 -53
  242. package/dist/registry/Separator.tsx +52 -0
  243. package/dist/registry/ShareButtons.tsx +2 -2
  244. package/dist/registry/Sidebar.tsx +18 -18
  245. package/dist/registry/Skeleton.tsx +1 -1
  246. package/dist/registry/Slider.tsx +229 -0
  247. package/dist/registry/Spinner.tsx +32 -0
  248. package/dist/registry/SpotlightCard.tsx +6 -6
  249. package/dist/registry/Stat.tsx +4 -4
  250. package/dist/registry/StatCard.tsx +19 -19
  251. package/dist/registry/Steps.tsx +7 -7
  252. package/dist/registry/Table.tsx +12 -10
  253. package/dist/registry/TableOfContents.tsx +8 -8
  254. package/dist/registry/Tabs.tsx +6 -6
  255. package/dist/registry/TagInput.tsx +9 -9
  256. package/dist/registry/Textarea.tsx +5 -5
  257. package/dist/registry/TimePicker.tsx +315 -0
  258. package/dist/registry/Timeline.tsx +14 -14
  259. package/dist/registry/Toast.tsx +15 -12
  260. package/dist/registry/Toggle.tsx +7 -10
  261. package/dist/registry/Tooltip.tsx +21 -73
  262. package/dist/registry/styles.css +868 -62
  263. package/dist/registry/useFloatingPanel.ts +112 -0
  264. package/dist/styles.css +868 -62
  265. package/dist/useFloatingPanel.d.ts +24 -0
  266. package/dist/useFloatingPanel.js +89 -0
  267. package/dist/useFloatingPanel.js.map +1 -0
  268. package/dist/useModalBehavior.d.ts +15 -0
  269. package/dist/useModalBehavior.js +57 -0
  270. package/dist/useModalBehavior.js.map +1 -0
  271. package/package.json +1 -1
@@ -0,0 +1,391 @@
1
+ "use client";
2
+
3
+ // ../../components/ui/DatePicker.tsx
4
+ import { useId, useMemo, useRef, useState } from "react";
5
+ import { Portal } from "./Floating.js";
6
+ import { FieldKey, FieldLabel, FieldMessage } from "./FieldMessage.js";
7
+ import { useFloatingPanel } from "./useFloatingPanel.js";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
10
+ var startOfMonth = (d) => new Date(d.getFullYear(), d.getMonth(), 1);
11
+ var addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
12
+ var addMonths = (d, n) => {
13
+ const target = new Date(d.getFullYear(), d.getMonth() + n, 1);
14
+ const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
15
+ return new Date(target.getFullYear(), target.getMonth(), Math.min(d.getDate(), last));
16
+ };
17
+ var monthIndex = (d) => d.getFullYear() * 12 + d.getMonth();
18
+ var sameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
19
+ var toISODate = (d) => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
20
+ function Calendar({
21
+ value,
22
+ range,
23
+ onChange,
24
+ onDayHover,
25
+ defaultMonth,
26
+ months = 1,
27
+ min,
28
+ max,
29
+ isDateDisabled,
30
+ weekStartsOn = 0,
31
+ locale = "en-US",
32
+ autoFocus = false,
33
+ className = ""
34
+ }) {
35
+ const uid = useId();
36
+ const [today] = useState(() => startOfDay(/* @__PURE__ */ new Date()));
37
+ const [focused, setFocused] = useState(() => startOfDay(value ?? range?.from ?? defaultMonth ?? today));
38
+ const [view, setView] = useState(() => startOfMonth(focused));
39
+ const [direction, setDirection] = useState("right");
40
+ const pendingFocus = useRef(autoFocus);
41
+ const anchor = value ?? range?.from ?? null;
42
+ const [seen, setSeen] = useState(anchor?.getTime());
43
+ if (anchor?.getTime() !== seen) {
44
+ setSeen(anchor?.getTime());
45
+ if (anchor) {
46
+ const d = startOfDay(anchor);
47
+ setFocused(d);
48
+ const shown = monthIndex(d) - monthIndex(view);
49
+ if (shown < 0 || shown >= months) setView(startOfMonth(d));
50
+ }
51
+ }
52
+ const minDay = min && startOfDay(min);
53
+ const maxDay = max && startOfDay(max);
54
+ const disabled = (d) => minDay && d < minDay || maxDay && d > maxDay || (isDateDisabled?.(d) ?? false);
55
+ const monthFmt = useMemo(() => new Intl.DateTimeFormat(locale, { month: "long", year: "numeric" }), [locale]);
56
+ const dayLabel = useMemo(
57
+ () => new Intl.DateTimeFormat(locale, { weekday: "long", month: "long", day: "numeric", year: "numeric" }),
58
+ [locale]
59
+ );
60
+ const weekdays = useMemo(() => {
61
+ const short = new Intl.DateTimeFormat(locale, { weekday: "short" });
62
+ const long = new Intl.DateTimeFormat(locale, { weekday: "long" });
63
+ return Array.from({ length: 7 }, (_, i) => {
64
+ const d = new Date(2023, 0, 1 + (i + weekStartsOn) % 7);
65
+ return { short: short.format(d).slice(0, 2), long: long.format(d) };
66
+ });
67
+ }, [locale, weekStartsOn]);
68
+ const move = (next, viaKeyboard) => {
69
+ pendingFocus.current = viaKeyboard;
70
+ const offset = monthIndex(next) - monthIndex(view);
71
+ if (offset < 0) {
72
+ setDirection("left");
73
+ setView(startOfMonth(next));
74
+ } else if (offset >= months) {
75
+ setDirection("right");
76
+ setView(startOfMonth(addMonths(next, -(months - 1))));
77
+ }
78
+ setFocused(next);
79
+ if (viaKeyboard) onDayHover?.(next);
80
+ };
81
+ const flip = (n) => {
82
+ pendingFocus.current = false;
83
+ setDirection(n > 0 ? "right" : "left");
84
+ setView(addMonths(view, n));
85
+ setFocused(addMonths(focused, n));
86
+ };
87
+ const onKeyDown = (e) => {
88
+ const dow = (focused.getDay() - weekStartsOn + 7) % 7;
89
+ const map = {
90
+ ArrowLeft: () => addDays(focused, -1),
91
+ ArrowRight: () => addDays(focused, 1),
92
+ ArrowUp: () => addDays(focused, -7),
93
+ ArrowDown: () => addDays(focused, 7),
94
+ PageUp: () => addMonths(focused, e.shiftKey ? -12 : -1),
95
+ PageDown: () => addMonths(focused, e.shiftKey ? 12 : 1),
96
+ Home: () => addDays(focused, -dow),
97
+ End: () => addDays(focused, 6 - dow)
98
+ };
99
+ if (map[e.key]) {
100
+ e.preventDefault();
101
+ move(map[e.key](), true);
102
+ }
103
+ };
104
+ const focusRef = (el) => {
105
+ if (!el || !pendingFocus.current) return;
106
+ pendingFocus.current = false;
107
+ el.focus({ preventScroll: true });
108
+ };
109
+ const prevDisabled = !!minDay && addDays(view, -1) < minDay;
110
+ const nextDisabled = !!maxDay && addMonths(view, months) > maxDay;
111
+ const from = range?.from ? startOfDay(range.from) : null;
112
+ const to = range?.to ? startOfDay(range.to) : null;
113
+ return /* @__PURE__ */ jsx(
114
+ "div",
115
+ {
116
+ className: ["flex flex-wrap justify-center gap-x-6 gap-y-4 select-none", className].join(" "),
117
+ onKeyDown,
118
+ onMouseLeave: () => onDayHover?.(null),
119
+ children: Array.from({ length: months }, (_, m) => {
120
+ const month = addMonths(view, m);
121
+ const first = startOfMonth(month);
122
+ const gridStart = addDays(first, -((first.getDay() - weekStartsOn + 7) % 7));
123
+ const weeks = Array.from(
124
+ { length: 6 },
125
+ (_2, w) => Array.from({ length: 7 }, (_3, d) => addDays(gridStart, w * 7 + d))
126
+ );
127
+ const labelId = `${uid}-month-${m}`;
128
+ return /* @__PURE__ */ jsxs("div", { className: "w-[266px]", children: [
129
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex h-7 items-center justify-between gap-2", children: [
130
+ m === 0 ? /* @__PURE__ */ jsx(FieldKey, { label: "previous month", disabled: prevDisabled, onClick: () => flip(-1), children: /* @__PURE__ */ jsx("path", { d: "M15 19l-7-7 7-7" }) }) : /* @__PURE__ */ jsx("span", { className: "w-7" }),
131
+ /* @__PURE__ */ jsx("span", { id: labelId, "aria-live": "polite", className: "text-[13.5px] font-semibold text-ink tracking-[-0.01em]", children: monthFmt.format(month) }),
132
+ m === months - 1 ? /* @__PURE__ */ jsx(FieldKey, { label: "next month", disabled: nextDisabled, onClick: () => flip(1), children: /* @__PURE__ */ jsx("path", { d: "M9 5l7 7-7 7" }) }) : /* @__PURE__ */ jsx("span", { className: "w-7" })
133
+ ] }),
134
+ /* @__PURE__ */ jsxs("div", { role: "grid", "aria-labelledby": labelId, children: [
135
+ /* @__PURE__ */ jsx("div", { role: "row", className: "grid grid-cols-7", children: weekdays.map((w) => /* @__PURE__ */ jsx(
136
+ "span",
137
+ {
138
+ role: "columnheader",
139
+ "aria-label": w.long,
140
+ className: "grid h-7 place-items-center text-[11px] font-medium text-ink-faint",
141
+ children: w.short
142
+ },
143
+ w.long
144
+ )) }),
145
+ /* @__PURE__ */ jsx(
146
+ "div",
147
+ {
148
+ className: direction === "right" ? "animate-tab-slide-right" : "animate-tab-slide-left",
149
+ children: weeks.map((week, wi) => /* @__PURE__ */ jsx("div", { role: "row", className: "grid grid-cols-7", children: week.map((d) => {
150
+ const inMonth = d.getMonth() === month.getMonth();
151
+ if (!inMonth && months > 1) {
152
+ return /* @__PURE__ */ jsx("div", { role: "gridcell", className: "h-[38px]" }, d.getTime());
153
+ }
154
+ const isEndpoint = range ? sameDay(d, from) || sameDay(d, to) : sameDay(d, value);
155
+ const inBand = !!(from && to && d > from && d < to);
156
+ const bandLeft = !!(from && to && sameDay(d, to) && !sameDay(from, to));
157
+ const bandRight = !!(from && to && sameDay(d, from) && !sameDay(from, to));
158
+ const isToday = sameDay(d, today);
159
+ const isOff = disabled(d);
160
+ const isFocus = sameDay(d, focused) && inMonth;
161
+ return /* @__PURE__ */ jsxs(
162
+ "div",
163
+ {
164
+ role: "gridcell",
165
+ "aria-selected": isEndpoint || inBand,
166
+ className: "relative grid h-[38px] place-items-center",
167
+ children: [
168
+ (inBand || bandLeft || bandRight) && /* @__PURE__ */ jsx(
169
+ "span",
170
+ {
171
+ "aria-hidden": true,
172
+ className: "absolute inset-y-[3px]",
173
+ style: {
174
+ left: bandLeft || inBand ? 0 : "50%",
175
+ right: bandRight || inBand ? 0 : "50%",
176
+ background: "var(--well)",
177
+ boxShadow: "var(--well-shadow)"
178
+ }
179
+ }
180
+ ),
181
+ /* @__PURE__ */ jsxs(
182
+ "button",
183
+ {
184
+ type: "button",
185
+ ref: isFocus ? focusRef : void 0,
186
+ tabIndex: isFocus ? 0 : -1,
187
+ disabled: isOff,
188
+ "aria-label": dayLabel.format(d),
189
+ "aria-current": isToday ? "date" : void 0,
190
+ onClick: () => {
191
+ move(d, false);
192
+ if (!isOff) onChange?.(d);
193
+ },
194
+ onMouseEnter: () => onDayHover?.(d),
195
+ className: [
196
+ "relative grid h-9 w-9 place-items-center rounded-[10px] text-[13px] tabular-nums",
197
+ "transition-[background-color,color,box-shadow] duration-150",
198
+ "focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ink",
199
+ "disabled:cursor-not-allowed disabled:text-ink-ghost disabled:line-through",
200
+ isEndpoint ? "font-semibold text-ink-inverse" : [
201
+ "cursor-pointer hover:bg-surface-active",
202
+ !inMonth ? "text-ink-ghost" : isToday ? "font-semibold text-ink-strong" : "text-ink-soft"
203
+ ].join(" ")
204
+ ].join(" "),
205
+ style: isEndpoint ? {
206
+ background: "var(--face-inverse)",
207
+ boxShadow: "var(--face-inverse-shadow)",
208
+ textShadow: "var(--emboss-inverse)"
209
+ } : void 0,
210
+ children: [
211
+ d.getDate(),
212
+ isToday && /* @__PURE__ */ jsx(
213
+ "span",
214
+ {
215
+ "aria-hidden": true,
216
+ className: [
217
+ "absolute bottom-[5px] left-1/2 h-[3px] w-[3px] -translate-x-1/2 rounded-full",
218
+ isEndpoint ? "bg-ink-inverse" : "bg-ink"
219
+ ].join(" ")
220
+ }
221
+ )
222
+ ]
223
+ }
224
+ )
225
+ ]
226
+ },
227
+ d.getTime()
228
+ );
229
+ }) }, wi))
230
+ },
231
+ monthIndex(month)
232
+ )
233
+ ] })
234
+ ] }, m);
235
+ })
236
+ }
237
+ );
238
+ }
239
+ var CalendarIcon = ({ className = "" }) => /* @__PURE__ */ jsxs("svg", { "aria-hidden": true, width: "15", height: "15", fill: "none", stroke: "currentColor", strokeWidth: "2", viewBox: "0 0 24 24", className, children: [
240
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "5", width: "18", height: "16", rx: "2.5" }),
241
+ /* @__PURE__ */ jsx("path", { strokeLinecap: "round", d: "M3 10h18M8 3v4M16 3v4" })
242
+ ] });
243
+ function ClearKey({ label, onClear }) {
244
+ return /* @__PURE__ */ jsx(
245
+ "button",
246
+ {
247
+ type: "button",
248
+ "aria-label": label,
249
+ onClick: onClear,
250
+ className: "absolute right-2.5 top-1/2 z-10 grid h-6 w-6 -translate-y-1/2 cursor-pointer place-items-center rounded-full text-ink-faint transition-colors hover:bg-surface-active hover:text-ink-soft",
251
+ children: /* @__PURE__ */ jsx("svg", { "aria-hidden": true, width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "2.5", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", d: "M6 6l12 12M18 6L6 18" }) })
252
+ }
253
+ );
254
+ }
255
+ var DEFAULT_FORMAT = { month: "short", day: "numeric", year: "numeric" };
256
+ function DatePicker({
257
+ value,
258
+ defaultValue = null,
259
+ onChange,
260
+ label,
261
+ hint,
262
+ error,
263
+ placeholder = "pick a date",
264
+ min,
265
+ max,
266
+ isDateDisabled,
267
+ weekStartsOn,
268
+ locale = "en-US",
269
+ format = DEFAULT_FORMAT,
270
+ name,
271
+ clearable = false,
272
+ disabled = false,
273
+ fullWidth = false,
274
+ className = ""
275
+ }) {
276
+ const uid = useId();
277
+ const ref = useRef(null);
278
+ const buttonRef = useRef(null);
279
+ const [internal, setInternal] = useState(defaultValue);
280
+ const selected = value !== void 0 ? value : internal;
281
+ const { open, mounted, toggle, show, close, setFloating, panelStyle } = useFloatingPanel(ref, {
282
+ onEscape: () => buttonRef.current?.focus()
283
+ });
284
+ const messageId = error || hint ? `${uid}-message` : void 0;
285
+ const text = selected ? new Intl.DateTimeFormat(locale, format).format(selected) : null;
286
+ const set = (d) => {
287
+ setInternal(d);
288
+ onChange?.(d);
289
+ };
290
+ return /* @__PURE__ */ jsxs("div", { className: ["group/field flex flex-col gap-1.5", fullWidth ? "w-full" : ""].join(" "), children: [
291
+ label && /* @__PURE__ */ jsx(FieldLabel, { id: `${uid}-label`, children: label }),
292
+ /* @__PURE__ */ jsxs("div", { ref, className: ["relative", fullWidth ? "w-full" : "inline-block w-56", className].join(" "), children: [
293
+ /* @__PURE__ */ jsxs(
294
+ "button",
295
+ {
296
+ ref: buttonRef,
297
+ type: "button",
298
+ disabled,
299
+ onClick: toggle,
300
+ onKeyDown: (e) => {
301
+ if (!open && e.key === "ArrowDown") {
302
+ e.preventDefault();
303
+ show();
304
+ }
305
+ },
306
+ "aria-haspopup": "dialog",
307
+ "aria-expanded": open,
308
+ "aria-controls": open ? `${uid}-panel` : void 0,
309
+ "aria-labelledby": label ? `${uid}-label ${uid}-value` : void 0,
310
+ "aria-invalid": error ? true : void 0,
311
+ "aria-describedby": messageId,
312
+ "data-open": open || void 0,
313
+ className: [
314
+ "field group/date relative isolate flex w-full cursor-pointer items-center gap-2.5 rounded-xl py-3 pl-3.5 text-left text-[13.5px]",
315
+ clearable && selected ? "pr-10" : "pr-4",
316
+ "focus:outline-none disabled:opacity-40 disabled:pointer-events-none"
317
+ ].join(" "),
318
+ children: [
319
+ /* @__PURE__ */ jsx(
320
+ CalendarIcon,
321
+ {
322
+ className: [
323
+ "shrink-0 transition-[color,transform] duration-300 ease-[var(--ease-spring)]",
324
+ open ? "scale-110 text-ink-soft" : "text-ink-faint group-hover/date:text-ink-body"
325
+ ].join(" ")
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsx(
329
+ "span",
330
+ {
331
+ id: `${uid}-value`,
332
+ className: ["truncate tabular-nums", text ? "font-medium text-ink" : "text-ink-faint"].join(" "),
333
+ children: text ?? placeholder
334
+ }
335
+ )
336
+ ]
337
+ }
338
+ ),
339
+ clearable && selected && !disabled && /* @__PURE__ */ jsx(
340
+ ClearKey,
341
+ {
342
+ label: "clear date",
343
+ onClear: () => {
344
+ set(null);
345
+ buttonRef.current?.focus();
346
+ }
347
+ }
348
+ ),
349
+ name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: selected ? toISODate(selected) : "" })
350
+ ] }),
351
+ mounted && /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
352
+ "div",
353
+ {
354
+ ref: setFloating,
355
+ id: `${uid}-panel`,
356
+ role: "dialog",
357
+ "aria-label": label ? `choose ${label}` : "choose a date",
358
+ className: "rounded-[16px] p-1.5",
359
+ style: panelStyle,
360
+ children: /* @__PURE__ */ jsx("div", { className: "rounded-[11px] bg-panel-face p-2.5", style: { boxShadow: "var(--panel-face-shadow)" }, children: /* @__PURE__ */ jsx(
361
+ Calendar,
362
+ {
363
+ value: selected,
364
+ onChange: (d) => {
365
+ set(d);
366
+ close();
367
+ buttonRef.current?.focus();
368
+ },
369
+ min,
370
+ max,
371
+ isDateDisabled,
372
+ weekStartsOn,
373
+ locale,
374
+ autoFocus: true
375
+ }
376
+ ) })
377
+ }
378
+ ) }),
379
+ /* @__PURE__ */ jsx(FieldMessage, { id: messageId, error, hint })
380
+ ] });
381
+ }
382
+ export {
383
+ Calendar,
384
+ CalendarIcon,
385
+ ClearKey,
386
+ DatePicker,
387
+ sameDay,
388
+ startOfDay,
389
+ toISODate
390
+ };
391
+ //# sourceMappingURL=DatePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../components/ui/DatePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useMemo, useRef, useState } from \"react\";\nimport { Portal } from \"./Floating\";\nimport { FieldKey, FieldLabel, FieldMessage } from \"./FieldMessage\";\nimport { useFloatingPanel } from \"./useFloatingPanel\";\n\n/* ── Date helpers ─────────────────────────────────────────────────── */\n/* Everything works on local calendar days at midnight, so a date never\n drifts across a time zone boundary on its way through the picker. */\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nconst addDays = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\nconst addMonths = (d: Date, n: number) => {\n const target = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(target.getFullYear(), target.getMonth(), Math.min(d.getDate(), last));\n};\nconst monthIndex = (d: Date) => d.getFullYear() * 12 + d.getMonth();\nexport const sameDay = (a?: Date | null, b?: Date | null) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\nexport const toISODate = (d: Date) =>\n `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n\nexport interface DateRange {\n from: Date | null;\n to: Date | null;\n}\n\n/* ── Calendar ─────────────────────────────────────────────────────── */\ninterface CalendarProps {\n value?: Date | null;\n /** Shade a span of days instead of marking one (see DateRangePicker) */\n range?: DateRange;\n onChange?: (date: Date) => void;\n /** The day under the pointer or keyboard, for previewing a range */\n onDayHover?: (date: Date | null) => void;\n /** The month shown first; defaults to the selected date, or today */\n defaultMonth?: Date;\n /** How many months sit side by side */\n months?: 1 | 2;\n min?: Date;\n max?: Date;\n /** Grey out and skip particular days, like weekends */\n isDateDisabled?: (date: Date) => boolean;\n /** 0 is Sunday, 1 is Monday */\n weekStartsOn?: 0 | 1;\n locale?: string;\n /** Move focus onto the grid as soon as it mounts */\n autoFocus?: boolean;\n className?: string;\n}\n\n/* A month of days on the panel's face. The chosen day is a raised key in\n the inverse material, today wears a small dot, and the grid follows\n the ARIA date-grid pattern: arrows move by day and week, page keys by\n month (shift for a year), home and end to the edges of the week. */\nexport function Calendar({\n value,\n range,\n onChange,\n onDayHover,\n defaultMonth,\n months = 1,\n min,\n max,\n isDateDisabled,\n weekStartsOn = 0,\n locale = \"en-US\",\n autoFocus = false,\n className = \"\",\n}: CalendarProps) {\n const uid = useId();\n const [today] = useState(() => startOfDay(new Date()));\n const [focused, setFocused] = useState<Date>(() => startOfDay(value ?? range?.from ?? defaultMonth ?? today));\n const [view, setView] = useState<Date>(() => startOfMonth(focused));\n const [direction, setDirection] = useState<\"left\" | \"right\">(\"right\");\n // Set by keyboard moves, spent by the next day button that mounts focused\n const pendingFocus = useRef(autoFocus);\n\n // A value set from outside brings its month into view\n const anchor = value ?? range?.from ?? null;\n const [seen, setSeen] = useState(anchor?.getTime());\n if (anchor?.getTime() !== seen) {\n setSeen(anchor?.getTime());\n if (anchor) {\n const d = startOfDay(anchor);\n setFocused(d);\n const shown = monthIndex(d) - monthIndex(view);\n if (shown < 0 || shown >= months) setView(startOfMonth(d));\n }\n }\n\n const minDay = min && startOfDay(min);\n const maxDay = max && startOfDay(max);\n const disabled = (d: Date) =>\n (minDay && d < minDay) || (maxDay && d > maxDay) || (isDateDisabled?.(d) ?? false);\n\n const monthFmt = useMemo(() => new Intl.DateTimeFormat(locale, { month: \"long\", year: \"numeric\" }), [locale]);\n const dayLabel = useMemo(\n () => new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\" }),\n [locale],\n );\n const weekdays = useMemo(() => {\n const short = new Intl.DateTimeFormat(locale, { weekday: \"short\" });\n const long = new Intl.DateTimeFormat(locale, { weekday: \"long\" });\n // 2023-01-01 was a Sunday\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(2023, 0, 1 + ((i + weekStartsOn) % 7));\n return { short: short.format(d).slice(0, 2), long: long.format(d) };\n });\n }, [locale, weekStartsOn]);\n\n /* Moves the roving focus, scrolling the view when the day is off it */\n const move = (next: Date, viaKeyboard: boolean) => {\n pendingFocus.current = viaKeyboard;\n const offset = monthIndex(next) - monthIndex(view);\n if (offset < 0) {\n setDirection(\"left\");\n setView(startOfMonth(next));\n } else if (offset >= months) {\n setDirection(\"right\");\n setView(startOfMonth(addMonths(next, -(months - 1))));\n }\n setFocused(next);\n if (viaKeyboard) onDayHover?.(next);\n };\n\n const flip = (n: number) => {\n pendingFocus.current = false;\n setDirection(n > 0 ? \"right\" : \"left\");\n setView(addMonths(view, n));\n setFocused(addMonths(focused, n));\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const dow = (focused.getDay() - weekStartsOn + 7) % 7;\n const map: Record<string, () => Date> = {\n ArrowLeft: () => addDays(focused, -1),\n ArrowRight: () => addDays(focused, 1),\n ArrowUp: () => addDays(focused, -7),\n ArrowDown: () => addDays(focused, 7),\n PageUp: () => addMonths(focused, e.shiftKey ? -12 : -1),\n PageDown: () => addMonths(focused, e.shiftKey ? 12 : 1),\n Home: () => addDays(focused, -dow),\n End: () => addDays(focused, 6 - dow),\n };\n if (map[e.key]) {\n e.preventDefault();\n move(map[e.key](), true);\n }\n };\n\n /* The focused day takes focus after it renders, but only when the\n keyboard moved it: a click shouldn't yank focus around. */\n const focusRef = (el: HTMLButtonElement | null) => {\n if (!el || !pendingFocus.current) return;\n pendingFocus.current = false;\n el.focus({ preventScroll: true });\n };\n\n const prevDisabled = !!minDay && addDays(view, -1) < minDay;\n const nextDisabled = !!maxDay && addMonths(view, months) > maxDay;\n\n const from = range?.from ? startOfDay(range.from) : null;\n const to = range?.to ? startOfDay(range.to) : null;\n\n return (\n <div\n className={[\"flex flex-wrap justify-center gap-x-6 gap-y-4 select-none\", className].join(\" \")}\n onKeyDown={onKeyDown}\n onMouseLeave={() => onDayHover?.(null)}\n >\n {Array.from({ length: months }, (_, m) => {\n const month = addMonths(view, m);\n const first = startOfMonth(month);\n const gridStart = addDays(first, -((first.getDay() - weekStartsOn + 7) % 7));\n // Always six weeks, so the panel keeps its height from month to month\n const weeks = Array.from({ length: 6 }, (_, w) =>\n Array.from({ length: 7 }, (_, d) => addDays(gridStart, w * 7 + d)),\n );\n const labelId = `${uid}-month-${m}`;\n return (\n <div key={m} className=\"w-[266px]\">\n <div className=\"mb-2 flex h-7 items-center justify-between gap-2\">\n {m === 0 ? (\n <FieldKey label=\"previous month\" disabled={prevDisabled} onClick={() => flip(-1)}>\n <path d=\"M15 19l-7-7 7-7\" />\n </FieldKey>\n ) : (\n <span className=\"w-7\" />\n )}\n <span id={labelId} aria-live=\"polite\" className=\"text-[13.5px] font-semibold text-ink tracking-[-0.01em]\">\n {monthFmt.format(month)}\n </span>\n {m === months - 1 ? (\n <FieldKey label=\"next month\" disabled={nextDisabled} onClick={() => flip(1)}>\n <path d=\"M9 5l7 7-7 7\" />\n </FieldKey>\n ) : (\n <span className=\"w-7\" />\n )}\n </div>\n\n <div role=\"grid\" aria-labelledby={labelId}>\n <div role=\"row\" className=\"grid grid-cols-7\">\n {weekdays.map((w) => (\n <span\n key={w.long}\n role=\"columnheader\"\n aria-label={w.long}\n className=\"grid h-7 place-items-center text-[11px] font-medium text-ink-faint\"\n >\n {w.short}\n </span>\n ))}\n </div>\n <div\n key={monthIndex(month)}\n className={direction === \"right\" ? \"animate-tab-slide-right\" : \"animate-tab-slide-left\"}\n >\n {weeks.map((week, wi) => (\n <div role=\"row\" key={wi} className=\"grid grid-cols-7\">\n {week.map((d) => {\n const inMonth = d.getMonth() === month.getMonth();\n // With two months the spill-over days would show twice\n if (!inMonth && months > 1) {\n return <div role=\"gridcell\" key={d.getTime()} className=\"h-[38px]\" />;\n }\n const isEndpoint = range ? sameDay(d, from) || sameDay(d, to) : sameDay(d, value);\n const inBand = !!(from && to && d > from && d < to);\n const bandLeft = !!(from && to && sameDay(d, to) && !sameDay(from, to));\n const bandRight = !!(from && to && sameDay(d, from) && !sameDay(from, to));\n const isToday = sameDay(d, today);\n const isOff = disabled(d);\n const isFocus = sameDay(d, focused) && inMonth;\n return (\n <div\n role=\"gridcell\"\n key={d.getTime()}\n aria-selected={isEndpoint || inBand}\n className=\"relative grid h-[38px] place-items-center\"\n >\n {/* The span of a range, cut into the face like a well */}\n {(inBand || bandLeft || bandRight) && (\n <span\n aria-hidden\n className=\"absolute inset-y-[3px]\"\n style={{\n left: bandLeft || inBand ? 0 : \"50%\",\n right: bandRight || inBand ? 0 : \"50%\",\n background: \"var(--well)\",\n boxShadow: \"var(--well-shadow)\",\n }}\n />\n )}\n <button\n type=\"button\"\n ref={isFocus ? focusRef : undefined}\n tabIndex={isFocus ? 0 : -1}\n disabled={isOff}\n aria-label={dayLabel.format(d)}\n aria-current={isToday ? \"date\" : undefined}\n onClick={() => {\n move(d, false);\n if (!isOff) onChange?.(d);\n }}\n onMouseEnter={() => onDayHover?.(d)}\n className={[\n \"relative grid h-9 w-9 place-items-center rounded-[10px] text-[13px] tabular-nums\",\n \"transition-[background-color,color,box-shadow] duration-150\",\n \"focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ink\",\n \"disabled:cursor-not-allowed disabled:text-ink-ghost disabled:line-through\",\n isEndpoint\n ? \"font-semibold text-ink-inverse\"\n : [\n \"cursor-pointer hover:bg-surface-active\",\n !inMonth ? \"text-ink-ghost\" : isToday ? \"font-semibold text-ink-strong\" : \"text-ink-soft\",\n ].join(\" \"),\n ].join(\" \")}\n style={\n isEndpoint\n ? {\n background: \"var(--face-inverse)\",\n boxShadow: \"var(--face-inverse-shadow)\",\n textShadow: \"var(--emboss-inverse)\",\n }\n : undefined\n }\n >\n {d.getDate()}\n {isToday && (\n <span\n aria-hidden\n className={[\n \"absolute bottom-[5px] left-1/2 h-[3px] w-[3px] -translate-x-1/2 rounded-full\",\n isEndpoint ? \"bg-ink-inverse\" : \"bg-ink\",\n ].join(\" \")}\n />\n )}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/* ── Pieces both pickers share ────────────────────────────────────── */\nexport const CalendarIcon = ({ className = \"\" }: { className?: string }) => (\n <svg aria-hidden width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\" className={className}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2.5\" />\n <path strokeLinecap=\"round\" d=\"M3 10h18M8 3v4M16 3v4\" />\n </svg>\n);\n\nexport function ClearKey({ label, onClear }: { label: string; onClear: () => void }) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n onClick={onClear}\n className=\"absolute right-2.5 top-1/2 z-10 grid h-6 w-6 -translate-y-1/2 cursor-pointer place-items-center rounded-full text-ink-faint transition-colors hover:bg-surface-active hover:text-ink-soft\"\n >\n <svg aria-hidden width=\"11\" height=\"11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n );\n}\n\n/* ── DatePicker ───────────────────────────────────────────────────── */\ninterface DatePickerProps {\n value?: Date | null;\n defaultValue?: Date | null;\n onChange?: (date: Date | null) => void;\n label?: string;\n hint?: string;\n error?: string;\n placeholder?: string;\n min?: Date;\n max?: Date;\n isDateDisabled?: (date: Date) => boolean;\n weekStartsOn?: 0 | 1;\n locale?: string;\n /** How the chosen date reads in the field */\n format?: Intl.DateTimeFormatOptions;\n /** Submit the date with a form, as yyyy-mm-dd */\n name?: string;\n /** Show a small key in the field that empties it */\n clearable?: boolean;\n disabled?: boolean;\n fullWidth?: boolean;\n className?: string;\n}\n\nconst DEFAULT_FORMAT: Intl.DateTimeFormatOptions = { month: \"short\", day: \"numeric\", year: \"numeric\" };\n\n/* The closed picker is a sunken field like Select; the calendar opens\n under it on a floating panel. Picking a day closes it and hands\n focus back to the field. */\nexport function DatePicker({\n value,\n defaultValue = null,\n onChange,\n label,\n hint,\n error,\n placeholder = \"pick a date\",\n min,\n max,\n isDateDisabled,\n weekStartsOn,\n locale = \"en-US\",\n format = DEFAULT_FORMAT,\n name,\n clearable = false,\n disabled = false,\n fullWidth = false,\n className = \"\",\n}: DatePickerProps) {\n const uid = useId();\n const ref = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const [internal, setInternal] = useState<Date | null>(defaultValue);\n const selected = value !== undefined ? value : internal;\n const { open, mounted, toggle, show, close, setFloating, panelStyle } = useFloatingPanel(ref, {\n onEscape: () => buttonRef.current?.focus(),\n });\n const messageId = error || hint ? `${uid}-message` : undefined;\n const text = selected ? new Intl.DateTimeFormat(locale, format).format(selected) : null;\n\n const set = (d: Date | null) => {\n setInternal(d);\n onChange?.(d);\n };\n\n return (\n <div className={[\"group/field flex flex-col gap-1.5\", fullWidth ? \"w-full\" : \"\"].join(\" \")}>\n {label && <FieldLabel id={`${uid}-label`}>{label}</FieldLabel>}\n <div ref={ref} className={[\"relative\", fullWidth ? \"w-full\" : \"inline-block w-56\", className].join(\" \")}>\n {/* The field's error styling keys off aria-invalid, as Input's does */}\n {/* eslint-disable-next-line jsx-a11y/role-supports-aria-props */}\n <button\n ref={buttonRef}\n type=\"button\"\n disabled={disabled}\n onClick={toggle}\n onKeyDown={(e) => {\n if (!open && e.key === \"ArrowDown\") {\n e.preventDefault();\n show();\n }\n }}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? `${uid}-panel` : undefined}\n aria-labelledby={label ? `${uid}-label ${uid}-value` : undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={messageId}\n data-open={open || undefined}\n className={[\n \"field group/date relative isolate flex w-full cursor-pointer items-center gap-2.5 rounded-xl py-3 pl-3.5 text-left text-[13.5px]\",\n clearable && selected ? \"pr-10\" : \"pr-4\",\n \"focus:outline-none disabled:opacity-40 disabled:pointer-events-none\",\n ].join(\" \")}\n >\n <CalendarIcon\n className={[\n \"shrink-0 transition-[color,transform] duration-300 ease-[var(--ease-spring)]\",\n open ? \"scale-110 text-ink-soft\" : \"text-ink-faint group-hover/date:text-ink-body\",\n ].join(\" \")}\n />\n <span\n id={`${uid}-value`}\n className={[\"truncate tabular-nums\", text ? \"font-medium text-ink\" : \"text-ink-faint\"].join(\" \")}\n >\n {text ?? placeholder}\n </span>\n </button>\n\n {clearable && selected && !disabled && (\n <ClearKey\n label=\"clear date\"\n onClear={() => {\n set(null);\n buttonRef.current?.focus();\n }}\n />\n )}\n\n {name && <input type=\"hidden\" name={name} value={selected ? toISODate(selected) : \"\"} />}\n </div>\n\n {mounted && (\n <Portal>\n <div\n ref={setFloating}\n id={`${uid}-panel`}\n role=\"dialog\"\n aria-label={label ? `choose ${label}` : \"choose a date\"}\n className=\"rounded-[16px] p-1.5\"\n style={panelStyle}\n >\n <div className=\"rounded-[11px] bg-panel-face p-2.5\" style={{ boxShadow: \"var(--panel-face-shadow)\" }}>\n <Calendar\n value={selected}\n onChange={(d) => {\n set(d);\n close();\n buttonRef.current?.focus();\n }}\n min={min}\n max={max}\n isDateDisabled={isDateDisabled}\n weekStartsOn={weekStartsOn}\n locale={locale}\n autoFocus\n />\n </div>\n </div>\n </Portal>\n )}\n <FieldMessage id={messageId} error={error} hint={hint} />\n </div>\n );\n}\n"],"mappings":"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","names":["_"]}
@@ -0,0 +1,34 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DateRange } from './DatePicker.js';
3
+
4
+ interface DateRangePreset {
5
+ label: string;
6
+ range: () => DateRange;
7
+ }
8
+ interface DateRangePickerProps {
9
+ value?: DateRange;
10
+ defaultValue?: DateRange;
11
+ onChange?: (range: DateRange) => void;
12
+ label?: string;
13
+ hint?: string;
14
+ error?: string;
15
+ placeholder?: string;
16
+ min?: Date;
17
+ max?: Date;
18
+ isDateDisabled?: (date: Date) => boolean;
19
+ weekStartsOn?: 0 | 1;
20
+ locale?: string;
21
+ /** Shortcuts down the side, like "last 7 days" */
22
+ presets?: DateRangePreset[];
23
+ /** One month instead of two side by side */
24
+ singleMonth?: boolean;
25
+ clearable?: boolean;
26
+ disabled?: boolean;
27
+ fullWidth?: boolean;
28
+ /** Submits name[from] and name[to] as yyyy-mm-dd */
29
+ name?: string;
30
+ className?: string;
31
+ }
32
+ declare function DateRangePicker({ value, defaultValue, onChange, label, hint, error, placeholder, min, max, isDateDisabled, weekStartsOn, locale, presets, singleMonth, clearable, disabled, fullWidth, name, className, }: DateRangePickerProps): react_jsx_runtime.JSX.Element;
33
+
34
+ export { DateRange, DateRangePicker, type DateRangePreset };