@rpcbase/ui 0.264.0 → 0.266.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/HourPickerField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAiB9B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC9B,CAAA;AA2QD,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC9C,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,aAAa,EACb,OAAO,EACP,WAA2B,EAC3B,SAAS,EACT,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,GACX,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/HourPickerField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAiB9B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC9B,CAAA;AA2QD,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC9C,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,aAAa,EACb,OAAO,EACP,WAA2B,EAC3B,SAAS,EACT,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,GACX,EAAE,oBAAoB,2CA2gBtB;yBA3hBe,eAAe;;;AA+hB/B,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAA;AA8SvD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAQ1D;yBARe,eAAe"}
|
package/dist/index302.js
CHANGED
|
@@ -140,47 +140,47 @@ function b({ direction: e, viewportRef: n, speed: i = 400, className: s }) {
|
|
|
140
140
|
function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeholder: f = "Select time", className: p, inputClassName: m, disabled: h, readOnly: g, open: _, onOpenChange: v, triggerTestId: ee, contentTestId: te, isHydrated: x }) {
|
|
141
141
|
let S = r.useId(), C = e ?? `hours-picker-${S}`, T = r.useRef(null), E = r.useRef(null), D = r.useCallback((e) => {
|
|
142
142
|
E.current = e;
|
|
143
|
-
}, []), O = r.useRef(null), k = r.useRef(!1), [A, j] = r.useState(null), M = r.useRef(null), N = r.useRef(null), P = r.useRef(null), [F,
|
|
143
|
+
}, []), O = r.useRef(null), k = r.useRef(!1), [A, j] = r.useState(null), M = r.useRef(null), N = r.useRef(null), P = r.useRef(null), [F, I] = r.useState(() => ({
|
|
144
144
|
left: 0,
|
|
145
145
|
top: 0,
|
|
146
146
|
width: 0
|
|
147
|
-
})), [
|
|
148
|
-
|
|
149
|
-
if (!
|
|
147
|
+
})), [L, R] = r.useState(!1), z = _ ?? L, B = v ?? R, V = r.useRef(!1);
|
|
148
|
+
V.current = z, r.useEffect(() => {
|
|
149
|
+
if (!z || h || g) return;
|
|
150
150
|
let e = T.current;
|
|
151
151
|
e instanceof HTMLInputElement && (typeof document < "u" && document.activeElement === e || e.focus({ preventScroll: !0 }));
|
|
152
152
|
}, [
|
|
153
153
|
h,
|
|
154
|
-
|
|
154
|
+
z,
|
|
155
155
|
g
|
|
156
156
|
]);
|
|
157
|
-
let
|
|
157
|
+
let H = r.useCallback((e) => {
|
|
158
158
|
O.current = e, j(e);
|
|
159
|
-
}, []),
|
|
159
|
+
}, []), U = r.useCallback(() => {
|
|
160
160
|
k.current = !0;
|
|
161
161
|
}, []);
|
|
162
162
|
r.useEffect(() => {
|
|
163
|
-
if (!
|
|
163
|
+
if (!z) return;
|
|
164
164
|
let e = d.find((e) => e.value === n);
|
|
165
165
|
if (e && y(e)) {
|
|
166
|
-
|
|
166
|
+
H(e.value);
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
169
169
|
let t = d.find((e) => y(e));
|
|
170
|
-
|
|
170
|
+
H(t?.value ?? null);
|
|
171
171
|
}, [
|
|
172
|
-
|
|
172
|
+
z,
|
|
173
173
|
d,
|
|
174
|
-
|
|
174
|
+
H,
|
|
175
175
|
n
|
|
176
176
|
]);
|
|
177
|
-
let
|
|
177
|
+
let ne = r.useCallback((e) => {
|
|
178
178
|
if (e === null) {
|
|
179
179
|
o && o(null);
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
182
|
y(d.find((t) => t.value === e)) && o && o(e);
|
|
183
|
-
}, [o, d]),
|
|
183
|
+
}, [o, d]), W = r.useCallback((e) => {
|
|
184
184
|
if (e === null) {
|
|
185
185
|
o && o(null), a(null);
|
|
186
186
|
return;
|
|
@@ -192,24 +192,24 @@ function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeho
|
|
|
192
192
|
d
|
|
193
193
|
]);
|
|
194
194
|
r.useEffect(() => {
|
|
195
|
-
if (!
|
|
195
|
+
if (!z) return;
|
|
196
196
|
let e = M.current?.ownerDocument ?? document, t = e.defaultView ?? window, n = (e) => {
|
|
197
197
|
let t = e.target;
|
|
198
198
|
if (!(t instanceof Node)) return;
|
|
199
199
|
let n = M.current;
|
|
200
|
-
n && (n.contains(t) || N.current?.contains(t) ||
|
|
200
|
+
n && (n.contains(t) || N.current?.contains(t) || B(!1));
|
|
201
201
|
}, r = (e) => {
|
|
202
|
-
if (e.key !== "Escape" || !
|
|
202
|
+
if (e.key !== "Escape" || !V.current) return;
|
|
203
203
|
let t = e.target;
|
|
204
204
|
if (!(t instanceof Node)) return;
|
|
205
205
|
let n = M.current, r = N.current;
|
|
206
|
-
!n?.contains(t) && !r?.contains(t) || (e.preventDefault(), e.stopPropagation(),
|
|
206
|
+
!n?.contains(t) && !r?.contains(t) || (e.preventDefault(), e.stopPropagation(), B(!1));
|
|
207
207
|
};
|
|
208
208
|
return e.addEventListener("pointerdown", n, !0), t.addEventListener("keydown", r, !0), () => {
|
|
209
209
|
e.removeEventListener("pointerdown", n, !0), t.removeEventListener("keydown", r, !0);
|
|
210
210
|
};
|
|
211
|
-
}, [
|
|
212
|
-
if (!
|
|
211
|
+
}, [z, B]), r.useEffect(() => {
|
|
212
|
+
if (!z) return;
|
|
213
213
|
let e = N.current;
|
|
214
214
|
if (!e) return;
|
|
215
215
|
let t = (e) => {
|
|
@@ -227,50 +227,50 @@ function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeho
|
|
|
227
227
|
return e.addEventListener("wheel", t, { passive: !1 }), () => {
|
|
228
228
|
e.removeEventListener("wheel", t);
|
|
229
229
|
};
|
|
230
|
-
}, [
|
|
231
|
-
if (!
|
|
230
|
+
}, [z]), r.useEffect(() => {
|
|
231
|
+
if (!z || _ !== void 0 && !v || typeof window > "u" || !("IntersectionObserver" in window)) return;
|
|
232
232
|
let e = T.current;
|
|
233
233
|
if (!(e instanceof HTMLElement)) return;
|
|
234
234
|
let t = !0, n = new IntersectionObserver((e) => {
|
|
235
235
|
if (!t) return;
|
|
236
236
|
let n = e[0];
|
|
237
|
-
n && !n.isIntersecting &&
|
|
237
|
+
n && !n.isIntersecting && B(!1);
|
|
238
238
|
});
|
|
239
239
|
return n.observe(e), () => {
|
|
240
240
|
t = !1, n.disconnect();
|
|
241
241
|
};
|
|
242
242
|
}, [
|
|
243
243
|
v,
|
|
244
|
-
|
|
244
|
+
z,
|
|
245
245
|
_,
|
|
246
|
-
|
|
246
|
+
B
|
|
247
247
|
]);
|
|
248
|
-
let
|
|
248
|
+
let G = r.useCallback(() => {
|
|
249
249
|
if (typeof window > "u") return;
|
|
250
250
|
let e = T.current, t = N.current;
|
|
251
251
|
if (!(e instanceof HTMLElement) || !t) return;
|
|
252
252
|
let n = e.getBoundingClientRect(), r = t.offsetHeight, i = window.innerWidth ?? 0, a = window.innerHeight ?? 0, o = n.width, s = n.left;
|
|
253
253
|
s + o > i - 8 && (s = Math.max(8, i - o - 8)), s < 8 && (s = 8);
|
|
254
254
|
let c = n.bottom + 8, l = c + r > a - 8, u = n.top - r - 8;
|
|
255
|
-
l && u >= 8 && (c = u), c < 8 && (c = 8), c + r > a - 8 && (c = Math.max(8, a - r - 8)),
|
|
255
|
+
l && u >= 8 && (c = u), c < 8 && (c = 8), c + r > a - 8 && (c = Math.max(8, a - r - 8)), I({
|
|
256
256
|
left: s,
|
|
257
257
|
top: c,
|
|
258
258
|
width: o
|
|
259
259
|
});
|
|
260
260
|
}, []);
|
|
261
|
-
|
|
262
|
-
if (!
|
|
263
|
-
|
|
264
|
-
let e = window.requestAnimationFrame(
|
|
265
|
-
return window.addEventListener("scroll",
|
|
266
|
-
window.cancelAnimationFrame(e), window.removeEventListener("scroll",
|
|
261
|
+
r.useLayoutEffect(() => {
|
|
262
|
+
if (!z || h || typeof window > "u") return;
|
|
263
|
+
G();
|
|
264
|
+
let e = window.requestAnimationFrame(G);
|
|
265
|
+
return window.addEventListener("scroll", G, !0), window.addEventListener("resize", G), () => {
|
|
266
|
+
window.cancelAnimationFrame(e), window.removeEventListener("scroll", G, !0), window.removeEventListener("resize", G);
|
|
267
267
|
};
|
|
268
268
|
}, [
|
|
269
269
|
h,
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
z,
|
|
271
|
+
G
|
|
272
272
|
]), r.useEffect(() => {
|
|
273
|
-
if (!
|
|
273
|
+
if (!z) return;
|
|
274
274
|
let e = P.current;
|
|
275
275
|
if (!e) return;
|
|
276
276
|
let t = requestAnimationFrame(() => {
|
|
@@ -299,8 +299,8 @@ function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeho
|
|
|
299
299
|
e.scrollTop = a;
|
|
300
300
|
});
|
|
301
301
|
return () => cancelAnimationFrame(t);
|
|
302
|
-
}, [
|
|
303
|
-
if (!
|
|
302
|
+
}, [z, d]), r.useEffect(() => {
|
|
303
|
+
if (!z || !A || !k.current) return;
|
|
304
304
|
let e = P.current;
|
|
305
305
|
if (!e) return;
|
|
306
306
|
let t = e.querySelector(`[role="option"][data-value="${A}"]`);
|
|
@@ -311,7 +311,9 @@ function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeho
|
|
|
311
311
|
return;
|
|
312
312
|
}
|
|
313
313
|
r > e.scrollTop + e.clientHeight && (e.scrollTop = Math.max(0, r - e.clientHeight));
|
|
314
|
-
}, [A,
|
|
314
|
+
}, [A, z]);
|
|
315
|
+
let re = d.find((e) => e.value === n);
|
|
316
|
+
return /* @__PURE__ */ c("div", {
|
|
315
317
|
"data-slot": "hours-picker-input",
|
|
316
318
|
className: t("w-[150px]", p),
|
|
317
319
|
ref: M,
|
|
@@ -321,24 +323,25 @@ function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeho
|
|
|
321
323
|
id: C,
|
|
322
324
|
placeholder: f,
|
|
323
325
|
value: n,
|
|
324
|
-
onValueUpdate:
|
|
325
|
-
onCommit:
|
|
326
|
+
onValueUpdate: ne,
|
|
327
|
+
onCommit: W,
|
|
326
328
|
options: d,
|
|
329
|
+
selectedLabel: re?.selectedLabel,
|
|
327
330
|
disabled: h,
|
|
328
331
|
readOnly: g,
|
|
329
|
-
open:
|
|
330
|
-
setOpen:
|
|
332
|
+
open: z,
|
|
333
|
+
setOpen: B,
|
|
331
334
|
inputClassName: m,
|
|
332
335
|
triggerTestId: ee,
|
|
333
336
|
isHydrated: x,
|
|
334
337
|
highlightedValueRef: O,
|
|
335
|
-
setHighlightedValue:
|
|
336
|
-
markKeyboardNavigation:
|
|
338
|
+
setHighlightedValue: H,
|
|
339
|
+
markKeyboardNavigation: U,
|
|
337
340
|
inputRef: (e) => {
|
|
338
341
|
T.current = e;
|
|
339
342
|
},
|
|
340
343
|
onDraftValueHandlerChange: D
|
|
341
|
-
}),
|
|
344
|
+
}), z ? (() => {
|
|
342
345
|
let e = /* @__PURE__ */ c(s, { children: /* @__PURE__ */ l("div", {
|
|
343
346
|
ref: N,
|
|
344
347
|
"data-testid": te,
|
|
@@ -371,13 +374,13 @@ function x({ id: e, value: n, onChange: a, onValueUpdate: o, options: d, placeho
|
|
|
371
374
|
e.preventDefault();
|
|
372
375
|
},
|
|
373
376
|
onClick: () => {
|
|
374
|
-
e.disabled || (E.current?.(e.value),
|
|
377
|
+
e.disabled || (E.current?.(e.value), H(e.value), T.current?.focus({ preventScroll: !0 }), W(e.value), B(!1));
|
|
375
378
|
},
|
|
376
379
|
onPointerEnter: () => {
|
|
377
|
-
k.current || (k.current = !1,
|
|
380
|
+
k.current || (k.current = !1, H(e.value));
|
|
378
381
|
},
|
|
379
382
|
onPointerMove: (t) => {
|
|
380
|
-
k.current && t.movementX === 0 && t.movementY === 0 || (k.current = !1,
|
|
383
|
+
k.current && t.movementX === 0 && t.movementY === 0 || (k.current = !1, H(e.value));
|
|
381
384
|
},
|
|
382
385
|
children: [/* @__PURE__ */ c("span", {
|
|
383
386
|
className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
|
|
@@ -415,13 +418,13 @@ function S({ id: e, value: n, onChange: o, onValueUpdate: d, options: f, placeho
|
|
|
415
418
|
width: 0
|
|
416
419
|
})), [j, M] = r.useState(!1), N = v ?? j, P = ee ?? M, F = r.useRef(!1);
|
|
417
420
|
F.current = N;
|
|
418
|
-
let
|
|
421
|
+
let I = r.useCallback((e) => {
|
|
419
422
|
y(f.find((t) => t.value === e)) && (d && d(e), o(e));
|
|
420
423
|
}, [
|
|
421
424
|
o,
|
|
422
425
|
d,
|
|
423
426
|
f
|
|
424
|
-
]),
|
|
427
|
+
]), L = r.useCallback(() => {
|
|
425
428
|
if (typeof window > "u") return;
|
|
426
429
|
let e = T.current, t = D.current;
|
|
427
430
|
if (!(e instanceof HTMLElement) || !t) return;
|
|
@@ -436,15 +439,15 @@ function S({ id: e, value: n, onChange: o, onValueUpdate: d, options: f, placeho
|
|
|
436
439
|
}, []);
|
|
437
440
|
r.useLayoutEffect(() => {
|
|
438
441
|
if (!N || g || typeof window > "u") return;
|
|
439
|
-
|
|
440
|
-
let e = window.requestAnimationFrame(
|
|
441
|
-
return window.addEventListener("scroll",
|
|
442
|
-
window.cancelAnimationFrame(e), window.removeEventListener("scroll",
|
|
442
|
+
L();
|
|
443
|
+
let e = window.requestAnimationFrame(L);
|
|
444
|
+
return window.addEventListener("scroll", L, !0), window.addEventListener("resize", L), () => {
|
|
445
|
+
window.cancelAnimationFrame(e), window.removeEventListener("scroll", L, !0), window.removeEventListener("resize", L);
|
|
443
446
|
};
|
|
444
447
|
}, [
|
|
445
448
|
g,
|
|
446
449
|
N,
|
|
447
|
-
|
|
450
|
+
L
|
|
448
451
|
]), r.useEffect(() => {
|
|
449
452
|
if (!N) return;
|
|
450
453
|
let e = E.current?.ownerDocument ?? document, t = e.defaultView ?? window, n = (e) => {
|
|
@@ -461,7 +464,7 @@ function S({ id: e, value: n, onChange: o, onValueUpdate: d, options: f, placeho
|
|
|
461
464
|
e.removeEventListener("pointerdown", n, !0), t.removeEventListener("keydown", r, !0);
|
|
462
465
|
};
|
|
463
466
|
}, [N, P]);
|
|
464
|
-
let
|
|
467
|
+
let R = f.find((e) => e.value === n), z = R?.selectedLabel ?? R?.label ?? n;
|
|
465
468
|
return /* @__PURE__ */ l("div", {
|
|
466
469
|
"data-slot": "hours-picker-field",
|
|
467
470
|
className: t("w-[150px]", m),
|
|
@@ -482,7 +485,7 @@ function S({ id: e, value: n, onChange: o, onValueUpdate: d, options: f, placeho
|
|
|
482
485
|
},
|
|
483
486
|
children: [/* @__PURE__ */ c("span", {
|
|
484
487
|
className: "line-clamp-1 text-left",
|
|
485
|
-
children:
|
|
488
|
+
children: n ? z : p
|
|
486
489
|
}), /* @__PURE__ */ c(a, {
|
|
487
490
|
"aria-hidden": !0,
|
|
488
491
|
className: "h-4 w-4 shrink-0 opacity-50"
|
|
@@ -521,7 +524,7 @@ function S({ id: e, value: n, onChange: o, onValueUpdate: d, options: f, placeho
|
|
|
521
524
|
e.preventDefault();
|
|
522
525
|
},
|
|
523
526
|
onClick: () => {
|
|
524
|
-
e.disabled || _ || (
|
|
527
|
+
e.disabled || _ || (I(e.value), P(!1), T.current?.focus({ preventScroll: !0 }));
|
|
525
528
|
},
|
|
526
529
|
children: [/* @__PURE__ */ c("span", {
|
|
527
530
|
className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
|
|
@@ -561,219 +564,233 @@ function C(t) {
|
|
|
561
564
|
}
|
|
562
565
|
C.displayName = "HourPickerField";
|
|
563
566
|
function w(e) {
|
|
564
|
-
let i = n(
|
|
565
|
-
i[0] === u ?
|
|
566
|
-
let [
|
|
567
|
-
i[2] ===
|
|
568
|
-
|
|
567
|
+
let i = n(99), { id: o, placeholder: s, value: u, onValueUpdate: f, onCommit: p, options: m, selectedLabel: g, disabled: b, readOnly: x, open: S, setOpen: C, inputClassName: w, triggerTestId: O, isHydrated: k, highlightedValueRef: A, setHighlightedValue: j, markKeyboardNavigation: M, inputRef: N, onDraftValueHandlerChange: P } = e, F = r.useRef(!1), I = r.useRef(!1), L = r.useRef(!1), R = r.useRef(null), z = r.useRef(null), B = r.useRef(!1), V;
|
|
568
|
+
i[0] === u ? V = i[1] : (V = () => u || "", i[0] = u, i[1] = V);
|
|
569
|
+
let [H, U] = r.useState(V), ne, W;
|
|
570
|
+
i[2] === P ? (ne = i[3], W = i[4]) : (ne = () => (P((e) => {
|
|
571
|
+
U(e);
|
|
569
572
|
}), () => {
|
|
570
|
-
|
|
571
|
-
}),
|
|
572
|
-
let
|
|
573
|
-
i[5] !==
|
|
574
|
-
let t =
|
|
573
|
+
P(null);
|
|
574
|
+
}), W = [P], i[2] = P, i[3] = ne, i[4] = W), r.useEffect(ne, W);
|
|
575
|
+
let G;
|
|
576
|
+
i[5] !== A || i[6] !== f || i[7] !== m || i[8] !== j || i[9] !== u ? (G = (e) => {
|
|
577
|
+
let t = A.current ?? u ?? "", n = m.findIndex((e) => e.value === t);
|
|
575
578
|
n === -1 && (n = e === 1 ? -1 : m.length);
|
|
576
579
|
for (let t = n + e; t >= 0 && t < m.length; t += e) {
|
|
577
580
|
let e = m[t];
|
|
578
581
|
if (y(e)) {
|
|
579
|
-
|
|
582
|
+
j(e.value), R.current = e.value, U(e.value), f(e.value);
|
|
580
583
|
return;
|
|
581
584
|
}
|
|
582
585
|
}
|
|
583
|
-
}, i[5] =
|
|
584
|
-
let
|
|
585
|
-
i[11] === u ? (
|
|
586
|
-
|
|
587
|
-
},
|
|
586
|
+
}, i[5] = A, i[6] = f, i[7] = m, i[8] = j, i[9] = u, i[10] = G) : G = i[10];
|
|
587
|
+
let re = G, ie, ae;
|
|
588
|
+
i[11] === u ? (ie = i[12], ae = i[13]) : (ie = () => {
|
|
589
|
+
F.current || U(u || "");
|
|
590
|
+
}, ae = [u], i[11] = u, i[12] = ie, i[13] = ae), r.useEffect(ie, ae);
|
|
591
|
+
let oe, se;
|
|
592
|
+
i[14] === H ? (oe = i[15], se = i[16]) : (oe = () => {
|
|
593
|
+
z.current = _(H);
|
|
594
|
+
}, se = [H], i[14] = H, i[15] = oe, i[16] = se), r.useEffect(oe, se);
|
|
588
595
|
let ce, le;
|
|
589
|
-
i[
|
|
590
|
-
|
|
591
|
-
},
|
|
592
|
-
let ue, de;
|
|
593
|
-
i[
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
let fe = !z && "text-muted-foreground", pe = x && "ring-2 ring-primary ring-offset-2", me;
|
|
597
|
-
i[20] !== C || i[21] !== fe || i[22] !== pe ? (me = t("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "transition-colors group-hover:bg-accent group-hover:text-accent-foreground", fe, pe, "[&_[data-slot='description']]:hidden", C), i[20] = C, i[21] = fe, i[22] = pe, i[23] = me) : me = i[23];
|
|
598
|
-
let he = me, ge = O ? "true" : void 0, _e;
|
|
599
|
-
i[24] === Symbol.for("react.memo_cache_sentinel") ? (_e = [{
|
|
596
|
+
i[17] === u ? (ce = i[18], le = i[19]) : (le = () => {
|
|
597
|
+
u === null && (B.current = !1);
|
|
598
|
+
}, ce = [u], i[17] = u, i[18] = ce, i[19] = le), r.useEffect(le, ce);
|
|
599
|
+
let ue = !H && "text-muted-foreground", de = S && "ring-2 ring-primary ring-offset-2", fe = u && g != null && "text-transparent focus:text-foreground", pe;
|
|
600
|
+
i[20] !== w || i[21] !== ue || i[22] !== de || i[23] !== fe ? (pe = t("peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "transition-colors group-hover:bg-accent group-hover:text-accent-foreground", ue, de, "[&_[data-slot='description']]:hidden", w, fe), i[20] = w, i[21] = ue, i[22] = de, i[23] = fe, i[24] = pe) : pe = i[24];
|
|
601
|
+
let me = pe, he = k ? "true" : void 0, ge;
|
|
602
|
+
i[25] === Symbol.for("react.memo_cache_sentinel") ? (ge = [{
|
|
600
603
|
mask: "00:00",
|
|
601
604
|
lazy: !0
|
|
602
605
|
}, {
|
|
603
606
|
mask: "0:00",
|
|
604
607
|
lazy: !0
|
|
605
|
-
}], i[
|
|
606
|
-
let
|
|
607
|
-
i[
|
|
608
|
+
}], i[25] = ge) : ge = i[25];
|
|
609
|
+
let K;
|
|
610
|
+
i[26] === m ? K = i[27] : (K = (e, t) => {
|
|
608
611
|
let n = (t.value + e).replace(/\D/g, "");
|
|
609
612
|
if (n.length <= 2 || n.length >= 4) return t.compiledMasks[0];
|
|
610
613
|
let r = h(Number(n.slice(0, 2)));
|
|
611
614
|
return m.some((e) => e.value.startsWith(`${r}:`)) ? t.compiledMasks[0] : t.compiledMasks[1];
|
|
612
|
-
}, i[
|
|
613
|
-
let
|
|
614
|
-
i[
|
|
615
|
+
}, i[26] = m, i[27] = K);
|
|
616
|
+
let q;
|
|
617
|
+
i[28] !== p || i[29] !== u ? (q = (e, t, n) => {
|
|
615
618
|
if (!n) return;
|
|
616
619
|
let r = typeof e == "string" ? e : String(e ?? ""), i = r.replace(/\D/g, ""), a = _(r);
|
|
617
|
-
if (
|
|
618
|
-
if (
|
|
619
|
-
|
|
620
|
+
if (z.current !== a) {
|
|
621
|
+
if (z.current = a, U(r), i.length !== 0) {
|
|
622
|
+
B.current = !1;
|
|
620
623
|
return;
|
|
621
624
|
}
|
|
622
|
-
u && !
|
|
625
|
+
u && !B.current && (B.current = !0, p(null));
|
|
623
626
|
}
|
|
624
|
-
}, i[
|
|
625
|
-
let
|
|
626
|
-
i[
|
|
627
|
+
}, i[28] = p, i[29] = u, i[30] = q) : q = i[30];
|
|
628
|
+
let J;
|
|
629
|
+
i[31] !== p || i[32] !== m || i[33] !== j || i[34] !== u ? (J = (e, t, n) => {
|
|
627
630
|
if (!n) return;
|
|
628
631
|
let r = typeof e == "string" ? e : String(e ?? "");
|
|
629
|
-
if (
|
|
630
|
-
|
|
632
|
+
if (R.current === r) {
|
|
633
|
+
R.current = null;
|
|
631
634
|
return;
|
|
632
635
|
}
|
|
633
636
|
let i = v(r, m);
|
|
634
637
|
if (!i) return;
|
|
635
638
|
if (i.selectableValue) {
|
|
636
|
-
if (
|
|
639
|
+
if (j(i.selectableValue), U(i.selectableValue), u === i.selectableValue) return;
|
|
637
640
|
p(i.selectableValue);
|
|
638
641
|
return;
|
|
639
642
|
}
|
|
640
643
|
let a = ee(i.parsed);
|
|
641
644
|
if (a == null) return;
|
|
642
645
|
let o = te(a, m);
|
|
643
|
-
o &&
|
|
644
|
-
}, i[
|
|
645
|
-
let
|
|
646
|
-
i[
|
|
647
|
-
|
|
648
|
-
},
|
|
649
|
-
|
|
650
|
-
},
|
|
651
|
-
|
|
652
|
-
}, i[
|
|
653
|
-
let
|
|
654
|
-
i[
|
|
655
|
-
if (!
|
|
656
|
-
if (e.key === "Tab" &&
|
|
657
|
-
|
|
646
|
+
o && j(o.value);
|
|
647
|
+
}, i[31] = p, i[32] = m, i[33] = j, i[34] = u, i[35] = J) : J = i[35];
|
|
648
|
+
let Y, X, Z;
|
|
649
|
+
i[36] !== b || i[37] !== S || i[38] !== C ? (Y = () => {
|
|
650
|
+
I.current = !0, !b && (S || C(!0));
|
|
651
|
+
}, X = (e) => {
|
|
652
|
+
I.current = !0, L.current = typeof document < "u" && document.activeElement === e.currentTarget, !b && (S || C(!0));
|
|
653
|
+
}, Z = () => {
|
|
654
|
+
b || S || C(!0);
|
|
655
|
+
}, i[36] = b, i[37] = S, i[38] = C, i[39] = Y, i[40] = X, i[41] = Z) : (Y = i[39], X = i[40], Z = i[41]);
|
|
656
|
+
let Q;
|
|
657
|
+
i[42] !== b || i[43] !== H || i[44] !== A || i[45] !== M || i[46] !== re || i[47] !== p || i[48] !== S || i[49] !== m || i[50] !== j || i[51] !== C ? (Q = (e) => {
|
|
658
|
+
if (!b) {
|
|
659
|
+
if (e.key === "Tab" && S && !e.defaultPrevented) {
|
|
660
|
+
C(!1);
|
|
658
661
|
return;
|
|
659
662
|
}
|
|
660
663
|
if (e.key === "Escape") {
|
|
661
|
-
if (!
|
|
662
|
-
e.preventDefault(),
|
|
664
|
+
if (!S) return;
|
|
665
|
+
e.preventDefault(), C(!1);
|
|
663
666
|
return;
|
|
664
667
|
}
|
|
665
|
-
if (!
|
|
666
|
-
if (
|
|
667
|
-
|
|
668
|
+
if (!S && !e.defaultPrevented && (e.key.length === 1 || e.key === "Backspace" || e.key === "Delete") && !e.ctrlKey && !e.metaKey && !e.altKey && C(!0), e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
669
|
+
if (M(), e.preventDefault(), !S) {
|
|
670
|
+
C(!0);
|
|
668
671
|
return;
|
|
669
672
|
}
|
|
670
|
-
|
|
673
|
+
re(e.key === "ArrowDown" ? 1 : -1);
|
|
671
674
|
return;
|
|
672
675
|
}
|
|
673
676
|
if (e.key === "Enter") {
|
|
674
|
-
|
|
675
|
-
let t = v(
|
|
677
|
+
M();
|
|
678
|
+
let t = v(H, m);
|
|
676
679
|
if (!t) {
|
|
677
|
-
if (!
|
|
678
|
-
let t = m.find((e) => e.value ===
|
|
680
|
+
if (!S || H.trim() !== "") return;
|
|
681
|
+
let t = m.find((e) => e.value === A.current), n = (y(t) ? t?.value : void 0) ?? m.find(D)?.value;
|
|
679
682
|
if (!n) return;
|
|
680
|
-
e.preventDefault(),
|
|
683
|
+
e.preventDefault(), j(n), U(n), p(n), C(!1);
|
|
681
684
|
return;
|
|
682
685
|
}
|
|
683
686
|
if (t.selectableValue) {
|
|
684
|
-
e.preventDefault(),
|
|
687
|
+
e.preventDefault(), j(t.selectableValue), U(t.selectableValue), p(t.selectableValue), C(!1);
|
|
685
688
|
return;
|
|
686
689
|
}
|
|
687
690
|
let n = ee(t.parsed);
|
|
688
691
|
if (n == null) return;
|
|
689
692
|
let r = te(n, m);
|
|
690
693
|
if (!r) return;
|
|
691
|
-
e.preventDefault(),
|
|
694
|
+
e.preventDefault(), j(r.value), U(r.value), p(r.value), C(!1);
|
|
692
695
|
return;
|
|
693
696
|
}
|
|
694
697
|
}
|
|
695
|
-
}, i[
|
|
696
|
-
let
|
|
697
|
-
i[
|
|
698
|
-
let t = !
|
|
699
|
-
if (
|
|
698
|
+
}, i[42] = b, i[43] = H, i[44] = A, i[45] = M, i[46] = re, i[47] = p, i[48] = S, i[49] = m, i[50] = j, i[51] = C, i[52] = Q) : Q = i[52];
|
|
699
|
+
let $;
|
|
700
|
+
i[53] !== b || i[54] !== S || i[55] !== C ? ($ = (e) => {
|
|
701
|
+
let t = !I.current || !L.current;
|
|
702
|
+
if (I.current = !1, L.current = !1, F.current = !0, t) {
|
|
700
703
|
let t = e.currentTarget;
|
|
701
704
|
requestAnimationFrame(() => t.select());
|
|
702
705
|
}
|
|
703
|
-
|
|
704
|
-
}, i[
|
|
705
|
-
let
|
|
706
|
-
i[
|
|
707
|
-
|
|
708
|
-
let e =
|
|
706
|
+
b || S || C(!0);
|
|
707
|
+
}, i[53] = b, i[54] = S, i[55] = C, i[56] = $) : $ = i[56];
|
|
708
|
+
let _e;
|
|
709
|
+
i[57] !== H || i[58] !== p || i[59] !== m || i[60] !== u ? (_e = () => {
|
|
710
|
+
F.current = !1;
|
|
711
|
+
let e = H.trim();
|
|
709
712
|
if (!e) {
|
|
710
|
-
|
|
713
|
+
U(u || "");
|
|
711
714
|
return;
|
|
712
715
|
}
|
|
713
716
|
let t = v(e, m);
|
|
714
717
|
if (!t) {
|
|
715
|
-
|
|
718
|
+
U(u || "");
|
|
716
719
|
return;
|
|
717
720
|
}
|
|
718
721
|
if (!t.selectableValue) {
|
|
719
|
-
|
|
722
|
+
U(u || "");
|
|
720
723
|
return;
|
|
721
724
|
}
|
|
722
|
-
|
|
723
|
-
}, i[
|
|
724
|
-
let
|
|
725
|
-
i[
|
|
725
|
+
U(t.selectableValue), u !== t.selectableValue && p(t.selectableValue);
|
|
726
|
+
}, i[57] = H, i[58] = p, i[59] = m, i[60] = u, i[61] = _e) : _e = i[61];
|
|
727
|
+
let ve;
|
|
728
|
+
i[62] !== b || i[63] !== H || i[64] !== o || i[65] !== N || i[66] !== s || i[67] !== x || i[68] !== he || i[69] !== K || i[70] !== q || i[71] !== J || i[72] !== Y || i[73] !== X || i[74] !== Z || i[75] !== Q || i[76] !== $ || i[77] !== _e || i[78] !== me || i[79] !== O ? (ve = /* @__PURE__ */ c(d, {
|
|
726
729
|
id: o,
|
|
727
|
-
"data-testid":
|
|
728
|
-
"data-hydrated":
|
|
730
|
+
"data-testid": O,
|
|
731
|
+
"data-hydrated": he,
|
|
729
732
|
type: "text",
|
|
730
|
-
disabled:
|
|
731
|
-
readOnly:
|
|
732
|
-
inputRef:
|
|
733
|
+
disabled: b,
|
|
734
|
+
readOnly: x,
|
|
735
|
+
inputRef: N,
|
|
733
736
|
autoComplete: "off",
|
|
734
|
-
mask:
|
|
735
|
-
dispatch:
|
|
737
|
+
mask: ge,
|
|
738
|
+
dispatch: K,
|
|
736
739
|
placeholder: s,
|
|
737
|
-
value:
|
|
738
|
-
className:
|
|
739
|
-
onAccept:
|
|
740
|
-
onComplete:
|
|
741
|
-
onPointerDown:
|
|
742
|
-
onMouseDown:
|
|
743
|
-
onClick:
|
|
744
|
-
onKeyDown:
|
|
745
|
-
onFocus:
|
|
746
|
-
onBlur:
|
|
747
|
-
}), i[
|
|
748
|
-
let
|
|
749
|
-
i[
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
740
|
+
value: H,
|
|
741
|
+
className: me,
|
|
742
|
+
onAccept: q,
|
|
743
|
+
onComplete: J,
|
|
744
|
+
onPointerDown: Y,
|
|
745
|
+
onMouseDown: X,
|
|
746
|
+
onClick: Z,
|
|
747
|
+
onKeyDown: Q,
|
|
748
|
+
onFocus: $,
|
|
749
|
+
onBlur: _e
|
|
750
|
+
}), i[62] = b, i[63] = H, i[64] = o, i[65] = N, i[66] = s, i[67] = x, i[68] = he, i[69] = K, i[70] = q, i[71] = J, i[72] = Y, i[73] = X, i[74] = Z, i[75] = Q, i[76] = $, i[77] = _e, i[78] = me, i[79] = O, i[80] = ve) : ve = i[80];
|
|
751
|
+
let ye;
|
|
752
|
+
i[81] !== b || i[82] !== g || i[83] !== u ? (ye = u && g != null ? /* @__PURE__ */ c("span", {
|
|
753
|
+
"aria-hidden": "true",
|
|
754
|
+
"data-slot": "hours-picker-input-selected-label",
|
|
755
|
+
className: t("pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm", b && "opacity-50"),
|
|
756
|
+
children: /* @__PURE__ */ c("span", {
|
|
757
|
+
className: "min-w-0 truncate",
|
|
758
|
+
children: g
|
|
759
|
+
})
|
|
760
|
+
}) : null, i[81] = b, i[82] = g, i[83] = u, i[84] = ye) : ye = i[84];
|
|
754
761
|
let be;
|
|
755
|
-
i[85] === Symbol.for("react.memo_cache_sentinel") ? (be =
|
|
762
|
+
i[85] === Symbol.for("react.memo_cache_sentinel") ? (be = t("absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"), i[85] = be) : be = i[85];
|
|
763
|
+
let xe = S ? "Close time picker" : "Open time picker", Se;
|
|
764
|
+
i[86] !== b || i[87] !== S || i[88] !== C ? (Se = () => {
|
|
765
|
+
b || C(!S);
|
|
766
|
+
}, i[86] = b, i[87] = S, i[88] = C, i[89] = Se) : Se = i[89];
|
|
767
|
+
let Ce;
|
|
768
|
+
i[90] === Symbol.for("react.memo_cache_sentinel") ? (Ce = /* @__PURE__ */ c(a, {
|
|
756
769
|
"aria-hidden": !0,
|
|
757
770
|
className: "size-4"
|
|
758
|
-
}), i[
|
|
759
|
-
let
|
|
760
|
-
i[
|
|
771
|
+
}), i[90] = Ce) : Ce = i[90];
|
|
772
|
+
let we;
|
|
773
|
+
i[91] !== b || i[92] !== xe || i[93] !== Se ? (we = /* @__PURE__ */ c("button", {
|
|
761
774
|
type: "button",
|
|
762
775
|
tabIndex: -1,
|
|
763
|
-
disabled:
|
|
776
|
+
disabled: b,
|
|
764
777
|
"data-slot": "hours-picker-input-toggle",
|
|
765
|
-
className:
|
|
766
|
-
"aria-label":
|
|
778
|
+
className: be,
|
|
779
|
+
"aria-label": xe,
|
|
767
780
|
onPointerDown: E,
|
|
768
781
|
onMouseDown: T,
|
|
769
|
-
onClick:
|
|
770
|
-
children:
|
|
771
|
-
}), i[
|
|
772
|
-
let
|
|
773
|
-
return i[
|
|
782
|
+
onClick: Se,
|
|
783
|
+
children: Ce
|
|
784
|
+
}), i[91] = b, i[92] = xe, i[93] = Se, i[94] = we) : we = i[94];
|
|
785
|
+
let Te;
|
|
786
|
+
return i[95] !== ve || i[96] !== ye || i[97] !== we ? (Te = /* @__PURE__ */ l("div", {
|
|
774
787
|
className: "relative group",
|
|
775
|
-
children: [
|
|
776
|
-
|
|
788
|
+
children: [
|
|
789
|
+
ve,
|
|
790
|
+
ye,
|
|
791
|
+
we
|
|
792
|
+
]
|
|
793
|
+
}), i[95] = ve, i[96] = ye, i[97] = we, i[98] = Te) : Te = i[98], Te;
|
|
777
794
|
}
|
|
778
795
|
function T(e) {
|
|
779
796
|
e.preventDefault();
|
package/dist/index302.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index302.js","names":["Check","ChevronDown","ChevronUp","React","createPortal","IMaskInput","IMask","InputMask","useIsTouchDevice","cn","imaskAny","HourPickerOption","value","label","disabled","description","ReactNode","pad2","String","padStart","parseTimeInput","raw","trimmed","trim","match","exec","hours","Number","minutes","isFinite","getAcceptedInputSignature","parsed","digits","replace","length","minutePart","slice","hourPart","ParsedTimeInputResult","selectableValue","parseTimeInputWithSelectableOption","options","parsedOption","find","option","isOptionSelectable","timeStringToMinutes","findClosestSelectableOption","targetMinutes","bestOption","bestDiff","POSITIVE_INFINITY","bestMinutes","NEGATIVE_INFINITY","optionMinutes","diff","Math","abs","HourPickerScrollButtonDirection","HourPickerScrollButtonProps","direction","viewportRef","RefObject","HTMLElement","speed","className","HourPickerScrollButton","setDisabled","useState","animationRef","useRef","undefined","lastTimeRef","isScrollingRef","checkScrollability","useCallback","viewport","current","scrollTop","scrollHeight","clientHeight","tolerance","canScrollUp","canScrollDown","hasScrollableContent","shouldDisable","useEffect","handleScroll","handleResize","addEventListener","passive","resizeObserver","ResizeObserver","observe","mutationObserver","MutationObserver","childList","subtree","removeEventListener","disconnect","stopScrolling","cancelAnimationFrame","smoothScroll","currentTime","deltaTime","distance","requestAnimationFrame","oldScrollTop","maxScroll","newScrollTop","max","min","scrollTo","top","canContinue","setTimeout","startScrolling","HourPickerInputProps","id","onChange","onValueUpdate","placeholder","inputClassName","readOnly","open","onOpenChange","triggerTestId","contentTestId","isHydrated","HourPickerInput","openProp","reactId","useId","triggerId","triggerInputRef","HTMLInputElement","setTriggerDraftValueRef","setTriggerDraftValueHandler","handler","highlightedValueRef","keyboardNavigationActiveRef","highlightedValue","setHighlightedValue","containerRef","HTMLDivElement","desktopPopoverRef","desktopContentRef","desktopPopoverPosition","setDesktopPopoverPosition","left","width","uncontrolledOpen","setUncontrolledOpen","setOpen","openRef","input","document","activeElement","focus","preventScroll","updateHighlightedValue","next","markKeyboardNavigation","currentOption","firstEnabled","updateValue","matchingOption","commitValue","ownerDocument","ownerWindow","defaultView","window","handlePointerDown","event","PointerEvent","target","Node","container","contains","popover","handleKeyDown","KeyboardEvent","key","preventDefault","stopPropagation","handleWheel","WheelEvent","deltaY","maxScrollTop","atTop","atBottom","isWheelOverViewport","nextScrollTop","trigger","isActive","observer","IntersectionObserver","entries","entry","isIntersecting","updateDesktopPopoverPosition","rect","getBoundingClientRect","popoverHeight","offsetHeight","viewportWidth","innerWidth","viewportHeight","innerHeight","padding","bottom","overflowBottom","aboveTop","useLayoutEffect","rafId","run","selected","querySelector","targetTop","offsetTop","targetBottom","viewportBottom","all","Array","from","querySelectorAll","lastDisabledBefore","el","isDisabled","hasAttribute","offset","raf","node","map","isChecked","movementX","movementY","body","displayName","HourPickerFieldProps","HourPickerSelectField","triggerRef","HTMLButtonElement","popoverRef","popoverPosition","setPopoverPosition","resolvedOpen","updatePopoverPosition","selectedOption","HourPickerField","props","$","_c","isTouchDevice","t0","HourPickerMaskedSelectTriggerProps","onCommit","MutableRefObject","inputRef","onDraftValueHandlerChange","HourPickerMaskedSelectTrigger","isEditingRef","pointerDownOnInputRef","inputWasFocusedOnPointerDownRef","ignoreNextMaskCommitValueRef","lastAcceptedSignatureRef","clearCommitPendingRef","t1","draft","setDraft","t2","t3","nextValue","t4","base","baseIndex","findIndex","nextIndex","nextOption","moveSelection","t5","t6","t7","t8","t10","t9","t11","t12","t13","triggerClassName","t14","t15","Symbol","for","mask","lazy","t16","appended","dynamicMasked","compiledMasks","hourPrefix","hasTwoDigitHour","some","option_0","startsWith","t17","accepted","_mask","nextText","nextDigits","nextSignature","t18","completed","_mask_0","event_0","nextText_0","resolved","closestOption","t19","t20","t21","event_1","currentTarget","t22","event_2","defaultPrevented","shouldReopen","ctrlKey","metaKey","altKey","resolved_0","highlightedOption","option_1","fallbackValue","_temp","targetMinutes_0","closestOption_0","t23","event_3","shouldSelectAll","element","select","t24","resolved_1","t25","t26","t27","t28","t29","t30","_temp2","_temp3","t31","event_5","event_4","option_2"],"sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { useIsTouchDevice } from \"@/helpers/useIsTouchDevice\"\nimport { cn } from \"@/lib/utils\"\n\n\n// WARNING: used to preserve input mask even with tree shaking\n// DO NOT REMOVE THIS CODE OR THIS COMMENT\nconst imaskAny = IMask as any\nif (typeof imaskAny.InputMask !== \"function\") {\n imaskAny.InputMask = InputMask\n}\n\n\nexport type HourPickerOption = {\n value: string\n label: string\n disabled?: boolean\n description?: React.ReactNode\n}\n\nfunction pad2(value: number) {\n return String(value).padStart(2, \"0\")\n}\n\nfunction parseTimeInput(raw: string) {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(trimmed)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {\n return null\n }\n\n return `${pad2(hours)}:${pad2(minutes)}`\n}\n\nfunction getAcceptedInputSignature(raw: string) {\n const parsed = parseTimeInput(raw)\n if (parsed) {\n return `parsed:${parsed}`\n }\n\n const digits = raw.replace(/\\D/g, \"\")\n if (!digits) {\n return \"empty\"\n }\n\n if (digits.length <= 2) {\n return `hour:${Number(digits)}`\n }\n\n const minutePart = digits.slice(-2)\n const hourPart = digits.slice(0, -2)\n return `hour-minute:${Number(hourPart)}:${minutePart}`\n}\n\ntype ParsedTimeInputResult = {\n parsed: string\n selectableValue: string | null\n}\n\nfunction parseTimeInputWithSelectableOption(raw: string, options: HourPickerOption[]): ParsedTimeInputResult | null {\n const parsed = parseTimeInput(raw)\n if (!parsed) return null\n\n const parsedOption = options.find((option) => option.value === parsed)\n if (isOptionSelectable(parsedOption)) {\n return { parsed, selectableValue: parsed }\n }\n\n return { parsed, selectableValue: null }\n}\n\nfunction timeStringToMinutes(value: string) {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n return hours * 60 + minutes\n}\n\nfunction isOptionSelectable(option: HourPickerOption | undefined) {\n if (!option) return false\n return !option.disabled\n}\n\nfunction findClosestSelectableOption(targetMinutes: number, options: HourPickerOption[]) {\n let bestOption: HourPickerOption | null = null\n let bestDiff = Number.POSITIVE_INFINITY\n let bestMinutes = Number.NEGATIVE_INFINITY\n\n for (const option of options) {\n if (!isOptionSelectable(option)) continue\n const optionMinutes = timeStringToMinutes(option.value)\n if (optionMinutes == null) continue\n\n const diff = Math.abs(optionMinutes - targetMinutes)\n if (diff < bestDiff || (diff === bestDiff && optionMinutes > bestMinutes)) {\n bestOption = option\n bestDiff = diff\n bestMinutes = optionMinutes\n }\n }\n\n return bestOption\n}\n\ntype HourPickerScrollButtonDirection = \"up\" | \"down\"\n\ntype HourPickerScrollButtonProps = {\n direction: HourPickerScrollButtonDirection\n viewportRef: React.RefObject<HTMLElement | null>\n speed?: number\n className?: string\n}\n\nfunction HourPickerScrollButton({\n direction,\n viewportRef,\n speed = 400,\n className,\n}: HourPickerScrollButtonProps) {\n const [disabled, setDisabled] = React.useState(true)\n const animationRef = React.useRef<number | undefined>(undefined)\n const lastTimeRef = React.useRef<number | undefined>(undefined)\n const isScrollingRef = React.useRef(false)\n\n const checkScrollability = React.useCallback(() => {\n const viewport = viewportRef.current\n if (!viewport) {\n setDisabled(true)\n return\n }\n\n const { scrollTop, scrollHeight, clientHeight } = viewport\n const tolerance = 2\n\n const canScrollUp = scrollTop > tolerance\n const canScrollDown = scrollTop < (scrollHeight - clientHeight - tolerance)\n const hasScrollableContent = scrollHeight > clientHeight + tolerance\n\n if (!hasScrollableContent) {\n setDisabled(true)\n return\n }\n\n const shouldDisable = direction === \"up\" ? !canScrollUp : !canScrollDown\n setDisabled(shouldDisable)\n }, [direction, viewportRef])\n\n React.useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n checkScrollability()\n\n const handleScroll = () => checkScrollability()\n const handleResize = () => checkScrollability()\n\n viewport.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n const resizeObserver = new ResizeObserver(handleResize)\n resizeObserver.observe(viewport)\n\n const mutationObserver = new MutationObserver(handleResize)\n mutationObserver.observe(viewport, { childList: true, subtree: true })\n\n return () => {\n viewport.removeEventListener(\"scroll\", handleScroll)\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [viewportRef, checkScrollability])\n\n const stopScrolling = React.useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = undefined\n }\n isScrollingRef.current = false\n lastTimeRef.current = undefined\n }, [])\n\n const smoothScroll = React.useCallback(\n (currentTime: number) => {\n const viewport = viewportRef.current\n if (!viewport || disabled || !isScrollingRef.current) {\n stopScrolling()\n return\n }\n\n if (!lastTimeRef.current) {\n lastTimeRef.current = currentTime\n }\n\n const deltaTime = currentTime - lastTimeRef.current\n const distance = (speed * deltaTime) / 1000\n\n if (distance < 0.1) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n return\n }\n\n const oldScrollTop = viewport.scrollTop\n const maxScroll = viewport.scrollHeight - viewport.clientHeight\n\n let newScrollTop: number\n if (direction === \"up\") {\n newScrollTop = Math.max(0, oldScrollTop - distance)\n } else {\n newScrollTop = Math.min(maxScroll, oldScrollTop + distance)\n }\n\n viewport.scrollTo({ top: newScrollTop })\n\n lastTimeRef.current = currentTime\n\n const tolerance = 1\n const canContinue =\n direction === \"up\"\n ? newScrollTop > tolerance\n : newScrollTop < (maxScroll - tolerance)\n\n if (canContinue && Math.abs(newScrollTop - oldScrollTop) > 0.01) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n } else {\n stopScrolling()\n setTimeout(checkScrollability, 16)\n }\n },\n [checkScrollability, direction, disabled, speed, stopScrolling, viewportRef],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewportRef.current || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, smoothScroll, viewportRef])\n\n React.useEffect(() => stopScrolling, [stopScrolling])\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center py-1 select-none\",\n disabled ? \"cursor-default opacity-40\" : \"cursor-pointer opacity-100 hover:bg-accent/20\",\n className\n )}\n onPointerEnter={() => {\n if (!disabled) startScrolling()\n }}\n onPointerMove={() => {\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={() => {\n stopScrolling()\n }}\n >\n {direction === \"up\"\n ? <ChevronUp aria-hidden className=\"h-4 w-4 opacity-50\" />\n : <ChevronDown aria-hidden className=\"h-4 w-4 opacity-50\" />}\n </div>\n )\n}\n\nexport type HourPickerInputProps = {\n id?: string\n value: string | null\n onChange: (value: string | null) => void\n onValueUpdate?: (value: string | null) => void\n options: HourPickerOption[]\n placeholder?: string\n className?: string\n inputClassName?: string\n disabled?: boolean\n readOnly?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n triggerTestId?: string\n contentTestId?: string\n isHydrated?: boolean\n}\n\nexport function HourPickerInput({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open: openProp,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerInputProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerInputRef = React.useRef<HTMLInputElement | null>(null)\n const setTriggerDraftValueRef = React.useRef<((value: string) => void) | null>(null)\n const setTriggerDraftValueHandler = React.useCallback((handler: ((value: string) => void) | null) => {\n setTriggerDraftValueRef.current = handler\n }, [])\n const highlightedValueRef = React.useRef<string | null>(null)\n const keyboardNavigationActiveRef = React.useRef(false)\n const [highlightedValue, setHighlightedValue] = React.useState<string | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const desktopPopoverRef = React.useRef<HTMLDivElement | null>(null)\n const desktopContentRef = React.useRef<HTMLDivElement | null>(null)\n const [desktopPopoverPosition, setDesktopPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const open = openProp ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = open\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (disabled || readOnly) {\n return\n }\n\n const input = triggerInputRef.current\n if (!(input instanceof HTMLInputElement)) {\n return\n }\n if (typeof document !== \"undefined\" && document.activeElement === input) {\n return\n }\n\n input.focus({ preventScroll: true })\n }, [disabled, open, readOnly])\n\n const updateHighlightedValue = React.useCallback((next: string | null) => {\n highlightedValueRef.current = next\n setHighlightedValue(next)\n }, [])\n\n const markKeyboardNavigation = React.useCallback(() => {\n keyboardNavigationActiveRef.current = true\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n\n const currentOption = options.find((option) => option.value === value)\n if (currentOption && isOptionSelectable(currentOption)) {\n updateHighlightedValue(currentOption.value)\n return\n }\n\n const firstEnabled = options.find((option) => isOptionSelectable(option))\n updateHighlightedValue(firstEnabled?.value ?? null)\n }, [open, options, updateHighlightedValue, value])\n\n const updateValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n },\n [onValueUpdate, options],\n )\n\n const commitValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n onChange(null)\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n React.useEffect(() => {\n if (!open) return\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (container.contains(target)) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return\n }\n if (!openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = desktopPopoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [open, setOpen])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (!popover) {\n return\n }\n\n const handleWheel = (event: WheelEvent) => {\n const viewport = desktopContentRef.current\n if (!viewport) {\n return\n }\n\n const deltaY = event.deltaY\n if (deltaY === 0) {\n return\n }\n\n const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight)\n const atTop = viewport.scrollTop <= 0\n const atBottom = viewport.scrollTop >= maxScrollTop\n\n const target = event.target\n const isWheelOverViewport = target instanceof Node && viewport.contains(target)\n\n if (isWheelOverViewport) {\n if ((deltaY < 0 && atTop) || (deltaY > 0 && atBottom)) {\n event.preventDefault()\n }\n return\n }\n\n event.preventDefault()\n const nextScrollTop = Math.min(maxScrollTop, Math.max(0, viewport.scrollTop + deltaY))\n viewport.scrollTop = nextScrollTop\n }\n\n popover.addEventListener(\"wheel\", handleWheel, { passive: false })\n return () => {\n popover.removeEventListener(\"wheel\", handleWheel)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (openProp !== undefined && !onOpenChange) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n if (!(\"IntersectionObserver\" in window)) {\n return\n }\n\n const trigger = triggerInputRef.current\n if (!(trigger instanceof HTMLElement)) {\n return\n }\n\n let isActive = true\n const observer = new IntersectionObserver(entries => {\n if (!isActive) {\n return\n }\n const entry = entries[0]\n if (entry && !entry.isIntersecting) {\n setOpen(false)\n }\n })\n observer.observe(trigger)\n return () => {\n isActive = false\n observer.disconnect()\n }\n }, [onOpenChange, open, openProp, setOpen])\n\n const updateDesktopPopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") return\n\n const trigger = triggerInputRef.current\n const popover = desktopPopoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) return\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setDesktopPopoverPosition({ left, top, width })\n }, [])\n\n // React Compiler rejects hook aliasing (useIsomorphicLayoutEffect pattern), so we\n // call useLayoutEffect directly and keep the SSR guard inside the effect.\n React.useLayoutEffect(() => {\n if (!open || disabled) return\n if (typeof window === \"undefined\") return\n\n updateDesktopPopoverPosition()\n const rafId = window.requestAnimationFrame(updateDesktopPopoverPosition)\n\n window.addEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.addEventListener(\"resize\", updateDesktopPopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.removeEventListener(\"resize\", updateDesktopPopoverPosition)\n }\n }, [disabled, open, updateDesktopPopoverPosition])\n\n React.useEffect(() => {\n if (!open) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const run = () => {\n const selected = viewport.querySelector(\"[role=\\\"option\\\"][data-state=\\\"checked\\\"]\")\n if (selected instanceof HTMLElement) {\n const padding = 8\n const targetTop = selected.offsetTop - padding\n const targetBottom = selected.offsetTop + selected.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n return\n }\n\n const all = Array.from(viewport.querySelectorAll(\"[role=\\\"option\\\"]\")) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\n\n for (const el of all) {\n const isDisabled = el.hasAttribute(\"data-disabled\")\n if (!isDisabled) {\n firstEnabled = el\n break\n }\n lastDisabledBefore = el\n }\n\n if (!firstEnabled) return\n\n const target = lastDisabledBefore ? lastDisabledBefore : firstEnabled\n\n const offset = Math.max(0, target.offsetTop - 8)\n viewport.scrollTop = offset\n }\n\n const raf = requestAnimationFrame(run)\n return () => cancelAnimationFrame(raf)\n }, [open, options])\n\n React.useEffect(() => {\n if (!open) return\n if (!highlightedValue) return\n if (!keyboardNavigationActiveRef.current) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const target = viewport.querySelector(`[role=\"option\"][data-value=\"${highlightedValue}\"]`)\n if (!(target instanceof HTMLElement)) return\n\n const padding = 8\n const targetTop = target.offsetTop - padding\n const targetBottom = target.offsetTop + target.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n }, [highlightedValue, open])\n\n return (\n <div\n data-slot=\"hours-picker-input\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <div className=\"relative\">\n <HourPickerMaskedSelectTrigger\n id={triggerId}\n placeholder={placeholder}\n value={value}\n onValueUpdate={updateValue}\n onCommit={commitValue}\n options={options}\n disabled={disabled}\n readOnly={readOnly}\n open={open}\n setOpen={setOpen}\n inputClassName={inputClassName}\n triggerTestId={triggerTestId}\n isHydrated={isHydrated}\n highlightedValueRef={highlightedValueRef}\n setHighlightedValue={updateHighlightedValue}\n markKeyboardNavigation={markKeyboardNavigation}\n inputRef={(node) => {\n triggerInputRef.current = node\n }}\n onDraftValueHandlerChange={setTriggerDraftValueHandler}\n />\n\n {open ? (() => {\n const popover = (\n <>\n <div\n ref={desktopPopoverRef}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"pointer-events-auto fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: desktopPopoverPosition.left,\n top: desktopPopoverPosition.top,\n width: desktopPopoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={desktopContentRef}\n />\n\n <div\n ref={desktopContentRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n highlightedValue === option.value && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled) return\n\n setTriggerDraftValueRef.current?.(option.value)\n updateHighlightedValue(option.value)\n triggerInputRef.current?.focus({ preventScroll: true })\n commitValue(option.value)\n setOpen(false)\n }}\n onPointerEnter={() => {\n if (keyboardNavigationActiveRef.current) return\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n onPointerMove={(event) => {\n if (keyboardNavigationActiveRef.current && event.movementX === 0 && event.movementY === 0) {\n return\n }\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={desktopContentRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return popover\n return createPortal(popover, document.body)\n })() : null}\n </div>\n </div>\n )\n}\n\nHourPickerInput.displayName = \"HourPickerInput\"\n\nexport type HourPickerFieldProps = HourPickerInputProps\n\nfunction HourPickerSelectField({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const popoverRef = React.useRef<HTMLDivElement | null>(null)\n const viewportRef = React.useRef<HTMLDivElement | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const resolvedOpen = open ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = resolvedOpen\n\n const commitValue = React.useCallback(\n (next: string) => {\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n const updatePopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n const trigger = triggerRef.current\n const popover = popoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) {\n return\n }\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setPopoverPosition({ left, top, width })\n }, [])\n\n React.useLayoutEffect(() => {\n if (!resolvedOpen || disabled) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n\n updatePopoverPosition()\n const rafId = window.requestAnimationFrame(updatePopoverPosition)\n\n window.addEventListener(\"scroll\", updatePopoverPosition, true)\n window.addEventListener(\"resize\", updatePopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updatePopoverPosition, true)\n window.removeEventListener(\"resize\", updatePopoverPosition)\n }\n }, [disabled, resolvedOpen, updatePopoverPosition])\n\n React.useEffect(() => {\n if (!resolvedOpen) {\n return\n }\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (container?.contains(target)) {\n return\n }\n\n const popover = popoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = popoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [resolvedOpen, setOpen])\n\n const selectedOption = options.find((option) => option.value === value)\n\n return (\n <div\n data-slot=\"hours-picker-field\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={resolvedOpen}\n aria-controls={`${triggerId}-content`}\n disabled={disabled}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n \"hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n resolvedOpen && \"ring-2 ring-primary ring-offset-2\",\n inputClassName,\n )}\n onClick={() => {\n if (disabled || readOnly) {\n return\n }\n setOpen(!resolvedOpen)\n }}\n >\n <span className=\"line-clamp-1 text-left\">\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDown aria-hidden className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n\n {resolvedOpen ? (() => {\n const popover = (\n <>\n <div\n ref={popoverRef}\n id={`${triggerId}-content`}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: popoverPosition.left,\n top: popoverPosition.top,\n width: popoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={viewportRef}\n />\n\n <div\n ref={viewportRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n isChecked && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled || readOnly) {\n return\n }\n\n commitValue(option.value)\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={viewportRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") {\n return popover\n }\n\n return createPortal(popover, document.body)\n })() : null}\n </div>\n )\n}\n\nexport function HourPickerField(props: HourPickerFieldProps) {\n const isTouchDevice = useIsTouchDevice()\n\n if (isTouchDevice) {\n return <HourPickerSelectField {...props} />\n }\n\n return <HourPickerInput {...props} />\n}\n\nHourPickerField.displayName = \"HourPickerField\"\n\ntype HourPickerMaskedSelectTriggerProps = {\n id: string\n placeholder: string\n value: string | null\n onValueUpdate: (value: string | null) => void\n onCommit: (value: string | null) => void\n options: HourPickerOption[]\n disabled?: boolean\n readOnly?: boolean\n open: boolean\n setOpen: (open: boolean) => void\n inputClassName?: string\n triggerTestId?: string\n isHydrated?: boolean\n highlightedValueRef: React.MutableRefObject<string | null>\n setHighlightedValue: (value: string | null) => void\n markKeyboardNavigation: () => void\n inputRef: (node: HTMLInputElement | null) => void\n onDraftValueHandlerChange: (handler: ((value: string) => void) | null) => void\n}\n\nfunction HourPickerMaskedSelectTrigger({\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps) {\n const isEditingRef = React.useRef(false)\n const pointerDownOnInputRef = React.useRef(false)\n const inputWasFocusedOnPointerDownRef = React.useRef(false)\n const ignoreNextMaskCommitValueRef = React.useRef<string | null>(null)\n const lastAcceptedSignatureRef = React.useRef<string | null>(null)\n const clearCommitPendingRef = React.useRef(false)\n\n const [draft, setDraft] = React.useState(() => (value ? value : \"\"))\n\n React.useEffect(() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }, [onDraftValueHandlerChange])\n\n const moveSelection = React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )\n\n React.useEffect(() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }, [value])\n\n React.useEffect(() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }, [draft])\n\n React.useEffect(() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }, [value])\n\n const triggerClassName = cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n )\n\n return (\n <div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index302.js","names":["Check","ChevronDown","ChevronUp","React","createPortal","IMaskInput","IMask","InputMask","useIsTouchDevice","cn","imaskAny","HourPickerOption","value","label","selectedLabel","ReactNode","disabled","description","pad2","String","padStart","parseTimeInput","raw","trimmed","trim","match","exec","hours","Number","minutes","isFinite","getAcceptedInputSignature","parsed","digits","replace","length","minutePart","slice","hourPart","ParsedTimeInputResult","selectableValue","parseTimeInputWithSelectableOption","options","parsedOption","find","option","isOptionSelectable","timeStringToMinutes","findClosestSelectableOption","targetMinutes","bestOption","bestDiff","POSITIVE_INFINITY","bestMinutes","NEGATIVE_INFINITY","optionMinutes","diff","Math","abs","HourPickerScrollButtonDirection","HourPickerScrollButtonProps","direction","viewportRef","RefObject","HTMLElement","speed","className","HourPickerScrollButton","setDisabled","useState","animationRef","useRef","undefined","lastTimeRef","isScrollingRef","checkScrollability","useCallback","viewport","current","scrollTop","scrollHeight","clientHeight","tolerance","canScrollUp","canScrollDown","hasScrollableContent","shouldDisable","useEffect","handleScroll","handleResize","addEventListener","passive","resizeObserver","ResizeObserver","observe","mutationObserver","MutationObserver","childList","subtree","removeEventListener","disconnect","stopScrolling","cancelAnimationFrame","smoothScroll","currentTime","deltaTime","distance","requestAnimationFrame","oldScrollTop","maxScroll","newScrollTop","max","min","scrollTo","top","canContinue","setTimeout","startScrolling","HourPickerInputProps","id","onChange","onValueUpdate","placeholder","inputClassName","readOnly","open","onOpenChange","triggerTestId","contentTestId","isHydrated","HourPickerInput","openProp","reactId","useId","triggerId","triggerInputRef","HTMLInputElement","setTriggerDraftValueRef","setTriggerDraftValueHandler","handler","highlightedValueRef","keyboardNavigationActiveRef","highlightedValue","setHighlightedValue","containerRef","HTMLDivElement","desktopPopoverRef","desktopContentRef","desktopPopoverPosition","setDesktopPopoverPosition","left","width","uncontrolledOpen","setUncontrolledOpen","setOpen","openRef","input","document","activeElement","focus","preventScroll","updateHighlightedValue","next","markKeyboardNavigation","currentOption","firstEnabled","updateValue","matchingOption","commitValue","ownerDocument","ownerWindow","defaultView","window","handlePointerDown","event","PointerEvent","target","Node","container","contains","popover","handleKeyDown","KeyboardEvent","key","preventDefault","stopPropagation","handleWheel","WheelEvent","deltaY","maxScrollTop","atTop","atBottom","isWheelOverViewport","nextScrollTop","trigger","isActive","observer","IntersectionObserver","entries","entry","isIntersecting","updateDesktopPopoverPosition","rect","getBoundingClientRect","popoverHeight","offsetHeight","viewportWidth","innerWidth","viewportHeight","innerHeight","padding","bottom","overflowBottom","aboveTop","useLayoutEffect","rafId","run","selected","querySelector","targetTop","offsetTop","targetBottom","viewportBottom","all","Array","from","querySelectorAll","lastDisabledBefore","el","isDisabled","hasAttribute","offset","raf","selectedOption","node","map","isChecked","movementX","movementY","body","displayName","HourPickerFieldProps","HourPickerSelectField","triggerRef","HTMLButtonElement","popoverRef","popoverPosition","setPopoverPosition","resolvedOpen","updatePopoverPosition","HourPickerField","props","$","_c","isTouchDevice","t0","HourPickerMaskedSelectTriggerProps","onCommit","MutableRefObject","inputRef","onDraftValueHandlerChange","HourPickerMaskedSelectTrigger","isEditingRef","pointerDownOnInputRef","inputWasFocusedOnPointerDownRef","ignoreNextMaskCommitValueRef","lastAcceptedSignatureRef","clearCommitPendingRef","t1","draft","setDraft","t2","t3","nextValue","t4","base","baseIndex","findIndex","nextIndex","nextOption","moveSelection","t5","t6","t7","t8","t10","t9","t11","t12","t13","t14","triggerClassName","t15","t16","Symbol","for","mask","lazy","t17","appended","dynamicMasked","compiledMasks","hourPrefix","hasTwoDigitHour","some","option_0","startsWith","t18","accepted","_mask","nextText","nextDigits","nextSignature","t19","completed","_mask_0","event_0","nextText_0","resolved","closestOption","t20","t21","t22","event_1","currentTarget","t23","event_2","defaultPrevented","shouldReopen","ctrlKey","metaKey","altKey","resolved_0","highlightedOption","option_1","fallbackValue","_temp","targetMinutes_0","closestOption_0","t24","event_3","shouldSelectAll","element","select","t25","resolved_1","t26","t27","t28","t29","t30","t31","t32","_temp2","_temp3","t33","event_5","event_4","option_2"],"sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { useIsTouchDevice } from \"@/helpers/useIsTouchDevice\"\nimport { cn } from \"@/lib/utils\"\n\n\n// WARNING: used to preserve input mask even with tree shaking\n// DO NOT REMOVE THIS CODE OR THIS COMMENT\nconst imaskAny = IMask as any\nif (typeof imaskAny.InputMask !== \"function\") {\n imaskAny.InputMask = InputMask\n}\n\n\nexport type HourPickerOption = {\n value: string\n label: string\n selectedLabel?: React.ReactNode\n disabled?: boolean\n description?: React.ReactNode\n}\n\nfunction pad2(value: number) {\n return String(value).padStart(2, \"0\")\n}\n\nfunction parseTimeInput(raw: string) {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(trimmed)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {\n return null\n }\n\n return `${pad2(hours)}:${pad2(minutes)}`\n}\n\nfunction getAcceptedInputSignature(raw: string) {\n const parsed = parseTimeInput(raw)\n if (parsed) {\n return `parsed:${parsed}`\n }\n\n const digits = raw.replace(/\\D/g, \"\")\n if (!digits) {\n return \"empty\"\n }\n\n if (digits.length <= 2) {\n return `hour:${Number(digits)}`\n }\n\n const minutePart = digits.slice(-2)\n const hourPart = digits.slice(0, -2)\n return `hour-minute:${Number(hourPart)}:${minutePart}`\n}\n\ntype ParsedTimeInputResult = {\n parsed: string\n selectableValue: string | null\n}\n\nfunction parseTimeInputWithSelectableOption(raw: string, options: HourPickerOption[]): ParsedTimeInputResult | null {\n const parsed = parseTimeInput(raw)\n if (!parsed) return null\n\n const parsedOption = options.find((option) => option.value === parsed)\n if (isOptionSelectable(parsedOption)) {\n return { parsed, selectableValue: parsed }\n }\n\n return { parsed, selectableValue: null }\n}\n\nfunction timeStringToMinutes(value: string) {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n return hours * 60 + minutes\n}\n\nfunction isOptionSelectable(option: HourPickerOption | undefined) {\n if (!option) return false\n return !option.disabled\n}\n\nfunction findClosestSelectableOption(targetMinutes: number, options: HourPickerOption[]) {\n let bestOption: HourPickerOption | null = null\n let bestDiff = Number.POSITIVE_INFINITY\n let bestMinutes = Number.NEGATIVE_INFINITY\n\n for (const option of options) {\n if (!isOptionSelectable(option)) continue\n const optionMinutes = timeStringToMinutes(option.value)\n if (optionMinutes == null) continue\n\n const diff = Math.abs(optionMinutes - targetMinutes)\n if (diff < bestDiff || (diff === bestDiff && optionMinutes > bestMinutes)) {\n bestOption = option\n bestDiff = diff\n bestMinutes = optionMinutes\n }\n }\n\n return bestOption\n}\n\ntype HourPickerScrollButtonDirection = \"up\" | \"down\"\n\ntype HourPickerScrollButtonProps = {\n direction: HourPickerScrollButtonDirection\n viewportRef: React.RefObject<HTMLElement | null>\n speed?: number\n className?: string\n}\n\nfunction HourPickerScrollButton({\n direction,\n viewportRef,\n speed = 400,\n className,\n}: HourPickerScrollButtonProps) {\n const [disabled, setDisabled] = React.useState(true)\n const animationRef = React.useRef<number | undefined>(undefined)\n const lastTimeRef = React.useRef<number | undefined>(undefined)\n const isScrollingRef = React.useRef(false)\n\n const checkScrollability = React.useCallback(() => {\n const viewport = viewportRef.current\n if (!viewport) {\n setDisabled(true)\n return\n }\n\n const { scrollTop, scrollHeight, clientHeight } = viewport\n const tolerance = 2\n\n const canScrollUp = scrollTop > tolerance\n const canScrollDown = scrollTop < (scrollHeight - clientHeight - tolerance)\n const hasScrollableContent = scrollHeight > clientHeight + tolerance\n\n if (!hasScrollableContent) {\n setDisabled(true)\n return\n }\n\n const shouldDisable = direction === \"up\" ? !canScrollUp : !canScrollDown\n setDisabled(shouldDisable)\n }, [direction, viewportRef])\n\n React.useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n checkScrollability()\n\n const handleScroll = () => checkScrollability()\n const handleResize = () => checkScrollability()\n\n viewport.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n const resizeObserver = new ResizeObserver(handleResize)\n resizeObserver.observe(viewport)\n\n const mutationObserver = new MutationObserver(handleResize)\n mutationObserver.observe(viewport, { childList: true, subtree: true })\n\n return () => {\n viewport.removeEventListener(\"scroll\", handleScroll)\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [viewportRef, checkScrollability])\n\n const stopScrolling = React.useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = undefined\n }\n isScrollingRef.current = false\n lastTimeRef.current = undefined\n }, [])\n\n const smoothScroll = React.useCallback(\n (currentTime: number) => {\n const viewport = viewportRef.current\n if (!viewport || disabled || !isScrollingRef.current) {\n stopScrolling()\n return\n }\n\n if (!lastTimeRef.current) {\n lastTimeRef.current = currentTime\n }\n\n const deltaTime = currentTime - lastTimeRef.current\n const distance = (speed * deltaTime) / 1000\n\n if (distance < 0.1) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n return\n }\n\n const oldScrollTop = viewport.scrollTop\n const maxScroll = viewport.scrollHeight - viewport.clientHeight\n\n let newScrollTop: number\n if (direction === \"up\") {\n newScrollTop = Math.max(0, oldScrollTop - distance)\n } else {\n newScrollTop = Math.min(maxScroll, oldScrollTop + distance)\n }\n\n viewport.scrollTo({ top: newScrollTop })\n\n lastTimeRef.current = currentTime\n\n const tolerance = 1\n const canContinue =\n direction === \"up\"\n ? newScrollTop > tolerance\n : newScrollTop < (maxScroll - tolerance)\n\n if (canContinue && Math.abs(newScrollTop - oldScrollTop) > 0.01) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n } else {\n stopScrolling()\n setTimeout(checkScrollability, 16)\n }\n },\n [checkScrollability, direction, disabled, speed, stopScrolling, viewportRef],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewportRef.current || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, smoothScroll, viewportRef])\n\n React.useEffect(() => stopScrolling, [stopScrolling])\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center py-1 select-none\",\n disabled ? \"cursor-default opacity-40\" : \"cursor-pointer opacity-100 hover:bg-accent/20\",\n className\n )}\n onPointerEnter={() => {\n if (!disabled) startScrolling()\n }}\n onPointerMove={() => {\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={() => {\n stopScrolling()\n }}\n >\n {direction === \"up\"\n ? <ChevronUp aria-hidden className=\"h-4 w-4 opacity-50\" />\n : <ChevronDown aria-hidden className=\"h-4 w-4 opacity-50\" />}\n </div>\n )\n}\n\nexport type HourPickerInputProps = {\n id?: string\n value: string | null\n onChange: (value: string | null) => void\n onValueUpdate?: (value: string | null) => void\n options: HourPickerOption[]\n placeholder?: string\n className?: string\n inputClassName?: string\n disabled?: boolean\n readOnly?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n triggerTestId?: string\n contentTestId?: string\n isHydrated?: boolean\n}\n\nexport function HourPickerInput({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open: openProp,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerInputProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerInputRef = React.useRef<HTMLInputElement | null>(null)\n const setTriggerDraftValueRef = React.useRef<((value: string) => void) | null>(null)\n const setTriggerDraftValueHandler = React.useCallback((handler: ((value: string) => void) | null) => {\n setTriggerDraftValueRef.current = handler\n }, [])\n const highlightedValueRef = React.useRef<string | null>(null)\n const keyboardNavigationActiveRef = React.useRef(false)\n const [highlightedValue, setHighlightedValue] = React.useState<string | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const desktopPopoverRef = React.useRef<HTMLDivElement | null>(null)\n const desktopContentRef = React.useRef<HTMLDivElement | null>(null)\n const [desktopPopoverPosition, setDesktopPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const open = openProp ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = open\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (disabled || readOnly) {\n return\n }\n\n const input = triggerInputRef.current\n if (!(input instanceof HTMLInputElement)) {\n return\n }\n if (typeof document !== \"undefined\" && document.activeElement === input) {\n return\n }\n\n input.focus({ preventScroll: true })\n }, [disabled, open, readOnly])\n\n const updateHighlightedValue = React.useCallback((next: string | null) => {\n highlightedValueRef.current = next\n setHighlightedValue(next)\n }, [])\n\n const markKeyboardNavigation = React.useCallback(() => {\n keyboardNavigationActiveRef.current = true\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n\n const currentOption = options.find((option) => option.value === value)\n if (currentOption && isOptionSelectable(currentOption)) {\n updateHighlightedValue(currentOption.value)\n return\n }\n\n const firstEnabled = options.find((option) => isOptionSelectable(option))\n updateHighlightedValue(firstEnabled?.value ?? null)\n }, [open, options, updateHighlightedValue, value])\n\n const updateValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n },\n [onValueUpdate, options],\n )\n\n const commitValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n onChange(null)\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n React.useEffect(() => {\n if (!open) return\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (container.contains(target)) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return\n }\n if (!openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = desktopPopoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [open, setOpen])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (!popover) {\n return\n }\n\n const handleWheel = (event: WheelEvent) => {\n const viewport = desktopContentRef.current\n if (!viewport) {\n return\n }\n\n const deltaY = event.deltaY\n if (deltaY === 0) {\n return\n }\n\n const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight)\n const atTop = viewport.scrollTop <= 0\n const atBottom = viewport.scrollTop >= maxScrollTop\n\n const target = event.target\n const isWheelOverViewport = target instanceof Node && viewport.contains(target)\n\n if (isWheelOverViewport) {\n if ((deltaY < 0 && atTop) || (deltaY > 0 && atBottom)) {\n event.preventDefault()\n }\n return\n }\n\n event.preventDefault()\n const nextScrollTop = Math.min(maxScrollTop, Math.max(0, viewport.scrollTop + deltaY))\n viewport.scrollTop = nextScrollTop\n }\n\n popover.addEventListener(\"wheel\", handleWheel, { passive: false })\n return () => {\n popover.removeEventListener(\"wheel\", handleWheel)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (openProp !== undefined && !onOpenChange) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n if (!(\"IntersectionObserver\" in window)) {\n return\n }\n\n const trigger = triggerInputRef.current\n if (!(trigger instanceof HTMLElement)) {\n return\n }\n\n let isActive = true\n const observer = new IntersectionObserver(entries => {\n if (!isActive) {\n return\n }\n const entry = entries[0]\n if (entry && !entry.isIntersecting) {\n setOpen(false)\n }\n })\n observer.observe(trigger)\n return () => {\n isActive = false\n observer.disconnect()\n }\n }, [onOpenChange, open, openProp, setOpen])\n\n const updateDesktopPopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") return\n\n const trigger = triggerInputRef.current\n const popover = desktopPopoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) return\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setDesktopPopoverPosition({ left, top, width })\n }, [])\n\n // React Compiler rejects hook aliasing (useIsomorphicLayoutEffect pattern), so we\n // call useLayoutEffect directly and keep the SSR guard inside the effect.\n React.useLayoutEffect(() => {\n if (!open || disabled) return\n if (typeof window === \"undefined\") return\n\n updateDesktopPopoverPosition()\n const rafId = window.requestAnimationFrame(updateDesktopPopoverPosition)\n\n window.addEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.addEventListener(\"resize\", updateDesktopPopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.removeEventListener(\"resize\", updateDesktopPopoverPosition)\n }\n }, [disabled, open, updateDesktopPopoverPosition])\n\n React.useEffect(() => {\n if (!open) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const run = () => {\n const selected = viewport.querySelector(\"[role=\\\"option\\\"][data-state=\\\"checked\\\"]\")\n if (selected instanceof HTMLElement) {\n const padding = 8\n const targetTop = selected.offsetTop - padding\n const targetBottom = selected.offsetTop + selected.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n return\n }\n\n const all = Array.from(viewport.querySelectorAll(\"[role=\\\"option\\\"]\")) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\n\n for (const el of all) {\n const isDisabled = el.hasAttribute(\"data-disabled\")\n if (!isDisabled) {\n firstEnabled = el\n break\n }\n lastDisabledBefore = el\n }\n\n if (!firstEnabled) return\n\n const target = lastDisabledBefore ? lastDisabledBefore : firstEnabled\n\n const offset = Math.max(0, target.offsetTop - 8)\n viewport.scrollTop = offset\n }\n\n const raf = requestAnimationFrame(run)\n return () => cancelAnimationFrame(raf)\n }, [open, options])\n\n React.useEffect(() => {\n if (!open) return\n if (!highlightedValue) return\n if (!keyboardNavigationActiveRef.current) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const target = viewport.querySelector(`[role=\"option\"][data-value=\"${highlightedValue}\"]`)\n if (!(target instanceof HTMLElement)) return\n\n const padding = 8\n const targetTop = target.offsetTop - padding\n const targetBottom = target.offsetTop + target.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n }, [highlightedValue, open])\n\n const selectedOption = options.find((option) => option.value === value)\n\n return (\n <div\n data-slot=\"hours-picker-input\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <div className=\"relative\">\n <HourPickerMaskedSelectTrigger\n id={triggerId}\n placeholder={placeholder}\n value={value}\n onValueUpdate={updateValue}\n onCommit={commitValue}\n options={options}\n selectedLabel={selectedOption?.selectedLabel}\n disabled={disabled}\n readOnly={readOnly}\n open={open}\n setOpen={setOpen}\n inputClassName={inputClassName}\n triggerTestId={triggerTestId}\n isHydrated={isHydrated}\n highlightedValueRef={highlightedValueRef}\n setHighlightedValue={updateHighlightedValue}\n markKeyboardNavigation={markKeyboardNavigation}\n inputRef={(node) => {\n triggerInputRef.current = node\n }}\n onDraftValueHandlerChange={setTriggerDraftValueHandler}\n />\n\n {open ? (() => {\n const popover = (\n <>\n <div\n ref={desktopPopoverRef}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"pointer-events-auto fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: desktopPopoverPosition.left,\n top: desktopPopoverPosition.top,\n width: desktopPopoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={desktopContentRef}\n />\n\n <div\n ref={desktopContentRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n highlightedValue === option.value && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled) return\n\n setTriggerDraftValueRef.current?.(option.value)\n updateHighlightedValue(option.value)\n triggerInputRef.current?.focus({ preventScroll: true })\n commitValue(option.value)\n setOpen(false)\n }}\n onPointerEnter={() => {\n if (keyboardNavigationActiveRef.current) return\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n onPointerMove={(event) => {\n if (keyboardNavigationActiveRef.current && event.movementX === 0 && event.movementY === 0) {\n return\n }\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={desktopContentRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return popover\n return createPortal(popover, document.body)\n })() : null}\n </div>\n </div>\n )\n}\n\nHourPickerInput.displayName = \"HourPickerInput\"\n\nexport type HourPickerFieldProps = HourPickerInputProps\n\nfunction HourPickerSelectField({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const popoverRef = React.useRef<HTMLDivElement | null>(null)\n const viewportRef = React.useRef<HTMLDivElement | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const resolvedOpen = open ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = resolvedOpen\n\n const commitValue = React.useCallback(\n (next: string) => {\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n const updatePopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n const trigger = triggerRef.current\n const popover = popoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) {\n return\n }\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setPopoverPosition({ left, top, width })\n }, [])\n\n React.useLayoutEffect(() => {\n if (!resolvedOpen || disabled) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n\n updatePopoverPosition()\n const rafId = window.requestAnimationFrame(updatePopoverPosition)\n\n window.addEventListener(\"scroll\", updatePopoverPosition, true)\n window.addEventListener(\"resize\", updatePopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updatePopoverPosition, true)\n window.removeEventListener(\"resize\", updatePopoverPosition)\n }\n }, [disabled, resolvedOpen, updatePopoverPosition])\n\n React.useEffect(() => {\n if (!resolvedOpen) {\n return\n }\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (container?.contains(target)) {\n return\n }\n\n const popover = popoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = popoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [resolvedOpen, setOpen])\n\n const selectedOption = options.find((option) => option.value === value)\n const selectedLabel = selectedOption?.selectedLabel ?? selectedOption?.label ?? value\n\n return (\n <div\n data-slot=\"hours-picker-field\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={resolvedOpen}\n aria-controls={`${triggerId}-content`}\n disabled={disabled}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n \"hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n resolvedOpen && \"ring-2 ring-primary ring-offset-2\",\n inputClassName,\n )}\n onClick={() => {\n if (disabled || readOnly) {\n return\n }\n setOpen(!resolvedOpen)\n }}\n >\n <span className=\"line-clamp-1 text-left\">\n {value ? selectedLabel : placeholder}\n </span>\n <ChevronDown aria-hidden className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n\n {resolvedOpen ? (() => {\n const popover = (\n <>\n <div\n ref={popoverRef}\n id={`${triggerId}-content`}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: popoverPosition.left,\n top: popoverPosition.top,\n width: popoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={viewportRef}\n />\n\n <div\n ref={viewportRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n isChecked && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled || readOnly) {\n return\n }\n\n commitValue(option.value)\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={viewportRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") {\n return popover\n }\n\n return createPortal(popover, document.body)\n })() : null}\n </div>\n )\n}\n\nexport function HourPickerField(props: HourPickerFieldProps) {\n const isTouchDevice = useIsTouchDevice()\n\n if (isTouchDevice) {\n return <HourPickerSelectField {...props} />\n }\n\n return <HourPickerInput {...props} />\n}\n\nHourPickerField.displayName = \"HourPickerField\"\n\ntype HourPickerMaskedSelectTriggerProps = {\n id: string\n placeholder: string\n value: string | null\n onValueUpdate: (value: string | null) => void\n onCommit: (value: string | null) => void\n options: HourPickerOption[]\n selectedLabel?: React.ReactNode\n disabled?: boolean\n readOnly?: boolean\n open: boolean\n setOpen: (open: boolean) => void\n inputClassName?: string\n triggerTestId?: string\n isHydrated?: boolean\n highlightedValueRef: React.MutableRefObject<string | null>\n setHighlightedValue: (value: string | null) => void\n markKeyboardNavigation: () => void\n inputRef: (node: HTMLInputElement | null) => void\n onDraftValueHandlerChange: (handler: ((value: string) => void) | null) => void\n}\n\nfunction HourPickerMaskedSelectTrigger({\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n selectedLabel,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps) {\n const isEditingRef = React.useRef(false)\n const pointerDownOnInputRef = React.useRef(false)\n const inputWasFocusedOnPointerDownRef = React.useRef(false)\n const ignoreNextMaskCommitValueRef = React.useRef<string | null>(null)\n const lastAcceptedSignatureRef = React.useRef<string | null>(null)\n const clearCommitPendingRef = React.useRef(false)\n\n const [draft, setDraft] = React.useState(() => (value ? value : \"\"))\n\n React.useEffect(() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }, [onDraftValueHandlerChange])\n\n const moveSelection = React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )\n\n React.useEffect(() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }, [value])\n\n React.useEffect(() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }, [draft])\n\n React.useEffect(() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }, [value])\n\n const triggerClassName = cn(\n \"peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n value && selectedLabel != null && \"text-transparent focus:text-foreground\",\n )\n\n return (\n <div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n {value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],"mappings":"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"}
|