@tensor_1/react 2.3.0 → 2.4.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
@@ -50,6 +50,7 @@ __export(src_exports, {
50
50
  ListItem: () => ListItem,
51
51
  LoadingState: () => LoadingState,
52
52
  Modal: () => Modal,
53
+ NavFavourites: () => NavFavourites,
53
54
  NavGroup: () => NavGroup,
54
55
  NavItem: () => NavItem,
55
56
  Note: () => Note,
@@ -66,6 +67,7 @@ __export(src_exports, {
66
67
  SidebarSection: () => SidebarSection,
67
68
  Skeleton: () => Skeleton,
68
69
  Spinner: () => Spinner,
70
+ StarButton: () => StarButton,
69
71
  Stat: () => Stat,
70
72
  StatusPill: () => StatusPill,
71
73
  SubNavItem: () => SubNavItem,
@@ -541,22 +543,411 @@ function SubNavItem({ active, as: Tag = "a", children, className, ...props }) {
541
543
  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
544
  }
543
545
 
544
- // src/components/Alert.tsx
546
+ // src/components/StarButton.tsx
545
547
  var import_jsx_runtime20 = require("react/jsx-runtime");
548
+ var StarGlyph = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
549
+ "svg",
550
+ {
551
+ viewBox: "0 0 24 24",
552
+ fill: "none",
553
+ stroke: "currentColor",
554
+ strokeWidth: 2,
555
+ strokeLinecap: "round",
556
+ strokeLinejoin: "round",
557
+ "aria-hidden": "true",
558
+ 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" })
559
+ }
560
+ );
561
+ function StarButton({
562
+ pinned,
563
+ label,
564
+ addLabel = "Add {label} to favourites",
565
+ onToggle,
566
+ className
567
+ }) {
568
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
569
+ "button",
570
+ {
571
+ type: "button",
572
+ className: cx("uix-navitem__star", className),
573
+ "data-on": pinned || void 0,
574
+ "aria-pressed": pinned,
575
+ "aria-label": addLabel.replace("{label}", label),
576
+ onClick: (e) => {
577
+ e.preventDefault();
578
+ e.stopPropagation();
579
+ onToggle(!pinned);
580
+ },
581
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StarGlyph, {})
582
+ }
583
+ );
584
+ }
585
+
586
+ // src/components/NavFavourites.tsx
587
+ var import_react12 = require("react");
588
+ var import_jsx_runtime21 = require("react/jsx-runtime");
589
+ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
590
+ "svg",
591
+ {
592
+ width: "12",
593
+ height: "12",
594
+ viewBox: "0 0 24 24",
595
+ fill: "none",
596
+ stroke: "currentColor",
597
+ strokeWidth: 2,
598
+ strokeLinecap: "round",
599
+ strokeLinejoin: "round",
600
+ "aria-hidden": "true",
601
+ style: { flexShrink: 0 },
602
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("path", { d: "m6 9 6 6 6-6" })
603
+ }
604
+ );
605
+ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
606
+ "svg",
607
+ {
608
+ width: "12",
609
+ height: "12",
610
+ viewBox: "0 0 24 24",
611
+ fill: "none",
612
+ stroke: "currentColor",
613
+ strokeWidth: 2,
614
+ strokeLinecap: "round",
615
+ strokeLinejoin: "round",
616
+ "aria-hidden": "true",
617
+ style: { flexShrink: 0 },
618
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("path", { d: "m9 18 6-6-6-6" })
619
+ }
620
+ );
621
+ var MoreIcon = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
622
+ "svg",
623
+ {
624
+ width: "14",
625
+ height: "14",
626
+ viewBox: "0 0 24 24",
627
+ fill: "none",
628
+ stroke: "currentColor",
629
+ strokeWidth: 1.75,
630
+ strokeLinecap: "round",
631
+ strokeLinejoin: "round",
632
+ "aria-hidden": "true",
633
+ children: [
634
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("circle", { cx: "12", cy: "12", r: "1" }),
635
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("circle", { cx: "12", cy: "5", r: "1" }),
636
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("circle", { cx: "12", cy: "19", r: "1" })
637
+ ]
638
+ }
639
+ );
640
+ var MUTED = "color-mix(in srgb, var(--uix-text) 50%, transparent)";
641
+ function NavFavourites({
642
+ items,
643
+ collapsed = false,
644
+ onToggleCollapsed,
645
+ onRemove,
646
+ onReorder,
647
+ labels,
648
+ emptyReason,
649
+ className
650
+ }) {
651
+ const regionId = (0, import_react12.useId)();
652
+ const headerRef = (0, import_react12.useRef)(null);
653
+ const regionRef = (0, import_react12.useRef)(null);
654
+ const focusAfterRef = (0, import_react12.useRef)(null);
655
+ const triggerRefs = (0, import_react12.useRef)(/* @__PURE__ */ new Map());
656
+ const order = items.map((i) => i.id);
657
+ (0, import_react12.useEffect)(() => {
658
+ const id = focusAfterRef.current;
659
+ if (!id) return;
660
+ focusAfterRef.current = null;
661
+ const el = triggerRefs.current.get(id);
662
+ if (el) el.focus();
663
+ else headerRef.current?.focus();
664
+ }, [order.join("|")]);
665
+ const handleToggle = () => {
666
+ if (!collapsed) {
667
+ const active = document.activeElement;
668
+ if (active && regionRef.current?.contains(active) && active !== headerRef.current) {
669
+ headerRef.current?.focus();
670
+ }
671
+ }
672
+ onToggleCollapsed?.();
673
+ };
674
+ const move = (id, dir) => {
675
+ const idx = order.indexOf(id);
676
+ const next = idx + dir;
677
+ if (idx < 0 || next < 0 || next >= order.length) return;
678
+ const reordered = [...order];
679
+ const [it] = reordered.splice(idx, 1);
680
+ if (it === void 0) return;
681
+ reordered.splice(next, 0, it);
682
+ focusAfterRef.current = id;
683
+ onReorder(reordered);
684
+ };
685
+ const remove = (id) => {
686
+ const idx = order.indexOf(id);
687
+ const neighbour = order[idx + 1] ?? order[idx - 1] ?? null;
688
+ focusAfterRef.current = neighbour;
689
+ onRemove(id);
690
+ };
691
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: cx("uix-favourites", className), style: { marginBottom: "var(--uix-space-1)" }, children: [
692
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
693
+ "button",
694
+ {
695
+ ref: headerRef,
696
+ type: "button",
697
+ "aria-expanded": !collapsed,
698
+ "aria-controls": regionId,
699
+ onClick: handleToggle,
700
+ className: "uix-text-eyebrow",
701
+ style: {
702
+ display: "flex",
703
+ width: "100%",
704
+ alignItems: "center",
705
+ gap: "6px",
706
+ padding: "8px 4px 4px",
707
+ border: 0,
708
+ background: "transparent",
709
+ cursor: "pointer",
710
+ color: "inherit"
711
+ },
712
+ children: [
713
+ collapsed ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChevronRightIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChevronDownIcon, {}),
714
+ labels.heading
715
+ ]
716
+ }
717
+ ),
718
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
719
+ "ul",
720
+ {
721
+ ref: regionRef,
722
+ id: regionId,
723
+ hidden: collapsed,
724
+ style: {
725
+ display: "flex",
726
+ flexDirection: "column",
727
+ gap: "1px",
728
+ listStyle: "none",
729
+ margin: 0,
730
+ padding: 0
731
+ },
732
+ children: items.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
733
+ "li",
734
+ {
735
+ className: "uix-text-meta",
736
+ "data-empty-reason": emptyReason,
737
+ style: { padding: "6px 8px", color: MUTED },
738
+ children: labels.empty
739
+ }
740
+ ) : items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
741
+ FavouriteRow,
742
+ {
743
+ item,
744
+ isFirst: idx === 0,
745
+ isLast: idx === items.length - 1,
746
+ labels,
747
+ onMoveUp: () => move(item.id, -1),
748
+ onMoveDown: () => move(item.id, 1),
749
+ onRemove: () => remove(item.id),
750
+ registerTrigger: (el) => triggerRefs.current.set(item.id, el)
751
+ },
752
+ item.id
753
+ ))
754
+ }
755
+ )
756
+ ] });
757
+ }
758
+ function FavouriteRow({
759
+ item,
760
+ isFirst,
761
+ isLast,
762
+ labels,
763
+ onMoveUp,
764
+ onMoveDown,
765
+ onRemove,
766
+ registerTrigger
767
+ }) {
768
+ const [open, setOpen] = (0, import_react12.useState)(false);
769
+ const [revealed, setRevealed] = (0, import_react12.useState)(false);
770
+ const menuId = (0, import_react12.useId)();
771
+ const triggerRef = (0, import_react12.useRef)(null);
772
+ const itemRefs = (0, import_react12.useRef)([]);
773
+ const optionsTemplate = labels.options ?? "{label} favourite options";
774
+ const actions = [
775
+ ...isFirst ? [] : [{ label: labels.moveUp, onSelect: onMoveUp }],
776
+ ...isLast ? [] : [{ label: labels.moveDown, onSelect: onMoveDown }],
777
+ { label: labels.remove.replace("{label}", item.label), onSelect: onRemove }
778
+ ];
779
+ (0, import_react12.useEffect)(() => {
780
+ if (open) itemRefs.current[0]?.focus();
781
+ }, [open]);
782
+ const closeAndReturnFocus = () => {
783
+ setOpen(false);
784
+ triggerRef.current?.focus();
785
+ };
786
+ const onMenuKeyDown = (e) => {
787
+ const menuItems = itemRefs.current.filter((x) => x !== null);
788
+ const currentIdx = menuItems.findIndex((el) => el === document.activeElement);
789
+ if (e.key === "ArrowDown") {
790
+ e.preventDefault();
791
+ menuItems[(currentIdx + 1) % menuItems.length]?.focus();
792
+ } else if (e.key === "ArrowUp") {
793
+ e.preventDefault();
794
+ menuItems[(currentIdx - 1 + menuItems.length) % menuItems.length]?.focus();
795
+ } else if (e.key === "Escape") {
796
+ e.preventDefault();
797
+ closeAndReturnFocus();
798
+ } else if (e.key === "Tab") {
799
+ setOpen(false);
800
+ }
801
+ };
802
+ const onRowKeyDown = (e) => {
803
+ if (!e.altKey) return;
804
+ if (e.key === "ArrowUp" && !isFirst) {
805
+ e.preventDefault();
806
+ onMoveUp();
807
+ } else if (e.key === "ArrowDown" && !isLast) {
808
+ e.preventDefault();
809
+ onMoveDown();
810
+ }
811
+ };
812
+ const triggerVisible = revealed || open;
813
+ return (
814
+ // biome-ignore lint/a11y/noStaticElementInteractions: keyboard accelerators on the row; the focusable controls inside carry their own semantics.
815
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
816
+ "li",
817
+ {
818
+ style: { position: "relative", display: "flex", alignItems: "center" },
819
+ onKeyDown: onRowKeyDown,
820
+ onMouseEnter: () => setRevealed(true),
821
+ onMouseLeave: () => setRevealed(false),
822
+ onFocus: () => setRevealed(true),
823
+ onBlur: (e) => {
824
+ if (!e.currentTarget.contains(e.relatedTarget)) setRevealed(false);
825
+ },
826
+ children: [
827
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { style: { minWidth: 0, flex: 1 }, children: item.link }),
828
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
829
+ "button",
830
+ {
831
+ ref: (el) => {
832
+ triggerRef.current = el;
833
+ registerTrigger(el);
834
+ },
835
+ type: "button",
836
+ "aria-haspopup": "menu",
837
+ "aria-expanded": open,
838
+ "aria-controls": open ? menuId : void 0,
839
+ "aria-label": optionsTemplate.replace("{label}", item.label),
840
+ onClick: () => setOpen((v) => !v),
841
+ style: {
842
+ marginLeft: "auto",
843
+ display: "inline-flex",
844
+ height: "20px",
845
+ width: "20px",
846
+ flexShrink: 0,
847
+ alignItems: "center",
848
+ justifyContent: "center",
849
+ border: 0,
850
+ borderRadius: "2px",
851
+ background: "transparent",
852
+ cursor: "pointer",
853
+ color: MUTED,
854
+ opacity: triggerVisible ? 1 : 0,
855
+ transition: "opacity var(--uix-dur-fast) var(--uix-ease-out)"
856
+ },
857
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(MoreIcon, {})
858
+ }
859
+ ),
860
+ open ? /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
861
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
862
+ "div",
863
+ {
864
+ "aria-hidden": "true",
865
+ role: "presentation",
866
+ onClick: () => setOpen(false),
867
+ style: { position: "fixed", inset: 0, cursor: "default", background: "transparent", zIndex: 40 }
868
+ }
869
+ ),
870
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
871
+ "ul",
872
+ {
873
+ id: menuId,
874
+ role: "menu",
875
+ onKeyDown: onMenuKeyDown,
876
+ style: {
877
+ position: "absolute",
878
+ right: 0,
879
+ top: "calc(100% + 2px)",
880
+ zIndex: 50,
881
+ minWidth: "160px",
882
+ overflow: "hidden",
883
+ margin: 0,
884
+ padding: "4px 0",
885
+ listStyle: "none",
886
+ borderRadius: "6px",
887
+ border: "1px solid var(--uix-border)",
888
+ background: "var(--uix-surface)",
889
+ boxShadow: "var(--uix-shadow-popover)"
890
+ },
891
+ children: actions.map((action, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("li", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
892
+ "button",
893
+ {
894
+ ref: (el) => {
895
+ itemRefs.current[i] = el;
896
+ },
897
+ type: "button",
898
+ role: "menuitem",
899
+ tabIndex: -1,
900
+ onClick: () => {
901
+ setOpen(false);
902
+ action.onSelect();
903
+ },
904
+ style: {
905
+ display: "flex",
906
+ width: "100%",
907
+ alignItems: "center",
908
+ padding: "6px 12px",
909
+ border: 0,
910
+ background: "transparent",
911
+ cursor: "pointer",
912
+ textAlign: "left",
913
+ fontSize: "13px",
914
+ color: "color-mix(in srgb, var(--uix-text) 85%, transparent)",
915
+ transition: "background-color var(--uix-dur-fast) var(--uix-ease-out)"
916
+ },
917
+ onMouseEnter: (e) => {
918
+ e.currentTarget.style.background = "var(--uix-bg-hover)";
919
+ },
920
+ onMouseLeave: (e) => {
921
+ e.currentTarget.style.background = "transparent";
922
+ },
923
+ children: action.label
924
+ }
925
+ ) }, action.label))
926
+ }
927
+ )
928
+ ] }) : null
929
+ ]
930
+ }
931
+ )
932
+ );
933
+ }
934
+
935
+ // src/components/Alert.tsx
936
+ var import_jsx_runtime22 = require("react/jsx-runtime");
546
937
  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 })
