@tensor_1/react 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -40,6 +40,10 @@ __export(src_exports, {
40
40
  EmptyState: () => EmptyState,
41
41
  ErrorState: () => ErrorState,
42
42
  Field: () => Field,
43
+ Inbox: () => Inbox,
44
+ InboxDetail: () => InboxDetail,
45
+ InboxItem: () => InboxItem,
46
+ InboxList: () => InboxList,
43
47
  Input: () => Input,
44
48
  InputGroup: () => InputGroup,
45
49
  Kanban: () => Kanban,
@@ -49,7 +53,9 @@ __export(src_exports, {
49
53
  List: () => List,
50
54
  ListItem: () => ListItem,
51
55
  LoadingState: () => LoadingState,
56
+ Meter: () => Meter,
52
57
  Modal: () => Modal,
58
+ NavFavourites: () => NavFavourites,
53
59
  NavGroup: () => NavGroup,
54
60
  NavItem: () => NavItem,
55
61
  Note: () => Note,
@@ -66,6 +72,7 @@ __export(src_exports, {
66
72
  SidebarSection: () => SidebarSection,
67
73
  Skeleton: () => Skeleton,
68
74
  Spinner: () => Spinner,
75
+ StarButton: () => StarButton,
69
76
  Stat: () => Stat,
70
77
  StatusPill: () => StatusPill,
71
78
  SubNavItem: () => SubNavItem,
@@ -541,22 +548,411 @@ function SubNavItem({ active, as: Tag = "a", children, className, ...props }) {
541
548
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("a", { className: cls, "aria-current": active ? "page" : void 0, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "uix-navitem__label", children }) });
542
549
  }
543
550
 
544
- // src/components/Alert.tsx
551
+ // src/components/StarButton.tsx
545
552
  var import_jsx_runtime20 = require("react/jsx-runtime");
553
+ var StarGlyph = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
554
+ "svg",
555
+ {
556
+ viewBox: "0 0 24 24",
557
+ fill: "none",
558
+ stroke: "currentColor",
559
+ strokeWidth: 2,
560
+ strokeLinecap: "round",
561
+ strokeLinejoin: "round",
562
+ "aria-hidden": "true",
563
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("path", { d: "M11.5 2.7a.6.6 0 0 1 1 0l2.4 5 5.4.8a.6.6 0 0 1 .3 1l-3.9 3.8.9 5.4a.6.6 0 0 1-.8.6L12 17l-4.8 2.5a.6.6 0 0 1-.8-.6l.9-5.4L3.4 9.5a.6.6 0 0 1 .3-1l5.4-.8z" })
564
+ }
565
+ );
566
+ function StarButton({
567
+ pinned,
568
+ label,
569
+ addLabel = "Add {label} to favourites",
570
+ onToggle,
571
+ className
572
+ }) {
573
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
574
+ "button",
575
+ {
576
+ type: "button",
577
+ className: cx("uix-navitem__star", className),
578
+ "data-on": pinned || void 0,
579
+ "aria-pressed": pinned,
580
+ "aria-label": addLabel.replace("{label}", label),
581
+ onClick: (e) => {
582
+ e.preventDefault();
583
+ e.stopPropagation();
584
+ onToggle(!pinned);
585
+ },
586
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StarGlyph, {})
587
+ }
588
+ );
589
+ }
590
+
591
+ // src/components/NavFavourites.tsx
592
+ var import_react12 = require("react");
593
+ var import_jsx_runtime21 = require("react/jsx-runtime");
594
+ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
595
+ "svg",
596
+ {
597
+ width: "12",
598
+ height: "12",
599
+ viewBox: "0 0 24 24",
600
+ fill: "none",
601
+ stroke: "currentColor",
602
+ strokeWidth: 2,
603
+ strokeLinecap: "round",
604
+ strokeLinejoin: "round",
605
+ "aria-hidden": "true",
606
+ style: { flexShrink: 0 },
607
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("path", { d: "m6 9 6 6 6-6" })
608
+ }
609
+ );
610
+ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
611
+ "svg",
612
+ {
613
+ width: "12",
614
+ height: "12",
615
+ viewBox: "0 0 24 24",
616
+ fill: "none",
617
+ stroke: "currentColor",
618
+ strokeWidth: 2,
619
+ strokeLinecap: "round",
620
+ strokeLinejoin: "round",
621
+ "aria-hidden": "true",
622
+ style: { flexShrink: 0 },
623
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("path", { d: "m9 18 6-6-6-6" })
624
+ }
625
+ );
626
+ var MoreIcon = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
627
+ "svg",
628
+ {
629
+ width: "14",
630
+ height: "14",
631
+ viewBox: "0 0 24 24",
632
+ fill: "none",
633
+ stroke: "currentColor",
634
+ strokeWidth: 1.75,
635
+ strokeLinecap: "round",
636
+ strokeLinejoin: "round",
637
+ "aria-hidden": "true",
638
+ children: [
639
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("circle", { cx: "12", cy: "12", r: "1" }),
640
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("circle", { cx: "12", cy: "5", r: "1" }),
641
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("circle", { cx: "12", cy: "19", r: "1" })
642
+ ]
643
+ }
644
+ );
645
+ var MUTED = "color-mix(in srgb, var(--uix-text) 50%, transparent)";
646
+ function NavFavourites({
647
+ items,
648
+ collapsed = false,
649
+ onToggleCollapsed,
650
+ onRemove,
651
+ onReorder,
652
+ labels,
653
+ emptyReason,
654
+ className
655
+ }) {
656
+ const regionId = (0, import_react12.useId)();
657
+ const headerRef = (0, import_react12.useRef)(null);
658
+ const regionRef = (0, import_react12.useRef)(null);
659
+ const focusAfterRef = (0, import_react12.useRef)(null);
660
+ const triggerRefs = (0, import_react12.useRef)(/* @__PURE__ */ new Map());
661
+ const order = items.map((i) => i.id);
662
+ (0, import_react12.useEffect)(() => {
663
+ const id = focusAfterRef.current;
664
+ if (!id) return;
665
+ focusAfterRef.current = null;
666
+ const el = triggerRefs.current.get(id);
667
+ if (el) el.focus();
668
+ else headerRef.current?.focus();
669
+ }, [order.join("|")]);
670
+ const handleToggle = () => {
671
+ if (!collapsed) {
672
+ const active = document.activeElement;
673
+ if (active && regionRef.current?.contains(active) && active !== headerRef.current) {
674
+ headerRef.current?.focus();
675
+ }
676
+ }
677
+ onToggleCollapsed?.();
678
+ };
679
+ const move = (id, dir) => {
680
+ const idx = order.indexOf(id);
681
+ const next = idx + dir;
682
+ if (idx < 0 || next < 0 || next >= order.length) return;
683
+ const reordered = [...order];
684
+ const [it] = reordered.splice(idx, 1);
685
+ if (it === void 0) return;
686
+ reordered.splice(next, 0, it);
687
+ focusAfterRef.current = id;
688
+ onReorder(reordered);
689
+ };
690
+ const remove = (id) => {
691
+ const idx = order.indexOf(id);
692
+ const neighbour = order[idx + 1] ?? order[idx - 1] ?? null;
693
+ focusAfterRef.current = neighbour;
694
+ onRemove(id);
695
+ };
696
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: cx("uix-favourites", className), style: { marginBottom: "var(--uix-space-1)" }, children: [
697
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
698
+ "button",
699
+ {
700
+ ref: headerRef,
701
+ type: "button",
702
+ "aria-expanded": !collapsed,
703
+ "aria-controls": regionId,
704
+ onClick: handleToggle,
705
+ className: "uix-text-eyebrow",
706
+ style: {
707
+ display: "flex",
708
+ width: "100%",
709
+ alignItems: "center",
710
+ gap: "6px",
711
+ padding: "8px 4px 4px",
712
+ border: 0,
713
+ background: "transparent",
714
+ cursor: "pointer",
715
+ color: "inherit"
716
+ },
717
+ children: [
718
+ collapsed ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChevronRightIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChevronDownIcon, {}),
719
+ labels.heading
720
+ ]
721
+ }
722
+ ),
723
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
724
+ "ul",
725
+ {
726
+ ref: regionRef,
727
+ id: regionId,
728
+ hidden: collapsed,
729
+ style: {
730
+ display: "flex",
731
+ flexDirection: "column",
732
+ gap: "1px",
733
+ listStyle: "none",
734
+ margin: 0,
735
+ padding: 0
736
+ },
737
+ children: items.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
738
+ "li",
739
+ {
740
+ className: "uix-text-meta",
741
+ "data-empty-reason": emptyReason,
742
+ style: { padding: "6px 8px", color: MUTED },
743
+ children: labels.empty
744
+ }
745
+ ) : items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
746
+ FavouriteRow,
747
+ {
748
+ item,
749
+ isFirst: idx === 0,
750
+ isLast: idx === items.length - 1,
751
+ labels,
752
+ onMoveUp: () => move(item.id, -1),
753
+ onMoveDown: () => move(item.id, 1),
754
+ onRemove: () => remove(item.id),
755
+ registerTrigger: (el) => triggerRefs.current.set(item.id, el)
756
+ },
757
+ item.id
758
+ ))
759
+ }
760
+ )
761
+ ] });
762
+ }
763
+ function FavouriteRow({
764
+ item,
765
+ isFirst,
766
+ isLast,
767
+ labels,
768
+ onMoveUp,
769
+ onMoveDown,
770
+ onRemove,
771
+ registerTrigger
772
+ }) {
773
+ const [open, setOpen] = (0, import_react12.useState)(false);
774
+ const [revealed, setRevealed] = (0, import_react12.useState)(false);
775
+ const menuId = (0, import_react12.useId)();
776
+ const triggerRef = (0, import_react12.useRef)(null);
777
+ const itemRefs = (0, import_react12.useRef)([]);
778
+ const optionsTemplate = labels.options ?? "{label} favourite options";
779
+ const actions = [
780
+ ...isFirst ? [] : [{ label: labels.moveUp, onSelect: onMoveUp }],
781
+ ...isLast ? [] : [{ label: labels.moveDown, onSelect: onMoveDown }],
782
+ { label: labels.remove.replace("{label}", item.label), onSelect: onRemove }
783
+ ];
784
+ (0, import_react12.useEffect)(() => {
785
+ if (open) itemRefs.current[0]?.focus();
786
+ }, [open]);
787
+ const closeAndReturnFocus = () => {
788
+ setOpen(false);
789
+ triggerRef.current?.focus();
790
+ };
791
+ const onMenuKeyDown = (e) => {
792
+ const menuItems = itemRefs.current.filter((x) => x !== null);
793
+ const currentIdx = menuItems.findIndex((el) => el === document.activeElement);
794
+ if (e.key === "ArrowDown") {
795
+ e.preventDefault();
796
+ menuItems[(currentIdx + 1) % menuItems.length]?.focus();
797
+ } else if (e.key === "ArrowUp") {
798
+ e.preventDefault();
799
+ menuItems[(currentIdx - 1 + menuItems.length) % menuItems.length]?.focus();
800
+ } else if (e.key === "Escape") {
801
+ e.preventDefault();
802
+ closeAndReturnFocus();
803
+ } else if (e.key === "Tab") {
804
+ setOpen(false);
805
+ }
806
+ };
807
+ const onRowKeyDown = (e) => {
808
+ if (!e.altKey) return;
809
+ if (e.key === "ArrowUp" && !isFirst) {
810
+ e.preventDefault();
811
+ onMoveUp();
812
+ } else if (e.key === "ArrowDown" && !isLast) {
813
+ e.preventDefault();
814
+ onMoveDown();
815
+ }
816
+ };
817
+ const triggerVisible = revealed || open;
818
+ return (
819
+ // biome-ignore lint/a11y/noStaticElementInteractions: keyboard accelerators on the row; the focusable controls inside carry their own semantics.
820
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
821
+ "li",
822
+ {
823
+ style: { position: "relative", display: "flex", alignItems: "center" },
824
+ onKeyDown: onRowKeyDown,
825
+ onMouseEnter: () => setRevealed(true),
826
+ onMouseLeave: () => setRevealed(false),
827
+ onFocus: () => setRevealed(true),
828
+ onBlur: (e) => {
829
+ if (!e.currentTarget.contains(e.relatedTarget)) setRevealed(false);
830
+ },
831
+ children: [
832
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { style: { minWidth: 0, flex: 1 }, children: item.link }),
833
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
834
+ "button",
835
+ {
836
+ ref: (el) => {
837
+ triggerRef.current = el;
838
+ registerTrigger(el);
839
+ },
840
+ type: "button",
841
+ "aria-haspopup": "menu",
842
+ "aria-expanded": open,
843
+ "aria-controls": open ? menuId : void 0,
844
+ "aria-label": optionsTemplate.replace("{label}", item.label),
845
+ onClick: () => setOpen((v) => !v),
846
+ style: {
847
+ marginLeft: "auto",
848
+ display: "inline-flex",
849
+ height: "20px",
850
+ width: "20px",
851
+ flexShrink: 0,
852
+ alignItems: "center",
853
+ justifyContent: "center",
854
+ border: 0,
855
+ borderRadius: "2px",
856
+ background: "transparent",
857
+ cursor: "pointer",
858
+ color: MUTED,
859
+ opacity: triggerVisible ? 1 : 0,
860
+ transition: "opacity var(--uix-dur-fast) var(--uix-ease-out)"
861
+ },
862
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(MoreIcon, {})
863
+ }
864
+ ),
865
+ open ? /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
866
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
867
+ "div",
868
+ {
869
+ "aria-hidden": "true",
870
+ role: "presentation",
871
+ onClick: () => setOpen(false),
872
+ style: { position: "fixed", inset: 0, cursor: "default", background: "transparent", zIndex: 40 }
873
+ }
874
+ ),
875
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
876
+ "ul",
877
+ {
878
+ id: menuId,
879
+ role: "menu",
880
+ onKeyDown: onMenuKeyDown,
881
+ style: {
882
+ position: "absolute",
883
+ right: 0,
884
+ top: "calc(100% + 2px)",
885
+ zIndex: 50,
886
+ minWidth: "160px",
887
+ overflow: "hidden",
888
+ margin: 0,
889
+ padding: "4px 0",
890
+ listStyle: "none",
891
+ borderRadius: "6px",
892
+ border: "1px solid var(--uix-border)",
893
+ background: "var(--uix-surface)",
894
+ boxShadow: "var(--uix-shadow-popover)"
895
+ },
896
+ children: actions.map((action, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("li", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
897
+ "button",
898
+ {
899
+ ref: (el) => {
900
+ itemRefs.current[i] = el;
901
+ },
902
+ type: "button",
903
+ role: "menuitem",
904
+ tabIndex: -1,
905
+ onClick: () => {
906
+ setOpen(false);
907
+ action.onSelect();
908
+ },
909
+ style: {
910
+ display: "flex",
911
+ width: "100%",
912
+ alignItems: "center",
913
+ padding: "6px 12px",
914
+ border: 0,
915
+ background: "transparent",
916
+ cursor: "pointer",
917
+ textAlign: "left",
918
+ fontSize: "13px",
919
+ color: "color-mix(in srgb, var(--uix-text) 85%, transparent)",
920
+ transition: "background-color var(--uix-dur-fast) var(--uix-ease-out)"
921
+ },
922
+ onMouseEnter: (e) => {
923
+ e.currentTarget.style.background = "var(--uix-bg-hover)";
924
+ },
925
+ onMouseLeave: (e) => {
926
+ e.currentTarget.style.background = "transparent";
927
+ },
928
+ children: action.label
929
+ }
930
+ ) }, action.label))
931
+ }
932
+ )
933
+ ] }) : null
934
+ ]
935
+ }
936
+ )
937
+ );
938
+ }
939
+
940
+ // src/components/Alert.tsx
941
+ var import_jsx_runtime22 = require("react/jsx-runtime");
546
942
  function Alert({ tone, title, icon, children, className, ...props }) {
547
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: cx("uix-alert", tone && tone !== "neutral" && `uix-alert--${tone}`, className), ...props, children: [
548
- icon && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uix-alert__icon", children: icon }),
549
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { children: [
550
- title && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uix-alert__title", children: title }),
551
- children && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uix-alert__body", children })
943
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: cx("uix-alert", tone && tone !== "neutral" && `uix-alert--${tone}`, className), ...props, children: [
944
+ icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-alert__icon", children: icon }),
945
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { children: [
946
+ title && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-alert__title", children: title }),
947
+ children && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-alert__body", children })
552
948
  ] })
553
949
  ] });
554
950
  }
