@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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/dist/charts/area.d.ts +8 -0
- package/dist/charts/area.js +55 -0
- package/dist/charts/area.js.map +1 -0
- package/dist/charts/bar.d.ts +9 -0
- package/dist/charts/bar.js +42 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/bullet.d.ts +8 -0
- package/dist/charts/bullet.js +50 -0
- package/dist/charts/bullet.js.map +1 -0
- package/dist/charts/chart-colors.d.ts +1 -0
- package/dist/charts/chart-colors.js +3 -0
- package/dist/charts/charts.d.ts +6 -0
- package/dist/charts/charts.js +15 -0
- package/dist/charts/charts.js.map +1 -0
- package/dist/charts/config.d.ts +117 -0
- package/dist/charts/config.js +117 -0
- package/dist/charts/config.js.map +1 -0
- package/dist/charts/custom-chart.d.ts +6 -0
- package/dist/charts/custom-chart.js +15 -0
- package/dist/charts/custom-chart.js.map +1 -0
- package/dist/charts/date-navigation.d.ts +22 -0
- package/dist/charts/date-navigation.js +122 -0
- package/dist/charts/date-navigation.js.map +1 -0
- package/dist/charts/donut.d.ts +8 -0
- package/dist/charts/donut.js +36 -0
- package/dist/charts/donut.js.map +1 -0
- package/dist/charts/frame.d.ts +9 -0
- package/dist/charts/frame.js +22 -0
- package/dist/charts/frame.js.map +1 -0
- package/dist/charts/funnel.d.ts +7 -0
- package/dist/charts/funnel.js +35 -0
- package/dist/charts/funnel.js.map +1 -0
- package/dist/charts/gauge.d.ts +8 -0
- package/dist/charts/gauge.js +46 -0
- package/dist/charts/gauge.js.map +1 -0
- package/dist/charts/grouped-bar.d.ts +7 -0
- package/dist/charts/grouped-bar.js +42 -0
- package/dist/charts/grouped-bar.js.map +1 -0
- package/dist/charts/heatmap-calendar.d.ts +27 -0
- package/dist/charts/heatmap-calendar.js +200 -0
- package/dist/charts/heatmap-calendar.js.map +1 -0
- package/dist/charts/item-list.d.ts +9 -0
- package/dist/charts/item-list.js +22 -0
- package/dist/charts/item-list.js.map +1 -0
- package/dist/charts/line.d.ts +9 -0
- package/dist/charts/line.js +58 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/palette.d.ts +33 -0
- package/dist/charts/palette.js +44 -0
- package/dist/charts/palette.js.map +1 -0
- package/dist/charts/radar.d.ts +6 -0
- package/dist/charts/radar.js +37 -0
- package/dist/charts/radar.js.map +1 -0
- package/dist/charts/sample.d.ts +42 -0
- package/dist/charts/sample.js +124 -0
- package/dist/charts/sample.js.map +1 -0
- package/dist/charts/sankey.d.ts +6 -0
- package/dist/charts/sankey.js +51 -0
- package/dist/charts/sankey.js.map +1 -0
- package/dist/charts/slot-bar.d.ts +15 -0
- package/dist/charts/slot-bar.js +80 -0
- package/dist/charts/slot-bar.js.map +1 -0
- package/dist/charts/sparkline.d.ts +6 -0
- package/dist/charts/sparkline.js +29 -0
- package/dist/charts/sparkline.js.map +1 -0
- package/dist/charts/stacked-bar.d.ts +7 -0
- package/dist/charts/stacked-bar.js +51 -0
- package/dist/charts/stacked-bar.js.map +1 -0
- package/dist/charts/stat-card.d.ts +21 -0
- package/dist/charts/stat-card.js +66 -0
- package/dist/charts/stat-card.js.map +1 -0
- package/dist/charts/timeline.d.ts +17 -0
- package/dist/charts/timeline.js +79 -0
- package/dist/charts/timeline.js.map +1 -0
- package/dist/charts/timeseries.d.ts +6 -0
- package/dist/charts/timeseries.js +15 -0
- package/dist/charts/timeseries.js.map +1 -0
- package/dist/components/accordion.d.ts +6 -0
- package/dist/components/accordion.js +21 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +25 -0
- package/dist/components/alert-dialog.js +61 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/app-header.d.ts +10 -0
- package/dist/components/app-header.js +35 -0
- package/dist/components/app-header.js.map +1 -0
- package/dist/components/app-shell.d.ts +4 -0
- package/dist/components/app-shell.js +29 -0
- package/dist/components/app-shell.js.map +1 -0
- package/dist/components/autocomplete.d.ts +47 -0
- package/dist/components/autocomplete.js +28 -0
- package/dist/components/autocomplete.js.map +1 -0
- package/dist/components/avatar.d.ts +5 -0
- package/dist/components/avatar.js +28 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.js +37 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/banner.d.ts +22 -0
- package/dist/components/banner.js +88 -0
- package/dist/components/banner.js.map +1 -0
- package/dist/components/basalt-mark.d.ts +8 -0
- package/dist/components/basalt-mark.js +17 -0
- package/dist/components/basalt-mark.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +9 -0
- package/dist/components/breadcrumbs.js +38 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/button.d.ts +17 -0
- package/dist/components/button.js +73 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/checkbox.d.ts +86 -0
- package/dist/components/checkbox.js +107 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/clipboard-text.d.ts +5 -0
- package/dist/components/clipboard-text.js +33 -0
- package/dist/components/clipboard-text.js.map +1 -0
- package/dist/components/code.d.ts +26 -0
- package/dist/components/code.js +45 -0
- package/dist/components/code.js.map +1 -0
- package/dist/components/collapsible.d.ts +33 -0
- package/dist/components/collapsible.js +38 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.d.ts +47 -0
- package/dist/components/combobox.js +28 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command-palette.d.ts +83 -0
- package/dist/components/command-palette.js +90 -0
- package/dist/components/command-palette.js.map +1 -0
- package/dist/components/confirm-dialog.d.ts +52 -0
- package/dist/components/confirm-dialog.js +61 -0
- package/dist/components/confirm-dialog.js.map +1 -0
- package/dist/components/context-menu.d.ts +7 -0
- package/dist/components/context-menu.js +23 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/data-table.d.ts +76 -0
- package/dist/components/data-table.js +230 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/date-picker.d.ts +90 -0
- package/dist/components/date-picker.js +452 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +37 -0
- package/dist/components/dialog.js +67 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +38 -0
- package/dist/components/dropdown-menu.js +24 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty.d.ts +6 -0
- package/dist/components/empty.js +28 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field.d.ts +39 -0
- package/dist/components/field.js +52 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/flow.d.ts +24 -0
- package/dist/components/flow.js +56 -0
- package/dist/components/flow.js.map +1 -0
- package/dist/components/grid.d.ts +15 -0
- package/dist/components/grid.js +24 -0
- package/dist/components/grid.js.map +1 -0
- package/dist/components/hover-card.d.ts +5 -0
- package/dist/components/hover-card.js +18 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-area.d.ts +19 -0
- package/dist/components/input-area.js +27 -0
- package/dist/components/input-area.js.map +1 -0
- package/dist/components/input-group.d.ts +70 -0
- package/dist/components/input-group.js +78 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.d.ts +19 -0
- package/dist/components/input.js +28 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.d.ts +20 -0
- package/dist/components/label.js +34 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/layer-card.d.ts +69 -0
- package/dist/components/layer-card.js +104 -0
- package/dist/components/layer-card.js.map +1 -0
- package/dist/components/link.d.ts +8 -0
- package/dist/components/link.js +18 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/loader.d.ts +4 -0
- package/dist/components/loader.js +66 -0
- package/dist/components/loader.js.map +1 -0
- package/dist/components/loading-screen.d.ts +5 -0
- package/dist/components/loading-screen.js +24 -0
- package/dist/components/loading-screen.js.map +1 -0
- package/dist/components/menu-bar.d.ts +8 -0
- package/dist/components/menu-bar.js +42 -0
- package/dist/components/menu-bar.js.map +1 -0
- package/dist/components/meter.d.ts +8 -0
- package/dist/components/meter.js +26 -0
- package/dist/components/meter.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +6 -0
- package/dist/components/navigation-menu.js +16 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/overlay.d.ts +16 -0
- package/dist/components/overlay.js +14 -0
- package/dist/components/overlay.js.map +1 -0
- package/dist/components/page-header.d.ts +19 -0
- package/dist/components/page-header.js +43 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/pagination.d.ts +35 -0
- package/dist/components/pagination.js +68 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +38 -0
- package/dist/components/popover.js +65 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/radio.d.ts +108 -0
- package/dist/components/radio.js +80 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/scroll-area.d.ts +15 -0
- package/dist/components/scroll-area.js +49 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/segment-control.d.ts +35 -0
- package/dist/components/segment-control.js +46 -0
- package/dist/components/segment-control.js.map +1 -0
- package/dist/components/select.d.ts +99 -0
- package/dist/components/select.js +51 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/sensitive-input.d.ts +23 -0
- package/dist/components/sensitive-input.js +43 -0
- package/dist/components/sensitive-input.js.map +1 -0
- package/dist/components/separator.d.ts +26 -0
- package/dist/components/separator.js +18 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +26 -0
- package/dist/components/sheet.js +49 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +101 -0
- package/dist/components/sidebar.js +260 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton-line.d.ts +6 -0
- package/dist/components/skeleton-line.js +22 -0
- package/dist/components/skeleton-line.js.map +1 -0
- package/dist/components/slider.d.ts +3 -0
- package/dist/components/slider.js +21 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/stat-strip.d.ts +19 -0
- package/dist/components/stat-strip.js +27 -0
- package/dist/components/stat-strip.js.map +1 -0
- package/dist/components/switch.d.ts +85 -0
- package/dist/components/switch.js +94 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table-of-contents.d.ts +33 -0
- package/dist/components/table-of-contents.js +37 -0
- package/dist/components/table-of-contents.js.map +1 -0
- package/dist/components/table-pager.d.ts +26 -0
- package/dist/components/table-pager.js +35 -0
- package/dist/components/table-pager.js.map +1 -0
- package/dist/components/table.d.ts +45 -0
- package/dist/components/table.js +32 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +65 -0
- package/dist/components/tabs.js +56 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text.d.ts +32 -0
- package/dist/components/text.js +46 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/theme-toggle.d.ts +7 -0
- package/dist/components/theme-toggle.js +28 -0
- package/dist/components/theme-toggle.js.map +1 -0
- package/dist/components/toast.d.ts +27 -0
- package/dist/components/toast.js +78 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toggle-group.d.ts +4 -0
- package/dist/components/toggle-group.js +48 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +7 -0
- package/dist/components/toggle.js +37 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/toolbar.d.ts +58 -0
- package/dist/components/toolbar.js +76 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.d.ts +13 -0
- package/dist/components/tooltip.js +18 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/typeahead-field.d.ts +24 -0
- package/dist/components/typeahead-field.js +177 -0
- package/dist/components/typeahead-field.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +35 -0
- package/dist/providers/link.d.ts +12 -0
- package/dist/providers/link.js +18 -0
- package/dist/providers/link.js.map +1 -0
- package/dist/providers/theme.d.ts +11 -0
- package/dist/providers/theme.js +43 -0
- package/dist/providers/theme.js.map +1 -0
- package/dist/styles/standalone.css +2233 -0
- package/dist/styles/tailwind.css +103 -0
- package/dist/styles/tokens.css +277 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.js +11 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/control-surface.d.ts +2 -0
- package/dist/utils/control-surface.js +11 -0
- package/dist/utils/control-surface.js.map +1 -0
- package/dist/utils/selection-indicator.d.ts +24 -0
- package/dist/utils/selection-indicator.js +108 -0
- package/dist/utils/selection-indicator.js.map +1 -0
- 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":";;;;;;;;AAQA,SAAS,EAAI,GAAe;CAC3B,OAAO,OAAO,CAAK,CAAC,CAAC,SAAS,GAAG,GAAG;AACrC;AAEA,SAAS,EAAU,GAAa;CAC/B,OAAO,GAAG,OAAO,EAAK,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,EAAI,EAAK,CAAC,EAAE,GAAG,EAAI,EAAK,CAAC;AACvE;AAEA,SAAS,EAAQ,GAAa;CAC7B,IAAM,IAAO,IAAI,KAAK,KAAK,IAAI,EAAK,GAAG,EAAK,IAAI,GAAG,EAAK,CAAC,CAAC;CAE1D,OADA,EAAK,eAAe,EAAK,CAAC,GACnB;AACR;AAEA,SAAS,EAAU,GAAa;CAC/B,IAAM,IAAO,IAAI,KAAK,EAAK,GAAG,EAAK,IAAI,GAAG,EAAK,CAAC;CAEhD,OADA,EAAK,YAAY,EAAK,CAAC,GAChB;AACR;AAEA,SAAS,EAAS,GAA6B;CAC9C,IAAM,IAAQ,6BAA6B,KAAK,CAAK;CACrD,IAAI,CAAC,GACJ,OAAO;CAER,IAAM,IAAO,OAAO,EAAM,EAAE,GACtB,IAAQ,OAAO,EAAM,EAAE,GACvB,IAAM,OAAO,EAAM,EAAE;CAC3B,IAAI,IAAO,GACV,OAAO;CAER,IAAM,IAAM,EAAQ;EAAE,GAAG;EAAM,GAAG;EAAO,GAAG;CAAI,CAAC;CAQjD,OANC,EAAI,eAAe,MAAM,KACzB,EAAI,YAAY,IAAI,MAAM,KAC1B,EAAI,WAAW,MAAM,IAEd,OAED;EAAE,GAAG;EAAM,GAAG;EAAO,GAAG;CAAI;AACpC;AAEA,IAAM,KACL;AAED,SAAS,EAAW,GAA0B;CAC7C,IAAM,IAAQ,IAAI,KAAK,eAAe,SAAS;EAC9C;EACA,MAAM;EACN,OAAO;EACP,KAAK;CACN,CAAC,CAAC,CAAC,8BAAc,IAAI,KAAK,CAAC,GACrB,KAAQ,MACb,OAAO,EAAM,MAAM,MAAS,EAAK,SAAS,CAAI,CAAC,EAAE,KAAK;CACvD,OAAO;EAAE,GAAG,EAAK,MAAM;EAAG,GAAG,EAAK,OAAO;EAAG,GAAG,EAAK,KAAK;CAAE;AAC5D;AAEA,SAAS,EAAY,GAAa,GAAgB,GAAqC;CACtF,OAAO,IAAI,KAAK,eAAe,GAAQ;EACtC,GAAG;EACH,UAAU;EACV,UAAU;CACX,CAAC,CAAC,CAAC,OAAO,EAAQ,CAAI,CAAC;AACxB;AAEA,SAAS,GAAmB,EAC3B,SACA,iBACA,cACA,YACA,WACA,iBAQE;CACF,SAAS,EAAI,GAAa;EACzB,IAAM,IAAO,EAAS,CAAG;EAIzB,OAHK,IAGE,IAAa,EAAU,CAAI,CAAC,KAAK,EAAY,GAAM,GAAQ,EAAE,WAAW,SAAS,CAAC,IAFjF;CAGT;CAUA,OATI,MAAS,UACP,IAGA,IAGE,GAAG,EAAI,CAAS,EAAE,KAAK,EAAI,CAAO,MAFjC,GAAG,EAAI,CAAS,EAAE,QAHlB,gBAOF,IACH,IAAa,EAAU,CAAY,CAAC,KACrC,EAAY,GAAc,GAAQ,EAAE,WAAW,SAAS,CAAC,IACzD;AACJ;AAEA,SAAS,EAAa,GAAa,GAAc;CAOhD,OANI,EAAK,MAAM,EAAM,IAGjB,EAAK,MAAM,EAAM,IAGd,EAAK,IAAI,EAAM,IAFd,EAAK,IAAI,EAAM,IAHf,EAAK,IAAI,EAAM;AAMxB;AAEA,SAAS,GAAa,GAAa,GAAc,GAAc;CAC9D,IAAM,IAAO,EAAS,CAAG,GACnB,IAAU,IAAM,EAAS,CAAG,IAAI,MAChC,IAAU,IAAM,EAAS,CAAG,IAAI;CAUtC,OAHA,EANI,CAAC,KAGD,KAAW,EAAa,GAAM,CAAO,IAAI,KAGzC,KAAW,EAAa,GAAM,CAAO,IAAI;AAI9C;AAEA,SAAS,EACR,GACA,GACA,GACA,GACC;CACD,OAAO,GAAa,GAAK,GAAK,CAAG,KAAK,CAAC,IAAiB,CAAG;AAC5D;AAmGA,SAAS,GAAW,GAAa,GAAc,GAAc;CAC5D,IAAM,IAAU,IAAM,EAAS,CAAG,IAAI,MAChC,IAAU,IAAM,EAAS,CAAG,IAAI;CAOtC,OANI,KAAW,EAAa,GAAM,CAAO,IAAI,IACrC,IAEJ,KAAW,EAAa,GAAM,CAAO,IAAI,IACrC,IAED;AACR;AAEA,SAAS,EAAa,GAAsB;CAC3C,IAAI,CAAC,OAAO,SAAS,EAAK,CAAC,KAAK,EAAK,IAAI,KAAK,EAAK,IAAI,MAAM,EAAK,IAAI,KAAK,EAAK,IAAI,IACnF,OAAO;CAER,IAAM,IAAM,EAAQ,CAAI;CACxB,OACC,CAAC,OAAO,MAAM,EAAI,QAAQ,CAAC,KAC3B,EAAI,eAAe,MAAM,EAAK,KAC9B,EAAI,YAAY,IAAI,MAAM,EAAK,KAC/B,EAAI,WAAW,MAAM,EAAK;AAE5B;AAEA,SAAS,EAAM,GAAoB;CAClC,OAAO,IAAO,EAAU,CAAI,IAAI;AACjC;AAEA,SAAS,EAAQ,GAAa,GAA4B;CACzD,IAAM,IAAO,EAAQ,CAAI;CAKzB,IAJI,OAAO,MAAM,EAAK,QAAQ,CAAC,MAG/B,EAAK,WAAW,EAAK,WAAW,IAAI,CAAI,GACpC,OAAO,MAAM,EAAK,QAAQ,CAAC,IAC9B,OAAO;CAER,IAAM,IAAQ;EAAE,GAAG,EAAK,eAAe;EAAG,GAAG,EAAK,YAAY,IAAI;EAAG,GAAG,EAAK,WAAW;CAAE;CAC1F,OAAO,EAAa,CAAK,IAAI,IAAQ;AACtC;AAEA,SAAS,GAAW,GAAc,GAA6B;CAC9D,IAAM,IAAQ,EAAM,IAAI,MAAM,EAAM,IAAI,KAAK,GACvC,IAAO;EAAE,GAAG,KAAK,MAAM,IAAQ,EAAE;EAAG,GAAI,IAAQ,KAAM;EAAG,GAAG;CAAE;CACpE,OAAO,EAAa,CAAI,IAAI,IAAO;AACpC;AAEA,SAAgB,EAAW,EAC1B,UACA,kBAAe,IACf,cACA,UAAO,UACP,eACA,uBACA,mBACA,mBACA,YACA,YAAS,SACT,kBAAe,GACf,aACA,gBACA,UACA,cACA,QACA,QACA,aACA,eACA,QACA,cAAc,GACd,oBAAoB,IACpB,gBAAgB,IAChB,GAAG,MACgB;CACnB,IAAM,EACL,aACA,eACA,aACA,YACA,mBAAmB,IACnB,GAAG,OACA,IACE,CAAC,IAAc,MAAmB,EAAS,CAAY,GACvD,CAAC,IAAmB,KAAwB,EACjD,MAAqB;EAAE,MAAM;EAAI,IAAI,KAAA;CAAU,CAChD,GACM,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,CAAC,IAAY,MAAiB,EAAS,CAAC,GACxC,IAAU,EAAwC,CAAC,CAAC,GACpD,IAAkB,EAAsB,IAAI,GAC5C,IAAW,EAAO,EAAK,GACvB,KAAY,EAAyB,IAAI,GACzC,KAAa,EAA0B,IAAI,GAC3C,KAAW,KAAS,IACpB,IAAgB,KAAc,IAC9B,IAAe,EACpB,MAAS,UAAU,EAAc,MAAM,EAAc,QAAQ,KAAK,EACnE,GACM,IAAY,IAAe,EAAU,CAAY,IAAI,IACrD,IAAY,MAAS,UAAU,KAAK,GACpC,KAAS,KAAgB,EAAW,CAAQ,GAC5C,CAAC,GAAO,KAAY,EAAgB;EAAE,GAAG,GAAO;EAAG,GAAG,GAAO;EAAG,GAAG;CAAE,CAAC,GACtE,KAAe,EAAO,CAAS;CACrC,IAAI,KAAQ,GAAa,YAAY,GAAW;EAC/C,EAAS,UAAU;EACnB,IAAM,IAAO,KAAgB,EAAW,CAAQ;EAChD,CAAI,EAAM,MAAM,EAAK,KAAK,EAAM,MAAM,EAAK,MAC1C,EAAS;GAAE,GAAG,EAAK;GAAG,GAAG,EAAK;GAAG,GAAG;EAAE,CAAC;CAEzC;CA8BA,AA7BA,GAAa,UAAU,GAEvB,QAAgB;EACf,IAAI,CAAC,GACJ;EAED,IAAM,IAAO,IACX,IAAY,EAAS,CAAS,IAAI,SAAS,EAAW,CAAQ,GAC/D,GACA,CACD;EAEA,AADA,EAAS;GAAE,GAAG,EAAK;GAAG,GAAG,EAAK;GAAG,GAAG;EAAE,CAAC,GAClC,MACJ,EAAS,UAAU;CAErB,GAAG;EAAC;EAAM;EAAW;EAAU;EAAK;CAAG,CAAC,GAExC,QAAgB;EACf,AAAI,KACH,EAAQ,EAAK;CAEf,GAAG,CAAC,CAAQ,CAAC,GAEb,QAAgB;EACf,AAAI,MACH,GAAW,SAAS,MAAM;CAE5B,GAAG,CAAC,EAAS,CAAC,GAEd,QAAgB;EACf,IAAM,IAAO,GAAU,SAAS;EAChC,IAAI,CAAC,MAAS,MAAS,UAAU,MAAe,KAAA,IAAY,MAAU,KAAA,IACrE;EAED,IAAM,KAAW,MAAiB;GACjC,qBAAqB;IAChB,EAAM,qBAGV,GAAgB,CAAY,GAC5B,EAAqB,MAAqB;KAAE,MAAM;KAAI,IAAI,KAAA;IAAU,CAAC,GACrE,EAAQ,EAAK;GACd,CAAC;EACF;EAEA,OADA,EAAK,iBAAiB,SAAS,CAAO,SACzB,EAAK,oBAAoB,SAAS,CAAO;CACvD,GAAG;EAAC;EAAmB;EAAc;EAAM;EAAY;CAAK,CAAC;CAE7D,IAAM,KAAgB,QAAc;EACnC,IAAM,IAAY,IAAI,KAAK,eAAe,GAAQ;GAAE,SAAS;GAAS,UAAU;EAAM,CAAC;EACvF,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAU;GAC9C,IAAM,IAAM,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,KAAM,IAAQ,KAAgB,CAAE,CAAC;GACxE,OAAO,EAAU,OAAO,CAAG;EAC5B,CAAC;CACF,GAAG,CAAC,GAAQ,CAAY,CAAC,GAEnB,IAAO,QAAc;EAC1B,IAAM,IAAQ;GAAE,GAAG,EAAM;GAAG,GAAG,EAAM;GAAG,GAAG;EAAE;EAC7C,IAAI,CAAC,EAAa,CAAK,GACtB,OAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,SAAS,IAAI;EAE7C,IAAM,KAAe,EAAQ,CAAK,CAAC,CAAC,UAAU,IAAI,IAAe,KAAK,GAChE,IAAQ,EAAQ,GAAO,CAAC,CAAW;EAIzC,OAHK,IAGE,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAU,EAAQ,GAAO,CAAK,CAAC,IAF7D,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAU,EAAQ,GAAO,IAAQ,CAAW,CAAC;CAGrF,GAAG,CAAC,GAAO,CAAY,CAAC;CAExB,QAAsB;EACrB,IAAI,CAAC,GACJ;EAED,IAAM,IAAU,EAAgB,SAC5B,IAAQ;EACZ,IAAI,GAGH,AAFA,EAAgB,UAAU,MAC1B,IAAQ,EAAK,WAAW,MAAS,EAAM,CAAI,MAAM,CAAO,GACpD,IAAQ,MACX,IAAQ;OAEH;GACN,IAAM,IAAU,SAAS,eACnB,IACL,CAAC,EAAS,WACV,aAAmB,eACnB,EAAQ,QAAQ,MAAM,MAAS,MAAS,CAAO,IAC5C,EAAQ,aAAa,YAAY,IACjC,MACE,IAAe,IAAa,EAAK,WAAW,MAAS,EAAM,CAAI,MAAM,CAAU,IAAI;GACzF,IAAI,KAAgB,GACnB,IAAQ;QACF;IACN,IAAM,IAAM,KAAa,KAAa,EAAU,EAAW,CAAQ,CAAC,GAC9D,IAAgB,EAAK,WAAW,MAAS,EAAM,CAAI,MAAM,CAAG;IAClE,IAAI,KAAiB,KAAK,EAAK,EAAc,EAAE,MAAM,EAAM,GAC1D,IAAQ;SACF;KACN,IAAM,IAAe,EAAK,WAAW,MAAS,GAAM,MAAM,EAAM,CAAC;KACjE,IAAQ,KAAgB,IAAI,IAAe;IAC5C;GACD;EACD;EACA,IAAM,KAAW,MAChB,GAAQ,KAAQ,EAAK,KAAK,KAAK,EAAe,EAAU,CAAI,GAAG,GAAK,GAAK,CAAc;EACxF,IAAI,CAAC,EAAQ,EAAK,MAAU,IAAI,GAAG;GAClC,IAAM,IAAU,EAAK,WAAW,MAAS,GAAM,MAAM,EAAM,KAAK,EAAQ,CAAI,CAAC,GACvE,IAAM,EAAK,WAAW,MAAS,EAAQ,CAAI,CAAC;GAClD,IAAQ,KAAW,IAAI,IAAU,KAAO,IAAI,IAAM;EACnD;EAEA,AADA,GAAc,CAAK,GACf,EAAS,YACZ,EAAS,UAAU,IACnB,EAAQ,QAAQ,EAAM,EAAE,MAAM;CAEhC,GAAG;EAAC;EAAM;EAAW;EAAW;EAAU;EAAM,EAAM;EAAG;EAAK;EAAK;CAAc,CAAC;CAElF,IAAM,IAAgB,GAAW,GAAO,EAAE,GACpC,KAAiB,GAAW,GAAO,CAAC,GACpC,IAAY,MAAS,UAAU,EAAc,OAAO,IACpD,IAAU,MAAS,UAAU,EAAc,KAAK,KAAA,GAChD,KAAQ,GAAmB;EAChC;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,SAAS,EAAW,GAAa;EAChC,OAAO,EAAe,GAAK,GAAK,GAAK,CAAc;CACpD;CAEA,SAAS,GAAO,GAAc;EACzB,WAAY,KAAY,CAAC,EAAW,CAAI,IAG5C;OAAI,MAAS,SAAS;IACrB,IAAM,IAAU,KAAc,IACxB,IACL,CAAC,EAAQ,QAAQ,EAAQ,KACtB,EAAE,MAAM,EAAK,IACb,EACC,EAAS,CAAI,KAAK;KAAE,GAAG;KAAG,GAAG;KAAG,GAAG;IAAE,GACrC,EAAS,EAAQ,IAAI,KAAK;KAAE,GAAG;KAAG,GAAG;KAAG,GAAG;IAAE,CAC9C,IAAI,IACH;KAAE,MAAM;KAAM,IAAI,EAAQ;IAAK,IAC/B;KAAE,MAAM,EAAQ;KAAM,IAAI;IAAK;IAKpC,AAJI,MAAe,KAAA,KAClB,EAAqB,CAAS,GAE/B,KAAgB,CAAS,GACrB,EAAU,MACb,EAAQ,EAAK;IAEd;GACD;GAKA,AAJI,MAAU,KAAA,KACb,GAAgB,CAAI,GAErB,EAAQ,EAAK,GACb,KAAW,CAAI;EALf;CAMD;CAEA,SAAS,GAAY,GAA0B;EAC1C,WAAY,IAGhB;OAAI,OAAO,EAAO,SAAU,UAAU;IACrC,IAAI,MAAS,SAAS;KACrB,IAAI,CAAC,EAAW,EAAO,KAAK,GAC3B;KAED,IAAM,IAAY;MAAE,MAAM,EAAO;MAAO,IAAI,EAAO;KAAM;KAKzD,AAJI,MAAe,KAAA,KAClB,EAAqB,CAAS,GAE/B,KAAgB,CAAS,GACzB,EAAQ,EAAK;KACb;IACD;IACA,GAAO,EAAO,KAAK;IACnB;GACD;GACA,IAAI,MAAS,SAAS;IACrB,IAAI,CAAC,EAAW,EAAO,MAAM,IAAI,KAAK,CAAC,EAAW,EAAO,MAAM,EAAE,GAChE;IAMD,AAJI,MAAe,KAAA,KAClB,EAAqB,EAAO,KAAK,GAElC,KAAgB,EAAO,KAAK,GAC5B,EAAQ,EAAK;GACd;EAVA;CAWD;CAEA,OACC,kBAAC,GAAD;EACO;EACN,eAAe,MAAS;GACnB,WAAQ,IAGZ;QAAI,GAAM;KACT,IAAM,KAAU,IAAY,EAAS,CAAS,IAAI,SAAS,EAAW,CAAQ;KAE9E,AADA,EAAS;MAAE,GAAG,EAAO;MAAG,GAAG,EAAO;MAAG,GAAG;KAAE,CAAC,GAC3C,EAAS,UAAU;IACpB;IACA,EAAQ,CAAI;GADZ;EAED;EAZD,UAAA;GAcC,kBAAC,SAAD;IACC,KAAK;IACL,MAAM,MAAS,UAAU,SAAS;IAC5B;IACI;IACV,KAAK,MAAS,UAAU,KAAA,IAAY;IACpC,KAAK,MAAS,UAAU,KAAA,IAAY;IACpC,WAAU;IACV,OAAO;KACN,UAAU;KACV,OAAO;KACP,QAAQ;KACR,UAAU;KACV,MAAM;IACP;IACA,OACC,MAAS,UAAW,KAAa,IAAU,GAAG,EAAU,GAAG,MAAY,KAAM;IAE9E,gBAAgB,KAAA;IACN;IACV,eAAY;IACZ,UAAU;IACV,GAAI;GACJ,CAAA;GACD,kBAAC,GAAD;IAAgB,SAAA;IACf,UAAA,kBAAC,GAAD;KACC,MAAK;KACL,KAAK;KACD;KACJ,SAAQ;KACE;KACD;KACD;KACR,mBAAiB;KACjB,cACC,IAAa,OAAU,gBAAgB,IAAY,GAAG,EAAU,IAAI,OAAW,KAAA;KAEhF,oBAAkB;KAClB,gBAAc;KACd,WAAW,EAAG,6BAA6B,EAAS;KAEnD,UAAA;IACM,CAAA;GACO,CAAA;GAChB,kBAAC,GAAD;IACC,OAAO;IACP,WAAU;IACV,cAAY,IAAY,GAAG,EAAU,aAAa;IAClD,kBAAkB,MAAU;KAC3B,EAAM,eAAe;KACrB,IAAM,IAAM,KAAa,KAAa,EAAU,EAAW,CAAQ,CAAC,GAC9D,IAAgB,EAAK,WAAW,MAAS,EAAM,CAAI,MAAM,CAAG,GAC5D,KAAW,MAChB,GACC,KAAQ,EAAK,KAAK,KAAK,EAAe,EAAU,CAAI,GAAG,GAAK,GAAK,CAAc,IAE7E,IACH,KAAiB,KAAK,EAAK,EAAc,EAAE,MAAM,EAAM,IACpD,IACA,KAAK,IACL,GACA,EAAK,WAAW,MAAS,GAAM,MAAM,EAAM,CAAC,CAC7C;KACH,IAAI,CAAC,EAAQ,EAAK,MAAU,IAAI,GAAG;MAClC,IAAM,IAAU,EAAK,WAAW,MAAS,GAAM,MAAM,EAAM,KAAK,EAAQ,CAAI,CAAC,GACvE,IAAM,EAAK,WAAW,MAAS,EAAQ,CAAI,CAAC;MAClD,IAAQ,KAAW,IAAI,IAAU,KAAO,IAAI,IAAM;KACnD;KACA,qBAAqB;MACpB,EAAQ,QAAQ,EAAM,EAAE,MAAM;KAC/B,CAAC;IACF;IA3BD,UAAA;KA6BE,KAAW,EAAQ,SAAS,IAC5B,kBAAC,OAAD;MAAK,WAAU;MACb,UAAA,EAAQ,KAAK,MACb,kBAAC,GAAD;OAEC,MAAK;OACL,SAAQ;OACR,WAAU;OACV,UAAU,KAAY;OACtB,eAAe,GAAY,CAAM;OAEhC,UAAA,EAAO;MACD,GARF,EAAO,KAQL,CACR;KACG,CAAA,IACF;KACJ,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACC,kBAAC,GAAD;QACC,MAAK;QACL,SAAQ;QACR,MAAK;QACL,MAAM,kBAAC,GAAD,CAAc,CAAA;QACpB,cAAW;QACX,WAAU;QACV,UAAU,KAAY,CAAC,KAAiB,EAAc,IAAI;QAC1D,eAAe;SACV,CAAC,KAAiB,EAAc,IAAI,MAGxC,EAAS,UAAU,IACnB,EAAS,CAAa;QACvB;OACA,CAAA;OACD,kBAAC,QAAD;QAAM,WAAU;QACd,UAAA,EAAY,GAAO,GAAQ;SAAE,OAAO;SAAQ,MAAM;QAAU,CAAC;OACzD,CAAA;OACN,kBAAC,GAAD;QACC,MAAK;QACL,SAAQ;QACR,MAAK;QACL,MAAM,kBAAC,IAAD,CAAe,CAAA;QACrB,cAAW;QACX,WAAU;QACV,UAAU,KAAY,CAAC;QACvB,eAAe;SACT,OAGL,EAAS,UAAU,IACnB,EAAS,EAAc;QACxB;OACA,CAAA;MACG;;KACL,kBAAC,OAAD;MACC,WAAU;MACV,YAAY,MAAU;OACrB,IAAM,IAAU,EAAK;OAChB,OAGL;YACC,EAAM,QAAQ,gBACd,EAAM,QAAQ,eACd,EAAM,QAAQ,eACd,EAAM,QAAQ,WACb;SACD,EAAM,eAAe;SACrB,IAAM,IACL,EAAM,QAAQ,eACX,IACA,EAAM,QAAQ,cACb,KACA,EAAM,QAAQ,cACb,IACA,IACF,IAAO,EAAQ,GAAS,CAAK;SACjC,KACC,IAAI,IAAO,GACX,KAAQ,EAAK,KAAK,KAAK,CAAC,EAAW,EAAU,CAAI,CAAC,KAAK,IAAO,IAC9D,KAAQ,GAER,IAAO,EAAQ,GAAM,CAAK;SAE3B,IAAI,CAAC,KAAQ,EAAK,IAAI,KAAK,CAAC,EAAW,EAAU,CAAI,CAAC,GACrD;SAED,IAAI,EAAK,MAAM,EAAM,KAAK,EAAK,MAAM,EAAM,GAAG;UAG7C,AAFA,EAAgB,UAAU,EAAU,CAAI,GACxC,EAAS,UAAU,IACnB,EAAS;WAAE,GAAG,EAAK;WAAG,GAAG,EAAK;WAAG,GAAG;UAAE,CAAC;UACvC;SACD;SACA,IAAM,IAAQ,EAAK,WAAW,MAAS,EAAM,CAAI,MAAM,EAAU,CAAI,CAAC;SACtE,AAAI,KAAS,MACZ,GAAc,CAAK,GACnB,EAAQ,QAAQ,EAAM,EAAE,MAAM;SAE/B;QACD;QACA,IAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,KAAK;SAC/C,EAAM,eAAe;SACrB,IAAM,IAAM,EAAU,CAAO;SAC7B,AAAI,EAAQ,KAAK,KAAK,EAAW,CAAG,KACnC,GAAO,CAAG;QAEZ;OAPA;MAQD;MArDD,UAAA,CAuDE,GAAc,KAAK,GAAK,MACxB,kBAAC,QAAD;OAEC,WAAU;OAET,UAAA;MACI,GAJA,GAAG,EAAI,GAAG,GAIV,CACN,GACA,EAAK,KAAK,GAAM,MAAU;OAC1B,IAAI,CAAC,GACJ,OACC,kBAAC,QAAD;QAEC,WAAU;QACV,WAAW;SACV,EAAQ,QAAQ,KAAS;QAC1B;OACA,GALK,SAAS,GAKd;OAGH,IAAM,IAAM,EAAU,CAAI,GACpB,IAAU,EAAK,MAAM,EAAM,GAC3B,IAAU,EAAK,KAAK,KAAK,EAAW,CAAG,GACvC,IAAW,IAAY,EAAS,CAAS,IAAI,MAC7C,IAAS,IAAU,EAAS,CAAO,IAAI,MACvC,IAAW,EAAS,CAAG,GACvB,IAAkB,GACvB,KACC,KACA,KACA,EAAa,GAAU,CAAQ,KAAK,KACpC,EAAa,GAAU,CAAM,KAAK,IAE9B,IAAc,MAAQ,KAAa,MAAQ;OACjD,OACC,kBAAC,UAAD;QACC,MAAK;QAEL,MAAM,MAAS;SACd,EAAQ,QAAQ,KAAS;QAC1B;QACA,UAAU,MAAU,KAAa,IAAI;QACrC,cAAY;QACZ,gBACC,MAAS,UACN,MAAQ,KAAa,MAAQ,IAC7B,EAAQ,KAAc,MAAQ;QAElC,UAAU,KAAY,KAAY,CAAC;QACnC,WAAW,EACV,IACA,sEACA,IAAU,2BAA2B,gCACrC,KAAW,0BACX,KAAmB,CAAC,KAAe,oBACnC,MACE,MAAS,UAAU,IAAc,MAAQ,MAC1C,6EACF;QACA,eAAe,KAAW,GAAO,CAAG;QAEnC,UAAA,EAAK;OACC,GAzBF,CAyBE;MAEV,CAAC,CACG;;IACU;;EACR;;AAEX"}
|
|
@@ -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"}
|