938
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: cx("uix-alert", tone && tone !== "neutral" && `uix-alert--${tone}`, className), ...props, children: [
939
+ icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-alert__icon", children: icon }),
940
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { children: [
941
+ title && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-alert__title", children: title }),
942
+ children && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "uix-alert__body", children })
552
943
  ] })
553
944
  ] });
554
945
  }
555
946
 
556
947
  // src/components/Spinner.tsx
557
- var import_jsx_runtime21 = require("react/jsx-runtime");
948
+ var import_jsx_runtime23 = require("react/jsx-runtime");
558
949
  function Spinner({ size = "md", accent, className, ...props }) {
559
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
950
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
560
951
  "span",
561
952
  {
562
953
  className: cx("uix-spinner", accent && "uix-spinner--accent", size === "lg" && "uix-spinner--lg", className),
@@ -568,9 +959,9 @@ function Spinner({ size = "md", accent, className, ...props }) {
568
959
  }
569
960
 
570
961
  // src/components/Toast.tsx
571
- var import_jsx_runtime22 = require("react/jsx-runtime");
962
+ var import_jsx_runtime24 = require("react/jsx-runtime");
572
963
  function Toast({ title, message, tone, icon, onClose, leaving, className, ...props }) {
573
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
964
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
574
965
  "div",
575
966
  {
576
967
  className: cx("uix-toast", tone && `uix-toast--${tone}`, className),
@@ -579,24 +970,24 @@ function Toast({ title, message, tone, icon, onClose, leaving, className, ...pro
579
970
  "aria-live": "polite",
580
971
  ...props,
581
972
  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 })
973
+ icon && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "uix-toast__icon", children: icon }),
974
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "uix-toast__body", children: [
975
+ title && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "uix-toast__title", children: title }),
976
+ message && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "uix-toast__msg", children: message })
586
977
  ] }),