555
951
 
556
952
  // src/components/Spinner.tsx
557
- var import_jsx_runtime21 = require("react/jsx-runtime");
953
+ var import_jsx_runtime23 = require("react/jsx-runtime");
558
954
  function Spinner({ size = "md", accent, className, ...props }) {
559
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
955
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
560
956
  "span",
561
957
  {
562
958
  className: cx("uix-spinner", accent && "uix-spinner--accent", size === "lg" && "uix-spinner--lg", className),
@@ -568,9 +964,9 @@ function Spinner({ size = "md", accent, className, ...props }) {
568
964
  }
569
965
 
570
966
  // src/components/Toast.tsx
571
- var import_jsx_runtime22 = require("react/jsx-runtime");
967
+ var import_jsx_runtime24 = require("react/jsx-runtime");
572
968
  function Toast({ title, message, tone, icon, onClose, leaving, className, ...props }) {
573
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
969
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
574
970
  "div",
575
971
  {
576
972
  className: cx("uix-toast", tone && `uix-toast--${tone}`, className),
@@ -579,24 +975,24 @@ function Toast({ title, message, tone, icon, onClose, leaving, className, ...pro
579
975
  "aria-live": "polite",
580
976
  ...props,
581
977
  children: [
582
- icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-toast__icon", children: icon }),
583
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "uix-toast__body", children: [
584
- title && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-toast__title", children: title }),
585
- message && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-toast__msg", children: message })
978
+ icon && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "uix-toast__icon", children: icon }),
979
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "uix-toast__body", children: [
980
+ title && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "uix-toast__title", children: title }),
981
+ message && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "uix-toast__msg", children: message })
586
982
  ] }),
