@roy-ui/ui 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{TimePicker-44EKHQEJ.css → TimePicker-LNKWKRLX.css} +128 -5
- package/dist/{TimePicker-BhRta4MK.d.ts → TimeRangePicker-CgkOBnk6.d.ts} +25 -1
- package/dist/{chunk-HUCK7AM7.js → chunk-PDUQROG2.js} +23 -15
- package/dist/chunk-PDUQROG2.js.map +1 -0
- package/dist/{chunk-75IGGPXL.js → chunk-QOSMU4DV.js} +321 -40
- package/dist/chunk-QOSMU4DV.js.map +1 -0
- package/dist/components/data-table/index.d.ts +4 -5
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/time-picker/index.d.ts +19 -3
- package/dist/components/time-picker/index.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-75IGGPXL.js.map +0 -1
- package/dist/chunk-HUCK7AM7.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useRef, useState, useCallback, useEffect } from 'react';
|
|
2
|
+
import { useRef, useState, useCallback, useEffect, useLayoutEffect } from 'react';
|
|
3
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
-
import './TimePicker-
|
|
4
|
+
import './TimePicker-LNKWKRLX.css';
|
|
5
5
|
|
|
6
6
|
// src/components/time-picker/TimePicker.tsx
|
|
7
7
|
function angleFromCenter(cx, cy, px, py) {
|
|
@@ -355,6 +355,82 @@ function Segment({
|
|
|
355
355
|
}
|
|
356
356
|
);
|
|
357
357
|
}
|
|
358
|
+
function ClockSwitch({
|
|
359
|
+
mode,
|
|
360
|
+
value,
|
|
361
|
+
onChange,
|
|
362
|
+
hourCycle,
|
|
363
|
+
minuteStep
|
|
364
|
+
}) {
|
|
365
|
+
const analogRef = useRef(null);
|
|
366
|
+
const digitalRef = useRef(null);
|
|
367
|
+
const [heights, setHeights] = useState(
|
|
368
|
+
{}
|
|
369
|
+
);
|
|
370
|
+
useLayoutEffect(() => {
|
|
371
|
+
const a = analogRef.current;
|
|
372
|
+
const d = digitalRef.current;
|
|
373
|
+
const measure = () => setHeights({ analog: a?.offsetHeight, digital: d?.offsetHeight });
|
|
374
|
+
measure();
|
|
375
|
+
const ro = new ResizeObserver(measure);
|
|
376
|
+
if (a) ro.observe(a);
|
|
377
|
+
if (d) ro.observe(d);
|
|
378
|
+
return () => ro.disconnect();
|
|
379
|
+
}, []);
|
|
380
|
+
const analogActive = mode === "analog";
|
|
381
|
+
useLayoutEffect(() => {
|
|
382
|
+
if (analogRef.current) analogRef.current.inert = !analogActive;
|
|
383
|
+
if (digitalRef.current) digitalRef.current.inert = analogActive;
|
|
384
|
+
}, [analogActive]);
|
|
385
|
+
const height = analogActive ? heights.analog : heights.digital;
|
|
386
|
+
return /* @__PURE__ */ jsxs(
|
|
387
|
+
"div",
|
|
388
|
+
{
|
|
389
|
+
className: "royui-tp__switch",
|
|
390
|
+
style: height != null ? { height } : void 0,
|
|
391
|
+
children: [
|
|
392
|
+
/* @__PURE__ */ jsx(
|
|
393
|
+
"div",
|
|
394
|
+
{
|
|
395
|
+
ref: analogRef,
|
|
396
|
+
className: [
|
|
397
|
+
"royui-tp__layer",
|
|
398
|
+
analogActive && "royui-tp__layer--active"
|
|
399
|
+
].filter(Boolean).join(" "),
|
|
400
|
+
children: /* @__PURE__ */ jsx(
|
|
401
|
+
AnalogClock,
|
|
402
|
+
{
|
|
403
|
+
value,
|
|
404
|
+
onChange,
|
|
405
|
+
hourCycle,
|
|
406
|
+
minuteStep
|
|
407
|
+
}
|
|
408
|
+
)
|
|
409
|
+
}
|
|
410
|
+
),
|
|
411
|
+
/* @__PURE__ */ jsx(
|
|
412
|
+
"div",
|
|
413
|
+
{
|
|
414
|
+
ref: digitalRef,
|
|
415
|
+
className: [
|
|
416
|
+
"royui-tp__layer",
|
|
417
|
+
!analogActive && "royui-tp__layer--active"
|
|
418
|
+
].filter(Boolean).join(" "),
|
|
419
|
+
children: /* @__PURE__ */ jsx(
|
|
420
|
+
DigitalClock,
|
|
421
|
+
{
|
|
422
|
+
value,
|
|
423
|
+
onChange,
|
|
424
|
+
hourCycle,
|
|
425
|
+
minuteStep
|
|
426
|
+
}
|
|
427
|
+
)
|
|
428
|
+
}
|
|
429
|
+
)
|
|
430
|
+
]
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
358
434
|
function pad2(n) {
|
|
359
435
|
return String(n).padStart(2, "0");
|
|
360
436
|
}
|
|
@@ -453,48 +529,253 @@ function TimePicker({
|
|
|
453
529
|
children: [
|
|
454
530
|
/* @__PURE__ */ jsxs("div", { className: "royui-tp__head", children: [
|
|
455
531
|
/* @__PURE__ */ jsx("div", { className: "royui-tp__readout", children: formatTime(draft, hourCycle) }),
|
|
456
|
-
switchable && /* @__PURE__ */ jsxs(
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
className:
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
532
|
+
switchable && /* @__PURE__ */ jsxs(
|
|
533
|
+
"div",
|
|
534
|
+
{
|
|
535
|
+
className: "royui-tp__variants",
|
|
536
|
+
role: "tablist",
|
|
537
|
+
"data-active": mode,
|
|
538
|
+
children: [
|
|
539
|
+
/* @__PURE__ */ jsx("span", { className: "royui-tp__variant-thumb", "aria-hidden": true }),
|
|
540
|
+
/* @__PURE__ */ jsx(
|
|
541
|
+
"button",
|
|
542
|
+
{
|
|
543
|
+
type: "button",
|
|
544
|
+
role: "tab",
|
|
545
|
+
"aria-selected": mode === "analog",
|
|
546
|
+
className: [
|
|
547
|
+
"royui-tp__variant",
|
|
548
|
+
mode === "analog" && "royui-tp__variant--on"
|
|
549
|
+
].filter(Boolean).join(" "),
|
|
550
|
+
onClick: () => setMode("analog"),
|
|
551
|
+
children: "Analog"
|
|
552
|
+
}
|
|
553
|
+
),
|
|
554
|
+
/* @__PURE__ */ jsx(
|
|
555
|
+
"button",
|
|
556
|
+
{
|
|
557
|
+
type: "button",
|
|
558
|
+
role: "tab",
|
|
559
|
+
"aria-selected": mode === "digital",
|
|
560
|
+
className: [
|
|
561
|
+
"royui-tp__variant",
|
|
562
|
+
mode === "digital" && "royui-tp__variant--on"
|
|
563
|
+
].filter(Boolean).join(" "),
|
|
564
|
+
onClick: () => setMode("digital"),
|
|
565
|
+
children: "Digital"
|
|
566
|
+
}
|
|
567
|
+
)
|
|
568
|
+
]
|
|
569
|
+
}
|
|
570
|
+
)
|
|
486
571
|
] }),
|
|
487
|
-
/* @__PURE__ */ jsx("div", { className: "royui-tp__body", children:
|
|
488
|
-
|
|
572
|
+
/* @__PURE__ */ jsx("div", { className: "royui-tp__body", children: /* @__PURE__ */ jsx(
|
|
573
|
+
ClockSwitch,
|
|
489
574
|
{
|
|
575
|
+
mode,
|
|
490
576
|
value: draft,
|
|
491
577
|
onChange: setDraft,
|
|
492
578
|
hourCycle,
|
|
493
579
|
minuteStep
|
|
494
580
|
}
|
|
495
|
-
)
|
|
496
|
-
|
|
581
|
+
) }),
|
|
582
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-tp__foot", children: [
|
|
583
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "royui-tp__ghost", onClick: setNow, children: "Now" }),
|
|
584
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "royui-tp__primary", onClick: apply, children: "Apply" })
|
|
585
|
+
] })
|
|
586
|
+
]
|
|
587
|
+
}
|
|
588
|
+
)
|
|
589
|
+
]
|
|
590
|
+
}
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
var EMPTY = { from: null, to: null };
|
|
594
|
+
function formatTimeRange(range, hourCycle = 24) {
|
|
595
|
+
if (!range || !range.from && !range.to) return "";
|
|
596
|
+
if (range.from && !range.to) return formatTime(range.from, hourCycle);
|
|
597
|
+
if (!range.from && range.to) return formatTime(range.to, hourCycle);
|
|
598
|
+
return `${formatTime(range.from, hourCycle)} \u2013 ${formatTime(range.to, hourCycle)}`;
|
|
599
|
+
}
|
|
600
|
+
function TimeRangePicker({
|
|
601
|
+
value,
|
|
602
|
+
defaultValue,
|
|
603
|
+
onChange,
|
|
604
|
+
variant = "analog",
|
|
605
|
+
switchable = true,
|
|
606
|
+
hourCycle = 24,
|
|
607
|
+
minuteStep = 1,
|
|
608
|
+
placeholder = "Time range",
|
|
609
|
+
align = "left",
|
|
610
|
+
className = "",
|
|
611
|
+
style,
|
|
612
|
+
triggerLabel,
|
|
613
|
+
disabled
|
|
614
|
+
}) {
|
|
615
|
+
const controlled = value !== void 0;
|
|
616
|
+
const [internal, setInternal] = useState(
|
|
617
|
+
defaultValue ?? EMPTY
|
|
618
|
+
);
|
|
619
|
+
const current = controlled ? value ?? EMPTY : internal;
|
|
620
|
+
const [open, setOpen] = useState(false);
|
|
621
|
+
const [mode, setMode] = useState(variant);
|
|
622
|
+
const [leg, setLeg] = useState("from");
|
|
623
|
+
const [draftFrom, setDraftFrom] = useState(
|
|
624
|
+
current.from ?? { hours: 9, minutes: 0 }
|
|
625
|
+
);
|
|
626
|
+
const [draftTo, setDraftTo] = useState(
|
|
627
|
+
current.to ?? { hours: 17, minutes: 0 }
|
|
628
|
+
);
|
|
629
|
+
const wrap2 = useRef(null);
|
|
630
|
+
useEffect(() => {
|
|
631
|
+
if (!open) return;
|
|
632
|
+
function onDown(e) {
|
|
633
|
+
if (wrap2.current && !wrap2.current.contains(e.target)) {
|
|
634
|
+
setOpen(false);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
function onKey(e) {
|
|
638
|
+
if (e.key === "Escape") setOpen(false);
|
|
639
|
+
}
|
|
640
|
+
document.addEventListener("mousedown", onDown);
|
|
641
|
+
document.addEventListener("keydown", onKey);
|
|
642
|
+
return () => {
|
|
643
|
+
document.removeEventListener("mousedown", onDown);
|
|
644
|
+
document.removeEventListener("keydown", onKey);
|
|
645
|
+
};
|
|
646
|
+
}, [open]);
|
|
647
|
+
useEffect(() => {
|
|
648
|
+
if (!open) return;
|
|
649
|
+
const now = /* @__PURE__ */ new Date();
|
|
650
|
+
setLeg("from");
|
|
651
|
+
setDraftFrom(current.from ?? { hours: now.getHours(), minutes: 0 });
|
|
652
|
+
setDraftTo(
|
|
653
|
+
current.to ?? { hours: (now.getHours() + 1) % 24, minutes: 0 }
|
|
654
|
+
);
|
|
655
|
+
}, [open]);
|
|
656
|
+
useEffect(() => {
|
|
657
|
+
setMode(variant);
|
|
658
|
+
}, [variant]);
|
|
659
|
+
const commit = (next) => {
|
|
660
|
+
if (!controlled) setInternal(next);
|
|
661
|
+
onChange?.(next);
|
|
662
|
+
};
|
|
663
|
+
const draft = leg === "from" ? draftFrom : draftTo;
|
|
664
|
+
const setDraft = leg === "from" ? setDraftFrom : setDraftTo;
|
|
665
|
+
const apply = () => {
|
|
666
|
+
commit({ from: draftFrom, to: draftTo });
|
|
667
|
+
setOpen(false);
|
|
668
|
+
};
|
|
669
|
+
const clear = () => {
|
|
670
|
+
commit(EMPTY);
|
|
671
|
+
setOpen(false);
|
|
672
|
+
};
|
|
673
|
+
return /* @__PURE__ */ jsxs(
|
|
674
|
+
"div",
|
|
675
|
+
{
|
|
676
|
+
ref: wrap2,
|
|
677
|
+
className: ["royui-tp", "royui-trp", className].filter(Boolean).join(" "),
|
|
678
|
+
style,
|
|
679
|
+
children: [
|
|
680
|
+
/* @__PURE__ */ jsxs(
|
|
681
|
+
"button",
|
|
682
|
+
{
|
|
683
|
+
type: "button",
|
|
684
|
+
className: "royui-tp__trigger",
|
|
685
|
+
onClick: () => !disabled && setOpen((o) => !o),
|
|
686
|
+
"aria-haspopup": "dialog",
|
|
687
|
+
"aria-expanded": open,
|
|
688
|
+
disabled,
|
|
689
|
+
children: [
|
|
690
|
+
/* @__PURE__ */ jsx("span", { className: "royui-tp__trigger-dot", "aria-hidden": true }),
|
|
691
|
+
/* @__PURE__ */ jsx("span", { className: "royui-tp__trigger-label", children: triggerLabel ?? (formatTimeRange(current, hourCycle) || placeholder) })
|
|
692
|
+
]
|
|
693
|
+
}
|
|
694
|
+
),
|
|
695
|
+
open && /* @__PURE__ */ jsxs(
|
|
696
|
+
"div",
|
|
697
|
+
{
|
|
698
|
+
className: `royui-tp__panel royui-tp__panel--${align}`,
|
|
699
|
+
role: "dialog",
|
|
700
|
+
"aria-label": "Choose time range",
|
|
701
|
+
children: [
|
|
702
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-tp__head", children: [
|
|
703
|
+
/* @__PURE__ */ jsx("div", { className: "royui-tp__readout", children: formatTime(draft, hourCycle) }),
|
|
704
|
+
switchable && /* @__PURE__ */ jsxs(
|
|
705
|
+
"div",
|
|
706
|
+
{
|
|
707
|
+
className: "royui-tp__variants",
|
|
708
|
+
role: "tablist",
|
|
709
|
+
"data-active": mode,
|
|
710
|
+
children: [
|
|
711
|
+
/* @__PURE__ */ jsx("span", { className: "royui-tp__variant-thumb", "aria-hidden": true }),
|
|
712
|
+
/* @__PURE__ */ jsx(
|
|
713
|
+
"button",
|
|
714
|
+
{
|
|
715
|
+
type: "button",
|
|
716
|
+
role: "tab",
|
|
717
|
+
"aria-selected": mode === "analog",
|
|
718
|
+
className: [
|
|
719
|
+
"royui-tp__variant",
|
|
720
|
+
mode === "analog" && "royui-tp__variant--on"
|
|
721
|
+
].filter(Boolean).join(" "),
|
|
722
|
+
onClick: () => setMode("analog"),
|
|
723
|
+
children: "Analog"
|
|
724
|
+
}
|
|
725
|
+
),
|
|
726
|
+
/* @__PURE__ */ jsx(
|
|
727
|
+
"button",
|
|
728
|
+
{
|
|
729
|
+
type: "button",
|
|
730
|
+
role: "tab",
|
|
731
|
+
"aria-selected": mode === "digital",
|
|
732
|
+
className: [
|
|
733
|
+
"royui-tp__variant",
|
|
734
|
+
mode === "digital" && "royui-tp__variant--on"
|
|
735
|
+
].filter(Boolean).join(" "),
|
|
736
|
+
onClick: () => setMode("digital"),
|
|
737
|
+
children: "Digital"
|
|
738
|
+
}
|
|
739
|
+
)
|
|
740
|
+
]
|
|
741
|
+
}
|
|
742
|
+
)
|
|
743
|
+
] }),
|
|
744
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-trp__legs", role: "tablist", "data-active": leg, children: [
|
|
745
|
+
/* @__PURE__ */ jsx("span", { className: "royui-trp__leg-thumb", "aria-hidden": true }),
|
|
746
|
+
/* @__PURE__ */ jsxs(
|
|
747
|
+
"button",
|
|
748
|
+
{
|
|
749
|
+
type: "button",
|
|
750
|
+
role: "tab",
|
|
751
|
+
"aria-selected": leg === "from",
|
|
752
|
+
className: "royui-trp__leg",
|
|
753
|
+
onClick: () => setLeg("from"),
|
|
754
|
+
children: [
|
|
755
|
+
/* @__PURE__ */ jsx("span", { className: "royui-trp__leg-label", children: "Start" }),
|
|
756
|
+
/* @__PURE__ */ jsx("span", { className: "royui-trp__leg-time", children: formatTime(draftFrom, hourCycle) })
|
|
757
|
+
]
|
|
758
|
+
}
|
|
759
|
+
),
|
|
760
|
+
/* @__PURE__ */ jsxs(
|
|
761
|
+
"button",
|
|
762
|
+
{
|
|
763
|
+
type: "button",
|
|
764
|
+
role: "tab",
|
|
765
|
+
"aria-selected": leg === "to",
|
|
766
|
+
className: "royui-trp__leg",
|
|
767
|
+
onClick: () => setLeg("to"),
|
|
768
|
+
children: [
|
|
769
|
+
/* @__PURE__ */ jsx("span", { className: "royui-trp__leg-label", children: "End" }),
|
|
770
|
+
/* @__PURE__ */ jsx("span", { className: "royui-trp__leg-time", children: formatTime(draftTo, hourCycle) })
|
|
771
|
+
]
|
|
772
|
+
}
|
|
773
|
+
)
|
|
774
|
+
] }),
|
|
775
|
+
/* @__PURE__ */ jsx("div", { className: "royui-tp__body", children: /* @__PURE__ */ jsx(
|
|
776
|
+
ClockSwitch,
|
|
497
777
|
{
|
|
778
|
+
mode,
|
|
498
779
|
value: draft,
|
|
499
780
|
onChange: setDraft,
|
|
500
781
|
hourCycle,
|
|
@@ -502,7 +783,7 @@ function TimePicker({
|
|
|
502
783
|
}
|
|
503
784
|
) }),
|
|
504
785
|
/* @__PURE__ */ jsxs("div", { className: "royui-tp__foot", children: [
|
|
505
|
-
/* @__PURE__ */ jsx("button", { type: "button", className: "royui-tp__ghost", onClick:
|
|
786
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "royui-tp__ghost", onClick: clear, children: "Clear" }),
|
|
506
787
|
/* @__PURE__ */ jsx("button", { type: "button", className: "royui-tp__primary", onClick: apply, children: "Apply" })
|
|
507
788
|
] })
|
|
508
789
|
]
|
|
@@ -513,6 +794,6 @@ function TimePicker({
|
|
|
513
794
|
);
|
|
514
795
|
}
|
|
515
796
|
|
|
516
|
-
export { AnalogClock, DigitalClock, TimePicker, formatTime };
|
|
517
|
-
//# sourceMappingURL=chunk-
|
|
518
|
-
//# sourceMappingURL=chunk-
|
|
797
|
+
export { AnalogClock, ClockSwitch, DigitalClock, TimePicker, TimeRangePicker, formatTime, formatTimeRange };
|
|
798
|
+
//# sourceMappingURL=chunk-QOSMU4DV.js.map
|
|
799
|
+
//# sourceMappingURL=chunk-QOSMU4DV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/time-picker/AnalogClock.tsx","../src/components/time-picker/DigitalClock.tsx","../src/components/time-picker/ClockSwitch.tsx","../src/components/time-picker/TimePicker.tsx","../src/components/time-picker/TimeRangePicker.tsx"],"names":["cx","cy","hours12","isAm","jsxs","jsx","useRef","useState","pad","wrap","useEffect"],"mappings":"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","file":"chunk-QOSMU4DV.js","sourcesContent":["'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n} from 'react';\n\nexport type TimeValue = { hours: number; minutes: number };\n\nexport interface AnalogClockProps {\n value: TimeValue;\n onChange: (next: TimeValue) => void;\n hourCycle?: 12 | 24;\n minuteStep?: number;\n /** SVG size in px. Default 220. */\n size?: number;\n}\n\ntype Mode = 'hours' | 'minutes';\n\nfunction angleFromCenter(cx: number, cy: number, px: number, py: number): number {\n const dx = px - cx;\n const dy = py - cy;\n const a = Math.atan2(dy, dx) * (180 / Math.PI) + 90;\n return (a + 360) % 360;\n}\n\nexport function AnalogClock({\n value,\n onChange,\n hourCycle = 24,\n minuteStep = 1,\n size = 220,\n}: AnalogClockProps) {\n const ref = useRef<SVGSVGElement>(null);\n const [mode, setMode] = useState<Mode>('hours');\n const [dragging, setDragging] = useState(false);\n\n const updateFromPointer = useCallback(\n (clientX: number, clientY: number, currentMode: Mode) => {\n const svg = ref.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const a = angleFromCenter(cx, cy, clientX, clientY);\n\n if (currentMode === 'hours') {\n // hours12 is the position on the face (0..11, where 0 = the \"12\" position).\n // Combine with the current AM/PM half so the underlying 24h value preserves\n // whichever half the user is editing.\n const hours12 = Math.round(a / 30) % 12;\n const isAm = value.hours < 12;\n const h24 = isAm ? hours12 : hours12 + 12;\n onChange({ ...value, hours: h24 });\n } else {\n let m = Math.round(a / 6) % 60;\n if (minuteStep > 1) m = Math.round(m / minuteStep) * minuteStep;\n if (m === 60) m = 0;\n onChange({ ...value, minutes: m });\n }\n },\n [minuteStep, onChange, value],\n );\n\n const togglePeriod = () => {\n const next = value.hours < 12 ? value.hours + 12 : value.hours - 12;\n onChange({ ...value, hours: next });\n };\n\n const isAm = value.hours < 12;\n\n useEffect(() => {\n if (!dragging) return;\n const onMove = (e: PointerEvent) => updateFromPointer(e.clientX, e.clientY, mode);\n const onUp = () => setDragging(false);\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n };\n }, [dragging, mode, updateFromPointer]);\n\n const handlePointerDown = (e: ReactPointerEvent<SVGSVGElement>) => {\n e.preventDefault();\n setDragging(true);\n updateFromPointer(e.clientX, e.clientY, mode);\n };\n\n // visible hour value\n const hours12 =\n hourCycle === 12\n ? value.hours === 0\n ? 12\n : value.hours > 12\n ? value.hours - 12\n : value.hours\n : value.hours % 12 === 0\n ? 12\n : value.hours % 12;\n\n const hourAngle = ((hours12 % 12) + value.minutes / 60) * 30 - 90;\n const minuteAngle = (value.minutes / 60) * 360 - 90;\n\n const r = size / 2;\n const cx = r;\n const cy = r;\n\n // hand lengths\n const hourLen = r * 0.45;\n const minuteLen = r * 0.7;\n const tickOuter = r * 0.92;\n const tickInner = r * 0.86;\n const majorInner = r * 0.82;\n\n const handX = (len: number, deg: number) => cx + len * Math.cos((deg * Math.PI) / 180);\n const handY = (len: number, deg: number) => cy + len * Math.sin((deg * Math.PI) / 180);\n\n return (\n <div className=\"royui-tp-analog\">\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n onPointerDown={handlePointerDown}\n className=\"royui-tp-analog__face\"\n role=\"application\"\n aria-label=\"Analog clock\"\n >\n <circle\n cx={cx}\n cy={cy}\n r={r - 1}\n className=\"royui-tp-analog__bezel\"\n />\n\n {/* minute ticks */}\n {Array.from({ length: 60 }).map((_, i) => {\n const angle = (i * 6 - 90) * (Math.PI / 180);\n const isMajor = i % 5 === 0;\n const inner = isMajor ? majorInner : tickInner;\n return (\n <line\n key={i}\n x1={cx + inner * Math.cos(angle)}\n y1={cy + inner * Math.sin(angle)}\n x2={cx + tickOuter * Math.cos(angle)}\n y2={cy + tickOuter * Math.sin(angle)}\n className={isMajor ? 'royui-tp-analog__tick--major' : 'royui-tp-analog__tick'}\n />\n );\n })}\n\n {/* hour numbers at 12, 3, 6, 9 */}\n {[12, 3, 6, 9].map((n) => {\n const idx = n % 12;\n const angle = (idx * 30 - 90) * (Math.PI / 180);\n const rr = r * 0.72;\n return (\n <text\n key={n}\n x={cx + rr * Math.cos(angle)}\n y={cy + rr * Math.sin(angle)}\n dy=\"0.34em\"\n textAnchor=\"middle\"\n className=\"royui-tp-analog__numeral\"\n >\n {n}\n </text>\n );\n })}\n\n {/* hour hand */}\n <line\n x1={cx}\n y1={cy}\n x2={handX(hourLen, hourAngle)}\n y2={handY(hourLen, hourAngle)}\n className={`royui-tp-analog__hand royui-tp-analog__hand--hour ${\n mode === 'hours' ? 'royui-tp-analog__hand--active' : ''\n }`}\n onPointerDown={(e) => {\n e.stopPropagation();\n setMode('hours');\n setDragging(true);\n }}\n />\n\n {/* minute hand */}\n <line\n x1={cx}\n y1={cy}\n x2={handX(minuteLen, minuteAngle)}\n y2={handY(minuteLen, minuteAngle)}\n className={`royui-tp-analog__hand royui-tp-analog__hand--minute ${\n mode === 'minutes' ? 'royui-tp-analog__hand--active' : ''\n }`}\n onPointerDown={(e) => {\n e.stopPropagation();\n setMode('minutes');\n setDragging(true);\n }}\n />\n\n <circle cx={cx} cy={cy} r={3.5} className=\"royui-tp-analog__pin\" />\n </svg>\n\n <div className=\"royui-tp-analog__modes\">\n <button\n type=\"button\"\n className={[\n 'royui-tp-analog__mode',\n mode === 'hours' && 'royui-tp-analog__mode--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setMode('hours')}\n >\n Hours\n </button>\n <button\n type=\"button\"\n className={[\n 'royui-tp-analog__mode',\n mode === 'minutes' && 'royui-tp-analog__mode--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setMode('minutes')}\n >\n Minutes\n </button>\n <div className=\"royui-tp-analog__period\" role=\"group\" aria-label=\"Day half\">\n <button\n type=\"button\"\n className={[\n 'royui-tp-analog__period-btn',\n isAm && 'royui-tp-analog__period-btn--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => {\n if (!isAm) togglePeriod();\n }}\n aria-pressed={isAm}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={[\n 'royui-tp-analog__period-btn',\n !isAm && 'royui-tp-analog__period-btn--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => {\n if (isAm) togglePeriod();\n }}\n aria-pressed={!isAm}\n >\n PM\n </button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useRef, type KeyboardEvent, type WheelEvent } from 'react';\nimport type { TimeValue } from './AnalogClock';\n\nexport interface DigitalClockProps {\n value: TimeValue;\n onChange: (next: TimeValue) => void;\n hourCycle?: 12 | 24;\n minuteStep?: number;\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction wrap(n: number, max: number): number {\n return ((n % max) + max) % max;\n}\n\nexport function DigitalClock({\n value,\n onChange,\n hourCycle = 24,\n minuteStep = 1,\n}: DigitalClockProps) {\n const hourBoundary = hourCycle === 12 ? 12 : 24;\n\n const displayHour =\n hourCycle === 12\n ? value.hours % 12 === 0\n ? 12\n : value.hours % 12\n : value.hours;\n\n const isAm = value.hours < 12;\n\n const setDisplayHour = (next: number) => {\n if (hourCycle === 24) {\n onChange({ ...value, hours: wrap(next, 24) });\n return;\n }\n let h = next;\n if (h <= 0) h = 12;\n if (h > 12) h = 1;\n const h24 = isAm ? (h === 12 ? 0 : h) : h === 12 ? 12 : h + 12;\n onChange({ ...value, hours: h24 });\n };\n\n const setMinutes = (next: number) => {\n const stepped = Math.round(next / minuteStep) * minuteStep;\n onChange({ ...value, minutes: wrap(stepped, 60) });\n };\n\n const setAm = () => {\n if (isAm) return;\n onChange({ ...value, hours: value.hours - 12 });\n };\n const setPm = () => {\n if (!isAm) return;\n onChange({ ...value, hours: value.hours + 12 });\n };\n\n return (\n <div className=\"royui-tp-digital\">\n <div className=\"royui-tp-digital__row\">\n <Segment\n label=\"Hours\"\n value={pad(displayHour)}\n onWheelStep={(d) => setDisplayHour(displayHour + d)}\n onArrow={(d) => setDisplayHour(displayHour + d)}\n max={hourBoundary}\n />\n <span className=\"royui-tp-digital__sep\" aria-hidden>\n :\n </span>\n <Segment\n label=\"Minutes\"\n value={pad(value.minutes)}\n onWheelStep={(d) => setMinutes(value.minutes + d * minuteStep)}\n onArrow={(d) => setMinutes(value.minutes + d * minuteStep)}\n max={60}\n />\n </div>\n <div className=\"royui-tp-digital__period\" role=\"group\" aria-label=\"Day half\">\n <button\n type=\"button\"\n className={[\n 'royui-tp-digital__period-btn',\n isAm && 'royui-tp-digital__period-btn--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={setAm}\n aria-pressed={isAm}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={[\n 'royui-tp-digital__period-btn',\n !isAm && 'royui-tp-digital__period-btn--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={setPm}\n aria-pressed={!isAm}\n >\n PM\n </button>\n </div>\n <div className=\"royui-tp-digital__hint\">\n Scroll or use arrow keys\n </div>\n </div>\n );\n}\n\nfunction Segment({\n label,\n value,\n onWheelStep,\n onArrow,\n max,\n}: {\n label: string;\n value: string;\n onWheelStep: (delta: 1 | -1) => void;\n onArrow: (delta: 1 | -1) => void;\n max: number;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n\n const handleWheel = (e: WheelEvent<HTMLDivElement>) => {\n e.preventDefault();\n onWheelStep(e.deltaY > 0 ? 1 : -1);\n };\n\n const handleKey = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowRight') {\n e.preventDefault();\n onArrow(1);\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowLeft') {\n e.preventDefault();\n onArrow(-1);\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"spinbutton\"\n tabIndex={0}\n aria-label={label}\n aria-valuetext={value}\n aria-valuemax={max}\n className=\"royui-tp-digital__seg\"\n onWheel={handleWheel}\n onKeyDown={handleKey}\n >\n {value}\n </div>\n );\n}\n","'use client';\n\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { AnalogClock, type TimeValue } from './AnalogClock';\nimport { DigitalClock } from './DigitalClock';\nimport type { TimePickerVariant } from './TimePicker';\n\nexport interface ClockSwitchProps {\n mode: TimePickerVariant;\n value: TimeValue;\n onChange: (next: TimeValue) => void;\n hourCycle?: 12 | 24;\n minuteStep?: number;\n}\n\n/**\n * Cross-fades the analog and digital faces and morphs the panel height between\n * them so switching modes feels continuous rather than a hard swap. Both faces\n * stay mounted: the active one drives layout (position: relative), the other\n * sits absolutely on top and fades out. The container height tracks whichever\n * face is active, animated via CSS.\n */\nexport function ClockSwitch({\n mode,\n value,\n onChange,\n hourCycle,\n minuteStep,\n}: ClockSwitchProps) {\n const analogRef = useRef<HTMLDivElement>(null);\n const digitalRef = useRef<HTMLDivElement>(null);\n const [heights, setHeights] = useState<{ analog?: number; digital?: number }>(\n {},\n );\n\n // Measure both faces' natural heights so the container can animate between\n // them. The inactive face is absolutely positioned without a bottom anchor,\n // so offsetHeight stays its intrinsic content height.\n useLayoutEffect(() => {\n const a = analogRef.current;\n const d = digitalRef.current;\n const measure = () =>\n setHeights({ analog: a?.offsetHeight, digital: d?.offsetHeight });\n measure();\n const ro = new ResizeObserver(measure);\n if (a) ro.observe(a);\n if (d) ro.observe(d);\n return () => ro.disconnect();\n }, []);\n\n const analogActive = mode === 'analog';\n\n // Pull the inactive face out of the focus order and a11y tree.\n useLayoutEffect(() => {\n if (analogRef.current) analogRef.current.inert = !analogActive;\n if (digitalRef.current) digitalRef.current.inert = analogActive;\n }, [analogActive]);\n\n const height = analogActive ? heights.analog : heights.digital;\n\n return (\n <div\n className=\"royui-tp__switch\"\n style={height != null ? { height } : undefined}\n >\n <div\n ref={analogRef}\n className={[\n 'royui-tp__layer',\n analogActive && 'royui-tp__layer--active',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <AnalogClock\n value={value}\n onChange={onChange}\n hourCycle={hourCycle}\n minuteStep={minuteStep}\n />\n </div>\n <div\n ref={digitalRef}\n className={[\n 'royui-tp__layer',\n !analogActive && 'royui-tp__layer--active',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <DigitalClock\n value={value}\n onChange={onChange}\n hourCycle={hourCycle}\n minuteStep={minuteStep}\n />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { type TimeValue } from './AnalogClock';\nimport { ClockSwitch } from './ClockSwitch';\nimport './TimePicker.css';\n\nexport type TimePickerVariant = 'analog' | 'digital';\n\nexport interface TimePickerProps {\n value?: TimeValue | null;\n defaultValue?: TimeValue | null;\n onChange?: (next: TimeValue) => void;\n /** Picker style. Default 'analog'. */\n variant?: TimePickerVariant;\n /** Allow the user to switch between variants. Default true. */\n switchable?: boolean;\n hourCycle?: 12 | 24;\n minuteStep?: number;\n placeholder?: string;\n align?: 'left' | 'right';\n className?: string;\n style?: CSSProperties;\n triggerLabel?: ReactNode;\n disabled?: boolean;\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nexport function formatTime(t: TimeValue | null | undefined, hourCycle: 12 | 24 = 24): string {\n if (!t) return '';\n if (hourCycle === 24) return `${pad(t.hours)}:${pad(t.minutes)}`;\n const h = t.hours % 12 === 0 ? 12 : t.hours % 12;\n const ampm = t.hours < 12 ? 'AM' : 'PM';\n return `${pad(h)}:${pad(t.minutes)} ${ampm}`;\n}\n\nexport function TimePicker({\n value,\n defaultValue,\n onChange,\n variant = 'analog',\n switchable = true,\n hourCycle = 24,\n minuteStep = 1,\n placeholder = 'Pick a time',\n align = 'left',\n className = '',\n style,\n triggerLabel,\n disabled,\n}: TimePickerProps) {\n const controlled = value !== undefined;\n const [internal, setInternal] = useState<TimeValue | null>(defaultValue ?? null);\n const current = controlled ? value : internal;\n\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<TimePickerVariant>(variant);\n const [draft, setDraft] = useState<TimeValue>(current ?? { hours: 12, minutes: 0 });\n\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onDown(e: MouseEvent) {\n if (wrap.current && !wrap.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDown);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDown);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) setDraft(current ?? { hours: new Date().getHours(), minutes: 0 });\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n setMode(variant);\n }, [variant]);\n\n const commit = (next: TimeValue) => {\n if (!controlled) setInternal(next);\n onChange?.(next);\n };\n\n const setNow = () => {\n const now = new Date();\n setDraft({ hours: now.getHours(), minutes: now.getMinutes() });\n };\n\n const apply = () => {\n commit(draft);\n setOpen(false);\n };\n\n return (\n <div\n ref={wrap}\n className={['royui-tp', className].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n type=\"button\"\n className=\"royui-tp__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className=\"royui-tp__trigger-dot\" aria-hidden />\n <span className=\"royui-tp__trigger-label\">\n {triggerLabel ?? (formatTime(current ?? null, hourCycle) || placeholder)}\n </span>\n </button>\n\n {open && (\n <div\n className={`royui-tp__panel royui-tp__panel--${align}`}\n role=\"dialog\"\n aria-label=\"Choose time\"\n >\n <div className=\"royui-tp__head\">\n <div className=\"royui-tp__readout\">\n {formatTime(draft, hourCycle)}\n </div>\n {switchable && (\n <div\n className=\"royui-tp__variants\"\n role=\"tablist\"\n data-active={mode}\n >\n <span className=\"royui-tp__variant-thumb\" aria-hidden />\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === 'analog'}\n className={[\n 'royui-tp__variant',\n mode === 'analog' && 'royui-tp__variant--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setMode('analog')}\n >\n Analog\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === 'digital'}\n className={[\n 'royui-tp__variant',\n mode === 'digital' && 'royui-tp__variant--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setMode('digital')}\n >\n Digital\n </button>\n </div>\n )}\n </div>\n\n <div className=\"royui-tp__body\">\n <ClockSwitch\n mode={mode}\n value={draft}\n onChange={setDraft}\n hourCycle={hourCycle}\n minuteStep={minuteStep}\n />\n </div>\n\n <div className=\"royui-tp__foot\">\n <button type=\"button\" className=\"royui-tp__ghost\" onClick={setNow}>\n Now\n </button>\n <button type=\"button\" className=\"royui-tp__primary\" onClick={apply}>\n Apply\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport type { TimeValue };\n","'use client';\n\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { type TimeValue } from './AnalogClock';\nimport { ClockSwitch } from './ClockSwitch';\nimport { formatTime, type TimePickerVariant } from './TimePicker';\nimport './TimePicker.css';\n\nexport type TimeRangeValue = { from: TimeValue | null; to: TimeValue | null };\n\nexport interface TimeRangePickerProps {\n value?: TimeRangeValue | null;\n defaultValue?: TimeRangeValue | null;\n onChange?: (next: TimeRangeValue) => void;\n /** Picker style. Default 'analog'. */\n variant?: TimePickerVariant;\n /** Allow the user to switch between variants. Default true. */\n switchable?: boolean;\n hourCycle?: 12 | 24;\n minuteStep?: number;\n placeholder?: string;\n align?: 'left' | 'right';\n className?: string;\n style?: CSSProperties;\n triggerLabel?: ReactNode;\n disabled?: boolean;\n}\n\ntype Leg = 'from' | 'to';\n\nconst EMPTY: TimeRangeValue = { from: null, to: null };\n\nexport function formatTimeRange(\n range: TimeRangeValue | null | undefined,\n hourCycle: 12 | 24 = 24,\n): string {\n if (!range || (!range.from && !range.to)) return '';\n if (range.from && !range.to) return formatTime(range.from, hourCycle);\n if (!range.from && range.to) return formatTime(range.to, hourCycle);\n return `${formatTime(range.from, hourCycle)} – ${formatTime(range.to, hourCycle)}`;\n}\n\nexport function TimeRangePicker({\n value,\n defaultValue,\n onChange,\n variant = 'analog',\n switchable = true,\n hourCycle = 24,\n minuteStep = 1,\n placeholder = 'Time range',\n align = 'left',\n className = '',\n style,\n triggerLabel,\n disabled,\n}: TimeRangePickerProps) {\n const controlled = value !== undefined;\n const [internal, setInternal] = useState<TimeRangeValue>(\n defaultValue ?? EMPTY,\n );\n const current = controlled ? value ?? EMPTY : internal;\n\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<TimePickerVariant>(variant);\n const [leg, setLeg] = useState<Leg>('from');\n const [draftFrom, setDraftFrom] = useState<TimeValue>(\n current.from ?? { hours: 9, minutes: 0 },\n );\n const [draftTo, setDraftTo] = useState<TimeValue>(\n current.to ?? { hours: 17, minutes: 0 },\n );\n\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onDown(e: MouseEvent) {\n if (wrap.current && !wrap.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDown);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDown);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // Seed both drafts from the committed value each time the panel opens.\n useEffect(() => {\n if (!open) return;\n const now = new Date();\n setLeg('from');\n setDraftFrom(current.from ?? { hours: now.getHours(), minutes: 0 });\n setDraftTo(\n current.to ?? { hours: (now.getHours() + 1) % 24, minutes: 0 },\n );\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n setMode(variant);\n }, [variant]);\n\n const commit = (next: TimeRangeValue) => {\n if (!controlled) setInternal(next);\n onChange?.(next);\n };\n\n const draft = leg === 'from' ? draftFrom : draftTo;\n const setDraft = leg === 'from' ? setDraftFrom : setDraftTo;\n\n const apply = () => {\n commit({ from: draftFrom, to: draftTo });\n setOpen(false);\n };\n\n const clear = () => {\n commit(EMPTY);\n setOpen(false);\n };\n\n return (\n <div\n ref={wrap}\n className={['royui-tp', 'royui-trp', className].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n type=\"button\"\n className=\"royui-tp__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className=\"royui-tp__trigger-dot\" aria-hidden />\n <span className=\"royui-tp__trigger-label\">\n {triggerLabel ??\n (formatTimeRange(current, hourCycle) || placeholder)}\n </span>\n </button>\n\n {open && (\n <div\n className={`royui-tp__panel royui-tp__panel--${align}`}\n role=\"dialog\"\n aria-label=\"Choose time range\"\n >\n <div className=\"royui-tp__head\">\n <div className=\"royui-tp__readout\">{formatTime(draft, hourCycle)}</div>\n {switchable && (\n <div\n className=\"royui-tp__variants\"\n role=\"tablist\"\n data-active={mode}\n >\n <span className=\"royui-tp__variant-thumb\" aria-hidden />\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === 'analog'}\n className={[\n 'royui-tp__variant',\n mode === 'analog' && 'royui-tp__variant--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setMode('analog')}\n >\n Analog\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === 'digital'}\n className={[\n 'royui-tp__variant',\n mode === 'digital' && 'royui-tp__variant--on',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setMode('digital')}\n >\n Digital\n </button>\n </div>\n )}\n </div>\n\n <div className=\"royui-trp__legs\" role=\"tablist\" data-active={leg}>\n <span className=\"royui-trp__leg-thumb\" aria-hidden />\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={leg === 'from'}\n className=\"royui-trp__leg\"\n onClick={() => setLeg('from')}\n >\n <span className=\"royui-trp__leg-label\">Start</span>\n <span className=\"royui-trp__leg-time\">\n {formatTime(draftFrom, hourCycle)}\n </span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={leg === 'to'}\n className=\"royui-trp__leg\"\n onClick={() => setLeg('to')}\n >\n <span className=\"royui-trp__leg-label\">End</span>\n <span className=\"royui-trp__leg-time\">\n {formatTime(draftTo, hourCycle)}\n </span>\n </button>\n </div>\n\n <div className=\"royui-tp__body\">\n <ClockSwitch\n mode={mode}\n value={draft}\n onChange={setDraft}\n hourCycle={hourCycle}\n minuteStep={minuteStep}\n />\n </div>\n\n <div className=\"royui-tp__foot\">\n <button type=\"button\" className=\"royui-tp__ghost\" onClick={clear}>\n Clear\n </button>\n <button type=\"button\" className=\"royui-tp__primary\" onClick={apply}>\n Apply\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { F as FontSpec, a as TableDensity } from '../../Table-qVdGZkB4.js';
|
|
4
4
|
import { D as DateRange } from '../../dateUtils-B_m_EICl.js';
|
|
5
|
-
import { c as TimePickerVariant,
|
|
5
|
+
import { c as TimePickerVariant, f as TimeRangeValue } from '../../TimeRangePicker-CgkOBnk6.js';
|
|
6
6
|
|
|
7
7
|
type ColumnType = 'text' | 'number' | 'date' | 'time';
|
|
8
8
|
type Column<T> = {
|
|
@@ -81,14 +81,13 @@ interface DataTableProps<T> {
|
|
|
81
81
|
monthsVisible?: number;
|
|
82
82
|
placeholder?: string;
|
|
83
83
|
};
|
|
84
|
-
/** Toolbar — time filter against one column. */
|
|
84
|
+
/** Toolbar — time-of-day range filter against one column. */
|
|
85
85
|
timeFilter?: {
|
|
86
86
|
column: string;
|
|
87
87
|
variant?: TimePickerVariant;
|
|
88
88
|
hourCycle?: 12 | 24;
|
|
89
|
+
minuteStep?: number;
|
|
89
90
|
placeholder?: string;
|
|
90
|
-
/** Tolerance in minutes around the chosen time. Default 0 (exact). */
|
|
91
|
-
toleranceMinutes?: number;
|
|
92
91
|
};
|
|
93
92
|
/** Pagination. Pass `false` to disable. */
|
|
94
93
|
pagination?: {
|
|
@@ -123,7 +122,7 @@ type TableLayout = {
|
|
|
123
122
|
interface FilterState {
|
|
124
123
|
search: string;
|
|
125
124
|
dateRange: DateRange;
|
|
126
|
-
|
|
125
|
+
timeRange: TimeRangeValue;
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
declare function DataTable<T>({ data, columns, getRowId, visibleRows, rowHeight, stickyHeader, density, loading, empty, fitColumns, search, dateFilter, timeFilter, pagination, reorderable, resizable, columnMenu, dataIO, headerFont, rowHeaderFont, cellFont, storageKey, className, toolbarExtras, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { ColumnMenu, DataTable, downloadString, fromCsv, fromJson, toCsv, toJson } from '../../chunk-
|
|
2
|
+
export { ColumnMenu, DataTable, downloadString, fromCsv, fromJson, toCsv, toJson } from '../../chunk-PDUQROG2.js';
|
|
3
3
|
import '../../chunk-XERZVDIT.js';
|
|
4
4
|
import '../../chunk-KSHKVSNK.js';
|
|
5
|
-
import '../../chunk-
|
|
5
|
+
import '../../chunk-QOSMU4DV.js';
|
|
6
6
|
import '../../chunk-SFENGB5N.js';
|
|
7
7
|
import '../../chunk-5CIBIH7R.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,8 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { A as AnalogClock, a as AnalogClockProps, T as TimePicker, b as TimePickerProps,
|
|
1
|
+
import { c as TimePickerVariant, g as TimeValue } from '../../TimeRangePicker-CgkOBnk6.js';
|
|
2
|
+
export { A as AnalogClock, a as AnalogClockProps, T as TimePicker, b as TimePickerProps, d as TimeRangePicker, e as TimeRangePickerProps, f as TimeRangeValue, h as formatTime, i as formatTimeRange } from '../../TimeRangePicker-CgkOBnk6.js';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import 'react';
|
|
5
5
|
|
|
6
|
+
interface ClockSwitchProps {
|
|
7
|
+
mode: TimePickerVariant;
|
|
8
|
+
value: TimeValue;
|
|
9
|
+
onChange: (next: TimeValue) => void;
|
|
10
|
+
hourCycle?: 12 | 24;
|
|
11
|
+
minuteStep?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Cross-fades the analog and digital faces and morphs the panel height between
|
|
15
|
+
* them so switching modes feels continuous rather than a hard swap. Both faces
|
|
16
|
+
* stay mounted: the active one drives layout (position: relative), the other
|
|
17
|
+
* sits absolutely on top and fades out. The container height tracks whichever
|
|
18
|
+
* face is active, animated via CSS.
|
|
19
|
+
*/
|
|
20
|
+
declare function ClockSwitch({ mode, value, onChange, hourCycle, minuteStep, }: ClockSwitchProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
|
|
6
22
|
interface DigitalClockProps {
|
|
7
23
|
value: TimeValue;
|
|
8
24
|
onChange: (next: TimeValue) => void;
|
|
@@ -11,4 +27,4 @@ interface DigitalClockProps {
|
|
|
11
27
|
}
|
|
12
28
|
declare function DigitalClock({ value, onChange, hourCycle, minuteStep, }: DigitalClockProps): react_jsx_runtime.JSX.Element;
|
|
13
29
|
|
|
14
|
-
export { DigitalClock, type DigitalClockProps, TimeValue };
|
|
30
|
+
export { ClockSwitch, type ClockSwitchProps, DigitalClock, type DigitalClockProps, TimePickerVariant, TimeValue };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { AnalogClock, DigitalClock, TimePicker, formatTime } from '../../chunk-
|
|
2
|
+
export { AnalogClock, ClockSwitch, DigitalClock, TimePicker, TimeRangePicker, formatTime, formatTimeRange } from '../../chunk-QOSMU4DV.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -10,8 +10,8 @@ export { TableSearch, TableSearchProps } from './components/table-search/index.j
|
|
|
10
10
|
export { Pagination, PaginationProps } from './components/pagination/index.js';
|
|
11
11
|
export { DEFAULT_PRESETS, DatePreset, DateRangePicker, DateRangePickerProps } from './components/date-range-picker/index.js';
|
|
12
12
|
export { D as DateRange, a as addDays, b as addMonths, f as formatMonthYear, c as formatRange, d as formatShort, i as isBetween, e as isSameDay, s as startOfDay } from './dateUtils-B_m_EICl.js';
|
|
13
|
-
export { A as AnalogClock, a as AnalogClockProps, T as TimePicker, b as TimePickerProps, c as TimePickerVariant, d as
|
|
14
|
-
export { DigitalClock, DigitalClockProps } from './components/time-picker/index.js';
|
|
13
|
+
export { A as AnalogClock, a as AnalogClockProps, T as TimePicker, b as TimePickerProps, c as TimePickerVariant, d as TimeRangePicker, e as TimeRangePickerProps, f as TimeRangeValue, g as TimeValue, h as formatTime, i as formatTimeRange } from './TimeRangePicker-CgkOBnk6.js';
|
|
14
|
+
export { ClockSwitch, ClockSwitchProps, DigitalClock, DigitalClockProps } from './components/time-picker/index.js';
|
|
15
15
|
export { Column, ColumnMenu, ColumnType, DataIO, DataTable, DataTableProps, FilterState, SortDir, TableLayout, downloadString, fromCsv, fromJson, toCsv, toJson } from './components/data-table/index.js';
|
|
16
16
|
import 'react';
|
|
17
17
|
import 'react/jsx-runtime';
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
export { TextMorph } from './chunk-PGV55XSZ.js';
|
|
3
3
|
export { TreeNav, TreeNavItem } from './chunk-M6HB6BMA.js';
|
|
4
4
|
export { Button } from './chunk-4SGMAZBG.js';
|
|
5
|
-
export { ColumnMenu, DataTable, downloadString, fromCsv, fromJson, toCsv, toJson } from './chunk-
|
|
5
|
+
export { ColumnMenu, DataTable, downloadString, fromCsv, fromJson, toCsv, toJson } from './chunk-PDUQROG2.js';
|
|
6
6
|
export { Spinner, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './chunk-XERZVDIT.js';
|
|
7
7
|
export { TableSearch } from './chunk-KSHKVSNK.js';
|
|
8
|
-
export { AnalogClock, DigitalClock, TimePicker, formatTime } from './chunk-
|
|
8
|
+
export { AnalogClock, ClockSwitch, DigitalClock, TimePicker, TimeRangePicker, formatTime, formatTimeRange } from './chunk-QOSMU4DV.js';
|
|
9
9
|
export { DEFAULT_PRESETS, DateRangePicker, addDays, addMonths, formatMonthYear, formatRange, formatShort, isBetween, isSameDay, startOfDay } from './chunk-SFENGB5N.js';
|
|
10
10
|
export { GradientButton } from './chunk-RLBVY3DG.js';
|
|
11
11
|
export { MadeBy } from './chunk-MDPMEW4K.js';
|