587
- onClose && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "uix-toast__close", onClick: onClose, "aria-label": "Dismiss", children: "\xD7" })
978
+ onClose && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("button", { className: "uix-toast__close", onClick: onClose, "aria-label": "Dismiss", children: "\xD7" })
588
979
  ]
589
980
  }
590
981
  );
591
982
  }
592
983
  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 });
984
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: cx("uix-toaster", className), "aria-live": "polite", "aria-atomic": "false", ...props, children });
594
985
  }
595
986
 
596
987
  // src/components/Table.tsx
597
- var import_jsx_runtime23 = require("react/jsx-runtime");
988
+ var import_jsx_runtime25 = require("react/jsx-runtime");
598
989
  function TableWrap({ children, className, ...props }) {
599
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: cx("uix-table-wrap", className), ...props, children });
990
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: cx("uix-table-wrap", className), ...props, children });
600
991
  }
601
992
  function Table({
602
993
  density = "standard",
@@ -608,7 +999,7 @@ function Table({
608
999
  children,
609
1000
  ...props
610
1001
  }) {
611
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1002
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
612
1003
  "table",
613
1004
  {
614
1005
  className: cx("uix-table", !zebra && "uix-table--no-zebra", pinnedCol && "uix-table--pinned-col", className),
@@ -621,7 +1012,7 @@ function Table({
621
1012
  );
622
1013
  }
623
1014
  function Th({ sortable, sortDirection, onSort, className, children, onClick, ...props }) {
624
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1015
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
625
1016
  "th",
626
1017
  {
627
1018
  className,
@@ -634,10 +1025,10 @@ function Th({ sortable, sortDirection, onSort, className, children, onClick, ...
634
1025
  );
635
1026
  }
636
1027
  function Td({ pinned, className, children, ...props }) {
637
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("td", { className, "data-pinned": pinned || void 0, ...props, children });
1028
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("td", { className, "data-pinned": pinned || void 0, ...props, children });
638
1029
  }
639
1030
  function Tr({ selected, pinned, className, children, ...props }) {
640
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1031
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
641
1032
  "tr",
642
1033
  {
643
1034
  className,
@@ -650,7 +1041,7 @@ function Tr({ selected, pinned, className, children, ...props }) {
650
1041
  }
651
1042
 
652
1043
  // src/components/Pagination.tsx
653
- var import_jsx_runtime24 = require("react/jsx-runtime");
1044
+ var import_jsx_runtime26 = require("react/jsx-runtime");
654
1045
  function getPageNumbers(page, total) {
655
1046
  if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);
656
1047
  const pages = [1];
@@ -664,8 +1055,8 @@ function getPageNumbers(page, total) {
664
1055
  }
665
1056
  function Pagination({ page, pageCount, onChange, className, ...props }) {
666
1057
  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)(
1058
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("nav", { "aria-label": "Pagination", className: cx("uix-pagination", className), ...props, children: [
1059
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
669
1060
  "button",
670
1061
  {
671
1062
  className: "uix-pagination__btn",
@@ -676,7 +1067,7 @@ function Pagination({ page, pageCount, onChange, className, ...props }) {
676
1067
  }
677
1068
  ),
678
1069
  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)(
1070
+ (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
1071
  "button",
681
1072
  {
682
1073
  className: "uix-pagination__btn",
@@ -687,7 +1078,7 @@ function Pagination({ page, pageCount, onChange, className, ...props }) {
687
1078
  p
688
1079
  )
689
1080
  ),
690
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1081
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
691
1082
  "button",
692
1083
  {
693
1084
  className: "uix-pagination__btn",
@@ -701,15 +1092,15 @@ function Pagination({ page, pageCount, onChange, className, ...props }) {
701
1092
  }
702
1093
 
703
1094
  // src/components/StatusPill.tsx
704
- var import_jsx_runtime25 = require("react/jsx-runtime");
1095
+ var import_jsx_runtime27 = require("react/jsx-runtime");
705
1096
  function StatusPill({ tone = "neutral", treatment = "filled", dot, children, className, ...props }) {
706
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1097
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
707
1098
  "span",
708
1099
  {
709
1100
  className: cx("uix-pill", `uix-pill--${tone}`, treatment === "outline" && "uix-pill--outline", className),
710
1101
  ...props,
711
1102
  children: [
712
- dot && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "uix-pill__dot", "aria-hidden": "true" }),
1103
+ dot && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "uix-pill__dot", "aria-hidden": "true" }),
713
1104
  children
714
1105
  ]
715
1106
  }
@@ -717,10 +1108,10 @@ function StatusPill({ tone = "neutral", treatment = "filled", dot, children, cla
717
1108
  }
718
1109
 
719
1110
  // src/components/Progress.tsx
720
- var import_jsx_runtime26 = require("react/jsx-runtime");
1111
+ var import_jsx_runtime28 = require("react/jsx-runtime");
721
1112
  function Progress({ value = 0, max = 100, indeterminate, className, ...props }) {
722
1113
  const pct = Math.max(0, Math.min(100, value / (max || 100) * 100));
723
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1114
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
724
1115
  "div",
725
1116
  {
726
1117
  role: "progressbar",
@@ -729,54 +1120,54 @@ function Progress({ value = 0, max = 100, indeterminate, className, ...props })
729
1120
  "aria-valuenow": indeterminate ? void 0 : value,
730
1121
  className: cx("uix-progress", indeterminate && "uix-progress--indeterminate", className),
731
1122
  ...props,
732
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "uix-progress__bar", style: indeterminate ? void 0 : { width: `${pct}%` } })
1123
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "uix-progress__bar", style: indeterminate ? void 0 : { width: `${pct}%` } })
733
1124
  }
734
1125
  );
735
1126
  }
736
1127
 
737
1128
  // src/components/Stat.tsx
738
- var import_jsx_runtime27 = require("react/jsx-runtime");
1129
+ var import_jsx_runtime29 = require("react/jsx-runtime");
739
1130
  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 }),
1131
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: cx("uix-stat", className), ...props, children: [
1132
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "uix-stat__label", children: [
1133
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: label }),
743
1134
  icon
744
1135
  ] }),
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 }),
1136
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "uix-stat__value", children: value }),
1137
+ (meta != null || trend != null) && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "uix-stat__meta", children: [
1138
+ trend != null && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: cx("uix-stat__trend", `uix-stat__trend--${trend.direction}`), children: trend.label }),
748
1139
  meta
