@roy-ui/ui 0.0.9 → 0.0.11

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"]}
@@ -0,0 +1,92 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, AnchorHTMLAttributes } from 'react';
3
+ import { ButtonProps } from '../button/index.js';
4
+
5
+ interface CarouselImage {
6
+ src: string;
7
+ alt?: string;
8
+ }
9
+ interface ImageCarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
10
+ /** Slides, in order. A single image renders without dots or drag. */
11
+ images: CarouselImage[];
12
+ /** Controlled active index. Leave undefined for uncontrolled. */
13
+ index?: number;
14
+ /** Starting index when uncontrolled. Default 0. */
15
+ defaultIndex?: number;
16
+ /** Fires with the new index on every change (drag, dot, or keyboard). */
17
+ onIndexChange?: (index: number) => void;
18
+ /** Show the pagination dots. Auto-hidden for a single image. Default true. */
19
+ showDots?: boolean;
20
+ /** Allow pointer drag / swipe between slides. Default true. */
21
+ draggable?: boolean;
22
+ /** Aspect ratio of the media box, e.g. "4 / 3" or "1 / 1". Default "4 / 3". */
23
+ ratio?: string;
24
+ /** Overlay slot painted on top of the image — a badge, a gradient, anything. */
25
+ overlay?: ReactNode;
26
+ /** Advance to the next slide on a timer, looping back to the first. Default false. */
27
+ autoplay?: boolean;
28
+ /** Milliseconds between auto-advances. Default 2500. */
29
+ autoplayInterval?: number;
30
+ /** Pause autoplay while the pointer is over the gallery. Default true. */
31
+ pauseOnHover?: boolean;
32
+ }
33
+ declare const ImageCarousel: react.ForwardRefExoticComponent<ImageCarouselProps & react.RefAttributes<HTMLDivElement>>;
34
+
35
+ interface CardStat {
36
+ /** Small leading glyph. Inherits the muted stat color via currentColor. */
37
+ icon?: ReactNode;
38
+ /** The figure, full-strength — e.g. "264 m²" or "4". */
39
+ value: ReactNode;
40
+ /** Dimmed descriptor after the figure — e.g. "Living" or "Bedrooms". */
41
+ label?: ReactNode;
42
+ }
43
+ interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'onChange'> {
44
+ /** Gallery shown at the top, with swipe + dot pagination. */
45
+ images: CarouselImage[];
46
+ /** Pill label over the image, e.g. "Prime Pick". Hidden when omitted. */
47
+ badge?: ReactNode;
48
+ /** Glyph inside the badge. Defaults to a gold star. */
49
+ badgeIcon?: ReactNode;
50
+ /** Headline figure, e.g. "$250,000". */
51
+ price: ReactNode;
52
+ /** Muted qualifier next to the price, e.g. "List price". */
53
+ priceLabel?: ReactNode;
54
+ /** Secondary line under the price — owner, address, etc. */
55
+ subtitle?: ReactNode;
56
+ /** Inline figures separated by hairline dividers, e.g. living area and rooms. */
57
+ stats?: CardStat[];
58
+ /** Footer attribution. Becomes a link when authorHref is set. */
59
+ author?: ReactNode;
60
+ /** Makes the author name a link. */
61
+ authorHref?: string;
62
+ /** Extra attributes for the author link — target, rel, onClick, etc. */
63
+ authorProps?: AnchorHTMLAttributes<HTMLAnchorElement>;
64
+ /** Right-aligned footer note, e.g. "2 days ago". */
65
+ meta?: ReactNode;
66
+ /** Label for the action button. Pass null to drop the button entirely. */
67
+ actionLabel?: ReactNode;
68
+ /** Click handler for the action button. */
69
+ onAction?: () => void;
70
+ /** Escape hatch onto the underlying Button (variant, color, loading, …). */
71
+ actionProps?: Partial<ButtonProps>;
72
+ /** Aspect ratio of the gallery. Default "4 / 3". */
73
+ ratio?: string;
74
+ /** Auto-advance the gallery on a timer, looping. Default false. */
75
+ autoplay?: boolean;
76
+ /** Milliseconds between auto-advances. Default 2500. */
77
+ autoplayInterval?: number;
78
+ /** Starting gallery index. */
79
+ defaultIndex?: number;
80
+ /** Fires when the gallery moves. */
81
+ onIndexChange?: (index: number) => void;
82
+ /** Lift + image-zoom on hover. Default true. */
83
+ hoverEffect?: boolean;
84
+ /**
85
+ * Colour scheme. "auto" (default) follows the system via prefers-color-scheme;
86
+ * "light" is a premium off-white surface, "dark" a near-black one.
87
+ */
88
+ theme?: 'light' | 'dark' | 'auto';
89
+ }
90
+ declare const Card: react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLDivElement>>;
91
+
92
+ export { Card, type CardProps, type CardStat, type CarouselImage, ImageCarousel, type ImageCarouselProps };
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ export { Card, ImageCarousel } from '../../chunk-B7QN2JTN.js';
3
+ import '../../chunk-4SGMAZBG.js';
4
+ //# sourceMappingURL=index.js.map
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}