@fabio.caffarello/react-design-system 3.13.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js +116 -88
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +57 -47
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +21 -20
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -1
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js +187 -149
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -1
- package/dist/granular/ui/components/DataGrid/DataGrid.js +92 -92
- package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +154 -139
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -1
- package/dist/granular/ui/components/Dialog/AlertDialog.js +73 -40
- package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogContent.js +54 -48
- package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogDescription.js +31 -31
- package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogTitle.js +30 -30
- package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -1
- package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -1
- package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/granular/ui/components/Form/Form.js +38 -37
- package/dist/granular/ui/components/Form/Form.js.map +1 -1
- package/dist/granular/ui/components/Form/FormField.js +28 -26
- package/dist/granular/ui/components/Form/FormField.js.map +1 -1
- package/dist/granular/ui/components/Header/Header.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -1
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -1
- package/dist/granular/ui/components/Menu/Menu.js.map +1 -1
- package/dist/granular/ui/components/Modal/Modal.js +98 -86
- package/dist/granular/ui/components/Modal/Modal.js.map +1 -1
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js +122 -106
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -1
- package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -1
- package/dist/granular/ui/components/Popover/Popover.js.map +1 -1
- package/dist/granular/ui/components/Rating/Rating.js.map +1 -1
- package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +82 -64
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +30 -29
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +37 -35
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +57 -57
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -1
- package/dist/granular/ui/components/Stepper/Stepper.js +102 -94
- package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -1
- package/dist/granular/ui/components/Table/Table.js +41 -35
- package/dist/granular/ui/components/Table/Table.js.map +1 -1
- package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -1
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +49 -46
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -1
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -1
- package/dist/granular/ui/components/Table/TableProvider.js +82 -80
- package/dist/granular/ui/components/Table/TableProvider.js.map +1 -1
- package/dist/granular/ui/components/Table/TableRow.js +57 -53
- package/dist/granular/ui/components/Table/TableRow.js.map +1 -1
- package/dist/granular/ui/components/Table/useColumnResizing.js +53 -53
- package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -1
- package/dist/granular/ui/components/TimePicker/TimePicker.js +149 -103
- package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -1
- package/dist/granular/ui/hooks/useFocusRestore.js +14 -15
- package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -1
- package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -1
- package/dist/granular/ui/primitives/Button/Button.js +86 -104
- package/dist/granular/ui/primitives/Button/Button.js.map +1 -1
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/granular/ui/primitives/Chip/Chip.js +91 -71
- package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -1
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -1
- package/dist/granular/ui/primitives/Input/Input.js.map +1 -1
- package/dist/granular/ui/primitives/Label/Label.js.map +1 -1
- package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -1
- package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -1
- package/dist/granular/ui/primitives/Select/Select.js.map +1 -1
- package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -1
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -1
- package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -1
- package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -1
- package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -1
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/granular/ui/providers/DialogContext.js.map +1 -1
- package/dist/granular/ui/providers/DialogProvider.js +24 -20
- package/dist/granular/ui/providers/DialogProvider.js.map +1 -1
- package/dist/index.cjs +144 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5896 -5609
- package/dist/index.js.map +1 -1
- package/dist/react-design-system.css +1 -1
- package/dist/server/index.cjs +13 -13
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +1050 -789
- package/dist/server/index.js.map +1 -1
- package/dist/ui/components/Autocomplete/Autocomplete.d.ts +21 -0
- package/dist/ui/components/Autocomplete/AutocompleteList.d.ts +4 -0
- package/dist/ui/components/Autocomplete/AutocompleteOption.d.ts +8 -0
- package/dist/ui/components/Breadcrumb/Breadcrumb.d.ts +0 -1
- package/dist/ui/components/ColorPicker/ColorPicker.d.ts +0 -1
- package/dist/ui/components/CommandPalette/CommandPalette.d.ts +0 -1
- package/dist/ui/components/DataGrid/DataGrid.d.ts +0 -1
- package/dist/ui/components/Dialog/DialogContent.d.ts +20 -1
- package/dist/ui/components/Drawer/Drawer.d.ts +0 -1
- package/dist/ui/components/Dropdown/Dropdown.d.ts +0 -1
- package/dist/ui/components/EmptyState/EmptyState.d.ts +0 -1
- package/dist/ui/components/FileUpload/FileUpload.d.ts +0 -1
- package/dist/ui/components/Form/FormField.d.ts +7 -0
- package/dist/ui/components/Header/Header.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderActions.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderHamburger.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderLogo.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderMobileMenu.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderNavigation.d.ts +1 -1
- package/dist/ui/components/Header/contexts/HeaderContext.d.ts +1 -1
- package/dist/ui/components/Menu/Menu.d.ts +0 -1
- package/dist/ui/components/Modal/Modal.d.ts +1 -2
- package/dist/ui/components/Navigation/Navigation.d.ts +1 -1
- package/dist/ui/components/PageHeader/PageHeader.d.ts +1 -1
- package/dist/ui/components/Pagination/Pagination.d.ts +0 -1
- package/dist/ui/components/Popover/Popover.d.ts +0 -1
- package/dist/ui/components/Rating/Rating.d.ts +0 -1
- package/dist/ui/components/SearchInput/SearchInput.d.ts +0 -1
- package/dist/ui/components/Stepper/Stepper.d.ts +0 -1
- package/dist/ui/components/Table/TableActions/TableActions.d.ts +0 -1
- package/dist/ui/components/Table/TableFilters/TableFilters.d.ts +0 -1
- package/dist/ui/components/Table/TablePagination/TablePagination.d.ts +0 -1
- package/dist/ui/components/TimePicker/TimePicker.d.ts +0 -1
- package/dist/ui/components/Timeline/Timeline.d.ts +0 -1
- package/dist/ui/primitives/Checkbox/Checkbox.d.ts +0 -1
- package/dist/ui/primitives/Chip/Chip.d.ts +21 -0
- package/dist/ui/primitives/ErrorMessage/ErrorMessage.d.ts +0 -1
- package/dist/ui/primitives/Input/Input.d.ts +0 -1
- package/dist/ui/primitives/Label/Label.d.ts +0 -1
- package/dist/ui/primitives/NavLink/NavLink.d.ts +1 -1
- package/dist/ui/primitives/Radio/Radio.d.ts +0 -1
- package/dist/ui/primitives/Select/Select.d.ts +0 -1
- package/dist/ui/primitives/Skeleton/Skeleton.d.ts +0 -1
- package/dist/ui/primitives/Slider/Slider.d.ts +0 -1
- package/dist/ui/primitives/Switch/Switch.d.ts +0 -1
- package/dist/ui/primitives/Tooltip/Tooltip.d.ts +0 -1
- package/dist/ui/providers/DialogContext.d.ts +8 -0
- package/dist/ui/server.d.ts +2 -0
- package/package.json +7 -7
|
@@ -1,53 +1,57 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
for (var
|
|
8
|
-
|
|
9
|
-
if (
|
|
10
|
-
for (var
|
|
11
|
-
|
|
2
|
+
var ae = Object.defineProperty, se = Object.defineProperties;
|
|
3
|
+
var ie = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var y = Object.getOwnPropertySymbols;
|
|
5
|
+
var E = Object.prototype.hasOwnProperty, P = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var C = (t, n, s) => n in t ? ae(t, n, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[n] = s, j = (t, n) => {
|
|
7
|
+
for (var s in n || (n = {}))
|
|
8
|
+
E.call(n, s) && C(t, s, n[s]);
|
|
9
|
+
if (y)
|
|
10
|
+
for (var s of y(n))
|
|
11
|
+
P.call(n, s) && C(t, s, n[s]);
|
|
12
12
|
return t;
|
|
13
|
-
},
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
for (var
|
|
17
|
-
|
|
18
|
-
if (t != null &&
|
|
19
|
-
for (var
|
|
20
|
-
|
|
21
|
-
return
|
|
13
|
+
}, q = (t, n) => se(t, ie(n));
|
|
14
|
+
var J = (t, n) => {
|
|
15
|
+
var s = {};
|
|
16
|
+
for (var i in t)
|
|
17
|
+
E.call(t, i) && n.indexOf(i) < 0 && (s[i] = t[i]);
|
|
18
|
+
if (t != null && y)
|
|
19
|
+
for (var i of y(t))
|
|
20
|
+
n.indexOf(i) < 0 && P.call(t, i) && (s[i] = t[i]);
|
|
21
|
+
return s;
|
|
22
22
|
};
|
|
23
23
|
import { jsxs as v, jsx as u } from "react/jsx-runtime";
|
|
24
|
-
import { useState as
|
|
25
|
-
import { ChevronLeft as
|
|
26
|
-
import { useDatePickerContext as
|
|
27
|
-
import { Button as
|
|
28
|
-
import { getSpacingClass as
|
|
29
|
-
import { getRadiusClass as
|
|
30
|
-
function
|
|
24
|
+
import { useState as K, useRef as z, useEffect as H } from "react";
|
|
25
|
+
import { ChevronLeft as le, ChevronRight as oe } from "lucide-react";
|
|
26
|
+
import { useDatePickerContext as ue } from "./DatePickerContext.js";
|
|
27
|
+
import { Button as L } from "../../primitives/Button/Button.js";
|
|
28
|
+
import { getSpacingClass as m } from "../../tokens/spacing.js";
|
|
29
|
+
import { getRadiusClass as ce } from "../../tokens/radius.js";
|
|
30
|
+
function fe(t) {
|
|
31
31
|
return new Date(t.getFullYear(), t.getMonth() + 1, 0).getDate();
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function ge(t) {
|
|
34
34
|
return new Date(t.getFullYear(), t.getMonth(), 1).getDay();
|
|
35
35
|
}
|
|
36
|
-
function
|
|
37
|
-
return !t || !
|
|
36
|
+
function f(t, n) {
|
|
37
|
+
return !t || !n ? !1 : t.getFullYear() === n.getFullYear() && t.getMonth() === n.getMonth() && t.getDate() === n.getDate();
|
|
38
38
|
}
|
|
39
|
-
function D(t,
|
|
40
|
-
return t.getFullYear() ===
|
|
39
|
+
function D(t, n) {
|
|
40
|
+
return t.getFullYear() === n.getFullYear() && t.getMonth() === n.getMonth();
|
|
41
41
|
}
|
|
42
|
-
function
|
|
43
|
-
if (!
|
|
44
|
-
const
|
|
45
|
-
return
|
|
42
|
+
function me(t, n, s) {
|
|
43
|
+
if (!n || !s) return !1;
|
|
44
|
+
const i = t.getTime();
|
|
45
|
+
return i >= n.getTime() && i <= s.getTime();
|
|
46
46
|
}
|
|
47
|
-
function
|
|
48
|
-
return
|
|
47
|
+
function d(t) {
|
|
48
|
+
return new Date(t.getFullYear(), t.getMonth(), t.getDate()).getTime();
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
function R(t, n, s, i) {
|
|
51
|
+
const F = d(t);
|
|
52
|
+
return !!(n && F < d(n) || s && F > d(s) || i != null && i.some((h) => f(t, h)));
|
|
53
|
+
}
|
|
54
|
+
const De = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], he = [
|
|
51
55
|
"January",
|
|
52
56
|
"February",
|
|
53
57
|
"March",
|
|
@@ -61,155 +65,165 @@ const ge = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], me = [
|
|
|
61
65
|
"November",
|
|
62
66
|
"December"
|
|
63
67
|
];
|
|
64
|
-
function
|
|
65
|
-
var
|
|
68
|
+
function de(F) {
|
|
69
|
+
var h = F, {
|
|
66
70
|
month: t,
|
|
67
|
-
onMonthChange:
|
|
68
|
-
className:
|
|
69
|
-
} =
|
|
71
|
+
onMonthChange: n,
|
|
72
|
+
className: s = ""
|
|
73
|
+
} = h, i = J(h, [
|
|
70
74
|
"month",
|
|
71
75
|
"onMonthChange",
|
|
72
76
|
"className"
|
|
73
77
|
]);
|
|
74
78
|
const {
|
|
75
|
-
selectedDate:
|
|
76
|
-
selectedRange:
|
|
77
|
-
mode:
|
|
78
|
-
onDateChange:
|
|
79
|
-
onRangeChange:
|
|
79
|
+
selectedDate: g,
|
|
80
|
+
selectedRange: l,
|
|
81
|
+
mode: b,
|
|
82
|
+
onDateChange: W,
|
|
83
|
+
onRangeChange: M,
|
|
80
84
|
minDate: x,
|
|
81
85
|
maxDate: S,
|
|
82
|
-
disabledDates:
|
|
83
|
-
} =
|
|
84
|
-
t ||
|
|
85
|
-
),
|
|
86
|
-
const e = /* @__PURE__ */ new Date(),
|
|
87
|
-
return
|
|
86
|
+
disabledDates: k
|
|
87
|
+
} = ue(), [o, w] = K(
|
|
88
|
+
t || g || (l == null ? void 0 : l.start) || /* @__PURE__ */ new Date()
|
|
89
|
+
), Y = z(null), [c, B] = K(() => {
|
|
90
|
+
const e = /* @__PURE__ */ new Date(), r = t || g || (l == null ? void 0 : l.start) || e;
|
|
91
|
+
return g && D(g, r) ? g : D(e, r) ? e : new Date(r.getFullYear(), r.getMonth(), 1);
|
|
88
92
|
});
|
|
89
|
-
|
|
90
|
-
t &&
|
|
91
|
-
}, [t])
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
H(() => {
|
|
94
|
+
t && w(t);
|
|
95
|
+
}, [t]);
|
|
96
|
+
const N = z(!0);
|
|
97
|
+
H(() => {
|
|
98
|
+
if (N.current) {
|
|
99
|
+
N.current = !1;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (!Y.current) return;
|
|
103
|
+
const e = new Date(
|
|
104
|
+
c.getFullYear(),
|
|
105
|
+
c.getMonth(),
|
|
106
|
+
c.getDate()
|
|
107
|
+
).toISOString(), r = Y.current.querySelector(
|
|
108
|
+
`[data-date="${e}"]`
|
|
95
109
|
);
|
|
96
|
-
|
|
97
|
-
}, [
|
|
98
|
-
const
|
|
99
|
-
if (D(
|
|
110
|
+
r && r.focus();
|
|
111
|
+
}, [c]);
|
|
112
|
+
const U = (() => {
|
|
113
|
+
if (D(c, o)) return c;
|
|
100
114
|
const e = /* @__PURE__ */ new Date();
|
|
101
115
|
return D(e, o) ? e : new Date(o.getFullYear(), o.getMonth(), 1);
|
|
102
|
-
})(),
|
|
103
|
-
for (let e = 0; e <
|
|
116
|
+
})(), G = fe(o), Q = ge(o), p = [];
|
|
117
|
+
for (let e = 0; e < Q; e++)
|
|
104
118
|
p.push(null);
|
|
105
|
-
for (let e = 1; e <=
|
|
119
|
+
for (let e = 1; e <= G; e++)
|
|
106
120
|
p.push(
|
|
107
121
|
new Date(o.getFullYear(), o.getMonth(), e)
|
|
108
122
|
);
|
|
109
|
-
const
|
|
110
|
-
if (!
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
else if (
|
|
114
|
-
const
|
|
115
|
-
!
|
|
123
|
+
const $ = (e) => {
|
|
124
|
+
if (!R(e, x, S, k)) {
|
|
125
|
+
if (b === "single")
|
|
126
|
+
W(e);
|
|
127
|
+
else if (b === "range") {
|
|
128
|
+
const r = l || { start: null, end: null };
|
|
129
|
+
!r.start || r.start && r.end ? M({ start: e, end: null }) : r.start && !r.end && (e < r.start ? M({ start: e, end: r.start }) : M({ start: r.start, end: e }));
|
|
116
130
|
}
|
|
117
131
|
}
|
|
118
|
-
},
|
|
132
|
+
}, V = () => {
|
|
119
133
|
const e = new Date(
|
|
120
134
|
o.getFullYear(),
|
|
121
135
|
o.getMonth() - 1,
|
|
122
136
|
1
|
|
123
137
|
);
|
|
124
|
-
|
|
125
|
-
},
|
|
138
|
+
w(e), n == null || n(e);
|
|
139
|
+
}, X = () => {
|
|
126
140
|
const e = new Date(
|
|
127
141
|
o.getFullYear(),
|
|
128
142
|
o.getMonth() + 1,
|
|
129
143
|
1
|
|
130
144
|
);
|
|
131
|
-
|
|
132
|
-
},
|
|
133
|
-
let
|
|
145
|
+
w(e), n == null || n(e);
|
|
146
|
+
}, Z = (e, r) => {
|
|
147
|
+
let a = null;
|
|
134
148
|
switch (e.key) {
|
|
135
149
|
case "ArrowLeft":
|
|
136
|
-
e.preventDefault(),
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
150
|
+
e.preventDefault(), a = new Date(
|
|
151
|
+
r.getFullYear(),
|
|
152
|
+
r.getMonth(),
|
|
153
|
+
r.getDate() - 1
|
|
140
154
|
);
|
|
141
155
|
break;
|
|
142
156
|
case "ArrowRight":
|
|
143
|
-
e.preventDefault(),
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
157
|
+
e.preventDefault(), a = new Date(
|
|
158
|
+
r.getFullYear(),
|
|
159
|
+
r.getMonth(),
|
|
160
|
+
r.getDate() + 1
|
|
147
161
|
);
|
|
148
162
|
break;
|
|
149
163
|
case "ArrowUp":
|
|
150
|
-
e.preventDefault(),
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
164
|
+
e.preventDefault(), a = new Date(
|
|
165
|
+
r.getFullYear(),
|
|
166
|
+
r.getMonth(),
|
|
167
|
+
r.getDate() - 7
|
|
154
168
|
);
|
|
155
169
|
break;
|
|
156
170
|
case "ArrowDown":
|
|
157
|
-
e.preventDefault(),
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
171
|
+
e.preventDefault(), a = new Date(
|
|
172
|
+
r.getFullYear(),
|
|
173
|
+
r.getMonth(),
|
|
174
|
+
r.getDate() + 7
|
|
161
175
|
);
|
|
162
176
|
break;
|
|
163
177
|
case "Home":
|
|
164
|
-
e.preventDefault(),
|
|
178
|
+
e.preventDefault(), a = new Date(r.getFullYear(), r.getMonth(), 1);
|
|
165
179
|
break;
|
|
166
180
|
case "End":
|
|
167
|
-
e.preventDefault(),
|
|
181
|
+
e.preventDefault(), a = new Date(r.getFullYear(), r.getMonth() + 1, 0);
|
|
168
182
|
break;
|
|
169
183
|
case "Enter":
|
|
170
184
|
case " ":
|
|
171
|
-
e.preventDefault(),
|
|
185
|
+
e.preventDefault(), $(r);
|
|
172
186
|
return;
|
|
173
187
|
}
|
|
174
|
-
|
|
175
|
-
},
|
|
188
|
+
a && (D(a, o) || w(new Date(a.getFullYear(), a.getMonth(), 1)), B(a));
|
|
189
|
+
}, O = [];
|
|
176
190
|
for (let e = 0; e < p.length; e += 7)
|
|
177
|
-
|
|
191
|
+
O.push(p.slice(e, e + 7));
|
|
178
192
|
return /* @__PURE__ */ v(
|
|
179
193
|
"div",
|
|
180
|
-
|
|
181
|
-
ref:
|
|
182
|
-
className: `${
|
|
183
|
-
},
|
|
194
|
+
q(j({
|
|
195
|
+
ref: Y,
|
|
196
|
+
className: `${m("base", "p")} ${s}`
|
|
197
|
+
}, i), {
|
|
184
198
|
children: [
|
|
185
199
|
/* @__PURE__ */ v(
|
|
186
200
|
"div",
|
|
187
201
|
{
|
|
188
|
-
className: `flex items-center justify-between ${
|
|
202
|
+
className: `flex items-center justify-between ${m("base", "mb")}`,
|
|
189
203
|
children: [
|
|
190
204
|
/* @__PURE__ */ u(
|
|
191
|
-
|
|
205
|
+
L,
|
|
192
206
|
{
|
|
193
207
|
variant: "iconOnly",
|
|
194
208
|
size: "sm",
|
|
195
|
-
onClick:
|
|
209
|
+
onClick: V,
|
|
196
210
|
"aria-label": "Previous month",
|
|
197
|
-
children: /* @__PURE__ */ u(
|
|
211
|
+
children: /* @__PURE__ */ u(le, { className: "h-4 w-4" })
|
|
198
212
|
}
|
|
199
213
|
),
|
|
200
214
|
/* @__PURE__ */ v("div", { className: "text-sm font-semibold", children: [
|
|
201
|
-
|
|
215
|
+
he[o.getMonth()],
|
|
202
216
|
" ",
|
|
203
217
|
o.getFullYear()
|
|
204
218
|
] }),
|
|
205
219
|
/* @__PURE__ */ u(
|
|
206
|
-
|
|
220
|
+
L,
|
|
207
221
|
{
|
|
208
222
|
variant: "iconOnly",
|
|
209
223
|
size: "sm",
|
|
210
|
-
onClick:
|
|
224
|
+
onClick: X,
|
|
211
225
|
"aria-label": "Next month",
|
|
212
|
-
children: /* @__PURE__ */ u(
|
|
226
|
+
children: /* @__PURE__ */ u(oe, { className: "h-4 w-4" })
|
|
213
227
|
}
|
|
214
228
|
)
|
|
215
229
|
]
|
|
@@ -220,68 +234,69 @@ function Me(M) {
|
|
|
220
234
|
"div",
|
|
221
235
|
{
|
|
222
236
|
role: "row",
|
|
223
|
-
className: `grid grid-cols-7 ${
|
|
224
|
-
children:
|
|
237
|
+
className: `grid grid-cols-7 ${m("xs", "gap")} ${m("sm", "mb")}`,
|
|
238
|
+
children: De.map((e) => /* @__PURE__ */ u(
|
|
225
239
|
"div",
|
|
226
240
|
{
|
|
227
241
|
role: "columnheader",
|
|
228
|
-
className: `text-center text-xs font-medium text-fg-tertiary ${
|
|
242
|
+
className: `text-center text-xs font-medium text-fg-tertiary ${m("xs", "py")}`,
|
|
229
243
|
children: e
|
|
230
244
|
},
|
|
231
245
|
e
|
|
232
246
|
))
|
|
233
247
|
}
|
|
234
248
|
),
|
|
235
|
-
|
|
249
|
+
O.map((e, r) => /* @__PURE__ */ u(
|
|
236
250
|
"div",
|
|
237
251
|
{
|
|
238
252
|
role: "row",
|
|
239
|
-
className: `grid grid-cols-7 ${
|
|
240
|
-
children: e.map((
|
|
241
|
-
if (!
|
|
253
|
+
className: `grid grid-cols-7 ${m("xs", "gap")}`,
|
|
254
|
+
children: e.map((a, _) => {
|
|
255
|
+
if (!a)
|
|
242
256
|
return /* @__PURE__ */ u(
|
|
243
257
|
"div",
|
|
244
258
|
{
|
|
245
259
|
role: "gridcell",
|
|
246
260
|
className: "aspect-square"
|
|
247
261
|
},
|
|
248
|
-
`empty-${
|
|
262
|
+
`empty-${r}-${_}`
|
|
249
263
|
);
|
|
250
|
-
const
|
|
251
|
-
|
|
264
|
+
const T = b === "single" ? f(a, g) : f(a, (l == null ? void 0 : l.start) || null) || f(a, (l == null ? void 0 : l.end) || null), ee = b === "range" && l ? me(a, l.start, l.end) : !1, I = R(
|
|
265
|
+
a,
|
|
252
266
|
x,
|
|
253
267
|
S,
|
|
254
|
-
|
|
255
|
-
),
|
|
268
|
+
k
|
|
269
|
+
), A = f(a, /* @__PURE__ */ new Date()), te = f(a, c), re = f(a, U);
|
|
256
270
|
return /* @__PURE__ */ u(
|
|
257
271
|
"button",
|
|
258
272
|
{
|
|
259
273
|
role: "gridcell",
|
|
260
274
|
type: "button",
|
|
261
|
-
"data-date":
|
|
262
|
-
tabIndex:
|
|
263
|
-
onClick: () =>
|
|
264
|
-
onKeyDown: (
|
|
275
|
+
"data-date": a.toISOString(),
|
|
276
|
+
tabIndex: re ? 0 : -1,
|
|
277
|
+
onClick: () => $(a),
|
|
278
|
+
onKeyDown: (ne) => Z(ne, a),
|
|
265
279
|
className: `
|
|
266
280
|
aspect-square
|
|
267
281
|
text-sm
|
|
268
|
-
${
|
|
282
|
+
${ce("md")}
|
|
269
283
|
transition-colors
|
|
270
284
|
focus:outline-none
|
|
271
285
|
focus:ring-2
|
|
272
286
|
focus:ring-offset-1
|
|
273
|
-
${
|
|
287
|
+
${I ? "text-fg-disabled cursor-not-allowed opacity-50" : T ? "bg-surface-brand-strong text-fg-inverse font-semibold" : ee ? "bg-surface-brand-muted text-fg-brand-emphasis" : A ? "border-2 border-line-brand font-semibold" : te ? "bg-surface-brand-muted" : "hover:bg-surface-active"}
|
|
274
288
|
`,
|
|
275
|
-
"aria-label":
|
|
276
|
-
"aria-selected":
|
|
277
|
-
"aria-disabled":
|
|
278
|
-
|
|
289
|
+
"aria-label": a.toDateString(),
|
|
290
|
+
"aria-selected": T,
|
|
291
|
+
"aria-disabled": I,
|
|
292
|
+
"aria-current": A ? "date" : void 0,
|
|
293
|
+
children: a.getDate()
|
|
279
294
|
},
|
|
280
|
-
|
|
295
|
+
a.toISOString()
|
|
281
296
|
);
|
|
282
297
|
})
|
|
283
298
|
},
|
|
284
|
-
`week-${
|
|
299
|
+
`week-${r}`
|
|
285
300
|
))
|
|
286
301
|
] })
|
|
287
302
|
]
|
|
@@ -289,6 +304,6 @@ function Me(M) {
|
|
|
289
304
|
);
|
|
290
305
|
}
|
|
291
306
|
export {
|
|
292
|
-
|
|
307
|
+
de as DatePickerCalendar
|
|
293
308
|
};
|
|
294
309
|
//# sourceMappingURL=DatePickerCalendar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerCalendar.js","sources":["../../../../../src/ui/components/DatePicker/DatePickerCalendar.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useState,\n useEffect,\n useRef,\n type HTMLAttributes,\n type KeyboardEvent,\n} from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport Button from \"../../primitives/Button/Button\";\nimport { getRadiusClass } from \"../../tokens\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport interface DatePickerCalendarProps extends HTMLAttributes<HTMLDivElement> {\n month?: Date; // Current month to display\n onMonthChange?: (month: Date) => void;\n}\n\n// Helper functions for date manipulation (without date-fns dependency)\nfunction getDaysInMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\nfunction getFirstDayOfMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n}\n\nfunction isSameDay(date1: Date | null, date2: Date | null): boolean {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n}\n\nfunction isSameMonth(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth()\n );\n}\n\nfunction isDateInRange(\n date: Date,\n start: Date | null,\n end: Date | null,\n): boolean {\n if (!start || !end) return false;\n const time = date.getTime();\n return time >= start.getTime() && time <= end.getTime();\n}\n\nfunction isDateDisabled(\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n disabledDates?: Date[],\n): boolean {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n if (disabledDates?.some((d) => isSameDay(date, d))) return true;\n return false;\n}\n\nconst WEEKDAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport function DatePickerCalendar({\n month: controlledMonth,\n onMonthChange,\n className = \"\",\n ...props\n}: DatePickerCalendarProps) {\n const {\n selectedDate,\n selectedRange,\n mode,\n onDateChange,\n onRangeChange,\n minDate,\n maxDate,\n disabledDates,\n } = useDatePickerContext();\n\n const [currentMonth, setCurrentMonth] = useState<Date>(\n controlledMonth || selectedDate || selectedRange?.start || new Date(),\n );\n const calendarRef = useRef<HTMLDivElement>(null);\n\n // Initial focusedDate: prefer selectedDate if in currentMonth, else today\n // if in currentMonth, else first of currentMonth. Always non-null so\n // exactly one cell has tabIndex=0 — required for canonical grid roving\n // tabindex (Tab enters once, arrows navigate within).\n const [focusedDate, setFocusedDate] = useState<Date>(() => {\n const today = new Date();\n const initialMonth =\n controlledMonth || selectedDate || selectedRange?.start || today;\n if (selectedDate && isSameMonth(selectedDate, initialMonth)) {\n return selectedDate;\n }\n if (isSameMonth(today, initialMonth)) {\n return today;\n }\n return new Date(initialMonth.getFullYear(), initialMonth.getMonth(), 1);\n });\n\n // Update current month if controlled\n useEffect(() => {\n if (controlledMonth) {\n setCurrentMonth(controlledMonth);\n }\n }, [controlledMonth]);\n\n // Roving tabindex: when focusedDate changes (via arrow keys or initial\n // mount), move the DOM focus to the matching cell. Without this, axe\n // sees a correct grid structure but the keyboard experience is broken\n // — arrow keys change only the state, not the actual focus.\n useEffect(() => {\n if (!calendarRef.current) return;\n const cell = calendarRef.current.querySelector<HTMLElement>(\n `[data-date=\"${focusedDate.toISOString()}\"]`,\n );\n if (cell) cell.focus();\n }, [focusedDate]);\n\n // Effective focused date for tabIndex assignment: if focusedDate is not\n // in currentMonth (e.g. user clicked Prev/Next via mouse), still keep\n // exactly one cell with tabIndex=0 so Tab can re-enter the grid. Pick a\n // sensible fallback in the visible month.\n const effectiveFocusedDate = (() => {\n if (isSameMonth(focusedDate, currentMonth)) return focusedDate;\n const today = new Date();\n if (isSameMonth(today, currentMonth)) return today;\n return new Date(currentMonth.getFullYear(), currentMonth.getMonth(), 1);\n })();\n\n const daysInMonth = getDaysInMonth(currentMonth);\n const firstDay = getFirstDayOfMonth(currentMonth);\n const days: (Date | null)[] = [];\n\n // Add empty cells for days before the first day of the month\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n\n // Add all days of the month\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day),\n );\n }\n\n const handleDateClick = (date: Date) => {\n if (isDateDisabled(date, minDate, maxDate, disabledDates)) return;\n\n if (mode === \"single\") {\n onDateChange(date);\n } else if (mode === \"range\") {\n const currentRange = selectedRange || { start: null, end: null };\n if (!currentRange.start || (currentRange.start && currentRange.end)) {\n // Start new range\n onRangeChange({ start: date, end: null });\n } else if (currentRange.start && !currentRange.end) {\n // Complete range\n if (date < currentRange.start) {\n onRangeChange({ start: date, end: currentRange.start });\n } else {\n onRangeChange({ start: currentRange.start, end: date });\n }\n }\n }\n };\n\n const handlePreviousMonth = () => {\n const newMonth = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth() - 1,\n 1,\n );\n setCurrentMonth(newMonth);\n onMonthChange?.(newMonth);\n };\n\n const handleNextMonth = () => {\n const newMonth = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth() + 1,\n 1,\n );\n setCurrentMonth(newMonth);\n onMonthChange?.(newMonth);\n };\n\n const handleKeyDown = (\n e: KeyboardEvent<HTMLButtonElement | HTMLDivElement>,\n date: Date,\n ) => {\n let newDate: Date | null = null;\n\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() - 1,\n );\n break;\n case \"ArrowRight\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + 1,\n );\n break;\n case \"ArrowUp\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() - 7,\n );\n break;\n case \"ArrowDown\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + 7,\n );\n break;\n case \"Home\":\n e.preventDefault();\n newDate = new Date(date.getFullYear(), date.getMonth(), 1);\n break;\n case \"End\":\n e.preventDefault();\n newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n handleDateClick(date);\n return;\n }\n\n if (newDate) {\n // Adjust month if needed\n if (!isSameMonth(newDate, currentMonth)) {\n setCurrentMonth(new Date(newDate.getFullYear(), newDate.getMonth(), 1));\n }\n setFocusedDate(newDate);\n }\n };\n\n // Chunk days into rows of 7 (one per week). The previous implementation\n // rendered all ~35 day cells as direct children of a single CSS grid div,\n // which made role=\"grid\" structurally invalid (grid must contain rows;\n // rows must contain gridcells). Each week is now a role=\"row\".\n const weeks: (Date | null)[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return (\n <div\n ref={calendarRef}\n className={`${getSpacingClass(\"base\", \"p\")} ${className}`}\n {...props}\n >\n {/* Header with month navigation — sits OUTSIDE the role=\"grid\" so\n the grid's direct children are only rows. */}\n <div\n className={`flex items-center justify-between ${getSpacingClass(\"base\", \"mb\")}`}\n >\n <Button\n variant=\"iconOnly\"\n size=\"sm\"\n onClick={handlePreviousMonth}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"text-sm font-semibold\">\n {MONTHS[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </div>\n <Button\n variant=\"iconOnly\"\n size=\"sm\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div role=\"grid\" aria-label=\"Calendar\">\n {/* Weekday header row */}\n <div\n role=\"row\"\n className={`grid grid-cols-7 ${getSpacingClass(\"xs\", \"gap\")} ${getSpacingClass(\"sm\", \"mb\")}`}\n >\n {WEEKDAYS.map((day) => (\n <div\n key={day}\n role=\"columnheader\"\n className={`text-center text-xs font-medium text-fg-tertiary ${getSpacingClass(\"xs\", \"py\")}`}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid — one role=\"row\" per week, role=\"gridcell\" per day.\n The buttons carry role=\"gridcell\" explicitly: the explicit role\n overrides the implicit button role, so aria-selected (allowed on\n gridcell, prohibited on button) becomes valid. */}\n {weeks.map((week, weekIdx) => (\n <div\n role=\"row\"\n key={`week-${weekIdx}`}\n className={`grid grid-cols-7 ${getSpacingClass(\"xs\", \"gap\")}`}\n >\n {week.map((date, dayIdx) => {\n if (!date) {\n return (\n <div\n role=\"gridcell\"\n key={`empty-${weekIdx}-${dayIdx}`}\n className=\"aspect-square\"\n />\n );\n }\n\n const isSelected =\n mode === \"single\"\n ? isSameDay(date, selectedDate)\n : isSameDay(date, selectedRange?.start || null) ||\n isSameDay(date, selectedRange?.end || null);\n\n const isInRange =\n mode === \"range\" && selectedRange\n ? isDateInRange(date, selectedRange.start, selectedRange.end)\n : false;\n\n const isDisabled = isDateDisabled(\n date,\n minDate,\n maxDate,\n disabledDates,\n );\n const isToday = isSameDay(date, new Date());\n const isFocused = isSameDay(date, focusedDate);\n // Roving tabindex: exactly one cell has tabIndex=0 per render,\n // and it is the effective focused cell. Other cells are\n // tabIndex=-1 (programmatically focusable via arrows, but\n // skipped by Tab). When focusedDate is outside currentMonth\n // (mouse-driven Prev/Next month nav), effectiveFocusedDate\n // picks a fallback so the grid never loses its single tab stop.\n const isTabStop = isSameDay(date, effectiveFocusedDate);\n\n return (\n <button\n key={date.toISOString()}\n role=\"gridcell\"\n type=\"button\"\n data-date={date.toISOString()}\n tabIndex={isTabStop ? 0 : -1}\n onClick={() => handleDateClick(date)}\n onKeyDown={(e) => handleKeyDown(e, date)}\n className={`\n aspect-square\n text-sm\n ${getRadiusClass(\"md\")}\n transition-colors\n focus:outline-none\n focus:ring-2\n focus:ring-offset-1\n ${\n isDisabled\n ? \"text-fg-disabled cursor-not-allowed opacity-50\"\n : isSelected\n ? \"bg-surface-brand-strong text-fg-inverse font-semibold\"\n : isInRange\n ? \"bg-surface-brand-muted text-fg-brand-emphasis\"\n : isToday\n ? \"border-2 border-line-brand font-semibold\"\n : isFocused\n ? \"bg-surface-brand-muted\"\n : \"hover:bg-surface-active\"\n }\n `}\n aria-label={date.toDateString()}\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["getDaysInMonth","date","getFirstDayOfMonth","isSameDay","date1","date2","isSameMonth","isDateInRange","start","end","time","isDateDisabled","minDate","maxDate","disabledDates","d","WEEKDAYS","MONTHS","DatePickerCalendar","_a","_b","controlledMonth","onMonthChange","className","props","__objRest","selectedDate","selectedRange","mode","onDateChange","onRangeChange","useDatePickerContext","currentMonth","setCurrentMonth","useState","calendarRef","useRef","focusedDate","setFocusedDate","today","initialMonth","useEffect","cell","effectiveFocusedDate","daysInMonth","firstDay","days","i","day","handleDateClick","currentRange","handlePreviousMonth","newMonth","handleNextMonth","handleKeyDown","newDate","weeks","jsxs","__spreadProps","__spreadValues","getSpacingClass","jsx","Button","ChevronLeft","ChevronRight","week","weekIdx","dayIdx","isSelected","isInRange","isDisabled","isToday","isFocused","isTabStop","e","getRadiusClass"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAASA,GAAeC,GAAoB;AAC1C,SAAO,IAAI,KAAKA,EAAK,eAAeA,EAAK,SAAA,IAAa,GAAG,CAAC,EAAE,QAAA;AAC9D;AAEA,SAASC,GAAmBD,GAAoB;AAC9C,SAAO,IAAI,KAAKA,EAAK,YAAA,GAAeA,EAAK,SAAA,GAAY,CAAC,EAAE,OAAA;AAC1D;AAEA,SAASE,EAAUC,GAAoBC,GAA6B;AAClE,SAAI,CAACD,KAAS,CAACC,IAAc,KAE3BD,EAAM,YAAA,MAAkBC,EAAM,YAAA,KAC9BD,EAAM,SAAA,MAAeC,EAAM,cAC3BD,EAAM,QAAA,MAAcC,EAAM,QAAA;AAE9B;AAEA,SAASC,EAAYF,GAAaC,GAAsB;AACtD,SACED,EAAM,YAAA,MAAkBC,EAAM,iBAC9BD,EAAM,SAAA,MAAeC,EAAM,SAAA;AAE/B;AAEA,SAASE,GACPN,GACAO,GACAC,GACS;AACT,MAAI,CAACD,KAAS,CAACC,EAAK,QAAO;AAC3B,QAAMC,IAAOT,EAAK,QAAA;AAClB,SAAOS,KAAQF,EAAM,QAAA,KAAaE,KAAQD,EAAI,QAAA;AAChD;AAEA,SAASE,EACPV,GACAW,GACAC,GACAC,GACS;AAGT,SAFI,GAAAF,KAAWX,IAAOW,KAClBC,KAAWZ,IAAOY,KAClBC,KAAA,QAAAA,EAAe,KAAK,CAACC,MAAMZ,EAAUF,GAAMc,CAAC;AAElD;AAEA,MAAMC,KAAW,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GAC3DC,KAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAASC,GAAmBC,GAKP;AALO,MAAAC,IAAAD,GACjC;AAAA,WAAOE;AAAA,IACP,eAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,MAHqBH,GAI9BI,IAAAC,EAJ8BL,GAI9B;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAM;AAAA,IACJ,cAAAM;AAAA,IACA,eAAAC;AAAA,IACA,MAAAC;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,SAAAlB;AAAA,IACA,SAAAC;AAAA,IACA,eAAAC;AAAA,EAAA,IACEiB,GAAA,GAEE,CAACC,GAAcC,CAAe,IAAIC;AAAA,IACtCb,KAAmBK,MAAgBC,KAAA,gBAAAA,EAAe,8BAAa,KAAA;AAAA,EAAK,GAEhEQ,IAAcC,GAAuB,IAAI,GAMzC,CAACC,GAAaC,CAAc,IAAIJ,EAAe,MAAM;AACzD,UAAMK,wBAAY,KAAA,GACZC,IACJnB,KAAmBK,MAAgBC,KAAA,gBAAAA,EAAe,UAASY;AAC7D,WAAIb,KAAgBpB,EAAYoB,GAAcc,CAAY,IACjDd,IAELpB,EAAYiC,GAAOC,CAAY,IAC1BD,IAEF,IAAI,KAAKC,EAAa,YAAA,GAAeA,EAAa,SAAA,GAAY,CAAC;AAAA,EACxE,CAAC;AAGD,EAAAC,EAAU,MAAM;AACd,IAAIpB,KACFY,EAAgBZ,CAAe;AAAA,EAEnC,GAAG,CAACA,CAAe,CAAC,GAMpBoB,EAAU,MAAM;AACd,QAAI,CAACN,EAAY,QAAS;AAC1B,UAAMO,IAAOP,EAAY,QAAQ;AAAA,MAC/B,eAAeE,EAAY,YAAA,CAAa;AAAA,IAAA;AAE1C,IAAIK,OAAW,MAAA;AAAA,EACjB,GAAG,CAACL,CAAW,CAAC;AAMhB,QAAMM,KAAwB,MAAM;AAClC,QAAIrC,EAAY+B,GAAaL,CAAY,EAAG,QAAOK;AACnD,UAAME,wBAAY,KAAA;AAClB,WAAIjC,EAAYiC,GAAOP,CAAY,IAAUO,IACtC,IAAI,KAAKP,EAAa,YAAA,GAAeA,EAAa,SAAA,GAAY,CAAC;AAAA,EACxE,GAAA,GAEMY,IAAc5C,GAAegC,CAAY,GACzCa,IAAW3C,GAAmB8B,CAAY,GAC1Cc,IAAwB,CAAA;AAG9B,WAASC,IAAI,GAAGA,IAAIF,GAAUE;AAC5B,IAAAD,EAAK,KAAK,IAAI;AAIhB,WAASE,IAAM,GAAGA,KAAOJ,GAAaI;AACpC,IAAAF,EAAK;AAAA,MACH,IAAI,KAAKd,EAAa,YAAA,GAAeA,EAAa,SAAA,GAAYgB,CAAG;AAAA,IAAA;AAIrE,QAAMC,IAAkB,CAAChD,MAAe;AACtC,QAAI,CAAAU,EAAeV,GAAMW,GAASC,GAASC,CAAa;AAExD,UAAIc,MAAS;AACX,QAAAC,EAAa5B,CAAI;AAAA,eACR2B,MAAS,SAAS;AAC3B,cAAMsB,IAAevB,KAAiB,EAAE,OAAO,MAAM,KAAK,KAAA;AAC1D,QAAI,CAACuB,EAAa,SAAUA,EAAa,SAASA,EAAa,MAE7DpB,EAAc,EAAE,OAAO7B,GAAM,KAAK,MAAM,IAC/BiD,EAAa,SAAS,CAACA,EAAa,QAEzCjD,IAAOiD,EAAa,QACtBpB,EAAc,EAAE,OAAO7B,GAAM,KAAKiD,EAAa,OAAO,IAEtDpB,EAAc,EAAE,OAAOoB,EAAa,OAAO,KAAKjD,GAAM;AAAA,MAG5D;AAAA;AAAA,EACF,GAEMkD,IAAsB,MAAM;AAChC,UAAMC,IAAW,IAAI;AAAA,MACnBpB,EAAa,YAAA;AAAA,MACbA,EAAa,aAAa;AAAA,MAC1B;AAAA,IAAA;AAEF,IAAAC,EAAgBmB,CAAQ,GACxB9B,KAAA,QAAAA,EAAgB8B;AAAA,EAClB,GAEMC,IAAkB,MAAM;AAC5B,UAAMD,IAAW,IAAI;AAAA,MACnBpB,EAAa,YAAA;AAAA,MACbA,EAAa,aAAa;AAAA,MAC1B;AAAA,IAAA;AAEF,IAAAC,EAAgBmB,CAAQ,GACxB9B,KAAA,QAAAA,EAAgB8B;AAAA,EAClB,GAEME,IAAgB,CACpB,GACArD,MACG;AACH,QAAIsD,IAAuB;AAE3B,YAAQ,EAAE,KAAA;AAAA,MACR,KAAK;AACH,UAAE,eAAA,GACFA,IAAU,IAAI;AAAA,UACZtD,EAAK,YAAA;AAAA,UACLA,EAAK,SAAA;AAAA,UACLA,EAAK,YAAY;AAAA,QAAA;AAEnB;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFsD,IAAU,IAAI;AAAA,UACZtD,EAAK,YAAA;AAAA,UACLA,EAAK,SAAA;AAAA,UACLA,EAAK,YAAY;AAAA,QAAA;AAEnB;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFsD,IAAU,IAAI;AAAA,UACZtD,EAAK,YAAA;AAAA,UACLA,EAAK,SAAA;AAAA,UACLA,EAAK,YAAY;AAAA,QAAA;AAEnB;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFsD,IAAU,IAAI;AAAA,UACZtD,EAAK,YAAA;AAAA,UACLA,EAAK,SAAA;AAAA,UACLA,EAAK,YAAY;AAAA,QAAA;AAEnB;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFsD,IAAU,IAAI,KAAKtD,EAAK,YAAA,GAAeA,EAAK,SAAA,GAAY,CAAC;AACzD;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFsD,IAAU,IAAI,KAAKtD,EAAK,YAAA,GAAeA,EAAK,SAAA,IAAa,GAAG,CAAC;AAC7D;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,UAAE,eAAA,GACFgD,EAAgBhD,CAAI;AACpB;AAAA,IAAA;AAGJ,IAAIsD,MAEGjD,EAAYiD,GAASvB,CAAY,KACpCC,EAAgB,IAAI,KAAKsB,EAAQ,YAAA,GAAeA,EAAQ,YAAY,CAAC,CAAC,GAExEjB,EAAeiB,CAAO;AAAA,EAE1B,GAMMC,IAA2B,CAAA;AACjC,WAAST,IAAI,GAAGA,IAAID,EAAK,QAAQC,KAAK;AACpC,IAAAS,EAAM,KAAKV,EAAK,MAAMC,GAAGA,IAAI,CAAC,CAAC;AAGjC,SACE,gBAAAU;AAAA,IAAC;AAAA,IAAAC,EAAAC,EAAA;AAAA,MACC,KAAKxB;AAAA,MACL,WAAW,GAAGyB,EAAgB,QAAQ,GAAG,CAAC,IAAIrC,CAAS;AAAA,OACnDC,IAHL;AAAA,MAOC,UAAA;AAAA,QAAA,gBAAAiC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,qCAAqCG,EAAgB,QAAQ,IAAI,CAAC;AAAA,YAE7E,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAASX;AAAA,kBACT,cAAW;AAAA,kBAEX,UAAA,gBAAAU,EAACE,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEnC,gBAAAN,EAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,gBAAAxC,GAAOe,EAAa,UAAU;AAAA,gBAAE;AAAA,gBAAEA,EAAa,YAAA;AAAA,cAAY,GAC9D;AAAA,cACA,gBAAA6B;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAST;AAAA,kBACT,cAAW;AAAA,kBAEX,UAAA,gBAAAQ,EAACG,IAAA,EAAa,WAAU,UAAA,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACpC;AAAA,UAAA;AAAA,QAAA;AAAA,QAGF,gBAAAP,EAAC,OAAA,EAAI,MAAK,QAAO,cAAW,YAE1B,UAAA;AAAA,UAAA,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,oBAAoBD,EAAgB,MAAM,KAAK,CAAC,IAAIA,EAAgB,MAAM,IAAI,CAAC;AAAA,cAEzF,UAAA5C,GAAS,IAAI,CAACgC,MACb,gBAAAa;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAW,oDAAoDD,EAAgB,MAAM,IAAI,CAAC;AAAA,kBAEzF,UAAAZ;AAAA,gBAAA;AAAA,gBAJIA;AAAA,cAAA,CAMR;AAAA,YAAA;AAAA,UAAA;AAAA,UAOFQ,EAAM,IAAI,CAACS,GAAMC,MAChB,gBAAAL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cAEL,WAAW,oBAAoBD,EAAgB,MAAM,KAAK,CAAC;AAAA,cAE1D,UAAAK,EAAK,IAAI,CAAChE,GAAMkE,MAAW;AAC1B,oBAAI,CAAClE;AACH,yBACE,gBAAA4D;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBAEL,WAAU;AAAA,oBAAA;AAAA,oBADL,SAASK,CAAO,IAAIC,CAAM;AAAA,kBAAA;AAMrC,sBAAMC,IACJxC,MAAS,WACLzB,EAAUF,GAAMyB,CAAY,IAC5BvB,EAAUF,IAAM0B,KAAA,gBAAAA,EAAe,UAAS,IAAI,KAC5CxB,EAAUF,IAAM0B,KAAA,gBAAAA,EAAe,QAAO,IAAI,GAE1C0C,IACJzC,MAAS,WAAWD,IAChBpB,GAAcN,GAAM0B,EAAc,OAAOA,EAAc,GAAG,IAC1D,IAEA2C,IAAa3D;AAAA,kBACjBV;AAAA,kBACAW;AAAA,kBACAC;AAAA,kBACAC;AAAA,gBAAA,GAEIyD,IAAUpE,EAAUF,GAAM,oBAAI,MAAM,GACpCuE,IAAYrE,EAAUF,GAAMoC,CAAW,GAOvCoC,IAAYtE,EAAUF,GAAM0C,CAAoB;AAEtD,uBACE,gBAAAkB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,aAAW5D,EAAK,YAAA;AAAA,oBAChB,UAAUwE,IAAY,IAAI;AAAA,oBAC1B,SAAS,MAAMxB,EAAgBhD,CAAI;AAAA,oBACnC,WAAW,CAACyE,OAAMpB,EAAcoB,IAAGzE,CAAI;AAAA,oBACvC,WAAW;AAAA;AAAA;AAAA,kBAGX0E,GAAe,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMpBL,IACI,mDACAF,IACE,0DACAC,IACE,kDACAE,IACE,6CACAC,IACE,2BACA,yBACd;AAAA;AAAA,oBAEE,cAAYvE,EAAK,aAAA;AAAA,oBACjB,iBAAemE;AAAA,oBACf,iBAAeE;AAAA,oBAEd,YAAK,QAAA;AAAA,kBAAQ;AAAA,kBAjCTrE,EAAK,YAAA;AAAA,gBAAY;AAAA,cAoC5B,CAAC;AAAA,YAAA;AAAA,YA/EI,QAAQiE,CAAO;AAAA,UAAA,CAiFvB;AAAA,QAAA,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
1
|
+
{"version":3,"file":"DatePickerCalendar.js","sources":["../../../../../src/ui/components/DatePicker/DatePickerCalendar.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useState,\n useEffect,\n useRef,\n type HTMLAttributes,\n type KeyboardEvent,\n} from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport Button from \"../../primitives/Button/Button\";\nimport { getRadiusClass } from \"../../tokens\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport interface DatePickerCalendarProps extends HTMLAttributes<HTMLDivElement> {\n month?: Date; // Current month to display\n onMonthChange?: (month: Date) => void;\n}\n\n// Helper functions for date manipulation (without date-fns dependency)\nfunction getDaysInMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\nfunction getFirstDayOfMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n}\n\nfunction isSameDay(date1: Date | null, date2: Date | null): boolean {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n}\n\nfunction isSameMonth(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth()\n );\n}\n\nfunction isDateInRange(\n date: Date,\n start: Date | null,\n end: Date | null,\n): boolean {\n if (!start || !end) return false;\n const time = date.getTime();\n return time >= start.getTime() && time <= end.getTime();\n}\n\n// Compare by calendar day, not by instant. Cells are local midnight, but\n// consumers routinely pass minDate={new Date()} (now, with a time-of-day)\n// to mean \"today onward\"; a raw `date < minDate` then disabled today\n// because midnight < now. Normalizing both sides to the start of their day\n// makes the bounds inclusive of the boundary day, as intended.\nfunction startOfDay(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\nfunction isDateDisabled(\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n disabledDates?: Date[],\n): boolean {\n const day = startOfDay(date);\n if (minDate && day < startOfDay(minDate)) return true;\n if (maxDate && day > startOfDay(maxDate)) return true;\n if (disabledDates?.some((d) => isSameDay(date, d))) return true;\n return false;\n}\n\nconst WEEKDAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport function DatePickerCalendar({\n month: controlledMonth,\n onMonthChange,\n className = \"\",\n ...props\n}: DatePickerCalendarProps) {\n const {\n selectedDate,\n selectedRange,\n mode,\n onDateChange,\n onRangeChange,\n minDate,\n maxDate,\n disabledDates,\n } = useDatePickerContext();\n\n const [currentMonth, setCurrentMonth] = useState<Date>(\n controlledMonth || selectedDate || selectedRange?.start || new Date(),\n );\n const calendarRef = useRef<HTMLDivElement>(null);\n\n // Initial focusedDate: prefer selectedDate if in currentMonth, else today\n // if in currentMonth, else first of currentMonth. Always non-null so\n // exactly one cell has tabIndex=0 — required for canonical grid roving\n // tabindex (Tab enters once, arrows navigate within).\n const [focusedDate, setFocusedDate] = useState<Date>(() => {\n const today = new Date();\n const initialMonth =\n controlledMonth || selectedDate || selectedRange?.start || today;\n if (selectedDate && isSameMonth(selectedDate, initialMonth)) {\n return selectedDate;\n }\n if (isSameMonth(today, initialMonth)) {\n return today;\n }\n return new Date(initialMonth.getFullYear(), initialMonth.getMonth(), 1);\n });\n\n // Update current month if controlled\n useEffect(() => {\n if (controlledMonth) {\n setCurrentMonth(controlledMonth);\n }\n }, [controlledMonth]);\n\n // Roving tabindex: when focusedDate changes via arrow keys, move DOM\n // focus to the matching cell. Two bugs fixed here:\n // 1. The initial mount is skipped — the calendar opens on input FOCUS,\n // so focusing a grid cell on mount yanked focus away from the input\n // the user just focused (they couldn't type). The grid is reachable\n // via Tab (roving tabindex) / ArrowDown; focus only follows arrow\n // navigation, not the open.\n // 2. The lookup key is normalized to local midnight. Cells render their\n // data-date from a midnight-local Date, but focusedDate (seeded from\n // selectedDate/today) carries a time-of-day, so the raw\n // toISOString() never matched and focus silently failed.\n const isInitialMount = useRef(true);\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false;\n return;\n }\n if (!calendarRef.current) return;\n const key = new Date(\n focusedDate.getFullYear(),\n focusedDate.getMonth(),\n focusedDate.getDate(),\n ).toISOString();\n const cell = calendarRef.current.querySelector<HTMLElement>(\n `[data-date=\"${key}\"]`,\n );\n if (cell) cell.focus();\n }, [focusedDate]);\n\n // Effective focused date for tabIndex assignment: if focusedDate is not\n // in currentMonth (e.g. user clicked Prev/Next via mouse), still keep\n // exactly one cell with tabIndex=0 so Tab can re-enter the grid. Pick a\n // sensible fallback in the visible month.\n const effectiveFocusedDate = (() => {\n if (isSameMonth(focusedDate, currentMonth)) return focusedDate;\n const today = new Date();\n if (isSameMonth(today, currentMonth)) return today;\n return new Date(currentMonth.getFullYear(), currentMonth.getMonth(), 1);\n })();\n\n const daysInMonth = getDaysInMonth(currentMonth);\n const firstDay = getFirstDayOfMonth(currentMonth);\n const days: (Date | null)[] = [];\n\n // Add empty cells for days before the first day of the month\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n\n // Add all days of the month\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day),\n );\n }\n\n const handleDateClick = (date: Date) => {\n if (isDateDisabled(date, minDate, maxDate, disabledDates)) return;\n\n if (mode === \"single\") {\n onDateChange(date);\n } else if (mode === \"range\") {\n const currentRange = selectedRange || { start: null, end: null };\n if (!currentRange.start || (currentRange.start && currentRange.end)) {\n // Start new range\n onRangeChange({ start: date, end: null });\n } else if (currentRange.start && !currentRange.end) {\n // Complete range\n if (date < currentRange.start) {\n onRangeChange({ start: date, end: currentRange.start });\n } else {\n onRangeChange({ start: currentRange.start, end: date });\n }\n }\n }\n };\n\n const handlePreviousMonth = () => {\n const newMonth = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth() - 1,\n 1,\n );\n setCurrentMonth(newMonth);\n onMonthChange?.(newMonth);\n };\n\n const handleNextMonth = () => {\n const newMonth = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth() + 1,\n 1,\n );\n setCurrentMonth(newMonth);\n onMonthChange?.(newMonth);\n };\n\n const handleKeyDown = (\n e: KeyboardEvent<HTMLButtonElement | HTMLDivElement>,\n date: Date,\n ) => {\n let newDate: Date | null = null;\n\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() - 1,\n );\n break;\n case \"ArrowRight\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + 1,\n );\n break;\n case \"ArrowUp\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() - 7,\n );\n break;\n case \"ArrowDown\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + 7,\n );\n break;\n case \"Home\":\n e.preventDefault();\n newDate = new Date(date.getFullYear(), date.getMonth(), 1);\n break;\n case \"End\":\n e.preventDefault();\n newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n handleDateClick(date);\n return;\n }\n\n if (newDate) {\n // Adjust month if needed\n if (!isSameMonth(newDate, currentMonth)) {\n setCurrentMonth(new Date(newDate.getFullYear(), newDate.getMonth(), 1));\n }\n setFocusedDate(newDate);\n }\n };\n\n // Chunk days into rows of 7 (one per week). The previous implementation\n // rendered all ~35 day cells as direct children of a single CSS grid div,\n // which made role=\"grid\" structurally invalid (grid must contain rows;\n // rows must contain gridcells). Each week is now a role=\"row\".\n const weeks: (Date | null)[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return (\n <div\n ref={calendarRef}\n className={`${getSpacingClass(\"base\", \"p\")} ${className}`}\n {...props}\n >\n {/* Header with month navigation — sits OUTSIDE the role=\"grid\" so\n the grid's direct children are only rows. */}\n <div\n className={`flex items-center justify-between ${getSpacingClass(\"base\", \"mb\")}`}\n >\n <Button\n variant=\"iconOnly\"\n size=\"sm\"\n onClick={handlePreviousMonth}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"text-sm font-semibold\">\n {MONTHS[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </div>\n <Button\n variant=\"iconOnly\"\n size=\"sm\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div role=\"grid\" aria-label=\"Calendar\">\n {/* Weekday header row */}\n <div\n role=\"row\"\n className={`grid grid-cols-7 ${getSpacingClass(\"xs\", \"gap\")} ${getSpacingClass(\"sm\", \"mb\")}`}\n >\n {WEEKDAYS.map((day) => (\n <div\n key={day}\n role=\"columnheader\"\n className={`text-center text-xs font-medium text-fg-tertiary ${getSpacingClass(\"xs\", \"py\")}`}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid — one role=\"row\" per week, role=\"gridcell\" per day.\n The buttons carry role=\"gridcell\" explicitly: the explicit role\n overrides the implicit button role, so aria-selected (allowed on\n gridcell, prohibited on button) becomes valid. */}\n {weeks.map((week, weekIdx) => (\n <div\n role=\"row\"\n key={`week-${weekIdx}`}\n className={`grid grid-cols-7 ${getSpacingClass(\"xs\", \"gap\")}`}\n >\n {week.map((date, dayIdx) => {\n if (!date) {\n return (\n <div\n role=\"gridcell\"\n key={`empty-${weekIdx}-${dayIdx}`}\n className=\"aspect-square\"\n />\n );\n }\n\n const isSelected =\n mode === \"single\"\n ? isSameDay(date, selectedDate)\n : isSameDay(date, selectedRange?.start || null) ||\n isSameDay(date, selectedRange?.end || null);\n\n const isInRange =\n mode === \"range\" && selectedRange\n ? isDateInRange(date, selectedRange.start, selectedRange.end)\n : false;\n\n const isDisabled = isDateDisabled(\n date,\n minDate,\n maxDate,\n disabledDates,\n );\n const isToday = isSameDay(date, new Date());\n const isFocused = isSameDay(date, focusedDate);\n // Roving tabindex: exactly one cell has tabIndex=0 per render,\n // and it is the effective focused cell. Other cells are\n // tabIndex=-1 (programmatically focusable via arrows, but\n // skipped by Tab). When focusedDate is outside currentMonth\n // (mouse-driven Prev/Next month nav), effectiveFocusedDate\n // picks a fallback so the grid never loses its single tab stop.\n const isTabStop = isSameDay(date, effectiveFocusedDate);\n\n return (\n <button\n key={date.toISOString()}\n role=\"gridcell\"\n type=\"button\"\n data-date={date.toISOString()}\n tabIndex={isTabStop ? 0 : -1}\n onClick={() => handleDateClick(date)}\n onKeyDown={(e) => handleKeyDown(e, date)}\n className={`\n aspect-square\n text-sm\n ${getRadiusClass(\"md\")}\n transition-colors\n focus:outline-none\n focus:ring-2\n focus:ring-offset-1\n ${\n isDisabled\n ? \"text-fg-disabled cursor-not-allowed opacity-50\"\n : isSelected\n ? \"bg-surface-brand-strong text-fg-inverse font-semibold\"\n : isInRange\n ? \"bg-surface-brand-muted text-fg-brand-emphasis\"\n : isToday\n ? \"border-2 border-line-brand font-semibold\"\n : isFocused\n ? \"bg-surface-brand-muted\"\n : \"hover:bg-surface-active\"\n }\n `}\n aria-label={date.toDateString()}\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n aria-current={isToday ? \"date\" : undefined}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["getDaysInMonth","date","getFirstDayOfMonth","isSameDay","date1","date2","isSameMonth","isDateInRange","start","end","time","startOfDay","d","isDateDisabled","minDate","maxDate","disabledDates","day","WEEKDAYS","MONTHS","DatePickerCalendar","_a","_b","controlledMonth","onMonthChange","className","props","__objRest","selectedDate","selectedRange","mode","onDateChange","onRangeChange","useDatePickerContext","currentMonth","setCurrentMonth","useState","calendarRef","useRef","focusedDate","setFocusedDate","today","initialMonth","useEffect","isInitialMount","key","cell","effectiveFocusedDate","daysInMonth","firstDay","days","i","handleDateClick","currentRange","handlePreviousMonth","newMonth","handleNextMonth","handleKeyDown","newDate","weeks","jsxs","__spreadProps","__spreadValues","getSpacingClass","jsx","Button","ChevronLeft","ChevronRight","week","weekIdx","dayIdx","isSelected","isInRange","isDisabled","isToday","isFocused","isTabStop","e","getRadiusClass"],"mappings":"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"}
|