749
1140
  ] })
750
1141
  ] });
751
1142
  }
752
1143
 
753
1144
  // src/components/Tooltip.tsx
754
- var import_jsx_runtime28 = require("react/jsx-runtime");
1145
+ var import_jsx_runtime30 = require("react/jsx-runtime");
755
1146
  function Tooltip({ label, children, ...props }) {
756
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { "data-uix-tip": label, ...props, children });
1147
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { "data-uix-tip": label, ...props, children });
757
1148
  }
758
1149
 
759
1150
  // src/components/States.tsx
760
- var import_jsx_runtime29 = require("react/jsx-runtime");
1151
+ var import_jsx_runtime31 = require("react/jsx-runtime");
761
1152
  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 }),
1153
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: cx("uix-empty", className), ...props, children: [
1154
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "uix-empty__icon", children: icon }),
1155
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "uix-empty__title", children: title }),
765
1156
  children,
766
1157
  action
767
1158
  ] });
768
1159
  }
769
1160
  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 }),
1161
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: cx("uix-empty", "uix-empty--danger", className), role: "alert", ...props, children: [
1162
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "uix-empty__icon uix-empty__icon--danger", children: icon }),
1163
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "uix-empty__title", children: title }),
1164
+ detail != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { children: detail }),
774
1165
  action
