@fabio.caffarello/react-design-system 3.13.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/granular/ui/components/Autocomplete/Autocomplete.js +103 -86
  2. package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -1
  3. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +57 -47
  4. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -1
  5. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +21 -20
  6. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -1
  7. package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -1
  8. package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -1
  9. package/dist/granular/ui/components/CommandPalette/CommandPalette.js +187 -149
  10. package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -1
  11. package/dist/granular/ui/components/DataGrid/DataGrid.js +92 -92
  12. package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -1
  13. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +154 -139
  14. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -1
  15. package/dist/granular/ui/components/Dialog/AlertDialog.js +73 -40
  16. package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -1
  17. package/dist/granular/ui/components/Dialog/DialogContent.js +54 -48
  18. package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -1
  19. package/dist/granular/ui/components/Dialog/DialogDescription.js +31 -31
  20. package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -1
  21. package/dist/granular/ui/components/Dialog/DialogTitle.js +30 -30
  22. package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -1
  23. package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -1
  24. package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -1
  25. package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -1
  26. package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -1
  27. package/dist/granular/ui/components/Form/Form.js +38 -37
  28. package/dist/granular/ui/components/Form/Form.js.map +1 -1
  29. package/dist/granular/ui/components/Form/FormField.js +28 -26
  30. package/dist/granular/ui/components/Form/FormField.js.map +1 -1
  31. package/dist/granular/ui/components/Header/Header.js.map +1 -1
  32. package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -1
  33. package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -1
  34. package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -1
  35. package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -1
  36. package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -1
  37. package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -1
  38. package/dist/granular/ui/components/Menu/Menu.js.map +1 -1
  39. package/dist/granular/ui/components/Modal/Modal.js +98 -86
  40. package/dist/granular/ui/components/Modal/Modal.js.map +1 -1
  41. package/dist/granular/ui/components/MultiSelect/MultiSelect.js +122 -106
  42. package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -1
  43. package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -1
  44. package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -1
  45. package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -1
  46. package/dist/granular/ui/components/Popover/Popover.js.map +1 -1
  47. package/dist/granular/ui/components/Rating/Rating.js.map +1 -1
  48. package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -1
  49. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +82 -64
  50. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -1
  51. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +30 -29
  52. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -1
  53. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +37 -35
  54. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -1
  55. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +57 -57
  56. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -1
  57. package/dist/granular/ui/components/Stepper/Stepper.js +102 -94
  58. package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -1
  59. package/dist/granular/ui/components/Table/Table.js +41 -35
  60. package/dist/granular/ui/components/Table/Table.js.map +1 -1
  61. package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -1
  62. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +49 -46
  63. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -1
  64. package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -1
  65. package/dist/granular/ui/components/Table/TableProvider.js +82 -80
  66. package/dist/granular/ui/components/Table/TableProvider.js.map +1 -1
  67. package/dist/granular/ui/components/Table/TableRow.js +57 -53
  68. package/dist/granular/ui/components/Table/TableRow.js.map +1 -1
  69. package/dist/granular/ui/components/Table/useColumnResizing.js +53 -53
  70. package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -1
  71. package/dist/granular/ui/components/TimePicker/TimePicker.js +149 -103
  72. package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -1
  73. package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -1
  74. package/dist/granular/ui/hooks/useFocusRestore.js +14 -15
  75. package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -1
  76. package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -1
  77. package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -1
  78. package/dist/granular/ui/primitives/Chip/Chip.js +91 -71
  79. package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -1
  80. package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -1
  81. package/dist/granular/ui/primitives/Input/Input.js.map +1 -1
  82. package/dist/granular/ui/primitives/Label/Label.js.map +1 -1
  83. package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -1
  84. package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -1
  85. package/dist/granular/ui/primitives/Select/Select.js.map +1 -1
  86. package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -1
  87. package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -1
  88. package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -1
  89. package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -1
  90. package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -1
  91. package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -1
  92. package/dist/granular/ui/providers/DialogContext.js.map +1 -1
  93. package/dist/granular/ui/providers/DialogProvider.js +24 -20
  94. package/dist/granular/ui/providers/DialogProvider.js.map +1 -1
  95. package/dist/index.cjs +144 -144
  96. package/dist/index.cjs.map +1 -1
  97. package/dist/index.js +5780 -5486
  98. package/dist/index.js.map +1 -1
  99. package/dist/react-design-system.css +1 -1
  100. package/dist/server/index.cjs +7 -7
  101. package/dist/server/index.cjs.map +1 -1
  102. package/dist/server/index.js +404 -384
  103. package/dist/server/index.js.map +1 -1
  104. package/dist/ui/components/Autocomplete/AutocompleteList.d.ts +4 -0
  105. package/dist/ui/components/Autocomplete/AutocompleteOption.d.ts +8 -0
  106. package/dist/ui/components/Breadcrumb/Breadcrumb.d.ts +0 -1
  107. package/dist/ui/components/ColorPicker/ColorPicker.d.ts +0 -1
  108. package/dist/ui/components/CommandPalette/CommandPalette.d.ts +0 -1
  109. package/dist/ui/components/DataGrid/DataGrid.d.ts +0 -1
  110. package/dist/ui/components/Dialog/DialogContent.d.ts +20 -1
  111. package/dist/ui/components/Drawer/Drawer.d.ts +0 -1
  112. package/dist/ui/components/Dropdown/Dropdown.d.ts +0 -1
  113. package/dist/ui/components/EmptyState/EmptyState.d.ts +0 -1
  114. package/dist/ui/components/FileUpload/FileUpload.d.ts +0 -1
  115. package/dist/ui/components/Form/FormField.d.ts +7 -0
  116. package/dist/ui/components/Header/Header.d.ts +1 -1
  117. package/dist/ui/components/Header/components/HeaderActions.d.ts +1 -1
  118. package/dist/ui/components/Header/components/HeaderHamburger.d.ts +1 -1
  119. package/dist/ui/components/Header/components/HeaderLogo.d.ts +1 -1
  120. package/dist/ui/components/Header/components/HeaderMobileMenu.d.ts +1 -1
  121. package/dist/ui/components/Header/components/HeaderNavigation.d.ts +1 -1
  122. package/dist/ui/components/Header/contexts/HeaderContext.d.ts +1 -1
  123. package/dist/ui/components/Menu/Menu.d.ts +0 -1
  124. package/dist/ui/components/Modal/Modal.d.ts +1 -2
  125. package/dist/ui/components/Navigation/Navigation.d.ts +1 -1
  126. package/dist/ui/components/PageHeader/PageHeader.d.ts +1 -1
  127. package/dist/ui/components/Pagination/Pagination.d.ts +0 -1
  128. package/dist/ui/components/Popover/Popover.d.ts +0 -1
  129. package/dist/ui/components/Rating/Rating.d.ts +0 -1
  130. package/dist/ui/components/SearchInput/SearchInput.d.ts +0 -1
  131. package/dist/ui/components/Stepper/Stepper.d.ts +0 -1
  132. package/dist/ui/components/Table/TableActions/TableActions.d.ts +0 -1
  133. package/dist/ui/components/Table/TableFilters/TableFilters.d.ts +0 -1
  134. package/dist/ui/components/Table/TablePagination/TablePagination.d.ts +0 -1
  135. package/dist/ui/components/TimePicker/TimePicker.d.ts +0 -1
  136. package/dist/ui/components/Timeline/Timeline.d.ts +0 -1
  137. package/dist/ui/primitives/Checkbox/Checkbox.d.ts +0 -1
  138. package/dist/ui/primitives/Chip/Chip.d.ts +21 -0
  139. package/dist/ui/primitives/ErrorMessage/ErrorMessage.d.ts +0 -1
  140. package/dist/ui/primitives/Input/Input.d.ts +0 -1
  141. package/dist/ui/primitives/Label/Label.d.ts +0 -1
  142. package/dist/ui/primitives/NavLink/NavLink.d.ts +1 -1
  143. package/dist/ui/primitives/Radio/Radio.d.ts +0 -1
  144. package/dist/ui/primitives/Select/Select.d.ts +0 -1
  145. package/dist/ui/primitives/Skeleton/Skeleton.d.ts +0 -1
  146. package/dist/ui/primitives/Slider/Slider.d.ts +0 -1
  147. package/dist/ui/primitives/Switch/Switch.d.ts +0 -1
  148. package/dist/ui/primitives/Tooltip/Tooltip.d.ts +0 -1
  149. package/dist/ui/providers/DialogContext.d.ts +8 -0
  150. package/package.json +7 -7