587
- onClose && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "uix-toast__close", onClick: onClose, "aria-label": "Dismiss", children: "\xD7" })
983
+ onClose && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("button", { className: "uix-toast__close", onClick: onClose, "aria-label": "Dismiss", children: "\xD7" })
588
984
  ]
589
985
  }
590
986
  );
591
987
  }
592
988
  function Toaster({ children, className, ...props }) {
593
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cx("uix-toaster", className), "aria-live": "polite", "aria-atomic": "false", ...props, children });
989
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: cx("uix-toaster", className), "aria-live": "polite", "aria-atomic": "false", ...props, children });
594
990
  }
595
991
 
596
992
  // src/components/Table.tsx
597
- var import_jsx_runtime23 = require("react/jsx-runtime");
993
+ var import_jsx_runtime25 = require("react/jsx-runtime");
598
994
  function TableWrap({ children, className, ...props }) {
599
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: cx("uix-table-wrap", className), ...props, children });
995
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: cx("uix-table-wrap", className), ...props, children });
600
996
  }
601
997
  function Table({
602
998
  density = "standard",
@@ -608,7 +1004,7 @@ function Table({
608
1004
  children,
609
1005
  ...props
610
1006
  }) {
611
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1007
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
612
1008
  "table",
613
1009
  {
614
1010
  className: cx("uix-table", !zebra && "uix-table--no-zebra", pinnedCol && "uix-table--pinned-col", className),
@@ -621,7 +1017,7 @@ function Table({
621
1017
  );
622
1018
  }
623
1019
  function Th({ sortable, sortDirection, onSort, className, children, onClick, ...props }) {
624
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1020
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
625
1021
  "th",
626
1022
  {
627
1023
  className,
@@ -634,10 +1030,10 @@ function Th({ sortable, sortDirection, onSort, className, children, onClick, ...
634
1030
  );
635
1031
  }
636
1032
  function Td({ pinned, className, children, ...props }) {
637
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("td", { className, "data-pinned": pinned || void 0, ...props, children });
1033
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("td", { className, "data-pinned": pinned || void 0, ...props, children });
638
1034
  }
639
1035
  function Tr({ selected, pinned, className, children, ...props }) {
640
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1036
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
641
1037
  "tr",
642
1038
  {
643
1039
  className,
@@ -650,7 +1046,7 @@ function Tr({ selected, pinned, className, children, ...props }) {
650
1046
  }
651
1047
 
652
1048
  // src/components/Pagination.tsx
653
- var import_jsx_runtime24 = require("react/jsx-runtime");
1049
+ var import_jsx_runtime26 = require("react/jsx-runtime");
654
1050
  function getPageNumbers(page, total) {
655
1051
  if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);
656
1052
  const pages = [1];
@@ -664,8 +1060,8 @@ function getPageNumbers(page, total) {
664
1060
  }
665
1061
  function Pagination({ page, pageCount, onChange, className, ...props }) {
666
1062
  const pages = getPageNumbers(page, pageCount);
667
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("nav", { "aria-label": "Pagination", className: cx("uix-pagination", className), ...props, children: [
668
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1063
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("nav", { "aria-label": "Pagination", className: cx("uix-pagination", className), ...props, children: [
1064
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
669
1065
  "button",
670
1066
  {
671
1067
  className: "uix-pagination__btn",
@@ -676,7 +1072,7 @@ function Pagination({ page, pageCount, onChange, className, ...props }) {
676
1072
  }
677
1073
  ),
678
1074
  pages.map(
679
- (p, i) => p === "ellipsis" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "uix-pagination__ellipsis", children: "\u2026" }, `e${i}`) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1075
+ (p, i) => p === "ellipsis" ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "uix-pagination__ellipsis", children: "\u2026" }, `e${i}`) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
680
1076
  "button",
681
1077
  {
682
1078
  className: "uix-pagination__btn",
@@ -687,7 +1083,7 @@ function Pagination({ page, pageCount, onChange, className, ...props }) {
687
1083
  p
688
1084
  )
689
1085
  ),
690
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1086
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
691
1087
  "button",
692
1088
  {
693
1089
  className: "uix-pagination__btn",
@@ -701,15 +1097,15 @@ function Pagination({ page, pageCount, onChange, className, ...props }) {
701
1097
  }
702
1098
 
703
1099
  // src/components/StatusPill.tsx
704
- var import_jsx_runtime25 = require("react/jsx-runtime");
1100
+ var import_jsx_runtime27 = require("react/jsx-runtime");
705
1101
  function StatusPill({ tone = "neutral", treatment = "filled", dot, children, className, ...props }) {
706
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1102
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
707
1103
  "span",
708
1104
  {
709
1105
  className: cx("uix-pill", `uix-pill--${tone}`, treatment === "outline" && "uix-pill--outline", className),
710
1106
  ...props,
711
1107
  children: [
712
- dot && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "uix-pill__dot", "aria-hidden": "true" }),
1108
+ dot && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "uix-pill__dot", "aria-hidden": "true" }),
713
1109
  children
714
1110
  ]
715
1111
  }
@@ -717,10 +1113,10 @@ function StatusPill({ tone = "neutral", treatment = "filled", dot, children, cla
717
1113
  }
718
1114
 
719
1115
  // src/components/Progress.tsx
720
- var import_jsx_runtime26 = require("react/jsx-runtime");
1116
+ var import_jsx_runtime28 = require("react/jsx-runtime");
721
1117
  function Progress({ value = 0, max = 100, indeterminate, className, ...props }) {
722
1118
  const pct = Math.max(0, Math.min(100, value / (max || 100) * 100));
723
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1119
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
724
1120
  "div",
725
1121
  {
726
1122
  role: "progressbar",
@@ -729,54 +1125,79 @@ function Progress({ value = 0, max = 100, indeterminate, className, ...props })
729
1125
  "aria-valuenow": indeterminate ? void 0 : value,
730
1126
  className: cx("uix-progress", indeterminate && "uix-progress--indeterminate", className),
731
1127
  ...props,
732
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "uix-progress__bar", style: indeterminate ? void 0 : { width: `${pct}%` } })
1128
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "uix-progress__bar", style: indeterminate ? void 0 : { width: `${pct}%` } })
1129
+ }
1130
+ );
1131
+ }
1132
+
1133
+ // src/components/Meter.tsx
1134
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1135
+ function Meter({ value = 0, tone, className, ...props }) {
1136
+ const pct = Math.max(0, Math.min(100, value));
1137
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1138
+ "div",
1139
+ {
1140
+ role: "meter",
1141
+ "aria-valuenow": pct,
1142
+ "aria-valuemin": 0,
1143
+ "aria-valuemax": 100,
1144
+ className: cx("uix-meter", className),
1145
+ ...props,
1146
+ children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1147
+ "div",
1148
+ {
1149
+ className: "uix-meter__fill",
1150
+ style: { width: `${pct}%` },
1151
+ ...tone && tone !== "success" ? { "data-tone": tone } : {}
1152
+ }
1153
+ )
733
1154
  }
734
1155
  );
735
1156
  }
736
1157
 
737
1158
  // src/components/Stat.tsx
738
- var import_jsx_runtime27 = require("react/jsx-runtime");
1159
+ var import_jsx_runtime30 = require("react/jsx-runtime");
739
1160
  function Stat({ label, value, icon, meta, trend, className, ...props }) {
740
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: cx("uix-stat", className), ...props, children: [
741
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "uix-stat__label", children: [
742
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: label }),
1161
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: cx("uix-stat", className), ...props, children: [
1162
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "uix-stat__label", children: [
1163
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: label }),
743
1164
  icon
744
1165
  ] }),
745
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "uix-stat__value", children: value }),
746
- (meta != null || trend != null) && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "uix-stat__meta", children: [
747
- trend != null && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: cx("uix-stat__trend", `uix-stat__trend--${trend.direction}`), children: trend.label }),
1166
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "uix-stat__value", children: value }),
1167
+ (meta != null || trend != null) && /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "uix-stat__meta", children: [
1168
+ trend != null && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: cx("uix-stat__trend", `uix-stat__trend--${trend.direction}`), children: trend.label }),
748
1169
  meta
