@nocoo/basalt 2.0.0-rc.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 (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/charts/area.d.ts +8 -0
  4. package/dist/charts/area.js +55 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +9 -0
  7. package/dist/charts/bar.js +42 -0
  8. package/dist/charts/bar.js.map +1 -0
  9. package/dist/charts/bullet.d.ts +8 -0
  10. package/dist/charts/bullet.js +50 -0
  11. package/dist/charts/bullet.js.map +1 -0
  12. package/dist/charts/chart-colors.d.ts +1 -0
  13. package/dist/charts/chart-colors.js +3 -0
  14. package/dist/charts/charts.d.ts +6 -0
  15. package/dist/charts/charts.js +15 -0
  16. package/dist/charts/charts.js.map +1 -0
  17. package/dist/charts/config.d.ts +117 -0
  18. package/dist/charts/config.js +117 -0
  19. package/dist/charts/config.js.map +1 -0
  20. package/dist/charts/custom-chart.d.ts +6 -0
  21. package/dist/charts/custom-chart.js +15 -0
  22. package/dist/charts/custom-chart.js.map +1 -0
  23. package/dist/charts/date-navigation.d.ts +22 -0
  24. package/dist/charts/date-navigation.js +122 -0
  25. package/dist/charts/date-navigation.js.map +1 -0
  26. package/dist/charts/donut.d.ts +8 -0
  27. package/dist/charts/donut.js +36 -0
  28. package/dist/charts/donut.js.map +1 -0
  29. package/dist/charts/frame.d.ts +9 -0
  30. package/dist/charts/frame.js +22 -0
  31. package/dist/charts/frame.js.map +1 -0
  32. package/dist/charts/funnel.d.ts +7 -0
  33. package/dist/charts/funnel.js +35 -0
  34. package/dist/charts/funnel.js.map +1 -0
  35. package/dist/charts/gauge.d.ts +8 -0
  36. package/dist/charts/gauge.js +46 -0
  37. package/dist/charts/gauge.js.map +1 -0
  38. package/dist/charts/grouped-bar.d.ts +7 -0
  39. package/dist/charts/grouped-bar.js +42 -0
  40. package/dist/charts/grouped-bar.js.map +1 -0
  41. package/dist/charts/heatmap-calendar.d.ts +27 -0
  42. package/dist/charts/heatmap-calendar.js +200 -0
  43. package/dist/charts/heatmap-calendar.js.map +1 -0
  44. package/dist/charts/item-list.d.ts +9 -0
  45. package/dist/charts/item-list.js +22 -0
  46. package/dist/charts/item-list.js.map +1 -0
  47. package/dist/charts/line.d.ts +9 -0
  48. package/dist/charts/line.js +58 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/palette.d.ts +33 -0
  51. package/dist/charts/palette.js +44 -0
  52. package/dist/charts/palette.js.map +1 -0
  53. package/dist/charts/radar.d.ts +6 -0
  54. package/dist/charts/radar.js +37 -0
  55. package/dist/charts/radar.js.map +1 -0
  56. package/dist/charts/sample.d.ts +42 -0
  57. package/dist/charts/sample.js +124 -0
  58. package/dist/charts/sample.js.map +1 -0
  59. package/dist/charts/sankey.d.ts +6 -0
  60. package/dist/charts/sankey.js +51 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/slot-bar.d.ts +15 -0
  63. package/dist/charts/slot-bar.js +80 -0
  64. package/dist/charts/slot-bar.js.map +1 -0
  65. package/dist/charts/sparkline.d.ts +6 -0
  66. package/dist/charts/sparkline.js +29 -0
  67. package/dist/charts/sparkline.js.map +1 -0
  68. package/dist/charts/stacked-bar.d.ts +7 -0
  69. package/dist/charts/stacked-bar.js +51 -0
  70. package/dist/charts/stacked-bar.js.map +1 -0
  71. package/dist/charts/stat-card.d.ts +21 -0
  72. package/dist/charts/stat-card.js +66 -0
  73. package/dist/charts/stat-card.js.map +1 -0
  74. package/dist/charts/timeline.d.ts +17 -0
  75. package/dist/charts/timeline.js +79 -0
  76. package/dist/charts/timeline.js.map +1 -0
  77. package/dist/charts/timeseries.d.ts +6 -0
  78. package/dist/charts/timeseries.js +15 -0
  79. package/dist/charts/timeseries.js.map +1 -0
  80. package/dist/components/accordion.d.ts +6 -0
  81. package/dist/components/accordion.js +21 -0
  82. package/dist/components/accordion.js.map +1 -0
  83. package/dist/components/alert-dialog.d.ts +25 -0
  84. package/dist/components/alert-dialog.js +61 -0
  85. package/dist/components/alert-dialog.js.map +1 -0
  86. package/dist/components/app-header.d.ts +10 -0
  87. package/dist/components/app-header.js +35 -0
  88. package/dist/components/app-header.js.map +1 -0
  89. package/dist/components/app-shell.d.ts +4 -0
  90. package/dist/components/app-shell.js +29 -0
  91. package/dist/components/app-shell.js.map +1 -0
  92. package/dist/components/autocomplete.d.ts +47 -0
  93. package/dist/components/autocomplete.js +28 -0
  94. package/dist/components/autocomplete.js.map +1 -0
  95. package/dist/components/avatar.d.ts +5 -0
  96. package/dist/components/avatar.js +28 -0
  97. package/dist/components/avatar.js.map +1 -0
  98. package/dist/components/badge.d.ts +10 -0
  99. package/dist/components/badge.js +37 -0
  100. package/dist/components/badge.js.map +1 -0
  101. package/dist/components/banner.d.ts +22 -0
  102. package/dist/components/banner.js +88 -0
  103. package/dist/components/banner.js.map +1 -0
  104. package/dist/components/basalt-mark.d.ts +8 -0
  105. package/dist/components/basalt-mark.js +17 -0
  106. package/dist/components/basalt-mark.js.map +1 -0
  107. package/dist/components/breadcrumbs.d.ts +9 -0
  108. package/dist/components/breadcrumbs.js +38 -0
  109. package/dist/components/breadcrumbs.js.map +1 -0
  110. package/dist/components/button.d.ts +17 -0
  111. package/dist/components/button.js +73 -0
  112. package/dist/components/button.js.map +1 -0
  113. package/dist/components/checkbox.d.ts +86 -0
  114. package/dist/components/checkbox.js +107 -0
  115. package/dist/components/checkbox.js.map +1 -0
  116. package/dist/components/clipboard-text.d.ts +5 -0
  117. package/dist/components/clipboard-text.js +33 -0
  118. package/dist/components/clipboard-text.js.map +1 -0
  119. package/dist/components/code.d.ts +26 -0
  120. package/dist/components/code.js +45 -0
  121. package/dist/components/code.js.map +1 -0
  122. package/dist/components/collapsible.d.ts +33 -0
  123. package/dist/components/collapsible.js +38 -0
  124. package/dist/components/collapsible.js.map +1 -0
  125. package/dist/components/combobox.d.ts +47 -0
  126. package/dist/components/combobox.js +28 -0
  127. package/dist/components/combobox.js.map +1 -0
  128. package/dist/components/command-palette.d.ts +83 -0
  129. package/dist/components/command-palette.js +90 -0
  130. package/dist/components/command-palette.js.map +1 -0
  131. package/dist/components/confirm-dialog.d.ts +52 -0
  132. package/dist/components/confirm-dialog.js +61 -0
  133. package/dist/components/confirm-dialog.js.map +1 -0
  134. package/dist/components/context-menu.d.ts +7 -0
  135. package/dist/components/context-menu.js +23 -0
  136. package/dist/components/context-menu.js.map +1 -0
  137. package/dist/components/data-table.d.ts +76 -0
  138. package/dist/components/data-table.js +230 -0
  139. package/dist/components/data-table.js.map +1 -0
  140. package/dist/components/date-picker.d.ts +90 -0
  141. package/dist/components/date-picker.js +452 -0
  142. package/dist/components/date-picker.js.map +1 -0
  143. package/dist/components/dialog.d.ts +37 -0
  144. package/dist/components/dialog.js +67 -0
  145. package/dist/components/dialog.js.map +1 -0
  146. package/dist/components/dropdown-menu.d.ts +38 -0
  147. package/dist/components/dropdown-menu.js +24 -0
  148. package/dist/components/dropdown-menu.js.map +1 -0
  149. package/dist/components/empty.d.ts +6 -0
  150. package/dist/components/empty.js +28 -0
  151. package/dist/components/empty.js.map +1 -0
  152. package/dist/components/field.d.ts +39 -0
  153. package/dist/components/field.js +52 -0
  154. package/dist/components/field.js.map +1 -0
  155. package/dist/components/flow.d.ts +24 -0
  156. package/dist/components/flow.js +56 -0
  157. package/dist/components/flow.js.map +1 -0
  158. package/dist/components/grid.d.ts +15 -0
  159. package/dist/components/grid.js +24 -0
  160. package/dist/components/grid.js.map +1 -0
  161. package/dist/components/hover-card.d.ts +5 -0
  162. package/dist/components/hover-card.js +18 -0
  163. package/dist/components/hover-card.js.map +1 -0
  164. package/dist/components/input-area.d.ts +19 -0
  165. package/dist/components/input-area.js +27 -0
  166. package/dist/components/input-area.js.map +1 -0
  167. package/dist/components/input-group.d.ts +70 -0
  168. package/dist/components/input-group.js +78 -0
  169. package/dist/components/input-group.js.map +1 -0
  170. package/dist/components/input.d.ts +19 -0
  171. package/dist/components/input.js +28 -0
  172. package/dist/components/input.js.map +1 -0
  173. package/dist/components/label.d.ts +20 -0
  174. package/dist/components/label.js +34 -0
  175. package/dist/components/label.js.map +1 -0
  176. package/dist/components/layer-card.d.ts +69 -0
  177. package/dist/components/layer-card.js +104 -0
  178. package/dist/components/layer-card.js.map +1 -0
  179. package/dist/components/link.d.ts +8 -0
  180. package/dist/components/link.js +18 -0
  181. package/dist/components/link.js.map +1 -0
  182. package/dist/components/loader.d.ts +4 -0
  183. package/dist/components/loader.js +66 -0
  184. package/dist/components/loader.js.map +1 -0
  185. package/dist/components/loading-screen.d.ts +5 -0
  186. package/dist/components/loading-screen.js +24 -0
  187. package/dist/components/loading-screen.js.map +1 -0
  188. package/dist/components/menu-bar.d.ts +8 -0
  189. package/dist/components/menu-bar.js +42 -0
  190. package/dist/components/menu-bar.js.map +1 -0
  191. package/dist/components/meter.d.ts +8 -0
  192. package/dist/components/meter.js +26 -0
  193. package/dist/components/meter.js.map +1 -0
  194. package/dist/components/navigation-menu.d.ts +6 -0
  195. package/dist/components/navigation-menu.js +16 -0
  196. package/dist/components/navigation-menu.js.map +1 -0
  197. package/dist/components/overlay.d.ts +16 -0
  198. package/dist/components/overlay.js +14 -0
  199. package/dist/components/overlay.js.map +1 -0
  200. package/dist/components/page-header.d.ts +19 -0
  201. package/dist/components/page-header.js +43 -0
  202. package/dist/components/page-header.js.map +1 -0
  203. package/dist/components/pagination.d.ts +35 -0
  204. package/dist/components/pagination.js +68 -0
  205. package/dist/components/pagination.js.map +1 -0
  206. package/dist/components/popover.d.ts +38 -0
  207. package/dist/components/popover.js +65 -0
  208. package/dist/components/popover.js.map +1 -0
  209. package/dist/components/radio.d.ts +108 -0
  210. package/dist/components/radio.js +80 -0
  211. package/dist/components/radio.js.map +1 -0
  212. package/dist/components/scroll-area.d.ts +15 -0
  213. package/dist/components/scroll-area.js +49 -0
  214. package/dist/components/scroll-area.js.map +1 -0
  215. package/dist/components/segment-control.d.ts +35 -0
  216. package/dist/components/segment-control.js +46 -0
  217. package/dist/components/segment-control.js.map +1 -0
  218. package/dist/components/select.d.ts +99 -0
  219. package/dist/components/select.js +51 -0
  220. package/dist/components/select.js.map +1 -0
  221. package/dist/components/sensitive-input.d.ts +23 -0
  222. package/dist/components/sensitive-input.js +43 -0
  223. package/dist/components/sensitive-input.js.map +1 -0
  224. package/dist/components/separator.d.ts +26 -0
  225. package/dist/components/separator.js +18 -0
  226. package/dist/components/separator.js.map +1 -0
  227. package/dist/components/sheet.d.ts +26 -0
  228. package/dist/components/sheet.js +49 -0
  229. package/dist/components/sheet.js.map +1 -0
  230. package/dist/components/sidebar.d.ts +101 -0
  231. package/dist/components/sidebar.js +260 -0
  232. package/dist/components/sidebar.js.map +1 -0
  233. package/dist/components/skeleton-line.d.ts +6 -0
  234. package/dist/components/skeleton-line.js +22 -0
  235. package/dist/components/skeleton-line.js.map +1 -0
  236. package/dist/components/slider.d.ts +3 -0
  237. package/dist/components/slider.js +21 -0
  238. package/dist/components/slider.js.map +1 -0
  239. package/dist/components/stat-strip.d.ts +19 -0
  240. package/dist/components/stat-strip.js +27 -0
  241. package/dist/components/stat-strip.js.map +1 -0
  242. package/dist/components/switch.d.ts +85 -0
  243. package/dist/components/switch.js +94 -0
  244. package/dist/components/switch.js.map +1 -0
  245. package/dist/components/table-of-contents.d.ts +33 -0
  246. package/dist/components/table-of-contents.js +37 -0
  247. package/dist/components/table-of-contents.js.map +1 -0
  248. package/dist/components/table-pager.d.ts +26 -0
  249. package/dist/components/table-pager.js +35 -0
  250. package/dist/components/table-pager.js.map +1 -0
  251. package/dist/components/table.d.ts +45 -0
  252. package/dist/components/table.js +32 -0
  253. package/dist/components/table.js.map +1 -0
  254. package/dist/components/tabs.d.ts +65 -0
  255. package/dist/components/tabs.js +56 -0
  256. package/dist/components/tabs.js.map +1 -0
  257. package/dist/components/text.d.ts +32 -0
  258. package/dist/components/text.js +46 -0
  259. package/dist/components/text.js.map +1 -0
  260. package/dist/components/theme-toggle.d.ts +7 -0
  261. package/dist/components/theme-toggle.js +28 -0
  262. package/dist/components/theme-toggle.js.map +1 -0
  263. package/dist/components/toast.d.ts +27 -0
  264. package/dist/components/toast.js +78 -0
  265. package/dist/components/toast.js.map +1 -0
  266. package/dist/components/toggle-group.d.ts +4 -0
  267. package/dist/components/toggle-group.js +48 -0
  268. package/dist/components/toggle-group.js.map +1 -0
  269. package/dist/components/toggle.d.ts +7 -0
  270. package/dist/components/toggle.js +37 -0
  271. package/dist/components/toggle.js.map +1 -0
  272. package/dist/components/toolbar.d.ts +58 -0
  273. package/dist/components/toolbar.js +76 -0
  274. package/dist/components/toolbar.js.map +1 -0
  275. package/dist/components/tooltip.d.ts +13 -0
  276. package/dist/components/tooltip.js +18 -0
  277. package/dist/components/tooltip.js.map +1 -0
  278. package/dist/components/typeahead-field.d.ts +24 -0
  279. package/dist/components/typeahead-field.js +177 -0
  280. package/dist/components/typeahead-field.js.map +1 -0
  281. package/dist/index.d.ts +33 -0
  282. package/dist/index.js +35 -0
  283. package/dist/providers/link.d.ts +12 -0
  284. package/dist/providers/link.js +18 -0
  285. package/dist/providers/link.js.map +1 -0
  286. package/dist/providers/theme.d.ts +11 -0
  287. package/dist/providers/theme.js +43 -0
  288. package/dist/providers/theme.js.map +1 -0
  289. package/dist/styles/standalone.css +2233 -0
  290. package/dist/styles/tailwind.css +103 -0
  291. package/dist/styles/tokens.css +277 -0
  292. package/dist/utils/cn.d.ts +2 -0
  293. package/dist/utils/cn.js +11 -0
  294. package/dist/utils/cn.js.map +1 -0
  295. package/dist/utils/control-surface.d.ts +2 -0
  296. package/dist/utils/control-surface.js +11 -0
  297. package/dist/utils/control-surface.js.map +1 -0
  298. package/dist/utils/selection-indicator.d.ts +24 -0
  299. package/dist/utils/selection-indicator.js +108 -0
  300. package/dist/utils/selection-indicator.js.map +1 -0
  301. package/package.json +107 -0
@@ -0,0 +1,452 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { Button as t } from "./button.js";
4
+ import { Popover as n, PopoverContent as r, PopoverTrigger as i } from "./popover.js";
5
+ import { useEffect as a, useLayoutEffect as o, useMemo as s, useRef as c, useState as l } from "react";
6
+ import { ChevronLeft as u, ChevronRight as ee } from "lucide-react";
7
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
+ //#region src/components/date-picker.tsx
9
+ function p(e) {
10
+ return String(e).padStart(2, "0");
11
+ }
12
+ function m(e) {
13
+ return `${String(e.y).padStart(4, "0")}-${p(e.m)}-${p(e.d)}`;
14
+ }
15
+ function h(e) {
16
+ let t = new Date(Date.UTC(e.y, e.m - 1, e.d));
17
+ return t.setUTCFullYear(e.y), t;
18
+ }
19
+ function g(e) {
20
+ let t = new Date(e.y, e.m - 1, e.d);
21
+ return t.setFullYear(e.y), t;
22
+ }
23
+ function _(e) {
24
+ let t = /^(\d{4,})-(\d{2})-(\d{2})$/.exec(e);
25
+ if (!t) return null;
26
+ let n = Number(t[1]), r = Number(t[2]), i = Number(t[3]);
27
+ if (n < 1) return null;
28
+ let a = h({
29
+ y: n,
30
+ m: r,
31
+ d: i
32
+ });
33
+ return a.getUTCFullYear() !== n || a.getUTCMonth() + 1 !== r || a.getUTCDate() !== i ? null : {
34
+ y: n,
35
+ m: r,
36
+ d: i
37
+ };
38
+ }
39
+ var te = "appearance-none border-0 bg-transparent p-0 font-inherit text-inherit cursor-pointer";
40
+ function v(e) {
41
+ let t = new Intl.DateTimeFormat("en-CA", {
42
+ timeZone: e,
43
+ year: "numeric",
44
+ month: "2-digit",
45
+ day: "2-digit"
46
+ }).formatToParts(/* @__PURE__ */ new Date()), n = (e) => Number(t.find((t) => t.type === e)?.value);
47
+ return {
48
+ y: n("year"),
49
+ m: n("month"),
50
+ d: n("day")
51
+ };
52
+ }
53
+ function y(e, t, n) {
54
+ return new Intl.DateTimeFormat(t, {
55
+ ...n,
56
+ timeZone: "UTC",
57
+ calendar: "gregory"
58
+ }).format(h(e));
59
+ }
60
+ function ne({ mode: e, selectedDate: t, rangeFrom: n, rangeTo: r, locale: i, formatDate: a }) {
61
+ function o(e) {
62
+ let t = _(e);
63
+ return t ? a?.(g(t)) ?? y(t, i, { dateStyle: "medium" }) : e;
64
+ }
65
+ return e === "range" ? n ? r ? `${o(n)} – ${o(r)}` : `${o(n)} – …` : "Pick a date" : t ? a?.(g(t)) ?? y(t, i, { dateStyle: "medium" }) : "Pick a date";
66
+ }
67
+ function b(e, t) {
68
+ return e.y === t.y ? e.m === t.m ? e.d - t.d : e.m - t.m : e.y - t.y;
69
+ }
70
+ function re(e, t, n) {
71
+ let r = _(e), i = t ? _(t) : null, a = n ? _(n) : null;
72
+ return !(!r || i && b(r, i) < 0 || a && b(r, a) > 0);
73
+ }
74
+ function x(e, t, n, r) {
75
+ return re(e, t, n) && !r?.(e);
76
+ }
77
+ function ie(e, t, n) {
78
+ let r = t ? _(t) : null, i = n ? _(n) : null;
79
+ return r && b(e, r) < 0 ? r : i && b(e, i) > 0 ? i : e;
80
+ }
81
+ function S(e) {
82
+ if (!Number.isFinite(e.y) || e.m < 1 || e.m > 12 || e.d < 1 || e.d > 31) return !1;
83
+ let t = h(e);
84
+ return !Number.isNaN(t.getTime()) && t.getUTCFullYear() === e.y && t.getUTCMonth() + 1 === e.m && t.getUTCDate() === e.d;
85
+ }
86
+ function C(e) {
87
+ return e ? m(e) : "";
88
+ }
89
+ function w(e, t) {
90
+ let n = h(e);
91
+ if (Number.isNaN(n.getTime()) || (n.setUTCDate(n.getUTCDate() + t), Number.isNaN(n.getTime()))) return null;
92
+ let r = {
93
+ y: n.getUTCFullYear(),
94
+ m: n.getUTCMonth() + 1,
95
+ d: n.getUTCDate()
96
+ };
97
+ return S(r) ? r : null;
98
+ }
99
+ function ae(e, t) {
100
+ let n = e.y * 12 + (e.m - 1) + t, r = {
101
+ y: Math.floor(n / 12),
102
+ m: n % 12 + 1,
103
+ d: 1
104
+ };
105
+ return S(r) ? r : null;
106
+ }
107
+ function T({ value: p, defaultValue: g = "", onChange: re, mode: T = "single", rangeValue: E, defaultRangeValue: oe, onRangeChange: se, isDisabledDate: D, presets: O, locale: k = "en-US", weekStartsOn: A = 0, timeZone: j, formatDate: ce, name: le, required: ue, min: M, max: N, disabled: P, className: de, id: fe, "aria-label": F, "aria-describedby": pe, "aria-invalid": me, ...he }) {
108
+ let { readOnly: I, autoFocus: ge, onFocus: _e, onBlur: ve, "aria-labelledby": ye, ...be } = he, [xe, Se] = l(g), [Ce, L] = l(oe ?? {
109
+ from: "",
110
+ to: void 0
111
+ }), [R, z] = l(!1), [we, Te] = l(0), B = c([]), V = c(null), H = c(!1), Ee = c(null), De = c(null), Oe = p ?? xe, U = E ?? Ce, W = _(T === "range" ? U.to || U.from || "" : Oe), G = W ? m(W) : "", K = T === "range" ? "" : G, ke = W ?? v(j), [q, J] = l({
112
+ y: ke.y,
113
+ m: ke.m,
114
+ d: 1
115
+ }), Ae = c(G);
116
+ if (R && Ae.current !== G) {
117
+ H.current = !0;
118
+ let e = W ?? v(j);
119
+ (q.y !== e.y || q.m !== e.m) && J({
120
+ y: e.y,
121
+ m: e.m,
122
+ d: 1
123
+ });
124
+ }
125
+ Ae.current = G, a(() => {
126
+ if (!R) return;
127
+ let e = ie((G ? _(G) : null) ?? v(j), M, N);
128
+ J({
129
+ y: e.y,
130
+ m: e.m,
131
+ d: 1
132
+ }), G || (H.current = !0);
133
+ }, [
134
+ R,
135
+ G,
136
+ j,
137
+ M,
138
+ N
139
+ ]), a(() => {
140
+ P && z(!1);
141
+ }, [P]), a(() => {
142
+ ge && De.current?.focus();
143
+ }, [ge]), a(() => {
144
+ let e = Ee.current?.form;
145
+ if (!e || (T === "range" ? E !== void 0 : p !== void 0)) return;
146
+ let t = (e) => {
147
+ queueMicrotask(() => {
148
+ e.defaultPrevented || (Se(g), L(oe ?? {
149
+ from: "",
150
+ to: void 0
151
+ }), z(!1));
152
+ });
153
+ };
154
+ return e.addEventListener("reset", t), () => e.removeEventListener("reset", t);
155
+ }, [
156
+ oe,
157
+ g,
158
+ T,
159
+ E,
160
+ p
161
+ ]);
162
+ let je = s(() => {
163
+ let e = new Intl.DateTimeFormat(k, {
164
+ weekday: "short",
165
+ timeZone: "UTC"
166
+ });
167
+ return Array.from({ length: 7 }, (t, n) => {
168
+ let r = new Date(Date.UTC(2024, 0, 7 + (n + A) % 7));
169
+ return e.format(r);
170
+ });
171
+ }, [k, A]), Y = s(() => {
172
+ let e = {
173
+ y: q.y,
174
+ m: q.m,
175
+ d: 1
176
+ };
177
+ if (!S(e)) return Array.from({ length: 42 }, () => null);
178
+ let t = (h(e).getUTCDay() - A + 7) % 7, n = w(e, -t);
179
+ return n ? Array.from({ length: 42 }, (e, t) => w(n, t)) : Array.from({ length: 42 }, (n, r) => w(e, r - t));
180
+ }, [q, A]);
181
+ o(() => {
182
+ if (!R) return;
183
+ let e = V.current, t = 0;
184
+ if (e) V.current = null, t = Y.findIndex((t) => C(t) === e), t < 0 && (t = 0);
185
+ else {
186
+ let e = document.activeElement, n = !H.current && e instanceof HTMLElement && B.current.some((t) => t === e) ? e.getAttribute("aria-label") : null, r = n ? Y.findIndex((e) => C(e) === n) : -1;
187
+ if (r >= 0) t = r;
188
+ else {
189
+ let e = G || K || m(v(j)), n = Y.findIndex((t) => C(t) === e);
190
+ if (n >= 0 && Y[n]?.m === q.m) t = n;
191
+ else {
192
+ let e = Y.findIndex((e) => e?.m === q.m);
193
+ t = e >= 0 ? e : 0;
194
+ }
195
+ }
196
+ }
197
+ let n = (e) => !!(e && e.y >= 1 && x(m(e), M, N, D));
198
+ if (!n(Y[t] ?? null)) {
199
+ let e = Y.findIndex((e) => e?.m === q.m && n(e)), r = Y.findIndex((e) => n(e));
200
+ t = e >= 0 ? e : r >= 0 ? r : t;
201
+ }
202
+ Te(t), H.current && (H.current = !1, B.current[t]?.focus());
203
+ }, [
204
+ R,
205
+ G,
206
+ K,
207
+ j,
208
+ Y,
209
+ q.m,
210
+ M,
211
+ N,
212
+ D
213
+ ]);
214
+ let X = ae(q, -1), Me = ae(q, 1), Z = T === "range" ? U.from : "", Q = T === "range" ? U.to : void 0, Ne = ne({
215
+ mode: T,
216
+ selectedDate: W,
217
+ rangeFrom: Z,
218
+ rangeTo: Q,
219
+ locale: k,
220
+ formatDate: ce
221
+ });
222
+ function $(e) {
223
+ return x(e, M, N, D);
224
+ }
225
+ function Pe(e) {
226
+ if (!(P || I || !$(e))) {
227
+ if (T === "range") {
228
+ let t = E ?? Ce, n = !t.from || t.to ? { from: e } : b(_(e) ?? {
229
+ y: 1,
230
+ m: 1,
231
+ d: 1
232
+ }, _(t.from) ?? {
233
+ y: 1,
234
+ m: 1,
235
+ d: 1
236
+ }) < 0 ? {
237
+ from: e,
238
+ to: t.from
239
+ } : {
240
+ from: t.from,
241
+ to: e
242
+ };
243
+ E === void 0 && L(n), se?.(n), n.to && z(!1);
244
+ return;
245
+ }
246
+ p === void 0 && Se(e), z(!1), re?.(e);
247
+ }
248
+ }
249
+ function Fe(e) {
250
+ if (!(P || I)) {
251
+ if (typeof e.value == "string") {
252
+ if (T === "range") {
253
+ if (!$(e.value)) return;
254
+ let t = {
255
+ from: e.value,
256
+ to: e.value
257
+ };
258
+ E === void 0 && L(t), se?.(t), z(!1);
259
+ return;
260
+ }
261
+ Pe(e.value);
262
+ return;
263
+ }
264
+ if (T === "range") {
265
+ if (!$(e.value.from) || !$(e.value.to)) return;
266
+ E === void 0 && L(e.value), se?.(e.value), z(!1);
267
+ }
268
+ }
269
+ }
270
+ return /* @__PURE__ */ f(n, {
271
+ open: R,
272
+ onOpenChange: (e) => {
273
+ if (!(e && P)) {
274
+ if (e) {
275
+ let e = (G ? _(G) : null) ?? v(j);
276
+ J({
277
+ y: e.y,
278
+ m: e.m,
279
+ d: 1
280
+ }), H.current = !0;
281
+ }
282
+ z(e);
283
+ }
284
+ },
285
+ children: [
286
+ /* @__PURE__ */ d("input", {
287
+ ref: Ee,
288
+ type: T === "range" ? "text" : "date",
289
+ name: le,
290
+ required: ue,
291
+ min: T === "range" ? void 0 : M,
292
+ max: T === "range" ? void 0 : N,
293
+ className: "sr-only mb-2 h-7",
294
+ style: {
295
+ position: "absolute",
296
+ width: 1,
297
+ height: 1,
298
+ overflow: "hidden",
299
+ clip: "rect(0, 0, 0, 0)"
300
+ },
301
+ value: T === "range" ? Z && Q ? `${Z}/${Q}` : "" : K,
302
+ onChange: () => void 0,
303
+ disabled: P,
304
+ "aria-hidden": "true",
305
+ tabIndex: -1,
306
+ ...be
307
+ }),
308
+ /* @__PURE__ */ d(i, {
309
+ asChild: !0,
310
+ children: /* @__PURE__ */ d(t, {
311
+ type: "button",
312
+ ref: De,
313
+ id: fe,
314
+ variant: "outline",
315
+ disabled: P,
316
+ onFocus: _e,
317
+ onBlur: ve,
318
+ "aria-labelledby": ye,
319
+ "aria-label": F ? Ne === "Pick a date" ? F : `${F}: ${Ne}` : void 0,
320
+ "aria-describedby": pe,
321
+ "aria-invalid": me,
322
+ className: e("justify-start font-normal", de),
323
+ children: Ne
324
+ })
325
+ }),
326
+ /* @__PURE__ */ f(r, {
327
+ arrow: !1,
328
+ className: "w-64 p-3",
329
+ "aria-label": F ? `${F} calendar` : "Date calendar",
330
+ onOpenAutoFocus: (e) => {
331
+ e.preventDefault();
332
+ let t = G || K || m(v(j)), n = Y.findIndex((e) => C(e) === t), r = (e) => !!(e && e.y >= 1 && x(m(e), M, N, D)), i = n >= 0 && Y[n]?.m === q.m ? n : Math.max(0, Y.findIndex((e) => e?.m === q.m));
333
+ if (!r(Y[i] ?? null)) {
334
+ let e = Y.findIndex((e) => e?.m === q.m && r(e)), t = Y.findIndex((e) => r(e));
335
+ i = e >= 0 ? e : t >= 0 ? t : i;
336
+ }
337
+ queueMicrotask(() => {
338
+ B.current[i]?.focus();
339
+ });
340
+ },
341
+ children: [
342
+ O && O.length > 0 ? /* @__PURE__ */ d("div", {
343
+ className: "mb-2 flex flex-wrap gap-1",
344
+ children: O.map((e) => /* @__PURE__ */ d(t, {
345
+ type: "button",
346
+ variant: "ghost",
347
+ className: "h-7 px-2 text-xs",
348
+ disabled: P || I,
349
+ onClick: () => Fe(e),
350
+ children: e.label
351
+ }, e.label))
352
+ }) : null,
353
+ /* @__PURE__ */ f("div", {
354
+ className: "mb-2 flex items-center justify-between gap-2",
355
+ children: [
356
+ /* @__PURE__ */ d(t, {
357
+ type: "button",
358
+ variant: "ghost",
359
+ size: "icon",
360
+ icon: /* @__PURE__ */ d(u, {}),
361
+ "aria-label": "Prev",
362
+ className: "size-8",
363
+ disabled: P || !X || X.y < 1,
364
+ onClick: () => {
365
+ !X || X.y < 1 || (H.current = !1, J(X));
366
+ }
367
+ }),
368
+ /* @__PURE__ */ d("span", {
369
+ className: "text-sm font-medium",
370
+ children: y(q, k, {
371
+ month: "long",
372
+ year: "numeric"
373
+ })
374
+ }),
375
+ /* @__PURE__ */ d(t, {
376
+ type: "button",
377
+ variant: "ghost",
378
+ size: "icon",
379
+ icon: /* @__PURE__ */ d(ee, {}),
380
+ "aria-label": "Next",
381
+ className: "size-8",
382
+ disabled: P || !Me,
383
+ onClick: () => {
384
+ Me && (H.current = !1, J(Me));
385
+ }
386
+ })
387
+ ]
388
+ }),
389
+ /* @__PURE__ */ f("div", {
390
+ className: "grid grid-cols-7 gap-1 text-center",
391
+ onKeyDown: (e) => {
392
+ let t = Y[we];
393
+ if (t) {
394
+ if (e.key === "ArrowRight" || e.key === "ArrowLeft" || e.key === "ArrowDown" || e.key === "ArrowUp") {
395
+ e.preventDefault();
396
+ let n = e.key === "ArrowRight" ? 1 : e.key === "ArrowLeft" ? -1 : e.key === "ArrowDown" ? 7 : -7, r = w(t, n);
397
+ for (let e = 0; r && r.y >= 1 && !$(m(r)) && e < 42; e += 1) r = w(r, n);
398
+ if (!r || r.y < 1 || !$(m(r))) return;
399
+ if (r.y !== q.y || r.m !== q.m) {
400
+ V.current = m(r), H.current = !0, J({
401
+ y: r.y,
402
+ m: r.m,
403
+ d: 1
404
+ });
405
+ return;
406
+ }
407
+ let i = Y.findIndex((e) => C(e) === m(r));
408
+ i >= 0 && (Te(i), B.current[i]?.focus());
409
+ return;
410
+ }
411
+ if (e.key === "Enter" || e.key === " ") {
412
+ e.preventDefault();
413
+ let n = m(t);
414
+ t.y >= 1 && $(n) && Pe(n);
415
+ }
416
+ }
417
+ },
418
+ children: [je.map((e, t) => /* @__PURE__ */ d("span", {
419
+ className: "flex h-8 items-center justify-center text-xs font-medium text-basalt-muted-foreground",
420
+ children: e
421
+ }, `${e}-${t}`)), Y.map((t, n) => {
422
+ if (!t) return /* @__PURE__ */ d("span", {
423
+ className: "h-8",
424
+ ref: () => {
425
+ B.current[n] = null;
426
+ }
427
+ }, `empty-${n}`);
428
+ let r = m(t), i = t.m === q.m, a = t.y >= 1 && $(r), o = Z ? _(Z) : null, s = Q ? _(Q) : null, c = _(r), l = !!(o && s && c && b(c, o) >= 0 && b(c, s) <= 0), u = r === Z || r === Q;
429
+ return /* @__PURE__ */ d("button", {
430
+ type: "button",
431
+ ref: (e) => {
432
+ B.current[n] = e;
433
+ },
434
+ tabIndex: n === we ? 0 : -1,
435
+ "aria-label": r,
436
+ "aria-pressed": T === "range" ? r === Z || r === Q : !!K && r === K,
437
+ disabled: P || I || !a,
438
+ className: e(te, "flex h-8 w-8 items-center justify-center rounded-basalt-md text-sm", i ? "text-basalt-foreground" : "text-basalt-muted-foreground", a && "hover:bg-basalt-accent", l && !u && "bg-basalt-accent", a && (T === "range" ? u : r === K) && "bg-basalt-primary text-basalt-primary-foreground hover:bg-basalt-primary/90"),
439
+ onClick: () => a && Pe(r),
440
+ children: t.d
441
+ }, r);
442
+ })]
443
+ })
444
+ ]
445
+ })
446
+ ]
447
+ });
448
+ }
449
+ //#endregion
450
+ export { T as DatePicker };
451
+
452
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","names":[],"sources":["../../src/components/date-picker.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { type ComponentProps, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\ntype Civil = { y: number; m: number; d: number };\n\nfunction pad(value: number) {\n\treturn String(value).padStart(2, \"0\");\n}\n\nfunction formatIso(date: Civil) {\n\treturn `${String(date.y).padStart(4, \"0\")}-${pad(date.m)}-${pad(date.d)}`;\n}\n\nfunction utcDate(date: Civil) {\n\tconst next = new Date(Date.UTC(date.y, date.m - 1, date.d));\n\tnext.setUTCFullYear(date.y);\n\treturn next;\n}\n\nfunction civilDate(date: Civil) {\n\tconst next = new Date(date.y, date.m - 1, date.d);\n\tnext.setFullYear(date.y);\n\treturn next;\n}\n\nfunction parseIso(value: string): Civil | null {\n\tconst match = /^(\\d{4,})-(\\d{2})-(\\d{2})$/.exec(value);\n\tif (!match) {\n\t\treturn null;\n\t}\n\tconst year = Number(match[1]);\n\tconst month = Number(match[2]);\n\tconst day = Number(match[3]);\n\tif (year < 1) {\n\t\treturn null;\n\t}\n\tconst utc = utcDate({ y: year, m: month, d: day });\n\tif (\n\t\tutc.getUTCFullYear() !== year ||\n\t\tutc.getUTCMonth() + 1 !== month ||\n\t\tutc.getUTCDate() !== day\n\t) {\n\t\treturn null;\n\t}\n\treturn { y: year, m: month, d: day };\n}\n\nconst CALENDAR_BUTTON =\n\t\"appearance-none border-0 bg-transparent p-0 font-inherit text-inherit cursor-pointer\";\n\nfunction todayCivil(timeZone?: string): Civil {\n\tconst parts = new Intl.DateTimeFormat(\"en-CA\", {\n\t\ttimeZone,\n\t\tyear: \"numeric\",\n\t\tmonth: \"2-digit\",\n\t\tday: \"2-digit\",\n\t}).formatToParts(new Date());\n\tconst read = (type: Intl.DateTimeFormatPartTypes) =>\n\t\tNumber(parts.find((part) => part.type === type)?.value);\n\treturn { y: read(\"year\"), m: read(\"month\"), d: read(\"day\") };\n}\n\nfunction formatCivil(date: Civil, locale: string, options: Intl.DateTimeFormatOptions) {\n\treturn new Intl.DateTimeFormat(locale, {\n\t\t...options,\n\t\ttimeZone: \"UTC\",\n\t\tcalendar: \"gregory\",\n\t}).format(utcDate(date));\n}\n\nfunction formatTriggerLabel({\n\tmode,\n\tselectedDate,\n\trangeFrom,\n\trangeTo,\n\tlocale,\n\tformatDate,\n}: {\n\tmode: \"single\" | \"range\";\n\tselectedDate: Civil | null;\n\trangeFrom: string;\n\trangeTo?: string;\n\tlocale: string;\n\tformatDate?: (date: Date) => string;\n}) {\n\tfunction one(iso: string) {\n\t\tconst date = parseIso(iso);\n\t\tif (!date) {\n\t\t\treturn iso;\n\t\t}\n\t\treturn formatDate?.(civilDate(date)) ?? formatCivil(date, locale, { dateStyle: \"medium\" });\n\t}\n\tif (mode === \"range\") {\n\t\tif (!rangeFrom) {\n\t\t\treturn \"Pick a date\";\n\t\t}\n\t\tif (!rangeTo) {\n\t\t\treturn `${one(rangeFrom)} – …`;\n\t\t}\n\t\treturn `${one(rangeFrom)} – ${one(rangeTo)}`;\n\t}\n\treturn selectedDate\n\t\t? (formatDate?.(civilDate(selectedDate)) ??\n\t\t\t\tformatCivil(selectedDate, locale, { dateStyle: \"medium\" }))\n\t\t: \"Pick a date\";\n}\n\nfunction compareCivil(left: Civil, right: Civil) {\n\tif (left.y !== right.y) {\n\t\treturn left.y - right.y;\n\t}\n\tif (left.m !== right.m) {\n\t\treturn left.m - right.m;\n\t}\n\treturn left.d - right.d;\n}\n\nfunction withinBounds(iso: string, min?: string, max?: string) {\n\tconst date = parseIso(iso);\n\tconst minDate = min ? parseIso(min) : null;\n\tconst maxDate = max ? parseIso(max) : null;\n\tif (!date) {\n\t\treturn false;\n\t}\n\tif (minDate && compareCivil(date, minDate) < 0) {\n\t\treturn false;\n\t}\n\tif (maxDate && compareCivil(date, maxDate) > 0) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction dateSelectable(\n\tiso: string,\n\tmin?: string,\n\tmax?: string,\n\tisDisabledDate?: (iso: string) => boolean,\n) {\n\treturn withinBounds(iso, min, max) && !isDisabledDate?.(iso);\n}\n\nexport type DatePickerRange = { from: string; to?: string };\n\nexport type DatePickerPreset = {\n\tlabel: string;\n\tvalue: string | { from: string; to: string };\n};\n\nexport type DatePickerProps = Omit<\n\tComponentProps<\"input\">,\n\t| \"value\"\n\t| \"defaultValue\"\n\t| \"onChange\"\n\t| \"type\"\n\t| \"children\"\n\t| \"disabled\"\n\t| \"name\"\n\t| \"required\"\n\t| \"min\"\n\t| \"max\"\n> & {\n\t/**\n\t * The controlled ISO date in single mode.\n\t */\n\tvalue?: string;\n\t/**\n\t * The uncontrolled initial ISO date in single mode.\n\t */\n\tdefaultValue?: string;\n\t/**\n\t * Called with the ISO date in single mode.\n\t */\n\tonChange?: (value: string) => void;\n\t/**\n\t * Selection mode.\n\t * @default single\n\t */\n\tmode?: \"single\" | \"range\";\n\t/**\n\t * The controlled range in range mode.\n\t */\n\trangeValue?: DatePickerRange;\n\t/**\n\t * The uncontrolled initial range in range mode.\n\t */\n\tdefaultRangeValue?: DatePickerRange;\n\t/**\n\t * Called when the range changes.\n\t */\n\tonRangeChange?: (value: DatePickerRange) => void;\n\t/**\n\t * Additional dates that cannot be selected.\n\t */\n\tisDisabledDate?: (iso: string) => boolean;\n\t/**\n\t * Shortcut values shown above the calendar.\n\t */\n\tpresets?: DatePickerPreset[];\n\t/**\n\t * Locale used to format the trigger and weekday labels.\n\t * @default en-US\n\t */\n\tlocale?: string;\n\t/**\n\t * First day of the week. 0 is Sunday.\n\t * @default 0\n\t */\n\tweekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\t/**\n\t * IANA time zone used to resolve today.\n\t */\n\ttimeZone?: string;\n\t/**\n\t * Custom formatter for the trigger label.\n\t */\n\tformatDate?: (date: Date) => string;\n\t/**\n\t * Native form field name.\n\t */\n\tname?: string;\n\t/**\n\t * Native required constraint.\n\t */\n\trequired?: boolean;\n\t/**\n\t * Inclusive lower ISO bound.\n\t */\n\tmin?: string;\n\t/**\n\t * Inclusive upper ISO bound.\n\t */\n\tmax?: string;\n\t/**\n\t * Disable the trigger and calendar.\n\t */\n\tdisabled?: boolean;\n};\n\nfunction clampCivil(date: Civil, min?: string, max?: string) {\n\tconst minDate = min ? parseIso(min) : null;\n\tconst maxDate = max ? parseIso(max) : null;\n\tif (minDate && compareCivil(date, minDate) < 0) {\n\t\treturn minDate;\n\t}\n\tif (maxDate && compareCivil(date, maxDate) > 0) {\n\t\treturn maxDate;\n\t}\n\treturn date;\n}\n\nfunction isValidCivil(date: Civil): boolean {\n\tif (!Number.isFinite(date.y) || date.m < 1 || date.m > 12 || date.d < 1 || date.d > 31) {\n\t\treturn false;\n\t}\n\tconst utc = utcDate(date);\n\treturn (\n\t\t!Number.isNaN(utc.getTime()) &&\n\t\tutc.getUTCFullYear() === date.y &&\n\t\tutc.getUTCMonth() + 1 === date.m &&\n\t\tutc.getUTCDate() === date.d\n\t);\n}\n\nfunction isoOf(date: Civil | null) {\n\treturn date ? formatIso(date) : \"\";\n}\n\nfunction addDays(date: Civil, days: number): Civil | null {\n\tconst next = utcDate(date);\n\tif (Number.isNaN(next.getTime())) {\n\t\treturn null;\n\t}\n\tnext.setUTCDate(next.getUTCDate() + days);\n\tif (Number.isNaN(next.getTime())) {\n\t\treturn null;\n\t}\n\tconst civil = { y: next.getUTCFullYear(), m: next.getUTCMonth() + 1, d: next.getUTCDate() };\n\treturn isValidCivil(civil) ? civil : null;\n}\n\nfunction shiftMonth(month: Civil, delta: number): Civil | null {\n\tconst total = month.y * 12 + (month.m - 1) + delta;\n\tconst next = { y: Math.floor(total / 12), m: (total % 12) + 1, d: 1 };\n\treturn isValidCivil(next) ? next : null;\n}\n\nexport function DatePicker({\n\tvalue,\n\tdefaultValue = \"\",\n\tonChange,\n\tmode = \"single\",\n\trangeValue,\n\tdefaultRangeValue,\n\tonRangeChange,\n\tisDisabledDate,\n\tpresets,\n\tlocale = \"en-US\",\n\tweekStartsOn = 0,\n\ttimeZone,\n\tformatDate,\n\tname,\n\trequired,\n\tmin,\n\tmax,\n\tdisabled,\n\tclassName,\n\tid,\n\t\"aria-label\": ariaLabel,\n\t\"aria-describedby\": ariaDescribedBy,\n\t\"aria-invalid\": ariaInvalid,\n\t...inputRest\n}: DatePickerProps) {\n\tconst {\n\t\treadOnly,\n\t\tautoFocus,\n\t\tonFocus,\n\t\tonBlur,\n\t\t\"aria-labelledby\": ariaLabelledBy,\n\t\t...formRest\n\t} = inputRest;\n\tconst [uncontrolled, setUncontrolled] = useState(defaultValue);\n\tconst [uncontrolledRange, setUncontrolledRange] = useState<DatePickerRange>(\n\t\tdefaultRangeValue ?? { from: \"\", to: undefined },\n\t);\n\tconst [open, setOpen] = useState(false);\n\tconst [focusIndex, setFocusIndex] = useState(0);\n\tconst dayRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\tconst pendingFocusIso = useRef<string | null>(null);\n\tconst focusDay = useRef(false);\n\tconst hiddenRef = useRef<HTMLInputElement>(null);\n\tconst triggerRef = useRef<HTMLButtonElement>(null);\n\tconst selected = value ?? uncontrolled;\n\tconst selectedRange = rangeValue ?? uncontrolledRange;\n\tconst selectedDate = parseIso(\n\t\tmode === \"range\" ? selectedRange.to || selectedRange.from || \"\" : selected,\n\t);\n\tconst cursorIso = selectedDate ? formatIso(selectedDate) : \"\";\n\tconst submitted = mode === \"range\" ? \"\" : cursorIso;\n\tconst cursor = selectedDate ?? todayCivil(timeZone);\n\tconst [month, setMonth] = useState<Civil>({ y: cursor.y, m: cursor.m, d: 1 });\n\tconst prevSelected = useRef(cursorIso);\n\tif (open && prevSelected.current !== cursorIso) {\n\t\tfocusDay.current = true;\n\t\tconst next = selectedDate ?? todayCivil(timeZone);\n\t\tif (month.y !== next.y || month.m !== next.m) {\n\t\t\tsetMonth({ y: next.y, m: next.m, d: 1 });\n\t\t}\n\t}\n\tprevSelected.current = cursorIso;\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst next = clampCivil(\n\t\t\t(cursorIso ? parseIso(cursorIso) : null) ?? todayCivil(timeZone),\n\t\t\tmin,\n\t\t\tmax,\n\t\t);\n\t\tsetMonth({ y: next.y, m: next.m, d: 1 });\n\t\tif (!cursorIso) {\n\t\t\tfocusDay.current = true;\n\t\t}\n\t}, [open, cursorIso, timeZone, min, max]);\n\n\tuseEffect(() => {\n\t\tif (disabled) {\n\t\t\tsetOpen(false);\n\t\t}\n\t}, [disabled]);\n\n\tuseEffect(() => {\n\t\tif (autoFocus) {\n\t\t\ttriggerRef.current?.focus();\n\t\t}\n\t}, [autoFocus]);\n\n\tuseEffect(() => {\n\t\tconst form = hiddenRef.current?.form;\n\t\tif (!form || (mode === \"range\" ? rangeValue !== undefined : value !== undefined)) {\n\t\t\treturn;\n\t\t}\n\t\tconst onReset = (event: Event) => {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetUncontrolled(defaultValue);\n\t\t\t\tsetUncontrolledRange(defaultRangeValue ?? { from: \"\", to: undefined });\n\t\t\t\tsetOpen(false);\n\t\t\t});\n\t\t};\n\t\tform.addEventListener(\"reset\", onReset);\n\t\treturn () => form.removeEventListener(\"reset\", onReset);\n\t}, [defaultRangeValue, defaultValue, mode, rangeValue, value]);\n\n\tconst weekdayLabels = useMemo(() => {\n\t\tconst formatter = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n\t\treturn Array.from({ length: 7 }, (_, index) => {\n\t\t\tconst day = new Date(Date.UTC(2024, 0, 7 + ((index + weekStartsOn) % 7)));\n\t\t\treturn formatter.format(day);\n\t\t});\n\t}, [locale, weekStartsOn]);\n\n\tconst days = useMemo(() => {\n\t\tconst first = { y: month.y, m: month.m, d: 1 };\n\t\tif (!isValidCivil(first)) {\n\t\t\treturn Array.from({ length: 42 }, () => null);\n\t\t}\n\t\tconst startOffset = (utcDate(first).getUTCDay() - weekStartsOn + 7) % 7;\n\t\tconst start = addDays(first, -startOffset);\n\t\tif (!start) {\n\t\t\treturn Array.from({ length: 42 }, (_, index) => addDays(first, index - startOffset));\n\t\t}\n\t\treturn Array.from({ length: 42 }, (_, index) => addDays(start, index));\n\t}, [month, weekStartsOn]);\n\n\tuseLayoutEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst pending = pendingFocusIso.current;\n\t\tlet index = 0;\n\t\tif (pending) {\n\t\t\tpendingFocusIso.current = null;\n\t\t\tindex = days.findIndex((date) => isoOf(date) === pending);\n\t\t\tif (index < 0) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t} else {\n\t\t\tconst focused = document.activeElement;\n\t\t\tconst focusedIso =\n\t\t\t\t!focusDay.current &&\n\t\t\t\tfocused instanceof HTMLElement &&\n\t\t\t\tdayRefs.current.some((node) => node === focused)\n\t\t\t\t\t? focused.getAttribute(\"aria-label\")\n\t\t\t\t\t: null;\n\t\t\tconst focusedIndex = focusedIso ? days.findIndex((date) => isoOf(date) === focusedIso) : -1;\n\t\t\tif (focusedIndex >= 0) {\n\t\t\t\tindex = focusedIndex;\n\t\t\t} else {\n\t\t\t\tconst iso = cursorIso || submitted || formatIso(todayCivil(timeZone));\n\t\t\t\tconst selectedIndex = days.findIndex((date) => isoOf(date) === iso);\n\t\t\t\tif (selectedIndex >= 0 && days[selectedIndex]?.m === month.m) {\n\t\t\t\t\tindex = selectedIndex;\n\t\t\t\t} else {\n\t\t\t\t\tconst firstInMonth = days.findIndex((date) => date?.m === month.m);\n\t\t\t\t\tindex = firstInMonth >= 0 ? firstInMonth : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst enabled = (date: Civil | null) =>\n\t\t\tBoolean(date && date.y >= 1 && dateSelectable(formatIso(date), min, max, isDisabledDate));\n\t\tif (!enabled(days[index] ?? null)) {\n\t\t\tconst inMonth = days.findIndex((date) => date?.m === month.m && enabled(date));\n\t\t\tconst any = days.findIndex((date) => enabled(date));\n\t\t\tindex = inMonth >= 0 ? inMonth : any >= 0 ? any : index;\n\t\t}\n\t\tsetFocusIndex(index);\n\t\tif (focusDay.current) {\n\t\t\tfocusDay.current = false;\n\t\t\tdayRefs.current[index]?.focus();\n\t\t}\n\t}, [open, cursorIso, submitted, timeZone, days, month.m, min, max, isDisabledDate]);\n\n\tconst previousMonth = shiftMonth(month, -1);\n\tconst followingMonth = shiftMonth(month, 1);\n\tconst rangeFrom = mode === \"range\" ? selectedRange.from : \"\";\n\tconst rangeTo = mode === \"range\" ? selectedRange.to : undefined;\n\tconst label = formatTriggerLabel({\n\t\tmode,\n\t\tselectedDate,\n\t\trangeFrom,\n\t\trangeTo,\n\t\tlocale,\n\t\tformatDate,\n\t});\n\n\tfunction selectable(iso: string) {\n\t\treturn dateSelectable(iso, min, max, isDisabledDate);\n\t}\n\n\tfunction commit(next: string) {\n\t\tif (disabled || readOnly || !selectable(next)) {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"range\") {\n\t\t\tconst current = rangeValue ?? uncontrolledRange;\n\t\t\tconst nextRange =\n\t\t\t\t!current.from || current.to\n\t\t\t\t\t? { from: next }\n\t\t\t\t\t: compareCivil(\n\t\t\t\t\t\t\t\tparseIso(next) ?? { y: 1, m: 1, d: 1 },\n\t\t\t\t\t\t\t\tparseIso(current.from) ?? { y: 1, m: 1, d: 1 },\n\t\t\t\t\t\t\t) < 0\n\t\t\t\t\t\t? { from: next, to: current.from }\n\t\t\t\t\t\t: { from: current.from, to: next };\n\t\t\tif (rangeValue === undefined) {\n\t\t\t\tsetUncontrolledRange(nextRange);\n\t\t\t}\n\t\t\tonRangeChange?.(nextRange);\n\t\t\tif (nextRange.to) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (value === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t}\n\t\tsetOpen(false);\n\t\tonChange?.(next);\n\t}\n\n\tfunction applyPreset(preset: DatePickerPreset) {\n\t\tif (disabled || readOnly) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof preset.value === \"string\") {\n\t\t\tif (mode === \"range\") {\n\t\t\t\tif (!selectable(preset.value)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst nextRange = { from: preset.value, to: preset.value };\n\t\t\t\tif (rangeValue === undefined) {\n\t\t\t\t\tsetUncontrolledRange(nextRange);\n\t\t\t\t}\n\t\t\t\tonRangeChange?.(nextRange);\n\t\t\t\tsetOpen(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(preset.value);\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"range\") {\n\t\t\tif (!selectable(preset.value.from) || !selectable(preset.value.to)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rangeValue === undefined) {\n\t\t\t\tsetUncontrolledRange(preset.value);\n\t\t\t}\n\t\t\tonRangeChange?.(preset.value);\n\t\t\tsetOpen(false);\n\t\t}\n\t}\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tonOpenChange={(next) => {\n\t\t\t\tif (next && disabled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (next) {\n\t\t\t\t\tconst synced = (cursorIso ? parseIso(cursorIso) : null) ?? todayCivil(timeZone);\n\t\t\t\t\tsetMonth({ y: synced.y, m: synced.m, d: 1 });\n\t\t\t\t\tfocusDay.current = true;\n\t\t\t\t}\n\t\t\t\tsetOpen(next);\n\t\t\t}}\n\t\t>\n\t\t\t<input\n\t\t\t\tref={hiddenRef}\n\t\t\t\ttype={mode === \"range\" ? \"text\" : \"date\"}\n\t\t\t\tname={name}\n\t\t\t\trequired={required}\n\t\t\t\tmin={mode === \"range\" ? undefined : min}\n\t\t\t\tmax={mode === \"range\" ? undefined : max}\n\t\t\t\tclassName=\"sr-only mb-2 h-7\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tclip: \"rect(0, 0, 0, 0)\",\n\t\t\t\t}}\n\t\t\t\tvalue={\n\t\t\t\t\tmode === \"range\" ? (rangeFrom && rangeTo ? `${rangeFrom}/${rangeTo}` : \"\") : submitted\n\t\t\t\t}\n\t\t\t\tonChange={() => undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\ttabIndex={-1}\n\t\t\t\t{...formRest}\n\t\t\t/>\n\t\t\t<PopoverTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\tid={id}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonFocus={onFocus as ComponentProps<\"button\">[\"onFocus\"]}\n\t\t\t\t\tonBlur={onBlur as ComponentProps<\"button\">[\"onBlur\"]}\n\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabel ? (label === \"Pick a date\" ? ariaLabel : `${ariaLabel}: ${label}`) : undefined\n\t\t\t\t\t}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\tclassName={cn(\"justify-start font-normal\", className)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</Button>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tarrow={false}\n\t\t\t\tclassName=\"w-64 p-3\"\n\t\t\t\taria-label={ariaLabel ? `${ariaLabel} calendar` : \"Date calendar\"}\n\t\t\t\tonOpenAutoFocus={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst iso = cursorIso || submitted || formatIso(todayCivil(timeZone));\n\t\t\t\t\tconst selectedIndex = days.findIndex((date) => isoOf(date) === iso);\n\t\t\t\t\tconst enabled = (date: Civil | null) =>\n\t\t\t\t\t\tBoolean(\n\t\t\t\t\t\t\tdate && date.y >= 1 && dateSelectable(formatIso(date), min, max, isDisabledDate),\n\t\t\t\t\t\t);\n\t\t\t\t\tlet index =\n\t\t\t\t\t\tselectedIndex >= 0 && days[selectedIndex]?.m === month.m\n\t\t\t\t\t\t\t? selectedIndex\n\t\t\t\t\t\t\t: Math.max(\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\tdays.findIndex((date) => date?.m === month.m),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\tif (!enabled(days[index] ?? null)) {\n\t\t\t\t\t\tconst inMonth = days.findIndex((date) => date?.m === month.m && enabled(date));\n\t\t\t\t\t\tconst any = days.findIndex((date) => enabled(date));\n\t\t\t\t\t\tindex = inMonth >= 0 ? inMonth : any >= 0 ? any : index;\n\t\t\t\t\t}\n\t\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t\tdayRefs.current[index]?.focus();\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{presets && presets.length > 0 ? (\n\t\t\t\t\t<div className=\"mb-2 flex flex-wrap gap-1\">\n\t\t\t\t\t\t{presets.map((preset) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={preset.label}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tclassName=\"h-7 px-2 text-xs\"\n\t\t\t\t\t\t\t\tdisabled={disabled || readOnly}\n\t\t\t\t\t\t\t\tonClick={() => applyPreset(preset)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{preset.label}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t<div className=\"mb-2 flex items-center justify-between gap-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ticon={<ChevronLeft />}\n\t\t\t\t\t\taria-label=\"Prev\"\n\t\t\t\t\t\tclassName=\"size-8\"\n\t\t\t\t\t\tdisabled={disabled || !previousMonth || previousMonth.y < 1}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (!previousMonth || previousMonth.y < 1) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfocusDay.current = false;\n\t\t\t\t\t\t\tsetMonth(previousMonth);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t{formatCivil(month, locale, { month: \"long\", year: \"numeric\" })}\n\t\t\t\t\t</span>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ticon={<ChevronRight />}\n\t\t\t\t\t\taria-label=\"Next\"\n\t\t\t\t\t\tclassName=\"size-8\"\n\t\t\t\t\t\tdisabled={disabled || !followingMonth}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (!followingMonth) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfocusDay.current = false;\n\t\t\t\t\t\t\tsetMonth(followingMonth);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"grid grid-cols-7 gap-1 text-center\"\n\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\tconst current = days[focusIndex];\n\t\t\t\t\t\tif (!current) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tevent.key === \"ArrowRight\" ||\n\t\t\t\t\t\t\tevent.key === \"ArrowLeft\" ||\n\t\t\t\t\t\t\tevent.key === \"ArrowDown\" ||\n\t\t\t\t\t\t\tevent.key === \"ArrowUp\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tconst delta =\n\t\t\t\t\t\t\t\tevent.key === \"ArrowRight\"\n\t\t\t\t\t\t\t\t\t? 1\n\t\t\t\t\t\t\t\t\t: event.key === \"ArrowLeft\"\n\t\t\t\t\t\t\t\t\t\t? -1\n\t\t\t\t\t\t\t\t\t\t: event.key === \"ArrowDown\"\n\t\t\t\t\t\t\t\t\t\t\t? 7\n\t\t\t\t\t\t\t\t\t\t\t: -7;\n\t\t\t\t\t\t\tlet next = addDays(current, delta);\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tlet step = 0;\n\t\t\t\t\t\t\t\tnext && next.y >= 1 && !selectable(formatIso(next)) && step < 42;\n\t\t\t\t\t\t\t\tstep += 1\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnext = addDays(next, delta);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!next || next.y < 1 || !selectable(formatIso(next))) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (next.y !== month.y || next.m !== month.m) {\n\t\t\t\t\t\t\t\tpendingFocusIso.current = formatIso(next);\n\t\t\t\t\t\t\t\tfocusDay.current = true;\n\t\t\t\t\t\t\t\tsetMonth({ y: next.y, m: next.m, d: 1 });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst index = days.findIndex((date) => isoOf(date) === formatIso(next));\n\t\t\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\t\t\tsetFocusIndex(index);\n\t\t\t\t\t\t\t\tdayRefs.current[index]?.focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"Enter\" || event.key === \" \") {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tconst iso = formatIso(current);\n\t\t\t\t\t\t\tif (current.y >= 1 && selectable(iso)) {\n\t\t\t\t\t\t\t\tcommit(iso);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{weekdayLabels.map((day, index) => (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={`${day}-${index}`}\n\t\t\t\t\t\t\tclassName=\"flex h-8 items-center justify-center text-xs font-medium text-basalt-muted-foreground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t\t{days.map((date, index) => {\n\t\t\t\t\t\tif (!date) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tkey={`empty-${index}`}\n\t\t\t\t\t\t\t\t\tclassName=\"h-8\"\n\t\t\t\t\t\t\t\t\tref={() => {\n\t\t\t\t\t\t\t\t\t\tdayRefs.current[index] = null;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst iso = formatIso(date);\n\t\t\t\t\t\tconst inMonth = date.m === month.m;\n\t\t\t\t\t\tconst inRange = date.y >= 1 && selectable(iso);\n\t\t\t\t\t\tconst fromDate = rangeFrom ? parseIso(rangeFrom) : null;\n\t\t\t\t\t\tconst toDate = rangeTo ? parseIso(rangeTo) : null;\n\t\t\t\t\t\tconst thisDate = parseIso(iso);\n\t\t\t\t\t\tconst inSelectedRange = Boolean(\n\t\t\t\t\t\t\tfromDate &&\n\t\t\t\t\t\t\t\ttoDate &&\n\t\t\t\t\t\t\t\tthisDate &&\n\t\t\t\t\t\t\t\tcompareCivil(thisDate, fromDate) >= 0 &&\n\t\t\t\t\t\t\t\tcompareCivil(thisDate, toDate) <= 0,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst isRangeEdge = iso === rangeFrom || iso === rangeTo;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tkey={iso}\n\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\tdayRefs.current[index] = node;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttabIndex={index === focusIndex ? 0 : -1}\n\t\t\t\t\t\t\t\taria-label={iso}\n\t\t\t\t\t\t\t\taria-pressed={\n\t\t\t\t\t\t\t\t\tmode === \"range\"\n\t\t\t\t\t\t\t\t\t\t? iso === rangeFrom || iso === rangeTo\n\t\t\t\t\t\t\t\t\t\t: Boolean(submitted) && iso === submitted\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdisabled={disabled || readOnly || !inRange}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tCALENDAR_BUTTON,\n\t\t\t\t\t\t\t\t\t\"flex h-8 w-8 items-center justify-center rounded-basalt-md text-sm\",\n\t\t\t\t\t\t\t\t\tinMonth ? \"text-basalt-foreground\" : \"text-basalt-muted-foreground\",\n\t\t\t\t\t\t\t\t\tinRange && \"hover:bg-basalt-accent\",\n\t\t\t\t\t\t\t\t\tinSelectedRange && !isRangeEdge && \"bg-basalt-accent\",\n\t\t\t\t\t\t\t\t\tinRange &&\n\t\t\t\t\t\t\t\t\t\t(mode === \"range\" ? isRangeEdge : iso === submitted) &&\n\t\t\t\t\t\t\t\t\t\t\"bg-basalt-primary text-basalt-primary-foreground hover:bg-basalt-primary/90\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={() => inRange && commit(iso)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{date.d}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
2
+ import * as React from "react";
3
+ export declare const DIALOG_SIZES: {
4
+ readonly sm: "sm:w-72";
5
+ readonly base: "sm:w-96";
6
+ readonly lg: "sm:w-[32rem]";
7
+ readonly xl: "sm:w-[48rem]";
8
+ };
9
+ export type DialogSize = keyof typeof DIALOG_SIZES;
10
+ export declare function dialogOverlayClass(className?: string): string;
11
+ export declare function dialogPanelClass({ size, className, }?: {
12
+ size?: DialogSize;
13
+ className?: string;
14
+ }): string;
15
+ export declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
16
+ export declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
17
+ export declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
18
+ export declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
19
+ export declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
20
+ export type DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {
21
+ size?: DialogSize;
22
+ disablePointerDismissal?: boolean;
23
+ };
24
+ export declare const DialogContent: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
25
+ size?: DialogSize;
26
+ disablePointerDismissal?: boolean;
27
+ } & React.RefAttributes<HTMLDivElement>>;
28
+ export declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
29
+ export declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
30
+ export declare function DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
31
+ export declare namespace DialogHeader {
32
+ var displayName: string;
33
+ }
34
+ export declare function DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
35
+ export declare namespace DialogFooter {
36
+ var displayName: string;
37
+ }
@@ -0,0 +1,67 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { OVERLAY_LAYER as t, OVERLAY_MOTION as n } from "./overlay.js";
4
+ import * as r from "react";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import * as o from "@radix-ui/react-dialog";
7
+ //#region src/components/dialog.tsx
8
+ var s = {
9
+ sm: "sm:w-72",
10
+ base: "sm:w-96",
11
+ lg: "sm:w-[32rem]",
12
+ xl: "sm:w-[48rem]"
13
+ };
14
+ function c(r) {
15
+ return e("fixed inset-0 bg-black/40 backdrop-blur-md", t, "data-[state=open]:animate-basalt-overlay-in data-[state=closed]:animate-basalt-overlay-out", n, r);
16
+ }
17
+ function l({ size: r = "base", className: i } = {}) {
18
+ return e("fixed top-1/2 left-1/2 w-full max-h-[calc(100vh-2rem)] max-w-[calc(100vw-2rem)] origin-center -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-basalt-lg bg-basalt-background p-8 text-basalt-foreground shadow-lg ring-1 ring-basalt-border", t, "data-[state=open]:animate-basalt-dialog-in data-[state=closed]:animate-basalt-dialog-out", n, s[r], i);
19
+ }
20
+ var u = o.Root, d = o.Trigger, f = o.Close, p = o.Portal, m = r.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ i(o.Overlay, {
21
+ ref: n,
22
+ className: c(e),
23
+ ...t
24
+ }));
25
+ m.displayName = o.Overlay.displayName;
26
+ var h = r.forwardRef(({ className: e, children: t, size: n = "base", disablePointerDismissal: r = !1, onPointerDownOutside: s, onInteractOutside: c, ...u }, d) => /* @__PURE__ */ a(p, { children: [/* @__PURE__ */ i(m, {}), /* @__PURE__ */ i(o.Content, {
27
+ ref: d,
28
+ className: l({
29
+ size: n,
30
+ className: e
31
+ }),
32
+ onPointerDownOutside: (e) => {
33
+ r && e.preventDefault(), s?.(e);
34
+ },
35
+ onInteractOutside: (e) => {
36
+ r && e.preventDefault(), c?.(e);
37
+ },
38
+ ...u,
39
+ children: t
40
+ })] }));
41
+ h.displayName = o.Content.displayName;
42
+ var g = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i(o.Title, {
43
+ ref: r,
44
+ className: e("text-2xl font-semibold tracking-tight", t),
45
+ ...n
46
+ }));
47
+ g.displayName = o.Title.displayName;
48
+ var _ = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i(o.Description, {
49
+ ref: r,
50
+ className: e("text-base text-basalt-muted-foreground", t),
51
+ ...n
52
+ }));
53
+ _.displayName = o.Description.displayName;
54
+ var v = ({ className: t, ...n }) => /* @__PURE__ */ i("div", {
55
+ className: e("flex flex-col space-y-1.5 text-left", t),
56
+ ...n
57
+ });
58
+ v.displayName = "DialogHeader";
59
+ var y = ({ className: t, ...n }) => /* @__PURE__ */ i("div", {
60
+ className: e("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", t),
61
+ ...n
62
+ });
63
+ y.displayName = "DialogFooter";
64
+ //#endregion
65
+ export { s as DIALOG_SIZES, u as Dialog, f as DialogClose, h as DialogContent, _ as DialogDescription, y as DialogFooter, v as DialogHeader, m as DialogOverlay, p as DialogPortal, g as DialogTitle, d as DialogTrigger, c as dialogOverlayClass, l as dialogPanelClass };
66
+
67
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.js","names":[],"sources":["../../src/components/dialog.tsx"],"sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\n\nexport const DIALOG_SIZES = {\n\tsm: \"sm:w-72\",\n\tbase: \"sm:w-96\",\n\tlg: \"sm:w-[32rem]\",\n\txl: \"sm:w-[48rem]\",\n} as const;\n\nexport type DialogSize = keyof typeof DIALOG_SIZES;\n\nexport function dialogOverlayClass(className?: string) {\n\treturn cn(\n\t\t\"fixed inset-0 bg-black/40 backdrop-blur-md\",\n\t\tOVERLAY_LAYER,\n\t\t\"data-[state=open]:animate-basalt-overlay-in data-[state=closed]:animate-basalt-overlay-out\",\n\t\tOVERLAY_MOTION,\n\t\tclassName,\n\t);\n}\n\nexport function dialogPanelClass({\n\tsize = \"base\",\n\tclassName,\n}: {\n\tsize?: DialogSize;\n\tclassName?: string;\n} = {}) {\n\treturn cn(\n\t\t\"fixed top-1/2 left-1/2 w-full max-h-[calc(100vh-2rem)] max-w-[calc(100vw-2rem)] origin-center -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-basalt-lg bg-basalt-background p-8 text-basalt-foreground shadow-lg ring-1 ring-basalt-border\",\n\t\tOVERLAY_LAYER,\n\t\t\"data-[state=open]:animate-basalt-dialog-in data-[state=closed]:animate-basalt-dialog-out\",\n\t\tOVERLAY_MOTION,\n\t\tDIALOG_SIZES[size],\n\t\tclassName,\n\t);\n}\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\nexport const DialogPortal = DialogPrimitive.Portal;\n\nexport const DialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Overlay ref={ref} className={dialogOverlayClass(className)} {...props} />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nexport type DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n\tsize?: DialogSize;\n\tdisablePointerDismissal?: boolean;\n};\n\nexport const DialogContent = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Content>,\n\tDialogContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\tsize = \"base\",\n\t\t\tdisablePointerDismissal = false,\n\t\t\tonPointerDownOutside,\n\t\t\tonInteractOutside,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={dialogPanelClass({ size, className })}\n\t\t\t\tonPointerDownOutside={(event) => {\n\t\t\t\t\tif (disablePointerDismissal) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tonPointerDownOutside?.(event);\n\t\t\t\t}}\n\t\t\t\tonInteractOutside={(event) => {\n\t\t\t\t\tif (disablePointerDismissal) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tonInteractOutside?.(event);\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t),\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nexport const DialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Title>,\n\tReact.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn(\"text-2xl font-semibold tracking-tight\", className)}\n\t\t{...props}\n\t/>\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nexport const DialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Description>,\n\tReact.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn(\"text-base text-basalt-muted-foreground\", className)}\n\t\t{...props}\n\t/>\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport const DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col space-y-1.5 text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nexport const DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn(\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n\t\t{...props}\n\t/>\n);\nDialogFooter.displayName = \"DialogFooter\";\n"],"mappings":";;;;;;;AAKA,IAAa,IAAe;CAC3B,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,IAAI;AACL;AAIA,SAAgB,EAAmB,GAAoB;CACtD,OAAO,EACN,8CACA,GACA,8FACA,GACA,CACD;AACD;AAEA,SAAgB,EAAiB,EAChC,UAAO,QACP,iBAIG,CAAC,GAAG;CACP,OAAO,EACN,yPACA,GACA,4FACA,GACA,EAAa,IACb,CACD;AACD;AAEA,IAAa,IAAS,EAAgB,MACzB,IAAgB,EAAgB,SAChC,IAAc,EAAgB,OAC9B,IAAe,EAAgB,QAE/B,IAAgB,EAAM,YAGhC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAgB,SAAjB;CAA8B;CAAK,WAAW,EAAmB,CAAS;CAAG,GAAI;AAAQ,CAAA,CACzF;AACD,EAAc,cAAc,EAAgB,QAAQ;AAOpD,IAAa,IAAgB,EAAM,YAKjC,EACC,cACA,aACA,UAAO,QACP,6BAA0B,IAC1B,yBACA,sBACA,GAAG,KAEJ,MAEA,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD,CAAgB,CAAA,GAChB,kBAAC,EAAgB,SAAjB;CACM;CACL,WAAW,EAAiB;EAAE;EAAM;CAAU,CAAC;CAC/C,uBAAuB,MAAU;EAIhC,AAHI,KACH,EAAM,eAAe,GAEtB,IAAuB,CAAK;CAC7B;CACA,oBAAoB,MAAU;EAI7B,AAHI,KACH,EAAM,eAAe,GAEtB,IAAoB,CAAK;CAC1B;CACA,GAAI;CAEH;AACuB,CAAA,CACZ,EAAA,CAAA,CAEhB;AACA,EAAc,cAAc,EAAgB,QAAQ;AAEpD,IAAa,IAAc,EAAM,YAG9B,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAgB,OAAjB;CACM;CACL,WAAW,EAAG,yCAAyC,CAAS;CAChE,GAAI;AACJ,CAAA,CACD;AACD,EAAY,cAAc,EAAgB,MAAM;AAEhD,IAAa,IAAoB,EAAM,YAGpC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAgB,aAAjB;CACM;CACL,WAAW,EAAG,0CAA0C,CAAS;CACjE,GAAI;AACJ,CAAA,CACD;AACD,EAAkB,cAAc,EAAgB,YAAY;AAE5D,IAAa,KAAgB,EAAE,cAAW,GAAG,QAC5C,kBAAC,OAAD;CAAK,WAAW,EAAG,uCAAuC,CAAS;CAAG,GAAI;AAAQ,CAAA;AAEnF,EAAa,cAAc;AAE3B,IAAa,KAAgB,EAAE,cAAW,GAAG,QAC5C,kBAAC,OAAD;CACC,WAAW,EAAG,0DAA0D,CAAS;CACjF,GAAI;AACJ,CAAA;AAEF,EAAa,cAAc"}