775
1166
  ] });
776
1167
  }
777
1168
  function Skeleton({ variant = "block", width, height, className, style, ...props }) {
778
1169
  const dims = { width, height, ...style };
779
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1170
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
780
1171
  "div",
781
1172
  {
782
1173
  className: cx(
@@ -791,52 +1182,52 @@ function Skeleton({ variant = "block", width, height, className, style, ...props
791
1182
  );
792
1183
  }
793
1184
  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)) });
1185
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: cx("uix-stack", className), role: "status", "aria-busy": "true", ...props, children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Skeleton, { variant: "text", width: `${92 - i % 3 * 14}%` }, i)) });
795
1186
  }
796
1187
 
797
1188
  // src/components/Label.tsx
798
- var import_jsx_runtime30 = require("react/jsx-runtime");
1189
+ var import_jsx_runtime32 = require("react/jsx-runtime");
799
1190
  function Label({ color, dot, children, className, style, ...props }) {
800
1191
  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" }),
1192
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("span", { className: cx("uix-label", className), style: merged, ...props, children: [
1193
+ dot && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "uix-label__dot", "aria-hidden": "true" }),
803
1194
  children
804
1195
  ] });
805
1196
  }
806
1197
 
807
1198
  // src/components/Avatar.tsx
808
- var import_jsx_runtime31 = require("react/jsx-runtime");
1199
+ var import_jsx_runtime33 = require("react/jsx-runtime");
809
1200
  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" })