749
1170
  ] })
750
1171
  ] });
751
1172
  }
752
1173
 
753
1174
  // src/components/Tooltip.tsx
754
- var import_jsx_runtime28 = require("react/jsx-runtime");
1175
+ var import_jsx_runtime31 = require("react/jsx-runtime");
755
1176
  function Tooltip({ label, children, ...props }) {
756
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { "data-uix-tip": label, ...props, children });
1177
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { "data-uix-tip": label, ...props, children });
757
1178
  }
758
1179
 
759
1180
  // src/components/States.tsx
760
- var import_jsx_runtime29 = require("react/jsx-runtime");
1181
+ var import_jsx_runtime32 = require("react/jsx-runtime");
761
1182
  function EmptyState({ icon, title, children, action, className, ...props }) {
762
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: cx("uix-empty", className), ...props, children: [
763
- icon != null && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "uix-empty__icon", children: icon }),
764
- title != null && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "uix-empty__title", children: title }),
1183
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: cx("uix-empty", className), ...props, children: [
1184
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "uix-empty__icon", children: icon }),
1185
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "uix-empty__title", children: title }),
765
1186
  children,
766
1187
  action
767
1188
  ] });
768
1189
  }
769
1190
  function ErrorState({ icon, title, detail, action, className, ...props }) {
770
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: cx("uix-empty", "uix-empty--danger", className), role: "alert", ...props, children: [
771
- icon != null && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "uix-empty__icon uix-empty__icon--danger", children: icon }),
772
- title != null && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "uix-empty__title", children: title }),
773
- detail != null && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { children: detail }),
1191
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: cx("uix-empty", "uix-empty--danger", className), role: "alert", ...props, children: [
1192
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "uix-empty__icon uix-empty__icon--danger", children: icon }),
1193
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "uix-empty__title", children: title }),
1194
+ detail != null && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { children: detail }),
774
1195
  action
