@roy-ui/ui 0.0.8 → 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.
@@ -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-44EKHQEJ.css';
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("div", { className: "royui-tp__variants", role: "tablist", children: [
457
- /* @__PURE__ */ jsx(
458
- "button",
459
- {
460
- type: "button",
461
- role: "tab",
462
- "aria-selected": mode === "analog",
463
- className: [
464
- "royui-tp__variant",
465
- mode === "analog" && "royui-tp__variant--on"
466
- ].filter(Boolean).join(" "),
467
- onClick: () => setMode("analog"),
468
- children: "Analog"
469
- }
470
- ),
471
- /* @__PURE__ */ jsx(
472
- "button",
473
- {
474
- type: "button",
475
- role: "tab",
476
- "aria-selected": mode === "digital",
477
- className: [
478
- "royui-tp__variant",
479
- mode === "digital" && "royui-tp__variant--on"
480
- ].filter(Boolean).join(" "),
481
- onClick: () => setMode("digital"),
482
- children: "Digital"
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: mode === "analog" ? /* @__PURE__ */ jsx(
488
- AnalogClock,
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
- ) : /* @__PURE__ */ jsx(
496
- DigitalClock,
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: setNow, children: "Now" }),
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-75IGGPXL.js.map
518
- //# sourceMappingURL=chunk-75IGGPXL.js.map
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, d as TimeValue } from '../../TimePicker-BhRta4MK.js';
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
- time: TimeValue | null;
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-HUCK7AM7.js';
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-75IGGPXL.js';
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 { d as TimeValue } from '../../TimePicker-BhRta4MK.js';
2
- export { A as AnalogClock, a as AnalogClockProps, T as TimePicker, b as TimePickerProps, c as TimePickerVariant, f as formatTime } from '../../TimePicker-BhRta4MK.js';
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-75IGGPXL.js';
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 TimeValue, f as formatTime } from './TimePicker-BhRta4MK.js';
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-HUCK7AM7.js';
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-75IGGPXL.js';
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';