@@ -1,53 +1,57 @@
1
1
  "use client";
2
- var te = Object.defineProperty, re = Object.defineProperties;
3
- var ne = Object.getOwnPropertyDescriptors;
4
- var w = Object.getOwnPropertySymbols;
5
- var A = Object.prototype.hasOwnProperty, I = Object.prototype.propertyIsEnumerable;
6
- var T = (t, r, a) => r in t ? te(t, r, { enumerable: !0, configurable: !0, writable: !0, value: a }) : t[r] = a, C = (t, r) => {
7
- for (var a in r || (r = {}))
8
- A.call(r, a) && T(t, a, r[a]);
9
- if (w)
10
- for (var a of w(r))
11
- I.call(r, a) && T(t, a, r[a]);
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
- }, E = (t, r) => re(t, ne(r));
14
- var P = (t, r) => {
15
- var a = {};
16
- for (var l in t)
17
- A.call(t, l) && r.indexOf(l) < 0 && (a[l] = t[l]);
18
- if (t != null && w)
19
- for (var l of w(t))
20
- r.indexOf(l) < 0 && I.call(t, l) && (a[l] = t[l]);
21
- return a;
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 j, useRef as se, useEffect as q } from "react";
25
- import { ChevronLeft as ae, ChevronRight as le } from "lucide-react";
26
- import { useDatePickerContext as ie } from "./DatePickerContext.js";
27
- import { Button as J } from "../../primitives/Button/Button.js";
28
- import { getSpacingClass as g } from "../../tokens/spacing.js";
29
- import { getRadiusClass as oe } from "../../tokens/radius.js";
30
- function ue(t) {
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 ce(t) {
33
+ function ge(t) {
34
34
  return new Date(t.getFullYear(), t.getMonth(), 1).getDay();
35
35
  }
36
- function c(t, r) {
37
- return !t || !r ? !1 : t.getFullYear() === r.getFullYear() && t.getMonth() === r.getMonth() && t.getDate() === r.getDate();
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, r) {
40
- return t.getFullYear() === r.getFullYear() && t.getMonth() === r.getMonth();
39
+ function D(t, n) {
40
+ return t.getFullYear() === n.getFullYear() && t.getMonth() === n.getMonth();
41
41
  }
42
- function fe(t, r, a) {
43
- if (!r || !a) return !1;
44
- const l = t.getTime();
45
- return l >= r.getTime() && l <= a.getTime();
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 K(t, r, a, l) {
48
- return !!(r && t < r || a && t > a || l != null && l.some((M) => c(t, M)));
47
+ function d(t) {
48
+ return new Date(t.getFullYear(), t.getMonth(), t.getDate()).getTime();
49
49
  }
50
- const ge = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], me = [
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 Me(M) {
65
- var Y = M, {
68
+ function de(F) {
69
+ var h = F, {
66
70
  month: t,
67
- onMonthChange: r,
68
- className: a = ""
69
- } = Y, l = P(Y, [
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: f,
76
- selectedRange: i,
77
- mode: h,
78
- onDateChange: z,
79
- onRangeChange: y,
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: d
83
- } = ie(), [o, b] = j(
84
- t || f || (i == null ? void 0 : i.start) || /* @__PURE__ */ new Date()
85
- ), F = se(null), [m, H] = j(() => {
86
- const e = /* @__PURE__ */ new Date(), n = t || f || (i == null ? void 0 : i.start) || e;
87
- return f && D(f, n) ? f : D(e, n) ? e : new Date(n.getFullYear(), n.getMonth(), 1);
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
- q(() => {
90
- t && b(t);
91
- }, [t]), q(() => {
92
- if (!F.current) return;
93
- const e = F.current.querySelector(
94
- `[data-date="${m.toISOString()}"]`
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
- e && e.focus();
97
- }, [m]);
98
- const L = (() => {
99
- if (D(m, o)) return m;
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
- })(), R = ue(o), W = ce(o), p = [];
103
- for (let e = 0; e < W; 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 <= R; 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 k = (e) => {
110
- if (!K(e, x, S, d)) {
111
- if (h === "single")
112
- z(e);
113
- else if (h === "range") {
114
- const n = i || { start: null, end: null };
115
- !n.start || n.start && n.end ? y({ start: e, end: null }) : n.start && !n.end && (e < n.start ? y({ start: e, end: n.start }) : y({ start: n.start, end: e }));
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
- }, B = () => {
132
+ }, V = () => {
119
133
  const e = new Date(
120
134
  o.getFullYear(),
121
135
  o.getMonth() - 1,
122
136
  1
123
137
  );
124
- b(e), r == null || r(e);
125
- }, U = () => {
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
- b(e), r == null || r(e);
132
- }, G = (e, n) => {
133
- let s = null;
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(), s = new Date(
137
- n.getFullYear(),
138
- n.getMonth(),
139
- n.getDate() - 1
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(), s = new Date(
144
- n.getFullYear(),
145
- n.getMonth(),
146
- n.getDate() + 1
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(), s = new Date(
151
- n.getFullYear(),
152
- n.getMonth(),
153
- n.getDate() - 7
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(), s = new Date(
158
- n.getFullYear(),
159
- n.getMonth(),
160
- n.getDate() + 7
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(), s = new Date(n.getFullYear(), n.getMonth(), 1);
178
+ e.preventDefault(), a = new Date(r.getFullYear(), r.getMonth(), 1);
165
179
  break;
166
180
  case "End":
167
- e.preventDefault(), s = new Date(n.getFullYear(), n.getMonth() + 1, 0);
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(), k(n);
185
+ e.preventDefault(), $(r);
172
186
  return;
173
187
  }
174
- s && (D(s, o) || b(new Date(s.getFullYear(), s.getMonth(), 1)), H(s));
175
- }, N = [];
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
- N.push(p.slice(e, e + 7));
191
+ O.push(p.slice(e, e + 7));
178
192
  return /* @__PURE__ */ v(
179
193
  "div",
180
- E(C({
181
- ref: F,
182
- className: `${g("base", "p")} ${a}`
183
- }, l), {
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 ${g("base", "mb")}`,
202
+ className: `flex items-center justify-between ${m("base", "mb")}`,
189
203
  children: [
190
204
  /* @__PURE__ */ u(
191
- J,
205
+ L,
192
206
  {
193
207
  variant: "iconOnly",
194
208
  size: "sm",
195
- onClick: B,
209
+ onClick: V,
196
210
  "aria-label": "Previous month",
197
- children: /* @__PURE__ */ u(ae, { className: "h-4 w-4" })
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
- me[o.getMonth()],
215
+ he[o.getMonth()],
202
216
  " ",
203
217
  o.getFullYear()
204
218
  ] }),
205
219
  /* @__PURE__ */ u(
206
- J,
220
+ L,
207
221
  {
208
222
  variant: "iconOnly",
209
223
  size: "sm",
210
- onClick: U,
224
+ onClick: X,
211
225
  "aria-label": "Next month",
212
- children: /* @__PURE__ */ u(le, { className: "h-4 w-4" })
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 ${g("xs", "gap")} ${g("sm", "mb")}`,
224
- children: ge.map((e) => /* @__PURE__ */ u(
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 ${g("xs", "py")}`,
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
- N.map((e, n) => /* @__PURE__ */ u(
249
+ O.map((e, r) => /* @__PURE__ */ u(
236
250
  "div",
237
251
  {
238
252
  role: "row",
239
- className: `grid grid-cols-7 ${g("xs", "gap")}`,
240
- children: e.map((s, Q) => {
241
- if (!s)
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-${n}-${Q}`
262
+ `empty-${r}-${_}`
249
263
  );
250
- const $ = h === "single" ? c(s, f) : c(s, (i == null ? void 0 : i.start) || null) || c(s, (i == null ? void 0 : i.end) || null), V = h === "range" && i ? fe(s, i.start, i.end) : !1, O = K(
251
- s,
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
- d
255
- ), X = c(s, /* @__PURE__ */ new Date()), Z = c(s, m), _ = c(s, L);
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": s.toISOString(),
262
- tabIndex: _ ? 0 : -1,
263
- onClick: () => k(s),
264
- onKeyDown: (ee) => G(ee, s),
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
- ${oe("md")}
282
+ ${ce("md")}
269
283
  transition-colors
270
284
  focus:outline-none
271
285
  focus:ring-2
272
286
  focus:ring-offset-1
273
- ${O ? "text-fg-disabled cursor-not-allowed opacity-50" : $ ? "bg-surface-brand-strong text-fg-inverse font-semibold" : V ? "bg-surface-brand-muted text-fg-brand-emphasis" : X ? "border-2 border-line-brand font-semibold" : Z ? "bg-surface-brand-muted" : "hover:bg-surface-active"}
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": s.toDateString(),
276
- "aria-selected": $,
277
- "aria-disabled": O,
278
- children: s.getDate()
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
- s.toISOString()
295
+ a.toISOString()
281
296
  );
282
297
  })
283
298
  },
284
- `week-${n}`
299
+ `week-${r}`
285
300
  ))
286
301
  ] })
287
302
  ]
@@ -289,6 +304,6 @@ function Me(M) {
289
304
  );
290
305
  }
291
306
  export {
292
- Me as DatePickerCalendar
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":"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"}
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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"}