775
1196
  ] });
776
1197
  }
777
1198
  function Skeleton({ variant = "block", width, height, className, style, ...props }) {
778
1199
  const dims = { width, height, ...style };
779
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1200
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
780
1201
  "div",
781
1202
  {
782
1203
  className: cx(
@@ -791,52 +1212,52 @@ function Skeleton({ variant = "block", width, height, className, style, ...props
791
1212
  );
792
1213
  }
793
1214
  function LoadingState({ rows = 3, className, ...props }) {
794
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cx("uix-stack", className), role: "status", "aria-busy": "true", ...props, children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Skeleton, { variant: "text", width: `${92 - i % 3 * 14}%` }, i)) });
1215
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: cx("uix-stack", className), role: "status", "aria-busy": "true", ...props, children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Skeleton, { variant: "text", width: `${92 - i % 3 * 14}%` }, i)) });
795
1216
  }
796
1217
 
797
1218
  // src/components/Label.tsx
798
- var import_jsx_runtime30 = require("react/jsx-runtime");
1219
+ var import_jsx_runtime33 = require("react/jsx-runtime");
799
1220
  function Label({ color, dot, children, className, style, ...props }) {
800
1221
  const merged = color ? { "--label-color": color, ...style } : style;
801
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: cx("uix-label", className), style: merged, ...props, children: [
802
- dot && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "uix-label__dot", "aria-hidden": "true" }),
1222
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: cx("uix-label", className), style: merged, ...props, children: [
1223
+ dot && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "uix-label__dot", "aria-hidden": "true" }),
803
1224
  children