1201
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: cx("uix-avatar", size !== "md" && `uix-avatar--${size}`, className), ...props, children: [
1202
+ src ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src, alt: alt ?? "" }) : children,
1203
+ status && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "uix-avatar__status" })
813
1204
  ] });
814
1205
  }
815
1206
  function AvatarGroup({ children, className, ...props }) {
816
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: cx("uix-avatar-group", className), ...props, children });
1207
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: cx("uix-avatar-group", className), ...props, children });
817
1208
  }
818
1209
  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: [
1210
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: cx("uix-user-chip", className), ...props, children: [
820
1211
  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 })
1212
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { children: [
1213
+ name != null && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "uix-user-chip__name", children: name }),
1214
+ sub != null && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "uix-user-chip__sub", style: { display: "block" }, children: sub })
824
1215
  ] }),
825
1216
  children
826
1217
  ] });
827
1218
  }
828
1219
 
829
1220
  // src/components/Comments.tsx
830
- var import_jsx_runtime32 = require("react/jsx-runtime");
1221
+ var import_jsx_runtime34 = require("react/jsx-runtime");
831
1222
  function Comments({ children, className, ...props }) {
832
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: cx("uix-comments", className), ...props, children });
1223
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: cx("uix-comments", className), ...props, children });
833
1224
  }
