@stackone/malachite 2.68.0 → 2.68.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,190 +1,205 @@
|
|
|
1
|
-
import { jsxs as b, jsx as
|
|
2
|
-
import { useId as J, useRef as
|
|
1
|
+
import { jsxs as b, jsx as n, Fragment as H } from "react/jsx-runtime";
|
|
2
|
+
import { useId as J, useRef as M, useEffect as Q, useLayoutEffect as ee } from "react";
|
|
3
3
|
import { Button as te } from "./Button.js";
|
|
4
4
|
import ne from "./CustomIcons/CaretDoubleLeftIcon.js";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
5
|
+
import ae from "./CustomIcons/CaretDoubleRightIcon.js";
|
|
6
|
+
import re from "./CustomIcons/CaretLeftIcon.js";
|
|
7
|
+
import le from "./CustomIcons/CaretRightIcon.js";
|
|
8
8
|
import { SegmentedControl as se } from "./SegmentedControl.js";
|
|
9
|
-
import { monthLabel as oe, monthWeeks as ie, dayKeyOf as K, sameDay as
|
|
10
|
-
import { DIVIDER_V as B, DIVIDER_H as
|
|
9
|
+
import { monthLabel as oe, monthWeeks as ie, dayKeyOf as K, sameDay as x, dayKeyString as A, weekdayLabels as ce, spokenDay as de, partsOf as ue, formatTimeReadout as me, addMonths as fe, compareDays as _, daysInMonth as he, addMonthsToDay as U, addDays as D, startOfWeek as j } from "./dateMath.js";
|
|
10
|
+
import { DIVIDER_V as B, DIVIDER_H as P, LINK_BUTTON as pe, LINK_HOVER as be, PRESET_BUTTON as ye, PRESET_HOVER as Ne, NAV_BUTTON as I, HEADING_TEXT as S, RANGE_BAND as ge, RANGE_BAND_SPAN as xe, CELL_CLASS as G, dayToneClass as z } from "./datePickerStyles.js";
|
|
11
11
|
import { FOCUS_RING as v } from "./focusRing.js";
|
|
12
|
-
const
|
|
13
|
-
switch (
|
|
12
|
+
const ve = 40, we = 240, R = (e, a = 1) => Array.from({ length: Math.ceil(e / a) }, (t, r) => r * a), De = (e, a, t, r) => {
|
|
13
|
+
switch (e) {
|
|
14
14
|
case "ArrowLeft":
|
|
15
|
-
return
|
|
15
|
+
return D(t, -1);
|
|
16
16
|
case "ArrowRight":
|
|
17
|
-
return
|
|
17
|
+
return D(t, 1);
|
|
18
18
|
case "ArrowUp":
|
|
19
|
-
return
|
|
19
|
+
return D(t, -7);
|
|
20
20
|
case "ArrowDown":
|
|
21
|
-
return
|
|
21
|
+
return D(t, 7);
|
|
22
22
|
case "Home":
|
|
23
|
-
return j(t,
|
|
23
|
+
return j(t, r);
|
|
24
24
|
case "End":
|
|
25
|
-
return
|
|
25
|
+
return D(j(t, r), 6);
|
|
26
26
|
case "PageUp":
|
|
27
|
-
return U(t,
|
|
27
|
+
return U(t, a ? -12 : -1);
|
|
28
28
|
case "PageDown":
|
|
29
|
-
return U(t,
|
|
29
|
+
return U(t, a ? 12 : 1);
|
|
30
30
|
default:
|
|
31
31
|
return null;
|
|
32
32
|
}
|
|
33
|
-
}, $e = (
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
}, $e = (e, a, t) => {
|
|
34
|
+
const r = he(e), h = Math.min(a, r);
|
|
35
|
+
for (let c = 0; c < r; c++)
|
|
36
|
+
for (const d of [h - c, h + c])
|
|
37
|
+
if (d >= 1 && d <= r && !t({ ...e, day: d }))
|
|
38
|
+
return { ...e, day: d };
|
|
39
|
+
return { ...e, day: h };
|
|
40
|
+
}, Ce = ({
|
|
41
|
+
view: e,
|
|
42
|
+
labelId: a,
|
|
43
|
+
onViewChange: t,
|
|
44
|
+
focusDay: r,
|
|
45
|
+
onFocusDayChange: h,
|
|
46
|
+
isDayDisabled: c,
|
|
47
|
+
isMonthReachable: d
|
|
48
|
+
}) => {
|
|
49
|
+
const f = (i) => {
|
|
50
|
+
const o = fe(e, i);
|
|
51
|
+
return { target: o, disabled: !d(o) };
|
|
52
|
+
}, y = f(-1), p = f(-12), N = f(1), l = f(12), u = ({ target: i, disabled: o }) => {
|
|
53
|
+
o || (t(i), h($e(i, r.day, c)));
|
|
39
54
|
};
|
|
40
55
|
return /* @__PURE__ */ b("div", { className: "flex items-center justify-between p-2", children: [
|
|
41
56
|
/* @__PURE__ */ b("div", { className: "flex items-center gap-0.5", children: [
|
|
42
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ n(
|
|
43
58
|
"button",
|
|
44
59
|
{
|
|
45
60
|
type: "button",
|
|
46
|
-
"aria-label": "Previous
|
|
47
|
-
className: `${
|
|
48
|
-
"aria-disabled":
|
|
49
|
-
onClick: () =>
|
|
50
|
-
children: /* @__PURE__ */
|
|
61
|
+
"aria-label": "Previous year",
|
|
62
|
+
className: `${I} ${v}`,
|
|
63
|
+
"aria-disabled": p.disabled || void 0,
|
|
64
|
+
onClick: () => u(p),
|
|
65
|
+
children: /* @__PURE__ */ n(ne, { size: 14 })
|
|
51
66
|
}
|
|
52
67
|
),
|
|
53
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ n(
|
|
54
69
|
"button",
|
|
55
70
|
{
|
|
56
71
|
type: "button",
|
|
57
|
-
"aria-label": "Previous
|
|
58
|
-
className: `${
|
|
59
|
-
"aria-disabled":
|
|
60
|
-
onClick: () =>
|
|
61
|
-
children: /* @__PURE__ */
|
|
72
|
+
"aria-label": "Previous month",
|
|
73
|
+
className: `${I} ${v}`,
|
|
74
|
+
"aria-disabled": y.disabled || void 0,
|
|
75
|
+
onClick: () => u(y),
|
|
76
|
+
children: /* @__PURE__ */ n(re, { size: 14 })
|
|
62
77
|
}
|
|
63
78
|
)
|
|
64
79
|
] }),
|
|
65
|
-
/* @__PURE__ */
|
|
80
|
+
/* @__PURE__ */ n("span", { id: a, "aria-live": "polite", className: S, children: oe(e) }),
|
|
66
81
|
/* @__PURE__ */ b("div", { className: "flex items-center gap-0.5", children: [
|
|
67
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ n(
|
|
68
83
|
"button",
|
|
69
84
|
{
|
|
70
85
|
type: "button",
|
|
71
86
|
"aria-label": "Next month",
|
|
72
|
-
className: `${
|
|
73
|
-
"aria-disabled":
|
|
74
|
-
onClick: () =>
|
|
75
|
-
children: /* @__PURE__ */
|
|
87
|
+
className: `${I} ${v}`,
|
|
88
|
+
"aria-disabled": N.disabled || void 0,
|
|
89
|
+
onClick: () => u(N),
|
|
90
|
+
children: /* @__PURE__ */ n(le, { size: 14 })
|
|
76
91
|
}
|
|
77
92
|
),
|
|
78
|
-
/* @__PURE__ */
|
|
93
|
+
/* @__PURE__ */ n(
|
|
79
94
|
"button",
|
|
80
95
|
{
|
|
81
96
|
type: "button",
|
|
82
97
|
"aria-label": "Next year",
|
|
83
|
-
className: `${
|
|
84
|
-
"aria-disabled":
|
|
85
|
-
onClick: () =>
|
|
86
|
-
children: /* @__PURE__ */
|
|
98
|
+
className: `${I} ${v}`,
|
|
99
|
+
"aria-disabled": l.disabled || void 0,
|
|
100
|
+
onClick: () => u(l),
|
|
101
|
+
children: /* @__PURE__ */ n(ae, { size: 14 })
|
|
87
102
|
}
|
|
88
103
|
)
|
|
89
104
|
] })
|
|
90
105
|
] });
|
|
91
|
-
}, Ie = (
|
|
92
|
-
mode:
|
|
93
|
-
zone:
|
|
106
|
+
}, Ie = (e, a, t) => !a || !t || _(a, t) === 0 ? null : x(e, a) ? "start" : x(e, t) ? "end" : _(e, a) > 0 && _(e, t) < 0 ? "middle" : null, ke = ({
|
|
107
|
+
mode: e,
|
|
108
|
+
zone: a,
|
|
94
109
|
weekStart: t,
|
|
95
|
-
view:
|
|
96
|
-
onViewChange:
|
|
97
|
-
focusDay:
|
|
98
|
-
onFocusDayChange:
|
|
99
|
-
draft:
|
|
100
|
-
today:
|
|
101
|
-
isDayDisabled:
|
|
102
|
-
isMonthReachable:
|
|
110
|
+
view: r,
|
|
111
|
+
onViewChange: h,
|
|
112
|
+
focusDay: c,
|
|
113
|
+
onFocusDayChange: d,
|
|
114
|
+
draft: f,
|
|
115
|
+
today: y,
|
|
116
|
+
isDayDisabled: p,
|
|
117
|
+
isMonthReachable: N,
|
|
103
118
|
onPickDay: l,
|
|
104
|
-
initialFocusRef:
|
|
119
|
+
initialFocusRef: u,
|
|
105
120
|
labelId: i
|
|
106
121
|
}) => {
|
|
107
|
-
const o =
|
|
122
|
+
const o = M(null), g = M(!1), L = ie(r, t), k = f.start ? K(f.start, a) : null, T = e === "range" && f.end ? K(f.end, a) : null, $ = L.some((m) => m.some((s) => x(s, c))) ? c : { ...r, day: 1 };
|
|
108
123
|
Q(() => {
|
|
109
|
-
var
|
|
110
|
-
|
|
111
|
-
}, [
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
114
|
-
|
|
124
|
+
var m, s;
|
|
125
|
+
g.current && (g.current = !1, (s = (m = o.current) == null ? void 0 : m.querySelector(`[data-day="${A(c)}"]`)) == null || s.focus({ preventScroll: !0 }));
|
|
126
|
+
}, [c]);
|
|
127
|
+
const F = (m) => {
|
|
128
|
+
if (m.key === "Enter" || m.key === " ") {
|
|
129
|
+
m.preventDefault(), p($) || l($);
|
|
115
130
|
return;
|
|
116
131
|
}
|
|
117
|
-
const
|
|
118
|
-
if (!
|
|
132
|
+
const s = De(m.key, m.shiftKey, $, t);
|
|
133
|
+
if (!s)
|
|
119
134
|
return;
|
|
120
|
-
|
|
121
|
-
const w =
|
|
122
|
-
w && !
|
|
123
|
-
},
|
|
135
|
+
m.preventDefault();
|
|
136
|
+
const w = s.month !== r.month || s.year !== r.year;
|
|
137
|
+
w && !N(s) || (w && h({ year: s.year, month: s.month }), g.current = !0, d(s));
|
|
138
|
+
}, W = ce(t);
|
|
124
139
|
return /* @__PURE__ */ b(
|
|
125
140
|
"div",
|
|
126
141
|
{
|
|
127
142
|
ref: o,
|
|
128
143
|
role: "grid",
|
|
129
144
|
"aria-labelledby": i,
|
|
130
|
-
"aria-multiselectable":
|
|
145
|
+
"aria-multiselectable": e === "range" || void 0,
|
|
131
146
|
className: "flex w-[276px] flex-col",
|
|
132
|
-
onKeyDown:
|
|
147
|
+
onKeyDown: F,
|
|
133
148
|
children: [
|
|
134
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ n("div", { role: "row", className: "grid grid-cols-7 px-[14px] py-2", children: W.map((m) => /* @__PURE__ */ n(
|
|
135
150
|
"span",
|
|
136
151
|
{
|
|
137
152
|
role: "columnheader",
|
|
138
|
-
"aria-label":
|
|
139
|
-
className: `flex h-6 items-center justify-center ${
|
|
140
|
-
children:
|
|
153
|
+
"aria-label": m.long,
|
|
154
|
+
className: `flex h-6 items-center justify-center ${S}`,
|
|
155
|
+
children: m.short
|
|
141
156
|
},
|
|
142
|
-
|
|
157
|
+
m.short
|
|
143
158
|
)) }),
|
|
144
|
-
L.map((
|
|
159
|
+
L.map((m) => /* @__PURE__ */ n(
|
|
145
160
|
"div",
|
|
146
161
|
{
|
|
147
162
|
role: "row",
|
|
148
163
|
className: "grid grid-cols-7 px-[14px] py-2",
|
|
149
|
-
children:
|
|
150
|
-
const w =
|
|
164
|
+
children: m.map((s) => {
|
|
165
|
+
const w = A(s), C = p(s), E = e === "range" ? Ie(s, k, T) : null, X = x(s, k) || x(s, T) || E === "middle", q = x(s, k) || x(s, T), O = x(s, y), Y = s.month !== r.month, V = x(s, $);
|
|
151
166
|
return /* @__PURE__ */ b(
|
|
152
167
|
"div",
|
|
153
168
|
{
|
|
154
169
|
role: "presentation",
|
|
155
170
|
className: "relative flex h-6 items-center justify-center",
|
|
156
171
|
children: [
|
|
157
|
-
|
|
172
|
+
E && /* @__PURE__ */ n(
|
|
158
173
|
"span",
|
|
159
174
|
{
|
|
160
175
|
"aria-hidden": "true",
|
|
161
|
-
className: `${ge} ${xe[
|
|
176
|
+
className: `${ge} ${xe[E]}`
|
|
162
177
|
}
|
|
163
178
|
),
|
|
164
|
-
/* @__PURE__ */
|
|
179
|
+
/* @__PURE__ */ n(
|
|
165
180
|
"button",
|
|
166
181
|
{
|
|
167
182
|
ref: V ? (Z) => {
|
|
168
|
-
|
|
183
|
+
u.current = Z;
|
|
169
184
|
} : void 0,
|
|
170
185
|
type: "button",
|
|
171
186
|
role: "gridcell",
|
|
172
|
-
"aria-selected":
|
|
187
|
+
"aria-selected": X,
|
|
173
188
|
"data-day": w,
|
|
174
189
|
tabIndex: V ? 0 : -1,
|
|
175
|
-
"aria-label": de(
|
|
190
|
+
"aria-label": de(s),
|
|
176
191
|
"aria-current": O ? "date" : void 0,
|
|
177
|
-
"aria-disabled":
|
|
178
|
-
className: `${G(
|
|
179
|
-
selected:
|
|
192
|
+
"aria-disabled": C || void 0,
|
|
193
|
+
className: `${G(C)} ${z({
|
|
194
|
+
selected: q,
|
|
180
195
|
today: O,
|
|
181
196
|
outside: Y,
|
|
182
|
-
disabled:
|
|
197
|
+
disabled: C
|
|
183
198
|
})}`,
|
|
184
199
|
onClick: () => {
|
|
185
|
-
|
|
200
|
+
d(s), C || l(s);
|
|
186
201
|
},
|
|
187
|
-
children:
|
|
202
|
+
children: s.day
|
|
188
203
|
}
|
|
189
204
|
)
|
|
190
205
|
]
|
|
@@ -193,34 +208,34 @@ const ye = 40, ve = 240, R = (n, r = 1) => Array.from({ length: Math.ceil(n / r)
|
|
|
193
208
|
);
|
|
194
209
|
})
|
|
195
210
|
},
|
|
196
|
-
|
|
211
|
+
A(m[0])
|
|
197
212
|
))
|
|
198
213
|
]
|
|
199
214
|
}
|
|
200
215
|
);
|
|
201
|
-
},
|
|
202
|
-
const
|
|
216
|
+
}, Te = ({ label: e, values: a, selected: t, isDisabled: r, onPick: h }) => {
|
|
217
|
+
const c = M(null), d = t === null ? -1 : a.filter((l) => l <= t).length - 1;
|
|
203
218
|
ee(() => {
|
|
204
|
-
|
|
205
|
-
}, [
|
|
206
|
-
const
|
|
219
|
+
c.current && d >= 0 && (c.current.scrollTop = d * ve);
|
|
220
|
+
}, [d]);
|
|
221
|
+
const f = Math.max(
|
|
207
222
|
0,
|
|
208
|
-
|
|
209
|
-
),
|
|
210
|
-
var o,
|
|
211
|
-
const i =
|
|
212
|
-
i === void 0 ||
|
|
223
|
+
a.findIndex((l) => !r(l))
|
|
224
|
+
), y = (l) => l === (d >= 0 ? d : f) ? 0 : -1, p = (l, u) => {
|
|
225
|
+
var o, g;
|
|
226
|
+
const i = a[l];
|
|
227
|
+
i === void 0 || r(i) || (h(i), u && ((g = (o = c.current) == null ? void 0 : o.querySelector(`[data-value="${i}"]`)) == null || g.focus({ preventScroll: !0 })));
|
|
213
228
|
};
|
|
214
|
-
return /* @__PURE__ */
|
|
229
|
+
return /* @__PURE__ */ n(
|
|
215
230
|
"div",
|
|
216
231
|
{
|
|
217
|
-
ref:
|
|
232
|
+
ref: c,
|
|
218
233
|
role: "listbox",
|
|
219
|
-
"aria-label":
|
|
234
|
+
"aria-label": e,
|
|
220
235
|
className: "flex flex-col items-center overflow-y-auto overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
|
|
221
|
-
style: { height:
|
|
236
|
+
style: { height: we },
|
|
222
237
|
onKeyDown: (l) => {
|
|
223
|
-
const
|
|
238
|
+
const u = d >= 0 ? d : -1, i = {
|
|
224
239
|
ArrowDown: 1,
|
|
225
240
|
ArrowUp: -1,
|
|
226
241
|
PageDown: 5,
|
|
@@ -228,20 +243,20 @@ const ye = 40, ve = 240, R = (n, r = 1) => Array.from({ length: Math.ceil(n / r)
|
|
|
228
243
|
};
|
|
229
244
|
let o = null;
|
|
230
245
|
if (l.key in i) {
|
|
231
|
-
o =
|
|
232
|
-
const
|
|
233
|
-
for (; o >= 0 && o <
|
|
234
|
-
o +=
|
|
246
|
+
o = u < 0 ? f : u + i[l.key];
|
|
247
|
+
const g = Math.sign(i[l.key]);
|
|
248
|
+
for (; o >= 0 && o < a.length && r(a[o]); )
|
|
249
|
+
o += g;
|
|
235
250
|
} else if (l.key === "Home")
|
|
236
|
-
o =
|
|
251
|
+
o = a.findIndex((g) => !r(g));
|
|
237
252
|
else if (l.key === "End")
|
|
238
|
-
for (o =
|
|
253
|
+
for (o = a.length - 1; o >= 0 && r(a[o]); )
|
|
239
254
|
o -= 1;
|
|
240
|
-
o !== null && (l.preventDefault(),
|
|
255
|
+
o !== null && (l.preventDefault(), p(o, !0));
|
|
241
256
|
},
|
|
242
|
-
children:
|
|
243
|
-
const i =
|
|
244
|
-
return /* @__PURE__ */
|
|
257
|
+
children: a.map((l, u) => {
|
|
258
|
+
const i = r(l), o = l === t;
|
|
259
|
+
return /* @__PURE__ */ n("div", { className: "flex shrink-0 items-center py-2", children: /* @__PURE__ */ n(
|
|
245
260
|
"button",
|
|
246
261
|
{
|
|
247
262
|
type: "button",
|
|
@@ -249,142 +264,145 @@ const ye = 40, ve = 240, R = (n, r = 1) => Array.from({ length: Math.ceil(n / r)
|
|
|
249
264
|
"data-value": l,
|
|
250
265
|
"aria-selected": o,
|
|
251
266
|
"aria-disabled": i || void 0,
|
|
252
|
-
tabIndex:
|
|
267
|
+
tabIndex: y(u),
|
|
253
268
|
className: `${G(i)} ${z({
|
|
254
269
|
selected: o,
|
|
255
270
|
today: !1,
|
|
256
271
|
outside: !1,
|
|
257
272
|
disabled: i
|
|
258
273
|
})}`,
|
|
259
|
-
onClick: () =>
|
|
274
|
+
onClick: () => p(u, !1),
|
|
260
275
|
children: String(l).padStart(2, "0")
|
|
261
276
|
}
|
|
262
277
|
) }, l);
|
|
263
278
|
})
|
|
264
279
|
}
|
|
265
280
|
);
|
|
266
|
-
},
|
|
267
|
-
mode:
|
|
268
|
-
zone:
|
|
281
|
+
}, Ee = ({
|
|
282
|
+
mode: e,
|
|
283
|
+
zone: a,
|
|
269
284
|
precision: t,
|
|
270
|
-
minuteStep:
|
|
271
|
-
draft:
|
|
272
|
-
active:
|
|
273
|
-
onActiveChange:
|
|
274
|
-
isTimeDisabled:
|
|
275
|
-
onPickTime:
|
|
285
|
+
minuteStep: r,
|
|
286
|
+
draft: h,
|
|
287
|
+
active: c,
|
|
288
|
+
onActiveChange: d,
|
|
289
|
+
isTimeDisabled: f,
|
|
290
|
+
onPickTime: y
|
|
276
291
|
}) => {
|
|
277
|
-
const
|
|
292
|
+
const p = e === "range" ? h[c] : h.start, N = p ? ue(p, a) : null, l = [
|
|
278
293
|
{ unit: "hours", label: "Hours", values: R(24) },
|
|
279
|
-
{ unit: "minutes", label: "Minutes", values: R(60,
|
|
294
|
+
{ unit: "minutes", label: "Minutes", values: R(60, r) },
|
|
280
295
|
...t === "second" ? [{ unit: "seconds", label: "Seconds", values: R(60) }] : []
|
|
281
296
|
];
|
|
282
297
|
return /* @__PURE__ */ b("div", { className: "flex flex-col gap-1", children: [
|
|
283
|
-
/* @__PURE__ */
|
|
298
|
+
/* @__PURE__ */ n("div", { className: "flex min-h-8 items-center justify-center p-2", children: e === "range" ? /* @__PURE__ */ n(
|
|
284
299
|
se,
|
|
285
300
|
{
|
|
286
301
|
size: "small",
|
|
287
302
|
"aria-label": "Time for",
|
|
288
|
-
value:
|
|
289
|
-
onChange:
|
|
303
|
+
value: c,
|
|
304
|
+
onChange: d,
|
|
290
305
|
options: [
|
|
291
306
|
{ value: "start", label: "Start" },
|
|
292
307
|
{ value: "end", label: "End" }
|
|
293
308
|
]
|
|
294
309
|
}
|
|
295
|
-
) : /* @__PURE__ */
|
|
296
|
-
/* @__PURE__ */
|
|
297
|
-
/* @__PURE__ */
|
|
310
|
+
) : /* @__PURE__ */ n("span", { className: `${S} whitespace-nowrap`, children: me(p, a, t) }) }),
|
|
311
|
+
/* @__PURE__ */ n("div", { className: P }),
|
|
312
|
+
/* @__PURE__ */ n(
|
|
298
313
|
"div",
|
|
299
314
|
{
|
|
300
315
|
className: "grid px-[14px]",
|
|
301
316
|
style: { gridTemplateColumns: `repeat(${l.length}, 35.67px)` },
|
|
302
|
-
children: l.map((
|
|
303
|
-
|
|
317
|
+
children: l.map((u) => /* @__PURE__ */ n(
|
|
318
|
+
Te,
|
|
304
319
|
{
|
|
305
|
-
label:
|
|
306
|
-
values:
|
|
307
|
-
selected:
|
|
308
|
-
isDisabled: (i) =>
|
|
309
|
-
onPick: (i) =>
|
|
320
|
+
label: u.label,
|
|
321
|
+
values: u.values,
|
|
322
|
+
selected: N ? N[u.unit] : null,
|
|
323
|
+
isDisabled: (i) => f(u.unit, i),
|
|
324
|
+
onPick: (i) => y(u.unit, i)
|
|
310
325
|
},
|
|
311
|
-
|
|
326
|
+
u.unit
|
|
312
327
|
))
|
|
313
328
|
}
|
|
314
329
|
)
|
|
315
330
|
] });
|
|
316
|
-
},
|
|
317
|
-
presets:
|
|
318
|
-
onPreset:
|
|
319
|
-
}) => /* @__PURE__ */
|
|
331
|
+
}, Ae = ({
|
|
332
|
+
presets: e,
|
|
333
|
+
onPreset: a
|
|
334
|
+
}) => /* @__PURE__ */ n("div", { className: "flex w-36 flex-col gap-0.5 p-1", role: "group", "aria-label": "Presets", children: e.map((t, r) => /* @__PURE__ */ n(
|
|
320
335
|
"button",
|
|
321
336
|
{
|
|
322
337
|
type: "button",
|
|
323
|
-
className: `${
|
|
324
|
-
onClick: () => r
|
|
338
|
+
className: `${ye} ${Ne} ${v}`,
|
|
339
|
+
onClick: () => a(r),
|
|
325
340
|
children: t
|
|
326
341
|
},
|
|
327
342
|
t
|
|
328
|
-
)) }),
|
|
329
|
-
const
|
|
343
|
+
)) }), Be = (e) => {
|
|
344
|
+
const a = `${J().replace(/[^a-zA-Z0-9_-]/g, "")}-month`, {
|
|
330
345
|
presets: t,
|
|
331
|
-
onPreset:
|
|
332
|
-
precision:
|
|
333
|
-
todayLabel:
|
|
334
|
-
todayDisabled:
|
|
335
|
-
onToday:
|
|
336
|
-
showApply:
|
|
337
|
-
applyDisabled:
|
|
338
|
-
onApply:
|
|
339
|
-
} =
|
|
346
|
+
onPreset: r,
|
|
347
|
+
precision: h,
|
|
348
|
+
todayLabel: c,
|
|
349
|
+
todayDisabled: d,
|
|
350
|
+
onToday: f,
|
|
351
|
+
showApply: y,
|
|
352
|
+
applyDisabled: p,
|
|
353
|
+
onApply: N
|
|
354
|
+
} = e;
|
|
340
355
|
return /* @__PURE__ */ b("div", { className: "flex flex-col gap-1 p-1.5", children: [
|
|
341
|
-
|
|
356
|
+
e.mode === "range" && /* @__PURE__ */ n("span", { className: "sr-only", "aria-live": "polite", children: e.active === "end" && e.draft.start && !e.draft.end ? "Choose the end date" : "" }),
|
|
342
357
|
/* @__PURE__ */ b("div", { className: "flex", children: [
|
|
343
358
|
t && t.length > 0 && /* @__PURE__ */ b(H, { children: [
|
|
344
|
-
/* @__PURE__ */
|
|
345
|
-
/* @__PURE__ */
|
|
359
|
+
/* @__PURE__ */ n(Ae, { presets: t, onPreset: r }),
|
|
360
|
+
/* @__PURE__ */ n("div", { className: `${B} mx-1` })
|
|
346
361
|
] }),
|
|
347
362
|
/* @__PURE__ */ b("div", { className: "flex flex-col gap-1", children: [
|
|
348
|
-
/* @__PURE__ */
|
|
349
|
-
|
|
363
|
+
/* @__PURE__ */ n(
|
|
364
|
+
Ce,
|
|
350
365
|
{
|
|
351
|
-
view:
|
|
352
|
-
labelId:
|
|
353
|
-
onViewChange:
|
|
354
|
-
|
|
366
|
+
view: e.view,
|
|
367
|
+
labelId: a,
|
|
368
|
+
onViewChange: e.onViewChange,
|
|
369
|
+
focusDay: e.focusDay,
|
|
370
|
+
onFocusDayChange: e.onFocusDayChange,
|
|
371
|
+
isDayDisabled: e.isDayDisabled,
|
|
372
|
+
isMonthReachable: e.isMonthReachable
|
|
355
373
|
}
|
|
356
374
|
),
|
|
357
|
-
/* @__PURE__ */
|
|
358
|
-
/* @__PURE__ */
|
|
375
|
+
/* @__PURE__ */ n("div", { className: P }),
|
|
376
|
+
/* @__PURE__ */ n(ke, { ...e, labelId: a })
|
|
359
377
|
] }),
|
|
360
|
-
|
|
361
|
-
/* @__PURE__ */
|
|
362
|
-
/* @__PURE__ */
|
|
378
|
+
h !== "day" && /* @__PURE__ */ b(H, { children: [
|
|
379
|
+
/* @__PURE__ */ n("div", { className: B }),
|
|
380
|
+
/* @__PURE__ */ n(Ee, { ...e })
|
|
363
381
|
] })
|
|
364
382
|
] }),
|
|
365
|
-
/* @__PURE__ */
|
|
383
|
+
/* @__PURE__ */ n("div", { className: P }),
|
|
366
384
|
/* @__PURE__ */ b(
|
|
367
385
|
"div",
|
|
368
386
|
{
|
|
369
|
-
className: `flex items-center p-2 ${
|
|
387
|
+
className: `flex items-center p-2 ${y ? "justify-between" : "justify-center"}`,
|
|
370
388
|
children: [
|
|
371
|
-
/* @__PURE__ */
|
|
389
|
+
/* @__PURE__ */ n(
|
|
372
390
|
"button",
|
|
373
391
|
{
|
|
374
392
|
type: "button",
|
|
375
|
-
className: `${
|
|
376
|
-
disabled:
|
|
377
|
-
onClick:
|
|
378
|
-
children:
|
|
393
|
+
className: `${pe} ${be} ${v}`,
|
|
394
|
+
disabled: d,
|
|
395
|
+
onClick: f,
|
|
396
|
+
children: c
|
|
379
397
|
}
|
|
380
398
|
),
|
|
381
|
-
|
|
399
|
+
y && /* @__PURE__ */ n(
|
|
382
400
|
te,
|
|
383
401
|
{
|
|
384
402
|
size: "small",
|
|
385
403
|
variant: "filled",
|
|
386
|
-
disabled:
|
|
387
|
-
onClick:
|
|
404
|
+
disabled: p,
|
|
405
|
+
onClick: N,
|
|
388
406
|
children: "Apply"
|
|
389
407
|
}
|
|
390
408
|
)
|
|
@@ -394,6 +412,6 @@ const ye = 40, ve = 240, R = (n, r = 1) => Array.from({ length: Math.ceil(n / r)
|
|
|
394
412
|
] });
|
|
395
413
|
};
|
|
396
414
|
export {
|
|
397
|
-
|
|
415
|
+
Be as default
|
|
398
416
|
};
|
|
399
417
|
//# sourceMappingURL=DatePickerPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerPanel.js","sources":["../../src/components/DatePickerPanel.tsx"],"sourcesContent":["import React, { useEffect, useId, useLayoutEffect, useRef } from 'react';\nimport { Button } from './Button';\nimport CaretDoubleLeftIcon from './CustomIcons/CaretDoubleLeftIcon';\nimport CaretDoubleRightIcon from './CustomIcons/CaretDoubleRightIcon';\nimport CaretLeftIcon from './CustomIcons/CaretLeftIcon';\nimport CaretRightIcon from './CustomIcons/CaretRightIcon';\nimport SegmentedControl from './SegmentedControl';\nimport {\n type DatePickerPrecision,\n type DatePickerTimeZone,\n type DayKey,\n type MonthKey,\n type WeekStart,\n addDays,\n addMonths,\n addMonthsToDay,\n compareDays,\n dayKeyOf,\n dayKeyString,\n formatTimeReadout,\n monthLabel,\n monthWeeks,\n partsOf,\n sameDay,\n spokenDay,\n startOfWeek,\n weekdayLabels,\n} from './dateMath';\nimport {\n CELL_CLASS,\n DIVIDER_H,\n DIVIDER_V,\n HEADING_TEXT,\n LINK_BUTTON,\n LINK_HOVER,\n NAV_BUTTON,\n PRESET_BUTTON,\n PRESET_HOVER,\n RANGE_BAND,\n RANGE_BAND_SPAN,\n dayToneClass,\n} from './datePickerStyles';\nimport type { DateMinuteStep } from './datePickerTypes';\nimport { FOCUS_RING } from './focusRing';\n\nexport type Endpoint = 'start' | 'end';\nexport type TimeUnit = 'hours' | 'minutes' | 'seconds';\n\nexport interface Selection {\n start: Date | null;\n end: Date | null;\n}\n\ninterface DatePickerPanelProps {\n mode: 'single' | 'range';\n zone: DatePickerTimeZone;\n precision: DatePickerPrecision;\n minuteStep: DateMinuteStep;\n weekStart: WeekStart;\n view: MonthKey;\n onViewChange: (view: MonthKey) => void;\n focusDay: DayKey;\n onFocusDayChange: (day: DayKey) => void;\n draft: Selection;\n active: Endpoint;\n onActiveChange: (endpoint: Endpoint) => void;\n today: DayKey;\n isDayDisabled: (day: DayKey) => boolean;\n isMonthReachable: (month: MonthKey) => boolean;\n isTimeDisabled: (unit: TimeUnit, value: number) => boolean;\n onPickDay: (day: DayKey) => void;\n onPickTime: (unit: TimeUnit, value: number) => void;\n presets?: string[];\n onPreset: (index: number) => void;\n todayLabel: string;\n todayDisabled: boolean;\n onToday: () => void;\n showApply: boolean;\n applyDisabled: boolean;\n onApply: () => void;\n initialFocusRef: React.MutableRefObject<HTMLElement | null>;\n}\n\nconst TIME_ROW_PX = 40;\nconst TIME_COLUMN_HEIGHT_PX = 240;\n\nconst range = (count: number, step = 1): number[] =>\n Array.from({ length: Math.ceil(count / step) }, (_, index) => index * step);\n\nconst keyMove = (key: string, shift: boolean, day: DayKey, weekStart: WeekStart): DayKey | null => {\n switch (key) {\n case 'ArrowLeft':\n return addDays(day, -1);\n case 'ArrowRight':\n return addDays(day, 1);\n case 'ArrowUp':\n return addDays(day, -7);\n case 'ArrowDown':\n return addDays(day, 7);\n case 'Home':\n return startOfWeek(day, weekStart);\n case 'End':\n return addDays(startOfWeek(day, weekStart), 6);\n case 'PageUp':\n return addMonthsToDay(day, shift ? -12 : -1);\n case 'PageDown':\n return addMonthsToDay(day, shift ? 12 : 1);\n default:\n return null;\n }\n};\n\nconst MonthHeader: React.FC<{\n view: MonthKey;\n labelId: string;\n onViewChange: (view: MonthKey) => void;\n isMonthReachable: (month: MonthKey) => boolean;\n}> = ({ view, labelId, onViewChange, isMonthReachable }) => {\n const step = (amount: number) => {\n const target = addMonths(view, amount);\n return { target, disabled: !isMonthReachable(target) };\n };\n const prevMonth = step(-1);\n const prevYear = step(-12);\n const nextMonth = step(1);\n const nextYear = step(12);\n // aria-disabled: a natively disabled button drops focus to <body>.\n const go = ({ target, disabled }: { target: MonthKey; disabled: boolean }) => {\n if (!disabled) {\n onViewChange(target);\n }\n };\n return (\n <div className=\"flex items-center justify-between p-2\">\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={prevMonth.disabled || undefined}\n onClick={() => go(prevMonth)}\n >\n <CaretLeftIcon size={14} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Previous year\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={prevYear.disabled || undefined}\n onClick={() => go(prevYear)}\n >\n <CaretDoubleLeftIcon size={14} />\n </button>\n </div>\n <span id={labelId} aria-live=\"polite\" className={HEADING_TEXT}>\n {monthLabel(view)}\n </span>\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label=\"Next month\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={nextMonth.disabled || undefined}\n onClick={() => go(nextMonth)}\n >\n <CaretRightIcon size={14} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next year\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={nextYear.disabled || undefined}\n onClick={() => go(nextYear)}\n >\n <CaretDoubleRightIcon size={14} />\n </button>\n </div>\n </div>\n );\n};\n\nconst bandSpan = (\n day: DayKey,\n start: DayKey | null,\n end: DayKey | null,\n): keyof typeof RANGE_BAND_SPAN | null => {\n if (!start || !end || compareDays(start, end) === 0) {\n return null;\n }\n if (sameDay(day, start)) {\n return 'start';\n }\n if (sameDay(day, end)) {\n return 'end';\n }\n return compareDays(day, start) > 0 && compareDays(day, end) < 0 ? 'middle' : null;\n};\n\nconst DayGrid: React.FC<\n Pick<\n DatePickerPanelProps,\n | 'mode'\n | 'zone'\n | 'weekStart'\n | 'view'\n | 'onViewChange'\n | 'focusDay'\n | 'onFocusDayChange'\n | 'draft'\n | 'today'\n | 'isDayDisabled'\n | 'isMonthReachable'\n | 'onPickDay'\n | 'initialFocusRef'\n > & { labelId: string }\n> = ({\n mode,\n zone,\n weekStart,\n view,\n onViewChange,\n focusDay,\n onFocusDayChange,\n draft,\n today,\n isDayDisabled,\n isMonthReachable,\n onPickDay,\n initialFocusRef,\n labelId,\n}) => {\n const gridRef = useRef<HTMLDivElement>(null);\n const moveFocus = useRef(false);\n const weeks = monthWeeks(view, weekStart);\n const start = draft.start ? dayKeyOf(draft.start, zone) : null;\n const end = mode === 'range' && draft.end ? dayKeyOf(draft.end, zone) : null;\n const focusInView = weeks.some((week) => week.some((day) => sameDay(day, focusDay)));\n const tabStop = focusInView ? focusDay : { ...view, day: 1 };\n\n useEffect(() => {\n if (!moveFocus.current) {\n return;\n }\n moveFocus.current = false;\n gridRef.current\n ?.querySelector<HTMLElement>(`[data-day=\"${dayKeyString(focusDay)}\"]`)\n ?.focus({ preventScroll: true });\n }, [focusDay]);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (!isDayDisabled(tabStop)) {\n onPickDay(tabStop);\n }\n return;\n }\n const next = keyMove(event.key, event.shiftKey, tabStop, weekStart);\n if (!next) {\n return;\n }\n event.preventDefault();\n const leavesView = next.month !== view.month || next.year !== view.year;\n if (leavesView && !isMonthReachable(next)) {\n return;\n }\n if (leavesView) {\n onViewChange({ year: next.year, month: next.month });\n }\n moveFocus.current = true;\n onFocusDayChange(next);\n };\n\n const weekdays = weekdayLabels(weekStart);\n\n return (\n <div\n ref={gridRef}\n role=\"grid\"\n aria-labelledby={labelId}\n aria-multiselectable={mode === 'range' || undefined}\n className=\"flex w-[276px] flex-col\"\n onKeyDown={handleKeyDown}\n >\n <div role=\"row\" className=\"grid grid-cols-7 px-[14px] py-2\">\n {weekdays.map((weekday) => (\n <span\n key={weekday.short}\n role=\"columnheader\"\n aria-label={weekday.long}\n className={`flex h-6 items-center justify-center ${HEADING_TEXT}`}\n >\n {weekday.short}\n </span>\n ))}\n </div>\n {weeks.map((week) => (\n <div\n key={dayKeyString(week[0])}\n role=\"row\"\n className=\"grid grid-cols-7 px-[14px] py-2\"\n >\n {week.map((day) => {\n const key = dayKeyString(day);\n const disabled = isDayDisabled(day);\n const band = mode === 'range' ? bandSpan(day, start, end) : null;\n const selected =\n sameDay(day, start) || sameDay(day, end) || band === 'middle';\n const endpoint = sameDay(day, start) || sameDay(day, end);\n const isToday = sameDay(day, today);\n const outside = day.month !== view.month;\n const isTabStop = sameDay(day, tabStop);\n return (\n <div\n key={key}\n role=\"presentation\"\n className=\"relative flex h-6 items-center justify-center\"\n >\n {band && (\n <span\n aria-hidden=\"true\"\n className={`${RANGE_BAND} ${RANGE_BAND_SPAN[band]}`}\n />\n )}\n <button\n ref={\n isTabStop\n ? (node) => {\n initialFocusRef.current = node;\n }\n : undefined\n }\n type=\"button\"\n role=\"gridcell\"\n aria-selected={selected}\n data-day={key}\n tabIndex={isTabStop ? 0 : -1}\n aria-label={spokenDay(day)}\n aria-current={isToday ? 'date' : undefined}\n aria-disabled={disabled || undefined}\n className={`${CELL_CLASS(disabled)} ${dayToneClass({\n selected: endpoint,\n today: isToday,\n outside,\n disabled,\n })}`}\n onClick={() => {\n onFocusDayChange(day);\n if (!disabled) {\n onPickDay(day);\n }\n }}\n >\n {day.day}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n};\n\nconst TimeColumn: React.FC<{\n label: string;\n values: number[];\n selected: number | null;\n isDisabled: (value: number) => boolean;\n onPick: (value: number) => void;\n}> = ({ label, values, selected, isDisabled, onPick }) => {\n const listRef = useRef<HTMLDivElement>(null);\n const parkedIndex =\n selected === null ? -1 : values.filter((value) => value <= selected).length - 1;\n\n // A write, never a layout read.\n useLayoutEffect(() => {\n if (listRef.current && parkedIndex >= 0) {\n listRef.current.scrollTop = parkedIndex * TIME_ROW_PX;\n }\n }, [parkedIndex]);\n\n const firstEnabled = Math.max(\n 0,\n values.findIndex((value) => !isDisabled(value)),\n );\n const tabIndexOf = (index: number) =>\n index === (parkedIndex >= 0 ? parkedIndex : firstEnabled) ? 0 : -1;\n\n const pickAt = (index: number, focus: boolean) => {\n const value = values[index];\n if (value === undefined || isDisabled(value)) {\n return;\n }\n onPick(value);\n if (focus) {\n listRef.current\n ?.querySelector<HTMLElement>(`[data-value=\"${value}\"]`)\n ?.focus({ preventScroll: true });\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const from = parkedIndex >= 0 ? parkedIndex : -1;\n const delta: Record<string, number> = {\n ArrowDown: 1,\n ArrowUp: -1,\n PageDown: 5,\n PageUp: -5,\n };\n let target: number | null = null;\n if (event.key in delta) {\n target = from < 0 ? firstEnabled : from + delta[event.key];\n const step = Math.sign(delta[event.key]);\n while (target >= 0 && target < values.length && isDisabled(values[target])) {\n target += step;\n }\n } else if (event.key === 'Home') {\n target = values.findIndex((value) => !isDisabled(value));\n } else if (event.key === 'End') {\n target = values.length - 1;\n while (target >= 0 && isDisabled(values[target])) {\n target -= 1;\n }\n }\n if (target === null) {\n return;\n }\n event.preventDefault();\n pickAt(target, true);\n };\n\n return (\n <div\n ref={listRef}\n role=\"listbox\"\n aria-label={label}\n className=\"flex flex-col items-center overflow-y-auto overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n style={{ height: TIME_COLUMN_HEIGHT_PX }}\n onKeyDown={handleKeyDown}\n >\n {values.map((value, index) => {\n const disabled = isDisabled(value);\n const isSelected = value === selected;\n return (\n <div key={value} className=\"flex shrink-0 items-center py-2\">\n <button\n type=\"button\"\n role=\"option\"\n data-value={value}\n aria-selected={isSelected}\n aria-disabled={disabled || undefined}\n tabIndex={tabIndexOf(index)}\n className={`${CELL_CLASS(disabled)} ${dayToneClass({\n selected: isSelected,\n today: false,\n outside: false,\n disabled,\n })}`}\n onClick={() => pickAt(index, false)}\n >\n {String(value).padStart(2, '0')}\n </button>\n </div>\n );\n })}\n </div>\n );\n};\n\nconst TimePanel: React.FC<\n Pick<\n DatePickerPanelProps,\n | 'mode'\n | 'zone'\n | 'precision'\n | 'minuteStep'\n | 'draft'\n | 'active'\n | 'onActiveChange'\n | 'isTimeDisabled'\n | 'onPickTime'\n >\n> = ({\n mode,\n zone,\n precision,\n minuteStep,\n draft,\n active,\n onActiveChange,\n isTimeDisabled,\n onPickTime,\n}) => {\n const target = mode === 'range' ? draft[active] : draft.start;\n const parts = target ? partsOf(target, zone) : null;\n const columns: { unit: TimeUnit; label: string; values: number[] }[] = [\n { unit: 'hours', label: 'Hours', values: range(24) },\n { unit: 'minutes', label: 'Minutes', values: range(60, minuteStep) },\n ...(precision === 'second'\n ? [{ unit: 'seconds' as const, label: 'Seconds', values: range(60) }]\n : []),\n ];\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex min-h-8 items-center justify-center p-2\">\n {mode === 'range' ? (\n <SegmentedControl<Endpoint>\n size=\"small\"\n aria-label=\"Time for\"\n value={active}\n onChange={onActiveChange}\n options={[\n { value: 'start', label: 'Start' },\n { value: 'end', label: 'End' },\n ]}\n />\n ) : (\n <span className={`${HEADING_TEXT} whitespace-nowrap`}>\n {formatTimeReadout(target, zone, precision)}\n </span>\n )}\n </div>\n <div className={DIVIDER_H} />\n <div\n className=\"grid px-[14px]\"\n style={{ gridTemplateColumns: `repeat(${columns.length}, 35.67px)` }}\n >\n {columns.map((column) => (\n <TimeColumn\n key={column.unit}\n label={column.label}\n values={column.values}\n selected={parts ? parts[column.unit] : null}\n isDisabled={(value) => isTimeDisabled(column.unit, value)}\n onPick={(value) => onPickTime(column.unit, value)}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst PresetList: React.FC<{ presets: string[]; onPreset: (index: number) => void }> = ({\n presets,\n onPreset,\n}) => (\n <div className=\"flex w-36 flex-col gap-0.5 p-1\" role=\"group\" aria-label=\"Presets\">\n {presets.map((label, index) => (\n <button\n key={label}\n type=\"button\"\n className={`${PRESET_BUTTON} ${PRESET_HOVER} ${FOCUS_RING}`}\n onClick={() => onPreset(index)}\n >\n {label}\n </button>\n ))}\n </div>\n);\n\nconst DatePickerPanel: React.FC<DatePickerPanelProps> = (props) => {\n const labelId = `${useId().replace(/[^a-zA-Z0-9_-]/g, '')}-month`;\n const {\n presets,\n onPreset,\n precision,\n todayLabel,\n todayDisabled,\n onToday,\n showApply,\n applyDisabled,\n onApply,\n } = props;\n return (\n <div className=\"flex flex-col gap-1 p-1.5\">\n {props.mode === 'range' && (\n <span className=\"sr-only\" aria-live=\"polite\">\n {props.active === 'end' && props.draft.start && !props.draft.end\n ? 'Choose the end date'\n : ''}\n </span>\n )}\n <div className=\"flex\">\n {presets && presets.length > 0 && (\n <>\n <PresetList presets={presets} onPreset={onPreset} />\n <div className={`${DIVIDER_V} mx-1`} />\n </>\n )}\n <div className=\"flex flex-col gap-1\">\n <MonthHeader\n view={props.view}\n labelId={labelId}\n onViewChange={props.onViewChange}\n isMonthReachable={props.isMonthReachable}\n />\n <div className={DIVIDER_H} />\n <DayGrid {...props} labelId={labelId} />\n </div>\n {precision !== 'day' && (\n <>\n <div className={DIVIDER_V} />\n <TimePanel {...props} />\n </>\n )}\n </div>\n <div className={DIVIDER_H} />\n <div\n className={`flex items-center p-2 ${showApply ? 'justify-between' : 'justify-center'}`}\n >\n <button\n type=\"button\"\n className={`${LINK_BUTTON} ${LINK_HOVER} ${FOCUS_RING}`}\n disabled={todayDisabled}\n onClick={onToday}\n >\n {todayLabel}\n </button>\n {showApply && (\n <Button\n size=\"small\"\n variant=\"filled\"\n disabled={applyDisabled}\n onClick={onApply}\n >\n Apply\n </Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default DatePickerPanel;\n"],"names":["TIME_ROW_PX","TIME_COLUMN_HEIGHT_PX","range","count","step","_","index","keyMove","key","shift","day","weekStart","addDays","startOfWeek","addMonthsToDay","MonthHeader","view","labelId","onViewChange","isMonthReachable","amount","target","addMonths","prevMonth","prevYear","nextMonth","nextYear","go","disabled","jsxs","jsx","NAV_BUTTON","FOCUS_RING","CaretLeftIcon","CaretDoubleLeftIcon","HEADING_TEXT","monthLabel","CaretRightIcon","CaretDoubleRightIcon","bandSpan","start","end","compareDays","sameDay","DayGrid","mode","zone","focusDay","onFocusDayChange","draft","today","isDayDisabled","onPickDay","initialFocusRef","gridRef","useRef","moveFocus","weeks","monthWeeks","dayKeyOf","tabStop","week","useEffect","_b","_a","dayKeyString","handleKeyDown","event","next","leavesView","weekdays","weekdayLabels","weekday","band","selected","endpoint","isToday","outside","isTabStop","RANGE_BAND","RANGE_BAND_SPAN","node","spokenDay","CELL_CLASS","dayToneClass","TimeColumn","label","values","isDisabled","onPick","listRef","parkedIndex","value","useLayoutEffect","firstEnabled","tabIndexOf","pickAt","focus","from","delta","isSelected","TimePanel","precision","minuteStep","active","onActiveChange","isTimeDisabled","onPickTime","parts","partsOf","columns","SegmentedControl","formatTimeReadout","DIVIDER_H","column","PresetList","presets","onPreset","PRESET_BUTTON","PRESET_HOVER","DatePickerPanel","props","useId","todayLabel","todayDisabled","onToday","showApply","applyDisabled","onApply","Fragment","DIVIDER_V","LINK_BUTTON","LINK_HOVER","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePickerPanel.js","sources":["../../src/components/DatePickerPanel.tsx"],"sourcesContent":["import React, { useEffect, useId, useLayoutEffect, useRef } from 'react';\nimport { Button } from './Button';\nimport CaretDoubleLeftIcon from './CustomIcons/CaretDoubleLeftIcon';\nimport CaretDoubleRightIcon from './CustomIcons/CaretDoubleRightIcon';\nimport CaretLeftIcon from './CustomIcons/CaretLeftIcon';\nimport CaretRightIcon from './CustomIcons/CaretRightIcon';\nimport SegmentedControl from './SegmentedControl';\nimport {\n type DatePickerPrecision,\n type DatePickerTimeZone,\n type DayKey,\n type MonthKey,\n type WeekStart,\n addDays,\n addMonths,\n addMonthsToDay,\n compareDays,\n dayKeyOf,\n dayKeyString,\n daysInMonth,\n formatTimeReadout,\n monthLabel,\n monthWeeks,\n partsOf,\n sameDay,\n spokenDay,\n startOfWeek,\n weekdayLabels,\n} from './dateMath';\nimport {\n CELL_CLASS,\n DIVIDER_H,\n DIVIDER_V,\n HEADING_TEXT,\n LINK_BUTTON,\n LINK_HOVER,\n NAV_BUTTON,\n PRESET_BUTTON,\n PRESET_HOVER,\n RANGE_BAND,\n RANGE_BAND_SPAN,\n dayToneClass,\n} from './datePickerStyles';\nimport type { DateMinuteStep } from './datePickerTypes';\nimport { FOCUS_RING } from './focusRing';\n\nexport type Endpoint = 'start' | 'end';\nexport type TimeUnit = 'hours' | 'minutes' | 'seconds';\n\nexport interface Selection {\n start: Date | null;\n end: Date | null;\n}\n\ninterface DatePickerPanelProps {\n mode: 'single' | 'range';\n zone: DatePickerTimeZone;\n precision: DatePickerPrecision;\n minuteStep: DateMinuteStep;\n weekStart: WeekStart;\n view: MonthKey;\n onViewChange: (view: MonthKey) => void;\n focusDay: DayKey;\n onFocusDayChange: (day: DayKey) => void;\n draft: Selection;\n active: Endpoint;\n onActiveChange: (endpoint: Endpoint) => void;\n today: DayKey;\n isDayDisabled: (day: DayKey) => boolean;\n isMonthReachable: (month: MonthKey) => boolean;\n isTimeDisabled: (unit: TimeUnit, value: number) => boolean;\n onPickDay: (day: DayKey) => void;\n onPickTime: (unit: TimeUnit, value: number) => void;\n presets?: string[];\n onPreset: (index: number) => void;\n todayLabel: string;\n todayDisabled: boolean;\n onToday: () => void;\n showApply: boolean;\n applyDisabled: boolean;\n onApply: () => void;\n initialFocusRef: React.MutableRefObject<HTMLElement | null>;\n}\n\nconst TIME_ROW_PX = 40;\nconst TIME_COLUMN_HEIGHT_PX = 240;\n\nconst range = (count: number, step = 1): number[] =>\n Array.from({ length: Math.ceil(count / step) }, (_, index) => index * step);\n\nconst keyMove = (key: string, shift: boolean, day: DayKey, weekStart: WeekStart): DayKey | null => {\n switch (key) {\n case 'ArrowLeft':\n return addDays(day, -1);\n case 'ArrowRight':\n return addDays(day, 1);\n case 'ArrowUp':\n return addDays(day, -7);\n case 'ArrowDown':\n return addDays(day, 7);\n case 'Home':\n return startOfWeek(day, weekStart);\n case 'End':\n return addDays(startOfWeek(day, weekStart), 6);\n case 'PageUp':\n return addMonthsToDay(day, shift ? -12 : -1);\n case 'PageDown':\n return addMonthsToDay(day, shift ? 12 : 1);\n default:\n return null;\n }\n};\n\nconst carriedDay = (\n target: MonthKey,\n dayOfMonth: number,\n isDayDisabled: (day: DayKey) => boolean,\n): DayKey => {\n const last = daysInMonth(target);\n const wanted = Math.min(dayOfMonth, last);\n for (let offset = 0; offset < last; offset++) {\n for (const day of [wanted - offset, wanted + offset]) {\n if (day >= 1 && day <= last && !isDayDisabled({ ...target, day })) {\n return { ...target, day };\n }\n }\n }\n return { ...target, day: wanted };\n};\n\nconst MonthHeader: React.FC<{\n view: MonthKey;\n labelId: string;\n onViewChange: (view: MonthKey) => void;\n focusDay: DayKey;\n onFocusDayChange: (day: DayKey) => void;\n isDayDisabled: (day: DayKey) => boolean;\n isMonthReachable: (month: MonthKey) => boolean;\n}> = ({\n view,\n labelId,\n onViewChange,\n focusDay,\n onFocusDayChange,\n isDayDisabled,\n isMonthReachable,\n}) => {\n const step = (amount: number) => {\n const target = addMonths(view, amount);\n return { target, disabled: !isMonthReachable(target) };\n };\n const prevMonth = step(-1);\n const prevYear = step(-12);\n const nextMonth = step(1);\n const nextYear = step(12);\n // aria-disabled: a natively disabled button drops focus to <body>.\n const go = ({ target, disabled }: { target: MonthKey; disabled: boolean }) => {\n if (!disabled) {\n onViewChange(target);\n onFocusDayChange(carriedDay(target, focusDay.day, isDayDisabled));\n }\n };\n return (\n <div className=\"flex items-center justify-between p-2\">\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label=\"Previous year\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={prevYear.disabled || undefined}\n onClick={() => go(prevYear)}\n >\n <CaretDoubleLeftIcon size={14} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={prevMonth.disabled || undefined}\n onClick={() => go(prevMonth)}\n >\n <CaretLeftIcon size={14} />\n </button>\n </div>\n <span id={labelId} aria-live=\"polite\" className={HEADING_TEXT}>\n {monthLabel(view)}\n </span>\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label=\"Next month\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={nextMonth.disabled || undefined}\n onClick={() => go(nextMonth)}\n >\n <CaretRightIcon size={14} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next year\"\n className={`${NAV_BUTTON} ${FOCUS_RING}`}\n aria-disabled={nextYear.disabled || undefined}\n onClick={() => go(nextYear)}\n >\n <CaretDoubleRightIcon size={14} />\n </button>\n </div>\n </div>\n );\n};\n\nconst bandSpan = (\n day: DayKey,\n start: DayKey | null,\n end: DayKey | null,\n): keyof typeof RANGE_BAND_SPAN | null => {\n if (!start || !end || compareDays(start, end) === 0) {\n return null;\n }\n if (sameDay(day, start)) {\n return 'start';\n }\n if (sameDay(day, end)) {\n return 'end';\n }\n return compareDays(day, start) > 0 && compareDays(day, end) < 0 ? 'middle' : null;\n};\n\nconst DayGrid: React.FC<\n Pick<\n DatePickerPanelProps,\n | 'mode'\n | 'zone'\n | 'weekStart'\n | 'view'\n | 'onViewChange'\n | 'focusDay'\n | 'onFocusDayChange'\n | 'draft'\n | 'today'\n | 'isDayDisabled'\n | 'isMonthReachable'\n | 'onPickDay'\n | 'initialFocusRef'\n > & { labelId: string }\n> = ({\n mode,\n zone,\n weekStart,\n view,\n onViewChange,\n focusDay,\n onFocusDayChange,\n draft,\n today,\n isDayDisabled,\n isMonthReachable,\n onPickDay,\n initialFocusRef,\n labelId,\n}) => {\n const gridRef = useRef<HTMLDivElement>(null);\n const moveFocus = useRef(false);\n const weeks = monthWeeks(view, weekStart);\n const start = draft.start ? dayKeyOf(draft.start, zone) : null;\n const end = mode === 'range' && draft.end ? dayKeyOf(draft.end, zone) : null;\n const focusInView = weeks.some((week) => week.some((day) => sameDay(day, focusDay)));\n const tabStop = focusInView ? focusDay : { ...view, day: 1 };\n\n useEffect(() => {\n if (!moveFocus.current) {\n return;\n }\n moveFocus.current = false;\n gridRef.current\n ?.querySelector<HTMLElement>(`[data-day=\"${dayKeyString(focusDay)}\"]`)\n ?.focus({ preventScroll: true });\n }, [focusDay]);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (!isDayDisabled(tabStop)) {\n onPickDay(tabStop);\n }\n return;\n }\n const next = keyMove(event.key, event.shiftKey, tabStop, weekStart);\n if (!next) {\n return;\n }\n event.preventDefault();\n const leavesView = next.month !== view.month || next.year !== view.year;\n if (leavesView && !isMonthReachable(next)) {\n return;\n }\n if (leavesView) {\n onViewChange({ year: next.year, month: next.month });\n }\n moveFocus.current = true;\n onFocusDayChange(next);\n };\n\n const weekdays = weekdayLabels(weekStart);\n\n return (\n <div\n ref={gridRef}\n role=\"grid\"\n aria-labelledby={labelId}\n aria-multiselectable={mode === 'range' || undefined}\n className=\"flex w-[276px] flex-col\"\n onKeyDown={handleKeyDown}\n >\n <div role=\"row\" className=\"grid grid-cols-7 px-[14px] py-2\">\n {weekdays.map((weekday) => (\n <span\n key={weekday.short}\n role=\"columnheader\"\n aria-label={weekday.long}\n className={`flex h-6 items-center justify-center ${HEADING_TEXT}`}\n >\n {weekday.short}\n </span>\n ))}\n </div>\n {weeks.map((week) => (\n <div\n key={dayKeyString(week[0])}\n role=\"row\"\n className=\"grid grid-cols-7 px-[14px] py-2\"\n >\n {week.map((day) => {\n const key = dayKeyString(day);\n const disabled = isDayDisabled(day);\n const band = mode === 'range' ? bandSpan(day, start, end) : null;\n const selected =\n sameDay(day, start) || sameDay(day, end) || band === 'middle';\n const endpoint = sameDay(day, start) || sameDay(day, end);\n const isToday = sameDay(day, today);\n const outside = day.month !== view.month;\n const isTabStop = sameDay(day, tabStop);\n return (\n <div\n key={key}\n role=\"presentation\"\n className=\"relative flex h-6 items-center justify-center\"\n >\n {band && (\n <span\n aria-hidden=\"true\"\n className={`${RANGE_BAND} ${RANGE_BAND_SPAN[band]}`}\n />\n )}\n <button\n ref={\n isTabStop\n ? (node) => {\n initialFocusRef.current = node;\n }\n : undefined\n }\n type=\"button\"\n role=\"gridcell\"\n aria-selected={selected}\n data-day={key}\n tabIndex={isTabStop ? 0 : -1}\n aria-label={spokenDay(day)}\n aria-current={isToday ? 'date' : undefined}\n aria-disabled={disabled || undefined}\n className={`${CELL_CLASS(disabled)} ${dayToneClass({\n selected: endpoint,\n today: isToday,\n outside,\n disabled,\n })}`}\n onClick={() => {\n onFocusDayChange(day);\n if (!disabled) {\n onPickDay(day);\n }\n }}\n >\n {day.day}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n};\n\nconst TimeColumn: React.FC<{\n label: string;\n values: number[];\n selected: number | null;\n isDisabled: (value: number) => boolean;\n onPick: (value: number) => void;\n}> = ({ label, values, selected, isDisabled, onPick }) => {\n const listRef = useRef<HTMLDivElement>(null);\n const parkedIndex =\n selected === null ? -1 : values.filter((value) => value <= selected).length - 1;\n\n // A write, never a layout read.\n useLayoutEffect(() => {\n if (listRef.current && parkedIndex >= 0) {\n listRef.current.scrollTop = parkedIndex * TIME_ROW_PX;\n }\n }, [parkedIndex]);\n\n const firstEnabled = Math.max(\n 0,\n values.findIndex((value) => !isDisabled(value)),\n );\n const tabIndexOf = (index: number) =>\n index === (parkedIndex >= 0 ? parkedIndex : firstEnabled) ? 0 : -1;\n\n const pickAt = (index: number, focus: boolean) => {\n const value = values[index];\n if (value === undefined || isDisabled(value)) {\n return;\n }\n onPick(value);\n if (focus) {\n listRef.current\n ?.querySelector<HTMLElement>(`[data-value=\"${value}\"]`)\n ?.focus({ preventScroll: true });\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const from = parkedIndex >= 0 ? parkedIndex : -1;\n const delta: Record<string, number> = {\n ArrowDown: 1,\n ArrowUp: -1,\n PageDown: 5,\n PageUp: -5,\n };\n let target: number | null = null;\n if (event.key in delta) {\n target = from < 0 ? firstEnabled : from + delta[event.key];\n const step = Math.sign(delta[event.key]);\n while (target >= 0 && target < values.length && isDisabled(values[target])) {\n target += step;\n }\n } else if (event.key === 'Home') {\n target = values.findIndex((value) => !isDisabled(value));\n } else if (event.key === 'End') {\n target = values.length - 1;\n while (target >= 0 && isDisabled(values[target])) {\n target -= 1;\n }\n }\n if (target === null) {\n return;\n }\n event.preventDefault();\n pickAt(target, true);\n };\n\n return (\n <div\n ref={listRef}\n role=\"listbox\"\n aria-label={label}\n className=\"flex flex-col items-center overflow-y-auto overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n style={{ height: TIME_COLUMN_HEIGHT_PX }}\n onKeyDown={handleKeyDown}\n >\n {values.map((value, index) => {\n const disabled = isDisabled(value);\n const isSelected = value === selected;\n return (\n <div key={value} className=\"flex shrink-0 items-center py-2\">\n <button\n type=\"button\"\n role=\"option\"\n data-value={value}\n aria-selected={isSelected}\n aria-disabled={disabled || undefined}\n tabIndex={tabIndexOf(index)}\n className={`${CELL_CLASS(disabled)} ${dayToneClass({\n selected: isSelected,\n today: false,\n outside: false,\n disabled,\n })}`}\n onClick={() => pickAt(index, false)}\n >\n {String(value).padStart(2, '0')}\n </button>\n </div>\n );\n })}\n </div>\n );\n};\n\nconst TimePanel: React.FC<\n Pick<\n DatePickerPanelProps,\n | 'mode'\n | 'zone'\n | 'precision'\n | 'minuteStep'\n | 'draft'\n | 'active'\n | 'onActiveChange'\n | 'isTimeDisabled'\n | 'onPickTime'\n >\n> = ({\n mode,\n zone,\n precision,\n minuteStep,\n draft,\n active,\n onActiveChange,\n isTimeDisabled,\n onPickTime,\n}) => {\n const target = mode === 'range' ? draft[active] : draft.start;\n const parts = target ? partsOf(target, zone) : null;\n const columns: { unit: TimeUnit; label: string; values: number[] }[] = [\n { unit: 'hours', label: 'Hours', values: range(24) },\n { unit: 'minutes', label: 'Minutes', values: range(60, minuteStep) },\n ...(precision === 'second'\n ? [{ unit: 'seconds' as const, label: 'Seconds', values: range(60) }]\n : []),\n ];\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex min-h-8 items-center justify-center p-2\">\n {mode === 'range' ? (\n <SegmentedControl<Endpoint>\n size=\"small\"\n aria-label=\"Time for\"\n value={active}\n onChange={onActiveChange}\n options={[\n { value: 'start', label: 'Start' },\n { value: 'end', label: 'End' },\n ]}\n />\n ) : (\n <span className={`${HEADING_TEXT} whitespace-nowrap`}>\n {formatTimeReadout(target, zone, precision)}\n </span>\n )}\n </div>\n <div className={DIVIDER_H} />\n <div\n className=\"grid px-[14px]\"\n style={{ gridTemplateColumns: `repeat(${columns.length}, 35.67px)` }}\n >\n {columns.map((column) => (\n <TimeColumn\n key={column.unit}\n label={column.label}\n values={column.values}\n selected={parts ? parts[column.unit] : null}\n isDisabled={(value) => isTimeDisabled(column.unit, value)}\n onPick={(value) => onPickTime(column.unit, value)}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst PresetList: React.FC<{ presets: string[]; onPreset: (index: number) => void }> = ({\n presets,\n onPreset,\n}) => (\n <div className=\"flex w-36 flex-col gap-0.5 p-1\" role=\"group\" aria-label=\"Presets\">\n {presets.map((label, index) => (\n <button\n key={label}\n type=\"button\"\n className={`${PRESET_BUTTON} ${PRESET_HOVER} ${FOCUS_RING}`}\n onClick={() => onPreset(index)}\n >\n {label}\n </button>\n ))}\n </div>\n);\n\nconst DatePickerPanel: React.FC<DatePickerPanelProps> = (props) => {\n const labelId = `${useId().replace(/[^a-zA-Z0-9_-]/g, '')}-month`;\n const {\n presets,\n onPreset,\n precision,\n todayLabel,\n todayDisabled,\n onToday,\n showApply,\n applyDisabled,\n onApply,\n } = props;\n return (\n <div className=\"flex flex-col gap-1 p-1.5\">\n {props.mode === 'range' && (\n <span className=\"sr-only\" aria-live=\"polite\">\n {props.active === 'end' && props.draft.start && !props.draft.end\n ? 'Choose the end date'\n : ''}\n </span>\n )}\n <div className=\"flex\">\n {presets && presets.length > 0 && (\n <>\n <PresetList presets={presets} onPreset={onPreset} />\n <div className={`${DIVIDER_V} mx-1`} />\n </>\n )}\n <div className=\"flex flex-col gap-1\">\n <MonthHeader\n view={props.view}\n labelId={labelId}\n onViewChange={props.onViewChange}\n focusDay={props.focusDay}\n onFocusDayChange={props.onFocusDayChange}\n isDayDisabled={props.isDayDisabled}\n isMonthReachable={props.isMonthReachable}\n />\n <div className={DIVIDER_H} />\n <DayGrid {...props} labelId={labelId} />\n </div>\n {precision !== 'day' && (\n <>\n <div className={DIVIDER_V} />\n <TimePanel {...props} />\n </>\n )}\n </div>\n <div className={DIVIDER_H} />\n <div\n className={`flex items-center p-2 ${showApply ? 'justify-between' : 'justify-center'}`}\n >\n <button\n type=\"button\"\n className={`${LINK_BUTTON} ${LINK_HOVER} ${FOCUS_RING}`}\n disabled={todayDisabled}\n onClick={onToday}\n >\n {todayLabel}\n </button>\n {showApply && (\n <Button\n size=\"small\"\n variant=\"filled\"\n disabled={applyDisabled}\n onClick={onApply}\n >\n Apply\n </Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default DatePickerPanel;\n"],"names":["TIME_ROW_PX","TIME_COLUMN_HEIGHT_PX","range","count","step","_","index","keyMove","key","shift","day","weekStart","addDays","startOfWeek","addMonthsToDay","carriedDay","target","dayOfMonth","isDayDisabled","last","daysInMonth","wanted","offset","MonthHeader","view","labelId","onViewChange","focusDay","onFocusDayChange","isMonthReachable","amount","addMonths","prevMonth","prevYear","nextMonth","nextYear","go","disabled","jsxs","jsx","NAV_BUTTON","FOCUS_RING","CaretDoubleLeftIcon","CaretLeftIcon","HEADING_TEXT","monthLabel","CaretRightIcon","CaretDoubleRightIcon","bandSpan","start","end","compareDays","sameDay","DayGrid","mode","zone","draft","today","onPickDay","initialFocusRef","gridRef","useRef","moveFocus","weeks","monthWeeks","dayKeyOf","tabStop","week","useEffect","_b","_a","dayKeyString","handleKeyDown","event","next","leavesView","weekdays","weekdayLabels","weekday","band","selected","endpoint","isToday","outside","isTabStop","RANGE_BAND","RANGE_BAND_SPAN","node","spokenDay","CELL_CLASS","dayToneClass","TimeColumn","label","values","isDisabled","onPick","listRef","parkedIndex","value","useLayoutEffect","firstEnabled","tabIndexOf","pickAt","focus","from","delta","isSelected","TimePanel","precision","minuteStep","active","onActiveChange","isTimeDisabled","onPickTime","parts","partsOf","columns","SegmentedControl","formatTimeReadout","DIVIDER_H","column","PresetList","presets","onPreset","PRESET_BUTTON","PRESET_HOVER","DatePickerPanel","props","useId","todayLabel","todayDisabled","onToday","showApply","applyDisabled","onApply","Fragment","DIVIDER_V","LINK_BUTTON","LINK_HOVER","Button"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const N = [
|
|
2
2
|
"Jan",
|
|
3
3
|
"Feb",
|
|
4
4
|
"Mar",
|
|
@@ -11,7 +11,7 @@ const M = [
|
|
|
11
11
|
"Oct",
|
|
12
12
|
"Nov",
|
|
13
13
|
"Dec"
|
|
14
|
-
], F = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
|
|
14
|
+
], F = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], C = [
|
|
15
15
|
"Sunday",
|
|
16
16
|
"Monday",
|
|
17
17
|
"Tuesday",
|
|
@@ -19,7 +19,7 @@ const M = [
|
|
|
19
19
|
"Thursday",
|
|
20
20
|
"Friday",
|
|
21
21
|
"Saturday"
|
|
22
|
-
],
|
|
22
|
+
], i = (t, e) => e === "utc" ? {
|
|
23
23
|
year: t.getUTCFullYear(),
|
|
24
24
|
month: t.getUTCMonth(),
|
|
25
25
|
day: t.getUTCDate(),
|
|
@@ -34,37 +34,37 @@ const M = [
|
|
|
34
34
|
minutes: t.getMinutes(),
|
|
35
35
|
seconds: t.getSeconds()
|
|
36
36
|
};
|
|
37
|
-
const a = ({ year: t, month: e, day: n, hours: s = 0, minutes: o = 0, seconds:
|
|
37
|
+
const a = ({ year: t, month: e, day: n, hours: s = 0, minutes: o = 0, seconds: r = 0 }, c, g = 0) => {
|
|
38
38
|
const u = t >= 0 && t < 100 ? 400 : 0;
|
|
39
39
|
if (c === "utc") {
|
|
40
|
-
const
|
|
41
|
-
Date.UTC(t + u, e, n, s, o,
|
|
40
|
+
const d = new Date(
|
|
41
|
+
Date.UTC(t + u, e, n, s, o, r, g)
|
|
42
42
|
);
|
|
43
|
-
return u &&
|
|
43
|
+
return u && d.setUTCFullYear(d.getUTCFullYear() - u), d;
|
|
44
44
|
}
|
|
45
|
-
const
|
|
46
|
-
return u &&
|
|
45
|
+
const m = new Date(t + u, e, n, s, o, r, g);
|
|
46
|
+
return u && m.setFullYear(m.getFullYear() - u), m;
|
|
47
47
|
}, h = (t, e) => {
|
|
48
|
-
const { year: n, month: s, day: o } =
|
|
48
|
+
const { year: n, month: s, day: o } = i(t, e);
|
|
49
49
|
return { year: n, month: s, day: o };
|
|
50
|
-
},
|
|
50
|
+
}, E = (t, e) => t.year - e.year || t.month - e.month || t.day - e.day, Y = (t, e) => !!t && !!e && E(t, e) === 0, I = ({ year: t, month: e, day: n }) => `${t}-${String(e + 1).padStart(2, "0")}-${String(n).padStart(2, "0")}`, b = ({ year: t, month: e, day: n }, s) => a({ year: t, month: e, day: n }, s), k = ({ year: t, month: e, day: n }, s) => a({ year: t, month: e, day: n, hours: 23, minutes: 59, seconds: 59 }, s, 999), f = (t, e) => h(a({ year: t.year, month: t.month, day: t.day + e }, "utc"), "utc"), _ = ({ year: t, month: e }) => h(a({ year: t, month: e + 1, day: 0 }, "utc"), "utc").day, p = ({ year: t, month: e }, n) => {
|
|
51
51
|
const s = t * 12 + e + n;
|
|
52
52
|
return { year: Math.floor(s / 12), month: (s % 12 + 12) % 12 };
|
|
53
53
|
}, W = (t, e) => {
|
|
54
54
|
const n = p(t, e);
|
|
55
|
-
return { ...n, day: Math.min(t.day,
|
|
56
|
-
},
|
|
57
|
-
const s = (n +
|
|
58
|
-
return { short: F[s], long:
|
|
55
|
+
return { ...n, day: Math.min(t.day, _(n)) };
|
|
56
|
+
}, M = (t) => a(t, "utc").getUTCDay(), l = { sunday: 0, monday: 1 }, R = (t) => Array.from({ length: 7 }, (e, n) => {
|
|
57
|
+
const s = (n + l[t]) % 7;
|
|
58
|
+
return { short: F[s], long: C[s] };
|
|
59
59
|
}), K = (t, e) => {
|
|
60
|
-
const n = { ...t, day: 1 }, s = (
|
|
61
|
-
for (let
|
|
62
|
-
|
|
63
|
-
return
|
|
64
|
-
}, L = (t, e) =>
|
|
65
|
-
const s =
|
|
66
|
-
return n === "day" ? o : `${o}, ${w(s, n)}${
|
|
67
|
-
}, x = (t, e, n) => `${t ? w(
|
|
60
|
+
const n = { ...t, day: 1 }, s = (M(n) - l[e] + 7) % 7, o = f(n, -s), r = [];
|
|
61
|
+
for (let c = 0; c < 42; c++)
|
|
62
|
+
c % 7 === 0 && r.push([]), r[r.length - 1].push(f(o, c));
|
|
63
|
+
return r;
|
|
64
|
+
}, L = (t, e) => f(t, -((M(t) - l[e] + 7) % 7)), J = ({ year: t, month: e }) => `${N[e]} ${t}`, T = (t) => String(t).padStart(2, "0"), w = (t, e) => e === "second" ? `${T(t.hours)}:${T(t.minutes)}:${T(t.seconds)}` : `${T(t.hours)}:${T(t.minutes)}`, U = (t) => t === "utc" ? " UTC" : "", Z = (t, e, n) => {
|
|
65
|
+
const s = i(t, e), o = `${N[s.month]} ${s.day} ${s.year}`;
|
|
66
|
+
return n === "day" ? o : `${o}, ${w(s, n)}${U(e)}`;
|
|
67
|
+
}, x = (t, e, n) => `${t ? w(i(t, e), n) : n === "second" ? "--:--:--" : "--:--"}${U(e)}`;
|
|
68
68
|
let $;
|
|
69
69
|
const B = (t) => ($ ?? ($ = new Intl.DateTimeFormat("en-US", {
|
|
70
70
|
weekday: "long",
|
|
@@ -77,18 +77,18 @@ const B = (t) => ($ ?? ($ = new Intl.DateTimeFormat("en-US", {
|
|
|
77
77
|
return null;
|
|
78
78
|
const n = typeof t == "string" ? H.exec(t) : null;
|
|
79
79
|
if (n) {
|
|
80
|
-
const [, o,
|
|
80
|
+
const [, o, r, c, g = "0", u = "0", m = "0", d = ""] = n, y = {
|
|
81
81
|
year: Number(o),
|
|
82
|
-
month: Number(
|
|
82
|
+
month: Number(r) - 1,
|
|
83
83
|
day: Number(c),
|
|
84
|
-
hours: Number(
|
|
84
|
+
hours: Number(g),
|
|
85
85
|
minutes: Number(u),
|
|
86
|
-
seconds: Number(
|
|
86
|
+
seconds: Number(m)
|
|
87
87
|
};
|
|
88
|
-
if (
|
|
88
|
+
if (y.hours > 23 || y.minutes > 59 || y.seconds > 59)
|
|
89
89
|
return null;
|
|
90
|
-
const S = a(
|
|
91
|
-
return
|
|
90
|
+
const S = a(y, e, Number(d.padEnd(3, "0")));
|
|
91
|
+
return Y(h(S, e), y) ? S : null;
|
|
92
92
|
}
|
|
93
93
|
const s = t instanceof Date ? t : new Date(t);
|
|
94
94
|
return A(s) ? s : null;
|
|
@@ -105,32 +105,32 @@ const B = (t) => ($ ?? ($ = new Intl.DateTimeFormat("en-US", {
|
|
|
105
105
|
), D = {
|
|
106
106
|
minute: 6e4,
|
|
107
107
|
second: 1e3
|
|
108
|
-
},
|
|
108
|
+
}, O = (t, e, n) => {
|
|
109
109
|
if (n === "day")
|
|
110
|
-
return
|
|
110
|
+
return b(i(t, e), e);
|
|
111
111
|
if (e === "local" && !Number.isInteger(t.getTimezoneOffset())) {
|
|
112
|
-
const o =
|
|
112
|
+
const o = i(t, e);
|
|
113
113
|
return a({ ...o, seconds: n === "second" ? o.seconds : 0 }, e);
|
|
114
114
|
}
|
|
115
115
|
const s = D[n];
|
|
116
116
|
return new Date(Math.floor(t.getTime() / s) * s);
|
|
117
|
-
}, j = (t, e, n) => n === "day" ?
|
|
117
|
+
}, j = (t, e, n) => n === "day" ? k(h(t, e), e) : new Date(O(t, e, n).getTime() + D[n] - 1), q = (t, e, n) => {
|
|
118
118
|
if (n === "day")
|
|
119
119
|
return t;
|
|
120
|
-
const s =
|
|
120
|
+
const s = O(t, e, n);
|
|
121
121
|
return s.getTime() < t.getTime() ? new Date(s.getTime() + D[n]) : s;
|
|
122
122
|
};
|
|
123
123
|
export {
|
|
124
|
-
|
|
124
|
+
f as addDays,
|
|
125
125
|
p as addMonths,
|
|
126
126
|
W as addMonthsToDay,
|
|
127
127
|
q as ceilTo,
|
|
128
128
|
G as clampDate,
|
|
129
|
-
|
|
129
|
+
E as compareDays,
|
|
130
130
|
h as dayKeyOf,
|
|
131
131
|
I as dayKeyString,
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
_ as daysInMonth,
|
|
133
|
+
k as endOfDay,
|
|
134
134
|
j as endOfUnit,
|
|
135
135
|
Z as formatDate,
|
|
136
136
|
w as formatTime,
|
|
@@ -139,15 +139,15 @@ export {
|
|
|
139
139
|
J as monthLabel,
|
|
140
140
|
K as monthWeeks,
|
|
141
141
|
P as overlapsBounds,
|
|
142
|
-
|
|
143
|
-
|
|
142
|
+
i as partsOf,
|
|
143
|
+
Y as sameDay,
|
|
144
144
|
B as spokenDay,
|
|
145
|
-
|
|
145
|
+
b as startOfDay,
|
|
146
146
|
L as startOfWeek,
|
|
147
147
|
V as toDate,
|
|
148
|
-
|
|
148
|
+
O as truncateTo,
|
|
149
149
|
R as weekdayLabels,
|
|
150
|
-
|
|
150
|
+
M as weekdayOf,
|
|
151
151
|
X as withTime
|
|
152
152
|
};
|
|
153
153
|
//# sourceMappingURL=dateMath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dateMath.js","sources":["../../src/components/dateMath.ts"],"sourcesContent":["export type DatePickerTimeZone = 'local' | 'utc';\n\nexport type DatePickerPrecision = 'day' | 'minute' | 'second';\n\nexport type WeekStart = 'monday' | 'sunday';\n\nexport interface DayKey {\n year: number;\n month: number;\n day: number;\n}\n\nexport interface MonthKey {\n year: number;\n month: number;\n}\n\nexport interface DateTimeParts extends DayKey {\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport interface DateRange {\n start: Date;\n end: Date;\n}\n\nconst MONTHS_SHORT = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n] as const;\n\nconst WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const;\nconst WEEKDAYS_LONG = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n] as const;\n\nexport const partsOf = (date: Date, zone: DatePickerTimeZone): DateTimeParts =>\n zone === 'utc'\n ? {\n year: date.getUTCFullYear(),\n month: date.getUTCMonth(),\n day: date.getUTCDate(),\n hours: date.getUTCHours(),\n minutes: date.getUTCMinutes(),\n seconds: date.getUTCSeconds(),\n }\n : {\n year: date.getFullYear(),\n month: date.getMonth(),\n day: date.getDate(),\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n };\n\n// `Date` reads years 0-99 as 19xx; build 400 years on (same calendar) and move back.\nconst YEAR_SHIFT = 400;\n\nexport const fromParts = (\n { year, month, day, hours = 0, minutes = 0, seconds = 0 }: DayKey & Partial<DateTimeParts>,\n zone: DatePickerTimeZone,\n milliseconds = 0,\n): Date => {\n const shift = year >= 0 && year < 100 ? YEAR_SHIFT : 0;\n if (zone === 'utc') {\n const date = new Date(\n Date.UTC(year + shift, month, day, hours, minutes, seconds, milliseconds),\n );\n if (shift) {\n date.setUTCFullYear(date.getUTCFullYear() - shift);\n }\n return date;\n }\n const date = new Date(year + shift, month, day, hours, minutes, seconds, milliseconds);\n if (shift) {\n date.setFullYear(date.getFullYear() - shift);\n }\n return date;\n};\n\nexport const dayKeyOf = (date: Date, zone: DatePickerTimeZone): DayKey => {\n const { year, month, day } = partsOf(date, zone);\n return { year, month, day };\n};\n\nexport const compareDays = (a: DayKey, b: DayKey): number =>\n a.year - b.year || a.month - b.month || a.day - b.day;\n\nexport const sameDay = (a: DayKey | null | undefined, b: DayKey | null | undefined): boolean =>\n !!a && !!b && compareDays(a, b) === 0;\n\nexport const dayKeyString = ({ year, month, day }: DayKey): string =>\n `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n\nexport const startOfDay = ({ year, month, day }: DayKey, zone: DatePickerTimeZone): Date =>\n fromParts({ year, month, day }, zone);\n\nexport const endOfDay = ({ year, month, day }: DayKey, zone: DatePickerTimeZone): Date =>\n fromParts({ year, month, day, hours: 23, minutes: 59, seconds: 59 }, zone, 999);\n\nexport const addDays = (day: DayKey, amount: number): DayKey =>\n dayKeyOf(fromParts({ year: day.year, month: day.month, day: day.day + amount }, 'utc'), 'utc');\n\nexport const daysInMonth = ({ year, month }: MonthKey): number =>\n dayKeyOf(fromParts({ year, month: month + 1, day: 0 }, 'utc'), 'utc').day;\n\nexport const addMonths = ({ year, month }: MonthKey, amount: number): MonthKey => {\n const total = year * 12 + month + amount;\n return { year: Math.floor(total / 12), month: ((total % 12) + 12) % 12 };\n};\n\nexport const addMonthsToDay = (day: DayKey, amount: number): DayKey => {\n const target = addMonths(day, amount);\n return { ...target, day: Math.min(day.day, daysInMonth(target)) };\n};\n\nexport const weekdayOf = (day: DayKey): number => fromParts(day, 'utc').getUTCDay();\n\nconst WEEK_START_INDEX: Record<WeekStart, number> = { sunday: 0, monday: 1 };\n\nexport const weekdayLabels = (weekStart: WeekStart): { short: string; long: string }[] =>\n Array.from({ length: 7 }, (_, index) => {\n const weekday = (index + WEEK_START_INDEX[weekStart]) % 7;\n return { short: WEEKDAYS_SHORT[weekday], long: WEEKDAYS_LONG[weekday] };\n });\n\nexport const monthWeeks = (view: MonthKey, weekStart: WeekStart): DayKey[][] => {\n const first: DayKey = { ...view, day: 1 };\n const lead = (weekdayOf(first) - WEEK_START_INDEX[weekStart] + 7) % 7;\n const cellCount = Math.ceil((lead + daysInMonth(view)) / 7) * 7;\n const start = addDays(first, -lead);\n const weeks: DayKey[][] = [];\n for (let index = 0; index < cellCount; index++) {\n if (index % 7 === 0) {\n weeks.push([]);\n }\n weeks[weeks.length - 1].push(addDays(start, index));\n }\n return weeks;\n};\n\nexport const startOfWeek = (day: DayKey, weekStart: WeekStart): DayKey =>\n addDays(day, -((weekdayOf(day) - WEEK_START_INDEX[weekStart] + 7) % 7));\n\nexport const monthLabel = ({ year, month }: MonthKey): string => `${MONTHS_SHORT[month]} ${year}`;\n\nconst pad = (value: number): string => String(value).padStart(2, '0');\n\nexport const formatTime = (\n parts: Pick<DateTimeParts, 'hours' | 'minutes' | 'seconds'>,\n precision: DatePickerPrecision,\n): string =>\n precision === 'second'\n ? `${pad(parts.hours)}:${pad(parts.minutes)}:${pad(parts.seconds)}`\n : `${pad(parts.hours)}:${pad(parts.minutes)}`;\n\nconst zoneSuffix = (zone: DatePickerTimeZone): string => (zone === 'utc' ? ' UTC' : '');\n\nexport const formatDate = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): string => {\n const parts = partsOf(date, zone);\n const day = `${MONTHS_SHORT[parts.month]} ${parts.day} ${parts.year}`;\n return precision === 'day' ? day : `${day}, ${formatTime(parts, precision)}${zoneSuffix(zone)}`;\n};\n\nexport const formatTimeReadout = (\n date: Date | null,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): string =>\n `${date ? formatTime(partsOf(date, zone), precision) : precision === 'second' ? '--:--:--' : '--:--'}${zoneSuffix(zone)}`;\n\n// Lazy, so importing the module has no side effects.\nlet spokenDayFormat: Intl.DateTimeFormat | undefined;\n\nexport const spokenDay = (day: DayKey): string => {\n spokenDayFormat ??= new Intl.DateTimeFormat('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n timeZone: 'UTC',\n });\n return spokenDayFormat.format(fromParts(day, 'utc'));\n};\n\nexport const clampDate = (date: Date, min?: Date, max?: Date): Date => {\n if (min && date.getTime() < min.getTime()) {\n return new Date(min.getTime());\n }\n if (max && date.getTime() > max.getTime()) {\n return new Date(max.getTime());\n }\n return date;\n};\n\nexport const overlapsBounds = (from: Date, to: Date, min?: Date, max?: Date): boolean =>\n (!min || to.getTime() >= min.getTime()) && (!max || from.getTime() <= max.getTime());\n\nconst isValidDate = (value: unknown): value is Date =>\n value instanceof Date && !Number.isNaN(value.getTime());\n\nconst ZONELESS = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?)?$/;\n\nexport const toDate = (\n value: Date | string | number | null | undefined,\n zone: DatePickerTimeZone,\n): Date | null => {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n // Without an offset, a string names a wall-clock time in `zone`, not in the browser's.\n const zoneless = typeof value === 'string' ? ZONELESS.exec(value) : null;\n if (zoneless) {\n const [, year, month, day, hours = '0', minutes = '0', seconds = '0', ms = ''] = zoneless;\n const parts = {\n year: Number(year),\n month: Number(month) - 1,\n day: Number(day),\n hours: Number(hours),\n minutes: Number(minutes),\n seconds: Number(seconds),\n };\n if (parts.hours > 23 || parts.minutes > 59 || parts.seconds > 59) {\n return null;\n }\n const date = fromParts(parts, zone, Number(ms.padEnd(3, '0')));\n return sameDay(dayKeyOf(date, zone), parts) ? date : null;\n }\n const date = value instanceof Date ? value : new Date(value);\n return isValidDate(date) ? date : null;\n};\n\nexport const withTime = (\n day: DayKey,\n time: Pick<DateTimeParts, 'hours' | 'minutes' | 'seconds'>,\n zone: DatePickerTimeZone,\n): Date =>\n fromParts(\n {\n year: day.year,\n month: day.month,\n day: day.day,\n hours: time.hours,\n minutes: time.minutes,\n seconds: time.seconds,\n },\n zone,\n );\n\nconst UNIT_MS: Record<Exclude<DatePickerPrecision, 'day'>, number> = {\n minute: 60_000,\n second: 1_000,\n};\n\n// Arithmetic, not a rebuild from local fields, which moves the repeated hour when clocks go back.\nexport const truncateTo = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): Date => {\n if (precision === 'day') {\n return startOfDay(partsOf(date, zone), zone);\n }\n if (zone === 'local' && !Number.isInteger(date.getTimezoneOffset())) {\n const parts = partsOf(date, zone);\n return fromParts({ ...parts, seconds: precision === 'second' ? parts.seconds : 0 }, zone);\n }\n const unit = UNIT_MS[precision];\n return new Date(Math.floor(date.getTime() / unit) * unit);\n};\n\n/** The last millisecond of the unit `date` falls in, so a range end covers the whole of it. */\nexport const endOfUnit = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): Date =>\n precision === 'day'\n ? endOfDay(dayKeyOf(date, zone), zone)\n : new Date(truncateTo(date, zone, precision).getTime() + UNIT_MS[precision] - 1);\n\nexport const ceilTo = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): Date => {\n if (precision === 'day') {\n return date;\n }\n const floor = truncateTo(date, zone, precision);\n return floor.getTime() < date.getTime()\n ? new Date(floor.getTime() + UNIT_MS[precision])\n : floor;\n};\n"],"names":["MONTHS_SHORT","WEEKDAYS_SHORT","WEEKDAYS_LONG","partsOf","date","zone","fromParts","year","month","day","hours","minutes","seconds","milliseconds","shift","dayKeyOf","compareDays","a","b","sameDay","dayKeyString","startOfDay","endOfDay","addDays","amount","daysInMonth","addMonths","total","addMonthsToDay","target","weekdayOf","WEEK_START_INDEX","weekdayLabels","weekStart","_","index","weekday","monthWeeks","view","first","lead","cellCount","start","weeks","startOfWeek","monthLabel","pad","value","formatTime","parts","precision","zoneSuffix","formatDate","formatTimeReadout","spokenDayFormat","spokenDay","clampDate","min","max","overlapsBounds","from","to","isValidDate","ZONELESS","toDate","zoneless","ms","withTime","time","UNIT_MS","truncateTo","unit","endOfUnit","ceilTo","floor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dateMath.js","sources":["../../src/components/dateMath.ts"],"sourcesContent":["export type DatePickerTimeZone = 'local' | 'utc';\n\nexport type DatePickerPrecision = 'day' | 'minute' | 'second';\n\nexport type WeekStart = 'monday' | 'sunday';\n\nexport interface DayKey {\n year: number;\n month: number;\n day: number;\n}\n\nexport interface MonthKey {\n year: number;\n month: number;\n}\n\nexport interface DateTimeParts extends DayKey {\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport interface DateRange {\n start: Date;\n end: Date;\n}\n\nconst MONTHS_SHORT = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n] as const;\n\nconst WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const;\nconst WEEKDAYS_LONG = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n] as const;\n\nexport const partsOf = (date: Date, zone: DatePickerTimeZone): DateTimeParts =>\n zone === 'utc'\n ? {\n year: date.getUTCFullYear(),\n month: date.getUTCMonth(),\n day: date.getUTCDate(),\n hours: date.getUTCHours(),\n minutes: date.getUTCMinutes(),\n seconds: date.getUTCSeconds(),\n }\n : {\n year: date.getFullYear(),\n month: date.getMonth(),\n day: date.getDate(),\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n };\n\n// `Date` reads years 0-99 as 19xx; build 400 years on (same calendar) and move back.\nconst YEAR_SHIFT = 400;\n\nexport const fromParts = (\n { year, month, day, hours = 0, minutes = 0, seconds = 0 }: DayKey & Partial<DateTimeParts>,\n zone: DatePickerTimeZone,\n milliseconds = 0,\n): Date => {\n const shift = year >= 0 && year < 100 ? YEAR_SHIFT : 0;\n if (zone === 'utc') {\n const date = new Date(\n Date.UTC(year + shift, month, day, hours, minutes, seconds, milliseconds),\n );\n if (shift) {\n date.setUTCFullYear(date.getUTCFullYear() - shift);\n }\n return date;\n }\n const date = new Date(year + shift, month, day, hours, minutes, seconds, milliseconds);\n if (shift) {\n date.setFullYear(date.getFullYear() - shift);\n }\n return date;\n};\n\nexport const dayKeyOf = (date: Date, zone: DatePickerTimeZone): DayKey => {\n const { year, month, day } = partsOf(date, zone);\n return { year, month, day };\n};\n\nexport const compareDays = (a: DayKey, b: DayKey): number =>\n a.year - b.year || a.month - b.month || a.day - b.day;\n\nexport const sameDay = (a: DayKey | null | undefined, b: DayKey | null | undefined): boolean =>\n !!a && !!b && compareDays(a, b) === 0;\n\nexport const dayKeyString = ({ year, month, day }: DayKey): string =>\n `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n\nexport const startOfDay = ({ year, month, day }: DayKey, zone: DatePickerTimeZone): Date =>\n fromParts({ year, month, day }, zone);\n\nexport const endOfDay = ({ year, month, day }: DayKey, zone: DatePickerTimeZone): Date =>\n fromParts({ year, month, day, hours: 23, minutes: 59, seconds: 59 }, zone, 999);\n\nexport const addDays = (day: DayKey, amount: number): DayKey =>\n dayKeyOf(fromParts({ year: day.year, month: day.month, day: day.day + amount }, 'utc'), 'utc');\n\nexport const daysInMonth = ({ year, month }: MonthKey): number =>\n dayKeyOf(fromParts({ year, month: month + 1, day: 0 }, 'utc'), 'utc').day;\n\nexport const addMonths = ({ year, month }: MonthKey, amount: number): MonthKey => {\n const total = year * 12 + month + amount;\n return { year: Math.floor(total / 12), month: ((total % 12) + 12) % 12 };\n};\n\nexport const addMonthsToDay = (day: DayKey, amount: number): DayKey => {\n const target = addMonths(day, amount);\n return { ...target, day: Math.min(day.day, daysInMonth(target)) };\n};\n\nexport const weekdayOf = (day: DayKey): number => fromParts(day, 'utc').getUTCDay();\n\nconst WEEK_START_INDEX: Record<WeekStart, number> = { sunday: 0, monday: 1 };\n\nexport const weekdayLabels = (weekStart: WeekStart): { short: string; long: string }[] =>\n Array.from({ length: 7 }, (_, index) => {\n const weekday = (index + WEEK_START_INDEX[weekStart]) % 7;\n return { short: WEEKDAYS_SHORT[weekday], long: WEEKDAYS_LONG[weekday] };\n });\n\nexport const monthWeeks = (view: MonthKey, weekStart: WeekStart): DayKey[][] => {\n const first: DayKey = { ...view, day: 1 };\n const lead = (weekdayOf(first) - WEEK_START_INDEX[weekStart] + 7) % 7;\n const start = addDays(first, -lead);\n const weeks: DayKey[][] = [];\n for (let index = 0; index < 42; index++) {\n if (index % 7 === 0) {\n weeks.push([]);\n }\n weeks[weeks.length - 1].push(addDays(start, index));\n }\n return weeks;\n};\n\nexport const startOfWeek = (day: DayKey, weekStart: WeekStart): DayKey =>\n addDays(day, -((weekdayOf(day) - WEEK_START_INDEX[weekStart] + 7) % 7));\n\nexport const monthLabel = ({ year, month }: MonthKey): string => `${MONTHS_SHORT[month]} ${year}`;\n\nconst pad = (value: number): string => String(value).padStart(2, '0');\n\nexport const formatTime = (\n parts: Pick<DateTimeParts, 'hours' | 'minutes' | 'seconds'>,\n precision: DatePickerPrecision,\n): string =>\n precision === 'second'\n ? `${pad(parts.hours)}:${pad(parts.minutes)}:${pad(parts.seconds)}`\n : `${pad(parts.hours)}:${pad(parts.minutes)}`;\n\nconst zoneSuffix = (zone: DatePickerTimeZone): string => (zone === 'utc' ? ' UTC' : '');\n\nexport const formatDate = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): string => {\n const parts = partsOf(date, zone);\n const day = `${MONTHS_SHORT[parts.month]} ${parts.day} ${parts.year}`;\n return precision === 'day' ? day : `${day}, ${formatTime(parts, precision)}${zoneSuffix(zone)}`;\n};\n\nexport const formatTimeReadout = (\n date: Date | null,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): string =>\n `${date ? formatTime(partsOf(date, zone), precision) : precision === 'second' ? '--:--:--' : '--:--'}${zoneSuffix(zone)}`;\n\n// Lazy, so importing the module has no side effects.\nlet spokenDayFormat: Intl.DateTimeFormat | undefined;\n\nexport const spokenDay = (day: DayKey): string => {\n spokenDayFormat ??= new Intl.DateTimeFormat('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n timeZone: 'UTC',\n });\n return spokenDayFormat.format(fromParts(day, 'utc'));\n};\n\nexport const clampDate = (date: Date, min?: Date, max?: Date): Date => {\n if (min && date.getTime() < min.getTime()) {\n return new Date(min.getTime());\n }\n if (max && date.getTime() > max.getTime()) {\n return new Date(max.getTime());\n }\n return date;\n};\n\nexport const overlapsBounds = (from: Date, to: Date, min?: Date, max?: Date): boolean =>\n (!min || to.getTime() >= min.getTime()) && (!max || from.getTime() <= max.getTime());\n\nconst isValidDate = (value: unknown): value is Date =>\n value instanceof Date && !Number.isNaN(value.getTime());\n\nconst ZONELESS = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?)?$/;\n\nexport const toDate = (\n value: Date | string | number | null | undefined,\n zone: DatePickerTimeZone,\n): Date | null => {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n // Without an offset, a string names a wall-clock time in `zone`, not in the browser's.\n const zoneless = typeof value === 'string' ? ZONELESS.exec(value) : null;\n if (zoneless) {\n const [, year, month, day, hours = '0', minutes = '0', seconds = '0', ms = ''] = zoneless;\n const parts = {\n year: Number(year),\n month: Number(month) - 1,\n day: Number(day),\n hours: Number(hours),\n minutes: Number(minutes),\n seconds: Number(seconds),\n };\n if (parts.hours > 23 || parts.minutes > 59 || parts.seconds > 59) {\n return null;\n }\n const date = fromParts(parts, zone, Number(ms.padEnd(3, '0')));\n return sameDay(dayKeyOf(date, zone), parts) ? date : null;\n }\n const date = value instanceof Date ? value : new Date(value);\n return isValidDate(date) ? date : null;\n};\n\nexport const withTime = (\n day: DayKey,\n time: Pick<DateTimeParts, 'hours' | 'minutes' | 'seconds'>,\n zone: DatePickerTimeZone,\n): Date =>\n fromParts(\n {\n year: day.year,\n month: day.month,\n day: day.day,\n hours: time.hours,\n minutes: time.minutes,\n seconds: time.seconds,\n },\n zone,\n );\n\nconst UNIT_MS: Record<Exclude<DatePickerPrecision, 'day'>, number> = {\n minute: 60_000,\n second: 1_000,\n};\n\n// Arithmetic, not a rebuild from local fields, which moves the repeated hour when clocks go back.\nexport const truncateTo = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): Date => {\n if (precision === 'day') {\n return startOfDay(partsOf(date, zone), zone);\n }\n if (zone === 'local' && !Number.isInteger(date.getTimezoneOffset())) {\n const parts = partsOf(date, zone);\n return fromParts({ ...parts, seconds: precision === 'second' ? parts.seconds : 0 }, zone);\n }\n const unit = UNIT_MS[precision];\n return new Date(Math.floor(date.getTime() / unit) * unit);\n};\n\n/** The last millisecond of the unit `date` falls in, so a range end covers the whole of it. */\nexport const endOfUnit = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): Date =>\n precision === 'day'\n ? endOfDay(dayKeyOf(date, zone), zone)\n : new Date(truncateTo(date, zone, precision).getTime() + UNIT_MS[precision] - 1);\n\nexport const ceilTo = (\n date: Date,\n zone: DatePickerTimeZone,\n precision: DatePickerPrecision,\n): Date => {\n if (precision === 'day') {\n return date;\n }\n const floor = truncateTo(date, zone, precision);\n return floor.getTime() < date.getTime()\n ? new Date(floor.getTime() + UNIT_MS[precision])\n : floor;\n};\n"],"names":["MONTHS_SHORT","WEEKDAYS_SHORT","WEEKDAYS_LONG","partsOf","date","zone","fromParts","year","month","day","hours","minutes","seconds","milliseconds","shift","dayKeyOf","compareDays","a","b","sameDay","dayKeyString","startOfDay","endOfDay","addDays","amount","daysInMonth","addMonths","total","addMonthsToDay","target","weekdayOf","WEEK_START_INDEX","weekdayLabels","weekStart","_","index","weekday","monthWeeks","view","first","lead","start","weeks","startOfWeek","monthLabel","pad","value","formatTime","parts","precision","zoneSuffix","formatDate","formatTimeReadout","spokenDayFormat","spokenDay","clampDate","min","max","overlapsBounds","from","to","isValidDate","ZONELESS","toDate","zoneless","ms","withTime","time","UNIT_MS","truncateTo","unit","endOfUnit","ceilTo","floor"],"mappings":"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"}
|
package/package.json
CHANGED