804
1225
  ] });
805
1226
  }
806
1227
 
807
1228
  // src/components/Avatar.tsx
808
- var import_jsx_runtime31 = require("react/jsx-runtime");
1229
+ var import_jsx_runtime34 = require("react/jsx-runtime");
809
1230
  function Avatar({ size = "md", src, alt, children, status, className, ...props }) {
810
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: cx("uix-avatar", size !== "md" && `uix-avatar--${size}`, className), ...props, children: [
811
- src ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("img", { src, alt: alt ?? "" }) : children,
812
- status && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "uix-avatar__status" })
1231
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: cx("uix-avatar", size !== "md" && `uix-avatar--${size}`, className), ...props, children: [
1232
+ src ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("img", { src, alt: alt ?? "" }) : children,
1233
+ status && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "uix-avatar__status" })
813
1234
  ] });
814
1235
  }
815
1236
  function AvatarGroup({ children, className, ...props }) {
816
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: cx("uix-avatar-group", className), ...props, children });
1237
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: cx("uix-avatar-group", className), ...props, children });
817
1238
  }
818
1239
  function UserChip({ avatar, name, sub, className, children, ...props }) {
819
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: cx("uix-user-chip", className), ...props, children: [
1240
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: cx("uix-user-chip", className), ...props, children: [
820
1241
  avatar,
821
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { children: [
822
- name != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "uix-user-chip__name", children: name }),
823
- sub != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "uix-user-chip__sub", style: { display: "block" }, children: sub })
1242
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { children: [
1243
+ name != null && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "uix-user-chip__name", children: name }),
1244
+ sub != null && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "uix-user-chip__sub", style: { display: "block" }, children: sub })
824
1245
  ] }),
825
1246
  children
826
1247
  ] });
827
1248
  }
828
1249
 
829
1250
  // src/components/Comments.tsx
830
- var import_jsx_runtime32 = require("react/jsx-runtime");
1251
+ var import_jsx_runtime35 = require("react/jsx-runtime");
831
1252
  function Comments({ children, className, ...props }) {
832
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: cx("uix-comments", className), ...props, children });
1253
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: cx("uix-comments", className), ...props, children });
833
1254
  }
834
1255
  function Comment({ avatar, author, meta, children, className, ...props }) {
835
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: cx("uix-comment", className), ...props, children: [
836
- avatar ?? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { "aria-hidden": "true" }),
837
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "uix-comment__body", children: [
838
- (author != null || meta != null) && /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "uix-comment__meta", children: [
839
- author != null && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "uix-comment__author", children: author }),
1256
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: cx("uix-comment", className), ...props, children: [
1257
+ avatar ?? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { "aria-hidden": "true" }),
1258
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "uix-comment__body", children: [
1259
+ (author != null || meta != null) && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "uix-comment__meta", children: [
1260
+ author != null && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "uix-comment__author", children: author }),
840
1261
  author != null && meta != null ? " \xB7 " : null,
841
1262
  meta
842
1263
  ] }),