834
1225
  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 }),
1226
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: cx("uix-comment", className), ...props, children: [
1227
+ avatar ?? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { "aria-hidden": "true" }),
1228
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: "uix-comment__body", children: [
1229
+ (author != null || meta != null) && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: "uix-comment__meta", children: [
1230
+ author != null && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "uix-comment__author", children: author }),
840
1231
  author != null && meta != null ? " \xB7 " : null,
841
1232
  meta
842
1233
  ] }),
@@ -846,95 +1237,95 @@ function Comment({ avatar, author, meta, children, className, ...props }) {
846
1237
  }
847
1238
 
848
1239
  // src/components/Timeline.tsx
849
- var import_jsx_runtime33 = require("react/jsx-runtime");
1240
+ var import_jsx_runtime35 = require("react/jsx-runtime");
850
1241
  function Timeline({ children, className, ...props }) {
851
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cx("uix-timeline", className), ...props, children });
1242
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: cx("uix-timeline", className), ...props, children });
852
1243
  }
853
1244
  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" })
1245
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: cx("uix-timeline__item", className), ...props, children: [
1246
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "uix-timeline__rail", children: [
1247
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "uix-timeline__node" }),
1248
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "uix-timeline__line" })
858
1249
  ] }),
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 }),
1250
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "uix-timeline__body", children: [
1251
+ meta != null && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "uix-timeline__meta", children: meta }),
861
1252
  children
862
1253
  ] })
863
1254
  ] });
864
1255
  }
865
1256
 
866
1257
  // src/components/Prose.tsx
867
- var import_jsx_runtime34 = require("react/jsx-runtime");
1258
+ var import_jsx_runtime36 = require("react/jsx-runtime");
868
1259
  function Prose({ children, className, ...props }) {
869
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: cx("uix-prose", className), ...props, children });
1260
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: cx("uix-prose", className), ...props, children });
870
1261
  }
871
1262
  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 })
1263
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cx("uix-note", tone && `uix-note--${tone}`, className), ...props, children: [
1264
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "uix-note__icon", children: icon }),
1265
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "uix-note__body", children })
875
1266
  ] });
876
1267
  }
877
1268
 
878
1269
  // src/components/Popover.tsx
879
- var import_jsx_runtime35 = require("react/jsx-runtime");
1270
+ var import_jsx_runtime37 = require("react/jsx-runtime");
880
1271
  function Popover({ popover = "auto", children, className, ...props }) {
881
1272
  const popoverAttr = { popover };
882
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: cx("uix-popover", className), ...popoverAttr, ...props, children });
1273
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: cx("uix-popover", className), ...popoverAttr, ...props, children });
883
1274
  }
884
1275
 
885
1276
  // src/components/CommandPalette.tsx
886
- var import_jsx_runtime36 = require("react/jsx-runtime");
1277
+ var import_jsx_runtime38 = require("react/jsx-runtime");
887
1278
  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 })
1279
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: cx("uix-cmdk", className), ...props, children: [
1280
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("input", { className: "uix-cmdk__input", ...inputProps }),
1281
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "uix-cmdk__list", children })
891
1282
  ] });
892
1283
  }
893
1284
  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 }),
1285
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
1286
+ label != null && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "uix-cmdk__group", children: label }),
896
1287
  children
897
1288
  ] });
898
1289
  }
899
1290
  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: [
1291
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: cx("uix-cmdk__item", className), "data-active": active || void 0, ...props, children: [
901
1292
  icon,
902
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { children }),
1293
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { children }),
903
1294
  shortcut