@@ -846,95 +1267,134 @@ function Comment({ avatar, author, meta, children, className, ...props }) {
846
1267
  }
847
1268
 
848
1269
  // src/components/Timeline.tsx
849
- var import_jsx_runtime33 = require("react/jsx-runtime");
1270
+ var import_jsx_runtime36 = require("react/jsx-runtime");
850
1271
  function Timeline({ children, className, ...props }) {
851
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cx("uix-timeline", className), ...props, children });
1272
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: cx("uix-timeline", className), ...props, children });
852
1273
  }
853
1274
  function TimelineItem({ meta, children, className, ...props }) {
854
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: cx("uix-timeline__item", className), ...props, children: [
855
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "uix-timeline__rail", children: [
856
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "uix-timeline__node" }),
857
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "uix-timeline__line" })
1275
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cx("uix-timeline__item", className), ...props, children: [
1276
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "uix-timeline__rail", children: [
1277
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "uix-timeline__node" }),
1278
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "uix-timeline__line" })
858
1279
  ] }),
859
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "uix-timeline__body", children: [
860
- meta != null && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "uix-timeline__meta", children: meta }),
1280
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "uix-timeline__body", children: [
1281
+ meta != null && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "uix-timeline__meta", children: meta }),
861
1282
  children
862
1283
  ] })
863
1284
  ] });
864
1285
  }
865
1286
 
866
1287
  // src/components/Prose.tsx
867
- var import_jsx_runtime34 = require("react/jsx-runtime");
1288
+ var import_jsx_runtime37 = require("react/jsx-runtime");
868
1289
  function Prose({ children, className, ...props }) {
869
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: cx("uix-prose", className), ...props, children });
1290
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: cx("uix-prose", className), ...props, children });
870
1291
  }
871
1292
  function Note({ tone, icon, children, className, ...props }) {
872
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: cx("uix-note", tone && `uix-note--${tone}`, className), ...props, children: [
873
- icon != null && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "uix-note__icon", children: icon }),
874
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "uix-note__body", children })
1293
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: cx("uix-note", tone && `uix-note--${tone}`, className), ...props, children: [
1294
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "uix-note__icon", children: icon }),
1295
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "uix-note__body", children })
875
1296
  ] });
876
1297
  }
877
1298
 
878
1299
  // src/components/Popover.tsx
879
- var import_jsx_runtime35 = require("react/jsx-runtime");
1300
+ var import_jsx_runtime38 = require("react/jsx-runtime");
880
1301
  function Popover({ popover = "auto", children, className, ...props }) {
881
1302
  const popoverAttr = { popover };
882
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: cx("uix-popover", className), ...popoverAttr, ...props, children });
1303
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: cx("uix-popover", className), ...popoverAttr, ...props, children });
883
1304
  }
884
1305
 
885
1306
  // src/components/CommandPalette.tsx
886
- var import_jsx_runtime36 = require("react/jsx-runtime");
1307
+ var import_jsx_runtime39 = require("react/jsx-runtime");
887
1308
  function CommandPalette({ inputProps, children, className, ...props }) {
888
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cx("uix-cmdk", className), ...props, children: [
889
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("input", { className: "uix-cmdk__input", ...inputProps }),
890
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "uix-cmdk__list", children })
1309
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: cx("uix-cmdk", className), ...props, children: [
1310
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("input", { className: "uix-cmdk__input", ...inputProps }),
1311
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "uix-cmdk__list", children })
891
1312
  ] });
892
1313
  }
893
1314
  function CommandGroup({ label, children }) {
894
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
895
- label != null && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "uix-cmdk__group", children: label }),
1315
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
1316
+ label != null && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "uix-cmdk__group", children: label }),
896
1317
  children
897
1318
  ] });
898
1319
  }
899
1320
  function CommandItem({ icon, shortcut, active, children, className, ...props }) {
900
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cx("uix-cmdk__item", className), "data-active": active || void 0, ...props, children: [
1321
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: cx("uix-cmdk__item", className), "data-active": active || void 0, ...props, children: [
901
1322
  icon,
902
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { children }),
1323
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { children }),
903
1324
  shortcut
904
1325
  ] });
905
1326
  }
906
1327
 
1328
+ // src/components/Inbox.tsx
1329
+ var import_jsx_runtime40 = require("react/jsx-runtime");
1330
+ function Inbox({ children, className, ...props }) {
1331
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cx("uix-inbox", className), ...props, children });
1332
+ }
1333
+ function InboxList({ children, className, ...props }) {
1334
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cx("uix-inbox__list", className), role: "listbox", ...props, children });
1335
+ }
1336
+ function InboxItem({
1337
+ subject,
1338
+ preview,
1339
+ leading,
1340
+ unread,
1341
+ selected,
1342
+ children,
1343
+ className,
1344
+ ...props
1345
+ }) {
1346
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
1347
+ "div",
1348
+ {
1349
+ role: "option",
1350
+ "aria-selected": selected ?? false,
1351
+ className: cx("uix-inbox__item", className),
1352
+ ...unread ? { "data-unread": "" } : {},
1353
+ ...props,
1354
+ children: [
1355
+ leading,
1356
+ subject != null && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "uix-inbox__subject", children: subject }),
1357
+ preview != null && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "uix-inbox__preview", children: preview }),
1358
+ children
1359
+ ]
1360
+ }
1361
+ );
1362
+ }
1363
+ function InboxDetail({ children, className, ...props }) {
1364
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cx("uix-inbox__detail", className), ...props, children });
1365
+ }
1366
+
907
1367
  // src/components/Kanban.tsx
908
- var import_jsx_runtime37 = require("react/jsx-runtime");
1368
+ var import_jsx_runtime41 = require("react/jsx-runtime");
909
1369
  function Kanban({ children, className, ...props }) {
910
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: cx("uix-kanban", className), ...props, children });
1370
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: cx("uix-kanban", className), ...props, children });
911
1371
  }
912
1372
  function KanbanColumn({ title, count, children, className, ...props }) {
913
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: cx("uix-kanban__col", className), ...props, children: [
914
- (title != null || count != null) && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "uix-kanban__head", children: [
1373
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: cx("uix-kanban__col", className), ...props, children: [
1374
+ (title != null || count != null) && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "uix-kanban__head", children: [
915
1375
  title,
916
- count != null && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "uix-kanban__count", children: count })
1376
+ count != null && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "uix-kanban__count", children: count })
917
1377
  ] }),
918
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "uix-kanban__body", children })
1378
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "uix-kanban__body", children })
919
1379
  ] });
920
1380
  }
921
1381
  function KanbanCard({ title, meta, children, className, ...props }) {
922
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: cx("uix-kanban__card", className), ...props, children: [
923
- title && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "uix-kanban__card-title", children: title }),
924
- meta && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "uix-kanban__card-meta", children: meta }),
1382
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: cx("uix-kanban__card", className), ...props, children: [
1383
+ title && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "uix-kanban__card-title", children: title }),
1384
+ meta && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "uix-kanban__card-meta", children: meta }),
925
1385
  children
926
1386
  ] });
927
1387
  }
928
1388
 
929
1389
  // src/components/Tree.tsx
930
- var import_react12 = require("react");
931
- var import_jsx_runtime38 = require("react/jsx-runtime");
932
- var ChevronIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("svg", { viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("path", { d: "M2 4l4 4 4-4" }) });
1390
+ var import_react13 = require("react");
1391
+ var import_jsx_runtime42 = require("react/jsx-runtime");
1392
+ var ChevronIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("svg", { viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("path", { d: "M2 4l4 4 4-4" }) });
933
1393
  function TreeNode({ node, expanded, selected, onToggle, onSelect, level = 0 }) {
934
1394
  const hasChildren = Array.isArray(node.children) && node.children.length > 0;
935
1395
  const isExpanded = expanded.has(node.id);
936
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("li", { children: [
937
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
1396
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("li", { children: [
1397
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
938
1398
  "button",
939
1399
  {
940
1400
  className: "uix-tree__row",
@@ -945,13 +1405,13 @@ function TreeNode({ node, expanded, selected, onToggle, onSelect, level = 0 }) {
945
1405
  onSelect?.(node.id);
946
1406
  },
947
1407
  children: [
948
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "uix-tree__toggle", children: hasChildren && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ChevronIcon2, {}) }),
949
- node.icon && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { "aria-hidden": "true", children: node.icon }),
1408
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "uix-tree__toggle", children: hasChildren && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(ChevronIcon2, {}) }),
1409
+ node.icon && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { "aria-hidden": "true", children: node.icon }),
950
1410
  node.label
951
1411
  ]
952
1412
  }
953
1413
  ),
954
- hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("ul", { children: node.children.map((child) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1414
+ hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("ul", { children: node.children.map((child) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
955
1415
  TreeNode,
956
1416
  {
957
1417
  node: child,
@@ -966,7 +1426,7 @@ function TreeNode({ node, expanded, selected, onToggle, onSelect, level = 0 }) {
966
1426
  ] });
967
1427
  }
968
1428
  function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected, onToggle, onSelect, className, ...props }) {
969
- const [internalExpanded, setInternalExpanded] = (0, import_react12.useState)(defaultExpanded ?? /* @__PURE__ */ new Set());
1429
+ const [internalExpanded, setInternalExpanded] = (0, import_react13.useState)(defaultExpanded ?? /* @__PURE__ */ new Set());
970
1430
  const expanded = controlledExpanded ?? internalExpanded;
971
1431
  function handleToggle(id) {
972
1432
  if (!controlledExpanded) {
@@ -979,7 +1439,7 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
979
1439
  }
980
1440
  onToggle?.(id);
981
1441
  }
982
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("ul", { className: cx("uix-tree", className), role: "tree", ...props, children: nodes.map((node) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1442
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("ul", { className: cx("uix-tree", className), role: "tree", ...props, children: nodes.map((node) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
983
1443
  TreeNode,
984
1444
  {
985
1445
  node,
@@ -1013,6 +1473,10 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
1013
1473
  EmptyState,
1014
1474
  ErrorState,
1015
1475
  Field,
1476
+ Inbox,
1477
+ InboxDetail,
1478
+ InboxItem,
1479
+ InboxList,
1016
1480
  Input,
1017
1481
  InputGroup,
1018
1482
  Kanban,
@@ -1022,7 +1486,9 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
1022
1486
  List,
1023
1487
  ListItem,
1024
1488
  LoadingState,
1489
+ Meter,
1025
1490
  Modal,
1491
+ NavFavourites,
1026
1492
  NavGroup,
1027
1493
  NavItem,
1028
1494
  Note,
@@ -1039,6 +1505,7 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
1039
1505
  SidebarSection,
1040
1506
  Skeleton,
1041
1507
  Spinner,
1508
+ StarButton,
1042
1509
  Stat,
1043
1510
  StatusPill,
1044
1511
  SubNavItem,