904
1295
  ] });
905
1296
  }
906
1297
 
907
1298
  // src/components/Kanban.tsx
908
- var import_jsx_runtime37 = require("react/jsx-runtime");
1299
+ var import_jsx_runtime39 = require("react/jsx-runtime");
909
1300
  function Kanban({ children, className, ...props }) {
910
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: cx("uix-kanban", className), ...props, children });
1301
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: cx("uix-kanban", className), ...props, children });
911
1302
  }
912
1303
  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: [
1304
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: cx("uix-kanban__col", className), ...props, children: [
1305
+ (title != null || count != null) && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "uix-kanban__head", children: [
915
1306
  title,
916
- count != null && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "uix-kanban__count", children: count })
1307
+ count != null && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "uix-kanban__count", children: count })
917
1308
  ] }),
918
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "uix-kanban__body", children })
1309
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "uix-kanban__body", children })
919
1310
  ] });
920
1311
  }
921
1312
  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 }),
1313
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: cx("uix-kanban__card", className), ...props, children: [
1314
+ title && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "uix-kanban__card-title", children: title }),
1315
+ meta && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "uix-kanban__card-meta", children: meta }),
925
1316
  children
926
1317
  ] });
927
1318
  }
928
1319
 
929
1320
  // 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" }) });
1321
+ var import_react13 = require("react");
1322
+ var import_jsx_runtime40 = require("react/jsx-runtime");
1323
+ var ChevronIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime40.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_runtime40.jsx)("path", { d: "M2 4l4 4 4-4" }) });
933
1324
  function TreeNode({ node, expanded, selected, onToggle, onSelect, level = 0 }) {
934
1325
  const hasChildren = Array.isArray(node.children) && node.children.length > 0;
935
1326
  const isExpanded = expanded.has(node.id);
936
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("li", { children: [
937
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
1327
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("li", { children: [
1328
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
938
1329
  "button",
939
1330
  {
940
1331
  className: "uix-tree__row",
@@ -945,13 +1336,13 @@ function TreeNode({ node, expanded, selected, onToggle, onSelect, level = 0 }) {
945
1336
  onSelect?.(node.id);
946
1337
  },
947
1338
  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 }),
1339
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "uix-tree__toggle", children: hasChildren && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(ChevronIcon2, {}) }),
1340
+ node.icon && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { "aria-hidden": "true", children: node.icon }),
950
1341
  node.label
951
1342
  ]
952
1343
  }
953
1344
  ),
954
- hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("ul", { children: node.children.map((child) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1345
+ hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("ul", { children: node.children.map((child) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
955
1346
  TreeNode,
956
1347
  {
957
1348
  node: child,
@@ -966,7 +1357,7 @@ function TreeNode({ node, expanded, selected, onToggle, onSelect, level = 0 }) {
966
1357
  ] });
967
1358
  }
968
1359
  function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected, onToggle, onSelect, className, ...props }) {
969
- const [internalExpanded, setInternalExpanded] = (0, import_react12.useState)(defaultExpanded ?? /* @__PURE__ */ new Set());
1360
+ const [internalExpanded, setInternalExpanded] = (0, import_react13.useState)(defaultExpanded ?? /* @__PURE__ */ new Set());
970
1361
  const expanded = controlledExpanded ?? internalExpanded;
971
1362
  function handleToggle(id) {
972
1363
  if (!controlledExpanded) {
@@ -979,7 +1370,7 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
979
1370
  }
980
1371
  onToggle?.(id);
981
1372
  }
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)(
1373
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("ul", { className: cx("uix-tree", className), role: "tree", ...props, children: nodes.map((node) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
983
1374
  TreeNode,
984
1375
  {
985
1376
  node,
@@ -1023,6 +1414,7 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
1023
1414
  ListItem,
1024
1415
  LoadingState,
1025
1416
  Modal,
1417
+ NavFavourites,
1026
1418
  NavGroup,
1027
1419
  NavItem,
1028
1420
  Note,
@@ -1039,6 +1431,7 @@ function Tree({ nodes, expanded: controlledExpanded, defaultExpanded, selected,
1039
1431
  SidebarSection,
1040
1432
  Skeleton,
1041
1433
  Spinner,
1434
+ StarButton,
1042
1435
  Stat,
1043
1436
  StatusPill,
1044
1437
  SubNavItem,