@cytario/design 1.15.0 → 1.17.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.js CHANGED
@@ -837,12 +837,26 @@ var variantConfig = {
837
837
  iconClass: "text-[var(--color-text-info)]"
838
838
  }
839
839
  };
840
+ var PlacementContext = createContext2("bottom-right");
841
+ var exitAnimationByPlacement = {
842
+ "top-center": "-translate-y-full opacity-0",
843
+ "top-right": "translate-x-full opacity-0",
844
+ "bottom-center": "translate-y-full opacity-0",
845
+ "bottom-right": "translate-x-full opacity-0"
846
+ };
847
+ var enterAnimationByPlacement = {
848
+ "top-center": "translate-y-0 opacity-100 animate-in slide-in-from-top",
849
+ "top-right": "translate-x-0 opacity-100 animate-in slide-in-from-right",
850
+ "bottom-center": "translate-y-0 opacity-100 animate-in slide-in-from-bottom",
851
+ "bottom-right": "translate-x-0 opacity-100 animate-in slide-in-from-right"
852
+ };
840
853
  function ToastItem({
841
854
  toast,
842
855
  onRemove
843
856
  }) {
844
857
  const [isExiting, setIsExiting] = useState(false);
845
858
  const timerRef = useRef(null);
859
+ const placement = useContext2(PlacementContext);
846
860
  const config = variantConfig[toast.variant];
847
861
  const IconComponent = config.icon;
848
862
  const dismiss = useCallback(() => {
@@ -865,7 +879,7 @@ function ToastItem({
865
879
  "flex items-start gap-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-3)] shadow-md",
866
880
  "min-w-[320px] max-w-[420px]",
867
881
  "transition-all duration-200",
868
- isExiting ? "translate-x-full opacity-0" : "translate-x-0 opacity-100 animate-in slide-in-from-right",
882
+ isExiting ? exitAnimationByPlacement[placement] : enterAnimationByPlacement[placement],
869
883
  config.containerClass
870
884
  ].join(" "),
871
885
  children: [
@@ -885,10 +899,20 @@ function ToastItem({
885
899
  }
886
900
  );
887
901
  }
888
- function ToastContainer({ toasts, removeToast }) {
902
+ var containerPositionStyles = {
903
+ "top-center": "fixed top-4 left-1/2 -translate-x-1/2 z-50 flex flex-col-reverse gap-2 items-center",
904
+ "top-right": "fixed top-4 right-4 z-50 flex flex-col-reverse gap-2",
905
+ "bottom-center": "fixed bottom-4 left-1/2 -translate-x-1/2 z-50 flex flex-col gap-2 items-center",
906
+ "bottom-right": "fixed bottom-4 right-4 z-50 flex flex-col gap-2"
907
+ };
908
+ function ToastContainer({
909
+ toasts,
910
+ removeToast,
911
+ placement = "bottom-right"
912
+ }) {
889
913
  if (toasts.length === 0) return null;
890
914
  return createPortal(
891
- /* @__PURE__ */ jsx10("div", { className: "fixed bottom-4 right-4 z-50 flex flex-col gap-2", children: toasts.map((toast) => /* @__PURE__ */ jsx10(ToastItem, { toast, onRemove: removeToast }, toast.id)) }),
915
+ /* @__PURE__ */ jsx10(PlacementContext.Provider, { value: placement, children: /* @__PURE__ */ jsx10("div", { className: containerPositionStyles[placement], children: toasts.map((toast) => /* @__PURE__ */ jsx10(ToastItem, { toast, onRemove: removeToast }, toast.id)) }) }),
892
916
  document.body
893
917
  );
894
918
  }
@@ -906,7 +930,7 @@ function createToastBridge() {
906
930
  }
907
931
  };
908
932
  }
909
- function ToastProvider({ children, bridge }) {
933
+ function ToastProvider({ children, bridge, placement = "bottom-right" }) {
910
934
  const [toasts, setToasts] = useState([]);
911
935
  const addToast = useCallback((toast) => {
912
936
  const id = `toast-${++toastCounter}`;
@@ -921,7 +945,7 @@ function ToastProvider({ children, bridge }) {
921
945
  }, [bridge, addToast]);
922
946
  return /* @__PURE__ */ jsxs8(ToastContext.Provider, { value: { toasts, addToast, removeToast }, children: [
923
947
  children,
924
- /* @__PURE__ */ jsx10(ToastContainer, { toasts, removeToast })
948
+ /* @__PURE__ */ jsx10(ToastContainer, { toasts, removeToast, placement })
925
949
  ] });
926
950
  }
927
951
  function useToast() {
@@ -1592,6 +1616,78 @@ function ToggleButton({
1592
1616
  );
1593
1617
  }
1594
1618
 
1619
+ // src/components/ToggleButtonGroup/ToggleButtonGroup.tsx
1620
+ import { createContext as createContext3, useContext as useContext3 } from "react";
1621
+ import { twMerge as twMerge5 } from "tailwind-merge";
1622
+ import {
1623
+ RadioGroup as AriaRadioGroup2,
1624
+ Radio as AriaRadio2
1625
+ } from "react-aria-components";
1626
+ import { jsx as jsx25 } from "react/jsx-runtime";
1627
+ var ToggleButtonGroupContext = createContext3({
1628
+ size: "md"
1629
+ });
1630
+ var sizeStyles5 = {
1631
+ sm: "px-2.5 py-1 text-xs gap-1",
1632
+ md: "px-3 py-1.5 text-sm gap-1.5",
1633
+ lg: "px-4 py-2 text-base gap-2"
1634
+ };
1635
+ var iconOnlySizeStyles = {
1636
+ sm: "p-1",
1637
+ md: "p-1.5",
1638
+ lg: "p-2"
1639
+ };
1640
+ function ToggleButtonGroup({
1641
+ size = "md",
1642
+ className,
1643
+ children,
1644
+ ...props
1645
+ }) {
1646
+ return /* @__PURE__ */ jsx25(ToggleButtonGroupContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx25(
1647
+ AriaRadioGroup2,
1648
+ {
1649
+ ...props,
1650
+ orientation: "horizontal",
1651
+ className: twMerge5(
1652
+ "inline-flex items-center rounded-[var(--border-radius-lg)] border border-[var(--color-border-default)] bg-[var(--color-surface-muted)] p-0.5 gap-0.5",
1653
+ className
1654
+ ),
1655
+ children
1656
+ }
1657
+ ) });
1658
+ }
1659
+ function ToggleButtonGroupItem({
1660
+ children,
1661
+ isIconOnly,
1662
+ className,
1663
+ ...props
1664
+ }) {
1665
+ const { size } = useContext3(ToggleButtonGroupContext);
1666
+ return /* @__PURE__ */ jsx25(
1667
+ AriaRadio2,
1668
+ {
1669
+ ...props,
1670
+ className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge5(
1671
+ // Base layout
1672
+ "inline-flex items-center justify-center",
1673
+ "rounded-[var(--border-radius-md)]",
1674
+ "font-[var(--font-weight-medium)]",
1675
+ "outline-none transition-colors cursor-pointer",
1676
+ // Focus ring
1677
+ "focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-1",
1678
+ // Disabled
1679
+ isDisabled && "opacity-50 pointer-events-none",
1680
+ // Size
1681
+ isIconOnly ? iconOnlySizeStyles[size] : sizeStyles5[size],
1682
+ // Selected state
1683
+ isSelected ? "bg-[var(--color-surface-default)] text-[var(--color-text-primary)] shadow-sm font-[var(--font-weight-semibold)]" : isPressed ? "bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]" : isHovered ? "bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]" : "bg-transparent text-[var(--color-text-secondary)]",
1684
+ className
1685
+ ),
1686
+ children
1687
+ }
1688
+ );
1689
+ }
1690
+
1595
1691
  // src/components/Menu/Menu.tsx
1596
1692
  import {
1597
1693
  MenuTrigger,
@@ -1599,29 +1695,42 @@ import {
1599
1695
  MenuItem as AriaMenuItem,
1600
1696
  Popover as Popover2
1601
1697
  } from "react-aria-components";
1602
- import { jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
1603
- function Menu({ items, children, className }) {
1698
+ import { jsx as jsx26, jsxs as jsxs18 } from "react/jsx-runtime";
1699
+ var popoverStyles = [
1700
+ "bg-[var(--color-surface-default)] rounded-[var(--border-radius-md)]",
1701
+ "shadow-lg border border-[var(--color-border-default)]",
1702
+ "py-1 min-w-48",
1703
+ "entering:animate-in entering:fade-in entering:zoom-in-95",
1704
+ "exiting:animate-out exiting:fade-out exiting:zoom-out-95"
1705
+ ].join(" ");
1706
+ function Menu({
1707
+ items,
1708
+ content,
1709
+ children,
1710
+ onAction,
1711
+ selectionMode,
1712
+ selectedKeys,
1713
+ defaultSelectedKeys,
1714
+ onSelectionChange,
1715
+ className
1716
+ }) {
1717
+ const selectionProps = selectionMode && selectionMode !== "none" ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange } : {};
1604
1718
  return /* @__PURE__ */ jsxs18(MenuTrigger, { children: [
1605
1719
  children,
1606
- /* @__PURE__ */ jsx25(
1720
+ /* @__PURE__ */ jsx26(
1607
1721
  Popover2,
1608
1722
  {
1609
- className: [
1610
- "bg-[var(--color-surface-default)] rounded-[var(--border-radius-md)]",
1611
- "shadow-lg border border-[var(--color-border-default)]",
1612
- "py-1 min-w-48",
1613
- "entering:animate-in entering:fade-in entering:zoom-in-95",
1614
- "exiting:animate-out exiting:fade-out exiting:zoom-out-95",
1615
- className
1616
- ].filter(Boolean).join(" "),
1617
- children: /* @__PURE__ */ jsx25(
1723
+ className: [popoverStyles, className].filter(Boolean).join(" "),
1724
+ children: items ? /* @__PURE__ */ jsx26(
1618
1725
  AriaMenu,
1619
1726
  {
1620
1727
  items,
1621
1728
  onAction: (key) => {
1622
1729
  const item = items.find((i) => i.id === key);
1623
1730
  item?.onAction?.();
1731
+ onAction?.(key);
1624
1732
  },
1733
+ ...selectionProps,
1625
1734
  className: "outline-none",
1626
1735
  children: (item) => /* @__PURE__ */ jsxs18(
1627
1736
  AriaMenuItem,
@@ -1639,18 +1748,157 @@ function Menu({ items, children, className }) {
1639
1748
  item.isDanger ? "text-[var(--color-text-danger)]" : "text-[var(--color-text-primary)]"
1640
1749
  ].filter(Boolean).join(" "),
1641
1750
  children: [
1642
- item.icon && /* @__PURE__ */ jsx25(Icon, { icon: item.icon, size: "sm" }),
1643
- item.label
1751
+ item.icon && /* @__PURE__ */ jsx26(Icon, { icon: item.icon, size: "sm" }),
1752
+ /* @__PURE__ */ jsx26("span", { className: "flex-1", children: item.label }),
1753
+ item.endContent && /* @__PURE__ */ jsx26("span", { className: "ml-auto flex items-center", children: item.endContent })
1644
1754
  ]
1645
1755
  }
1646
1756
  )
1647
1757
  }
1758
+ ) : /* @__PURE__ */ jsx26(
1759
+ AriaMenu,
1760
+ {
1761
+ onAction: (key) => onAction?.(key),
1762
+ ...selectionProps,
1763
+ className: "outline-none",
1764
+ children: content
1765
+ }
1648
1766
  )
1649
1767
  }
1650
1768
  )
1651
1769
  ] });
1652
1770
  }
1653
1771
 
1772
+ // src/components/Menu/MenuItem.tsx
1773
+ import { MenuItem as AriaMenuItem2 } from "react-aria-components";
1774
+ import { jsx as jsx27, jsxs as jsxs19 } from "react/jsx-runtime";
1775
+ function MenuItem({
1776
+ id,
1777
+ children,
1778
+ icon,
1779
+ endContent,
1780
+ onAction,
1781
+ href,
1782
+ target,
1783
+ isDisabled,
1784
+ isDanger,
1785
+ textValue,
1786
+ className
1787
+ }) {
1788
+ return /* @__PURE__ */ jsxs19(
1789
+ AriaMenuItem2,
1790
+ {
1791
+ id,
1792
+ href,
1793
+ target,
1794
+ isDisabled,
1795
+ onAction,
1796
+ textValue,
1797
+ className: [
1798
+ "flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default",
1799
+ "transition-colors",
1800
+ "focus:bg-[var(--color-surface-muted)]",
1801
+ "hover:bg-[var(--color-surface-muted)]",
1802
+ "disabled:opacity-50 disabled:pointer-events-none",
1803
+ isDanger ? "text-[var(--color-text-danger)]" : "text-[var(--color-text-primary)]",
1804
+ className
1805
+ ].filter(Boolean).join(" "),
1806
+ children: [
1807
+ icon && /* @__PURE__ */ jsx27(Icon, { icon, size: "sm" }),
1808
+ /* @__PURE__ */ jsx27("span", { className: "flex-1", children }),
1809
+ endContent && /* @__PURE__ */ jsx27("span", { className: "ml-auto flex items-center", children: endContent })
1810
+ ]
1811
+ }
1812
+ );
1813
+ }
1814
+
1815
+ // src/components/Menu/MenuCheckboxItem.tsx
1816
+ import { MenuItem as AriaMenuItem3 } from "react-aria-components";
1817
+ import { Check as Check2 } from "lucide-react";
1818
+ import { Fragment as Fragment7, jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
1819
+ function MenuCheckboxItem({
1820
+ id,
1821
+ children,
1822
+ textValue,
1823
+ isDisabled,
1824
+ className
1825
+ }) {
1826
+ return /* @__PURE__ */ jsx28(
1827
+ AriaMenuItem3,
1828
+ {
1829
+ id,
1830
+ textValue,
1831
+ isDisabled,
1832
+ className: ({ isSelected }) => [
1833
+ "flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default",
1834
+ "transition-colors",
1835
+ "focus:bg-[var(--color-surface-muted)]",
1836
+ "hover:bg-[var(--color-surface-muted)]",
1837
+ "disabled:opacity-50 disabled:pointer-events-none",
1838
+ "text-[var(--color-text-primary)]",
1839
+ isSelected ? "font-[number:var(--font-weight-medium)]" : "",
1840
+ className
1841
+ ].filter(Boolean).join(" "),
1842
+ children: ({ isSelected }) => /* @__PURE__ */ jsxs20(Fragment7, { children: [
1843
+ /* @__PURE__ */ jsx28("span", { className: "flex items-center justify-center w-4 h-4 shrink-0", children: isSelected && /* @__PURE__ */ jsx28(Check2, { size: 14, className: "text-[var(--color-action-primary)]", "aria-hidden": "true" }) }),
1844
+ /* @__PURE__ */ jsx28("span", { className: "flex-1", children })
1845
+ ] })
1846
+ }
1847
+ );
1848
+ }
1849
+
1850
+ // src/components/Menu/MenuSection.tsx
1851
+ import {
1852
+ MenuSection as AriaMenuSection,
1853
+ Header
1854
+ } from "react-aria-components";
1855
+ import { jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
1856
+ function MenuSection({
1857
+ header,
1858
+ children,
1859
+ "aria-label": ariaLabel,
1860
+ className
1861
+ }) {
1862
+ return /* @__PURE__ */ jsxs21(AriaMenuSection, { className, "aria-label": ariaLabel, children: [
1863
+ header && /* @__PURE__ */ jsx29(
1864
+ Header,
1865
+ {
1866
+ className: [
1867
+ "px-3 py-1.5",
1868
+ "text-[length:var(--font-size-xs)] font-[number:var(--font-weight-semibold)]",
1869
+ "text-[var(--color-text-secondary)]",
1870
+ "uppercase tracking-wider",
1871
+ "select-none"
1872
+ ].join(" "),
1873
+ children: header
1874
+ }
1875
+ ),
1876
+ children
1877
+ ] });
1878
+ }
1879
+
1880
+ // src/components/Menu/MenuHeader.tsx
1881
+ import { Header as Header2 } from "react-aria-components";
1882
+ import { jsx as jsx30 } from "react/jsx-runtime";
1883
+ function MenuHeader({ children, className }) {
1884
+ return /* @__PURE__ */ jsx30(Header2, { className, children });
1885
+ }
1886
+
1887
+ // src/components/Menu/MenuSeparator.tsx
1888
+ import { Separator } from "react-aria-components";
1889
+ import { jsx as jsx31 } from "react/jsx-runtime";
1890
+ function MenuSeparator({ className }) {
1891
+ return /* @__PURE__ */ jsx31(
1892
+ Separator,
1893
+ {
1894
+ className: [
1895
+ "border-t border-[var(--color-border-default)] my-1",
1896
+ className
1897
+ ].filter(Boolean).join(" ")
1898
+ }
1899
+ );
1900
+ }
1901
+
1654
1902
  // src/components/Popover/Popover.tsx
1655
1903
  import {
1656
1904
  DialogTrigger,
@@ -1658,12 +1906,12 @@ import {
1658
1906
  Dialog as AriaDialog2,
1659
1907
  Button as AriaButton3
1660
1908
  } from "react-aria-components";
1661
- import { Fragment as Fragment7, jsx as jsx26 } from "react/jsx-runtime";
1909
+ import { Fragment as Fragment8, jsx as jsx32 } from "react/jsx-runtime";
1662
1910
  function Popover3({ children, isOpen, onOpenChange }) {
1663
- return /* @__PURE__ */ jsx26(DialogTrigger, { isOpen, onOpenChange, children });
1911
+ return /* @__PURE__ */ jsx32(DialogTrigger, { isOpen, onOpenChange, children });
1664
1912
  }
1665
1913
  function PopoverTrigger({ children, className }) {
1666
- return /* @__PURE__ */ jsx26(
1914
+ return /* @__PURE__ */ jsx32(
1667
1915
  AriaButton3,
1668
1916
  {
1669
1917
  className: [
@@ -1681,7 +1929,7 @@ function PopoverContent({
1681
1929
  className,
1682
1930
  children
1683
1931
  }) {
1684
- return /* @__PURE__ */ jsx26(
1932
+ return /* @__PURE__ */ jsx32(
1685
1933
  AriaPopover,
1686
1934
  {
1687
1935
  placement,
@@ -1698,26 +1946,26 @@ function PopoverContent({
1698
1946
  "entering:placement-right:slide-in-from-left-1",
1699
1947
  className
1700
1948
  ].filter(Boolean).join(" "),
1701
- children: /* @__PURE__ */ jsx26(AriaDialog2, { className: "outline-none", children: ({ close }) => /* @__PURE__ */ jsx26(Fragment7, { children: typeof children === "function" ? children({ close }) : children }) })
1949
+ children: /* @__PURE__ */ jsx32(AriaDialog2, { className: "outline-none", children: ({ close }) => /* @__PURE__ */ jsx32(Fragment8, { children: typeof children === "function" ? children({ close }) : children }) })
1702
1950
  }
1703
1951
  );
1704
1952
  }
1705
1953
 
1706
1954
  // src/components/Tabs/Tabs.tsx
1707
- import { createContext as createContext3, useContext as useContext3 } from "react";
1708
- import { twMerge as twMerge5 } from "tailwind-merge";
1955
+ import { createContext as createContext4, useContext as useContext4 } from "react";
1956
+ import { twMerge as twMerge6 } from "tailwind-merge";
1709
1957
  import {
1710
1958
  Tabs as AriaTabs,
1711
1959
  TabList as AriaTabList,
1712
1960
  Tab as AriaTab,
1713
1961
  TabPanel as AriaTabPanel
1714
1962
  } from "react-aria-components";
1715
- import { jsx as jsx27 } from "react/jsx-runtime";
1716
- var TabsContext = createContext3({
1963
+ import { jsx as jsx33 } from "react/jsx-runtime";
1964
+ var TabsContext = createContext4({
1717
1965
  variant: "underline",
1718
1966
  size: "md"
1719
1967
  });
1720
- var sizeStyles5 = {
1968
+ var sizeStyles6 = {
1721
1969
  sm: "px-3 py-1.5 text-sm",
1722
1970
  md: "px-4 py-2 text-base",
1723
1971
  lg: "px-6 py-3 text-lg"
@@ -1730,12 +1978,12 @@ function Tabs({
1730
1978
  children,
1731
1979
  ...props
1732
1980
  }) {
1733
- return /* @__PURE__ */ jsx27(TabsContext.Provider, { value: { variant, size }, children: /* @__PURE__ */ jsx27(
1981
+ return /* @__PURE__ */ jsx33(TabsContext.Provider, { value: { variant, size }, children: /* @__PURE__ */ jsx33(
1734
1982
  AriaTabs,
1735
1983
  {
1736
1984
  ...props,
1737
1985
  orientation,
1738
- className: twMerge5(
1986
+ className: twMerge6(
1739
1987
  orientation === "vertical" ? "flex" : "",
1740
1988
  className
1741
1989
  ),
@@ -1747,14 +1995,14 @@ function TabList({
1747
1995
  className,
1748
1996
  ...props
1749
1997
  }) {
1750
- const { variant } = useContext3(TabsContext);
1998
+ const { variant } = useContext4(TabsContext);
1751
1999
  const baseStyles = variant === "unstyled" ? "flex items-center" : variant === "underline" ? "flex items-center border-b border-[var(--color-border-default)]" : "inline-flex items-center bg-[var(--color-surface-muted)] rounded-[var(--border-radius-lg)] p-1 gap-1";
1752
2000
  const verticalStyles = variant === "unstyled" ? "flex-col" : variant === "underline" ? "flex-col border-b-0 border-r border-[var(--color-border-default)]" : "flex-col";
1753
- return /* @__PURE__ */ jsx27(
2001
+ return /* @__PURE__ */ jsx33(
1754
2002
  AriaTabList,
1755
2003
  {
1756
2004
  ...props,
1757
- className: ({ orientation }) => twMerge5(
2005
+ className: ({ orientation }) => twMerge6(
1758
2006
  baseStyles,
1759
2007
  orientation === "vertical" ? verticalStyles : "",
1760
2008
  className
@@ -1763,21 +2011,21 @@ function TabList({
1763
2011
  );
1764
2012
  }
1765
2013
  function Tab({ className, ...props }) {
1766
- const { variant, size } = useContext3(TabsContext);
1767
- return /* @__PURE__ */ jsx27(
2014
+ const { variant, size } = useContext4(TabsContext);
2015
+ return /* @__PURE__ */ jsx33(
1768
2016
  AriaTab,
1769
2017
  {
1770
2018
  ...props,
1771
2019
  className: ({ isSelected, isDisabled, isHovered, isPressed }) => {
1772
2020
  if (variant === "unstyled") {
1773
- return twMerge5(
2021
+ return twMerge6(
1774
2022
  "cursor-pointer outline-none",
1775
2023
  "focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2",
1776
2024
  isDisabled ? "opacity-50 pointer-events-none" : "",
1777
2025
  className
1778
2026
  );
1779
2027
  }
1780
- return twMerge5(
2028
+ return twMerge6(
1781
2029
  // Base
1782
2030
  "cursor-pointer outline-none transition-colors",
1783
2031
  "font-[var(--font-weight-medium)]",
@@ -1786,7 +2034,7 @@ function Tab({ className, ...props }) {
1786
2034
  // Disabled
1787
2035
  isDisabled ? "opacity-50 pointer-events-none" : "",
1788
2036
  // Size
1789
- sizeStyles5[size],
2037
+ sizeStyles6[size],
1790
2038
  ...getTabVariantStyles(variant, {
1791
2039
  isSelected,
1792
2040
  isHovered,
@@ -1820,12 +2068,12 @@ function getTabVariantStyles(variant, state) {
1820
2068
  ];
1821
2069
  }
1822
2070
  function TabPanel({ className, ...props }) {
1823
- const { variant } = useContext3(TabsContext);
1824
- return /* @__PURE__ */ jsx27(
2071
+ const { variant } = useContext4(TabsContext);
2072
+ return /* @__PURE__ */ jsx33(
1825
2073
  AriaTabPanel,
1826
2074
  {
1827
2075
  ...props,
1828
- className: twMerge5(
2076
+ className: twMerge6(
1829
2077
  variant === "unstyled" ? "outline-none" : "mt-4 outline-none",
1830
2078
  className
1831
2079
  )
@@ -1845,8 +2093,8 @@ import {
1845
2093
  import { useCallback as useCallback2, useImperativeHandle, useRef as useRef2, useState as useState2 } from "react";
1846
2094
  import { Tree as ArboristTree } from "react-arborist";
1847
2095
  import { ChevronRight as ChevronRight2, Folder, File } from "lucide-react";
1848
- import { Check as Check2 } from "lucide-react";
1849
- import { jsx as jsx28, jsxs as jsxs19 } from "react/jsx-runtime";
2096
+ import { Check as Check3 } from "lucide-react";
2097
+ import { jsx as jsx34, jsxs as jsxs22 } from "react/jsx-runtime";
1850
2098
  var rowHeightMap = {
1851
2099
  compact: 32,
1852
2100
  comfortable: 40
@@ -1869,7 +2117,7 @@ function NodeRenderer({
1869
2117
  const isSelected = node.isSelected && !isCheckbox;
1870
2118
  const isCompact = size === "compact";
1871
2119
  const IconComponent = data.icon ? data.icon : node.isInternal ? Folder : File;
1872
- return /* @__PURE__ */ jsxs19(
2120
+ return /* @__PURE__ */ jsxs22(
1873
2121
  "div",
1874
2122
  {
1875
2123
  ref: dragHandle,
@@ -1904,7 +2152,7 @@ function NodeRenderer({
1904
2152
  }
1905
2153
  },
1906
2154
  children: [
1907
- /* @__PURE__ */ jsx28(
2155
+ /* @__PURE__ */ jsx34(
1908
2156
  "button",
1909
2157
  {
1910
2158
  type: "button",
@@ -1922,7 +2170,7 @@ function NodeRenderer({
1922
2170
  },
1923
2171
  tabIndex: -1,
1924
2172
  "aria-label": node.isOpen ? "Collapse" : "Expand",
1925
- children: /* @__PURE__ */ jsx28(
2173
+ children: /* @__PURE__ */ jsx34(
1926
2174
  ChevronRight2,
1927
2175
  {
1928
2176
  size: 14,
@@ -1934,7 +2182,7 @@ function NodeRenderer({
1934
2182
  )
1935
2183
  }
1936
2184
  ),
1937
- isCheckbox && /* @__PURE__ */ jsx28(
2185
+ isCheckbox && /* @__PURE__ */ jsx34(
1938
2186
  "div",
1939
2187
  {
1940
2188
  className: [
@@ -1945,8 +2193,8 @@ function NodeRenderer({
1945
2193
  role: "checkbox",
1946
2194
  "aria-checked": isChecked,
1947
2195
  "aria-label": `Select ${data.name}`,
1948
- children: isChecked && /* @__PURE__ */ jsx28(
1949
- Check2,
2196
+ children: isChecked && /* @__PURE__ */ jsx34(
2197
+ Check3,
1950
2198
  {
1951
2199
  className: "w-3 h-3 text-[var(--color-text-inverse)]",
1952
2200
  strokeWidth: 3
@@ -1954,7 +2202,7 @@ function NodeRenderer({
1954
2202
  )
1955
2203
  }
1956
2204
  ),
1957
- /* @__PURE__ */ jsx28(
2205
+ /* @__PURE__ */ jsx34(
1958
2206
  IconComponent,
1959
2207
  {
1960
2208
  size: 16,
@@ -1962,7 +2210,7 @@ function NodeRenderer({
1962
2210
  "aria-hidden": "true"
1963
2211
  }
1964
2212
  ),
1965
- /* @__PURE__ */ jsx28("span", { className: "truncate", children: data.name })
2213
+ /* @__PURE__ */ jsx34("span", { className: "truncate", children: data.name })
1966
2214
  ]
1967
2215
  }
1968
2216
  );
@@ -2028,13 +2276,13 @@ function Tree({
2028
2276
  );
2029
2277
  const arboristSearchMatch = searchMatch ? (node, term) => searchMatch(node.data, term) : void 0;
2030
2278
  const selectionProp = selectionMode === "single" && selectedIds && selectedIds.size > 0 ? [...selectedIds][0] : void 0;
2031
- return /* @__PURE__ */ jsx28(
2279
+ return /* @__PURE__ */ jsx34(
2032
2280
  "div",
2033
2281
  {
2034
2282
  role: "tree",
2035
2283
  "aria-label": ariaLabel,
2036
2284
  className: ["outline-none overflow-hidden", className].filter(Boolean).join(" "),
2037
- children: /* @__PURE__ */ jsx28(
2285
+ children: /* @__PURE__ */ jsx34(
2038
2286
  ArboristTree,
2039
2287
  {
2040
2288
  ref: internalRef,
@@ -2053,7 +2301,7 @@ function Tree({
2053
2301
  onSelect: handleSelect,
2054
2302
  onActivate: handleActivate,
2055
2303
  disableEdit: true,
2056
- children: (props) => /* @__PURE__ */ jsx28(
2304
+ children: (props) => /* @__PURE__ */ jsx34(
2057
2305
  NodeRenderer,
2058
2306
  {
2059
2307
  ...props,
@@ -2072,17 +2320,17 @@ function Tree({
2072
2320
  }
2073
2321
 
2074
2322
  // src/components/SegmentedControl/SegmentedControl.tsx
2075
- import { createContext as createContext4, useContext as useContext4 } from "react";
2076
- import { twMerge as twMerge6 } from "tailwind-merge";
2323
+ import { createContext as createContext5, useContext as useContext5 } from "react";
2324
+ import { twMerge as twMerge7 } from "tailwind-merge";
2077
2325
  import {
2078
2326
  ToggleButtonGroup as AriaToggleButtonGroup,
2079
2327
  ToggleButton as AriaToggleButton2
2080
2328
  } from "react-aria-components";
2081
- import { jsx as jsx29 } from "react/jsx-runtime";
2082
- var SegmentedControlContext = createContext4({
2329
+ import { jsx as jsx35 } from "react/jsx-runtime";
2330
+ var SegmentedControlContext = createContext5({
2083
2331
  size: "md"
2084
2332
  });
2085
- var sizeStyles6 = {
2333
+ var sizeStyles7 = {
2086
2334
  sm: "px-2.5 py-1 text-xs",
2087
2335
  md: "px-3 py-1.5 text-sm",
2088
2336
  lg: "px-4 py-2 text-base"
@@ -2098,7 +2346,7 @@ function SegmentedControl({
2098
2346
  ...props
2099
2347
  }) {
2100
2348
  const isNoneMode = selectionMode === "none";
2101
- return /* @__PURE__ */ jsx29(SegmentedControlContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx29(
2349
+ return /* @__PURE__ */ jsx35(SegmentedControlContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx35(
2102
2350
  AriaToggleButtonGroup,
2103
2351
  {
2104
2352
  ...props,
@@ -2106,7 +2354,7 @@ function SegmentedControl({
2106
2354
  selectedKeys: isNoneMode ? /* @__PURE__ */ new Set() : selectedKeys,
2107
2355
  defaultSelectedKeys: isNoneMode ? void 0 : defaultSelectedKeys,
2108
2356
  onSelectionChange: isNoneMode ? void 0 : onSelectionChange,
2109
- className: twMerge6(
2357
+ className: twMerge7(
2110
2358
  "inline-flex items-center rounded-[var(--border-radius-lg)] border border-[var(--color-border-default)] bg-[var(--color-surface-muted)] p-0.5 gap-0.5",
2111
2359
  className
2112
2360
  ),
@@ -2118,12 +2366,12 @@ function SegmentedControlItem({
2118
2366
  className,
2119
2367
  ...props
2120
2368
  }) {
2121
- const { size } = useContext4(SegmentedControlContext);
2122
- return /* @__PURE__ */ jsx29(
2369
+ const { size } = useContext5(SegmentedControlContext);
2370
+ return /* @__PURE__ */ jsx35(
2123
2371
  AriaToggleButton2,
2124
2372
  {
2125
2373
  ...props,
2126
- className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge6(
2374
+ className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge7(
2127
2375
  // Base layout
2128
2376
  "inline-flex items-center justify-center",
2129
2377
  "rounded-[var(--border-radius-md)]",
@@ -2134,7 +2382,7 @@ function SegmentedControlItem({
2134
2382
  // Disabled
2135
2383
  isDisabled && "opacity-50 pointer-events-none",
2136
2384
  // Size
2137
- sizeStyles6[size],
2385
+ sizeStyles7[size],
2138
2386
  // Selected state
2139
2387
  isSelected ? "bg-[var(--color-surface-default)] text-[var(--color-text-primary)] shadow-sm font-[var(--font-weight-semibold)]" : isPressed ? "bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]" : isHovered ? "bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]" : "bg-transparent text-[var(--color-text-secondary)]",
2140
2388
  className
@@ -2153,7 +2401,7 @@ import {
2153
2401
  Info as Info2,
2154
2402
  Microscope
2155
2403
  } from "lucide-react";
2156
- import { Fragment as Fragment8, jsx as jsx30, jsxs as jsxs20 } from "react/jsx-runtime";
2404
+ import { Fragment as Fragment9, jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
2157
2405
  function getFileIcon(type, extension) {
2158
2406
  if (type === "directory") return Folder2;
2159
2407
  const ext = (extension ?? "").toLowerCase();
@@ -2179,7 +2427,7 @@ function FileIcon({
2179
2427
  size = 16
2180
2428
  }) {
2181
2429
  const IconComponent = getFileIcon(type, extension);
2182
- return /* @__PURE__ */ jsx30(
2430
+ return /* @__PURE__ */ jsx36(
2183
2431
  IconComponent,
2184
2432
  {
2185
2433
  size,
@@ -2224,14 +2472,14 @@ function FileCard({
2224
2472
  },
2225
2473
  [onPress]
2226
2474
  );
2227
- const cardContent = /* @__PURE__ */ jsxs20(Fragment8, { children: [
2228
- /* @__PURE__ */ jsxs20(
2475
+ const cardContent = /* @__PURE__ */ jsxs23(Fragment9, { children: [
2476
+ /* @__PURE__ */ jsxs23(
2229
2477
  "div",
2230
2478
  {
2231
2479
  className: `shrink-0 relative overflow-hidden bg-[var(--color-neutral-900)] ${thumbnailClass}`,
2232
2480
  children: [
2233
- children ? /* @__PURE__ */ jsx30("div", { className: "h-full w-full overflow-hidden", children }) : /* @__PURE__ */ jsx30("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx30(IconComponent, { size: iconSize, className: iconColor }) }),
2234
- onInfo && /* @__PURE__ */ jsx30(
2481
+ children ? /* @__PURE__ */ jsx36("div", { className: "h-full w-full overflow-hidden", children }) : /* @__PURE__ */ jsx36("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx36(IconComponent, { size: iconSize, className: iconColor }) }),
2482
+ onInfo && /* @__PURE__ */ jsx36(
2235
2483
  "div",
2236
2484
  {
2237
2485
  className: [
@@ -2239,7 +2487,7 @@ function FileCard({
2239
2487
  "transition-opacity duration-150",
2240
2488
  compact ? "bottom-1.5 right-1.5" : "bottom-2 right-2"
2241
2489
  ].join(" "),
2242
- children: /* @__PURE__ */ jsx30(
2490
+ children: /* @__PURE__ */ jsx36(
2243
2491
  "span",
2244
2492
  {
2245
2493
  onClick: handleInfoClick,
@@ -2249,7 +2497,7 @@ function FileCard({
2249
2497
  }
2250
2498
  },
2251
2499
  role: "presentation",
2252
- children: /* @__PURE__ */ jsx30(
2500
+ children: /* @__PURE__ */ jsx36(
2253
2501
  IconButton,
2254
2502
  {
2255
2503
  icon: Info2,
@@ -2267,7 +2515,7 @@ function FileCard({
2267
2515
  ]
2268
2516
  }
2269
2517
  ),
2270
- /* @__PURE__ */ jsx30(
2518
+ /* @__PURE__ */ jsx36(
2271
2519
  "div",
2272
2520
  {
2273
2521
  className: [
@@ -2275,12 +2523,12 @@ function FileCard({
2275
2523
  "bg-[var(--color-surface-default)]",
2276
2524
  compact ? "px-2 py-1.5 rounded-b-[var(--border-radius-md)]" : "gap-0.5 px-3 py-2 rounded-b-[var(--border-radius-lg)]"
2277
2525
  ].join(" "),
2278
- children: compact ? /* @__PURE__ */ jsx30("span", { className: "text-xs font-medium text-[var(--color-text-primary)] truncate", children: name }) : /* @__PURE__ */ jsxs20(Fragment8, { children: [
2279
- /* @__PURE__ */ jsxs20("span", { className: "flex items-center gap-1.5", children: [
2280
- /* @__PURE__ */ jsx30(FileIcon, { type, extension, size: 16 }),
2281
- /* @__PURE__ */ jsx30("span", { className: "text-sm font-medium text-[var(--color-text-primary)] truncate", children: name })
2526
+ children: compact ? /* @__PURE__ */ jsx36("span", { className: "text-xs font-medium text-[var(--color-text-primary)] truncate", children: name }) : /* @__PURE__ */ jsxs23(Fragment9, { children: [
2527
+ /* @__PURE__ */ jsxs23("span", { className: "flex items-center gap-1.5", children: [
2528
+ /* @__PURE__ */ jsx36(FileIcon, { type, extension, size: 16 }),
2529
+ /* @__PURE__ */ jsx36("span", { className: "text-sm font-medium text-[var(--color-text-primary)] truncate", children: name })
2282
2530
  ] }),
2283
- size && /* @__PURE__ */ jsx30("span", { className: "text-xs text-[var(--color-text-secondary)] tabular-nums pl-[22px]", children: size })
2531
+ size && /* @__PURE__ */ jsx36("span", { className: "text-xs text-[var(--color-text-secondary)] tabular-nums pl-[22px]", children: size })
2284
2532
  ] })
2285
2533
  }
2286
2534
  )
@@ -2296,7 +2544,7 @@ function FileCard({
2296
2544
  className
2297
2545
  ].filter(Boolean).join(" ");
2298
2546
  if (href) {
2299
- return /* @__PURE__ */ jsx30(
2547
+ return /* @__PURE__ */ jsx36(
2300
2548
  "a",
2301
2549
  {
2302
2550
  href,
@@ -2307,7 +2555,7 @@ function FileCard({
2307
2555
  );
2308
2556
  }
2309
2557
  if (onPress) {
2310
- return /* @__PURE__ */ jsx30(
2558
+ return /* @__PURE__ */ jsx36(
2311
2559
  "div",
2312
2560
  {
2313
2561
  role: "button",
@@ -2320,17 +2568,17 @@ function FileCard({
2320
2568
  }
2321
2569
  );
2322
2570
  }
2323
- return /* @__PURE__ */ jsx30("div", { className: baseStyles, children: cardContent });
2571
+ return /* @__PURE__ */ jsx36("div", { className: baseStyles, children: cardContent });
2324
2572
  }
2325
2573
 
2326
2574
  // src/components/StorageConnectionCard/StorageConnectionCard.tsx
2327
2575
  import { useCallback as useCallback4 } from "react";
2328
2576
  import { AlertCircle, Database, Info as Info3 } from "lucide-react";
2329
- import { twMerge as twMerge9 } from "tailwind-merge";
2577
+ import { twMerge as twMerge10 } from "tailwind-merge";
2330
2578
 
2331
2579
  // src/components/Pill/Pill.tsx
2332
- import { twMerge as twMerge7 } from "tailwind-merge";
2333
- import { jsx as jsx31 } from "react/jsx-runtime";
2580
+ import { twMerge as twMerge8 } from "tailwind-merge";
2581
+ import { jsx as jsx37 } from "react/jsx-runtime";
2334
2582
  var HASH_PALETTE = [
2335
2583
  "teal",
2336
2584
  // sky
@@ -2381,10 +2629,10 @@ function resolveColor(color, name) {
2381
2629
  }
2382
2630
  function Pill({ children, color, name, className }) {
2383
2631
  const resolved = resolveColor(color, name);
2384
- return /* @__PURE__ */ jsx31(
2632
+ return /* @__PURE__ */ jsx37(
2385
2633
  "span",
2386
2634
  {
2387
- className: twMerge7(
2635
+ className: twMerge8(
2388
2636
  "inline-flex items-center rounded-full",
2389
2637
  "px-2 py-0.5",
2390
2638
  "text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-tight)]",
@@ -2397,8 +2645,8 @@ function Pill({ children, color, name, className }) {
2397
2645
  }
2398
2646
 
2399
2647
  // src/components/Pill/GroupPill.tsx
2400
- import { twMerge as twMerge8 } from "tailwind-merge";
2401
- import { jsx as jsx32, jsxs as jsxs21 } from "react/jsx-runtime";
2648
+ import { twMerge as twMerge9 } from "tailwind-merge";
2649
+ import { jsx as jsx38, jsxs as jsxs24 } from "react/jsx-runtime";
2402
2650
  function GroupPill({
2403
2651
  path,
2404
2652
  visibleCount = 3,
@@ -2409,10 +2657,10 @@ function GroupPill({
2409
2657
  const hiddenCount = Math.max(0, segments.length - visibleCount);
2410
2658
  const hiddenSegments = segments.slice(0, hiddenCount);
2411
2659
  const visibleSegments = segments.slice(hiddenCount);
2412
- return /* @__PURE__ */ jsxs21(
2660
+ return /* @__PURE__ */ jsxs24(
2413
2661
  "span",
2414
2662
  {
2415
- className: twMerge8(
2663
+ className: twMerge9(
2416
2664
  "inline-flex items-center gap-1",
2417
2665
  className
2418
2666
  ),
@@ -2420,10 +2668,10 @@ function GroupPill({
2420
2668
  children: [
2421
2669
  hiddenSegments.map((segment, index) => {
2422
2670
  const color = pillColorFromName(segment);
2423
- return /* @__PURE__ */ jsx32(
2671
+ return /* @__PURE__ */ jsx38(
2424
2672
  "span",
2425
2673
  {
2426
- className: twMerge8(
2674
+ className: twMerge9(
2427
2675
  "inline-block size-2 shrink-0 rounded-full",
2428
2676
  dotColorStyles[color]
2429
2677
  ),
@@ -2433,14 +2681,14 @@ function GroupPill({
2433
2681
  `dot-${index}-${segment}`
2434
2682
  );
2435
2683
  }),
2436
- visibleSegments.map((segment, index) => /* @__PURE__ */ jsx32(Pill, { name: segment, children: segment }, `pill-${index}-${segment}`))
2684
+ visibleSegments.map((segment, index) => /* @__PURE__ */ jsx38(Pill, { name: segment, children: segment }, `pill-${index}-${segment}`))
2437
2685
  ]
2438
2686
  }
2439
2687
  );
2440
2688
  }
2441
2689
 
2442
2690
  // src/components/StorageConnectionCard/StorageConnectionCard.tsx
2443
- import { Fragment as Fragment9, jsx as jsx33, jsxs as jsxs22 } from "react/jsx-runtime";
2691
+ import { Fragment as Fragment10, jsx as jsx39, jsxs as jsxs25 } from "react/jsx-runtime";
2444
2692
  var statusDotStyles = {
2445
2693
  connected: "bg-[var(--color-status-success)]",
2446
2694
  error: "border-2 border-[var(--color-status-danger)] bg-transparent",
@@ -2456,7 +2704,7 @@ function ProviderBadge({ provider }) {
2456
2704
  const config = providerConfig[provider.toLowerCase()];
2457
2705
  const label = config?.label ?? provider;
2458
2706
  const color = config?.color ?? "neutral";
2459
- return /* @__PURE__ */ jsx33(Pill, { color, children: label });
2707
+ return /* @__PURE__ */ jsx39(Pill, { color, children: label });
2460
2708
  }
2461
2709
  function PreviewArea({
2462
2710
  status = "connected",
@@ -2464,11 +2712,11 @@ function PreviewArea({
2464
2712
  children
2465
2713
  }) {
2466
2714
  if (status === "loading") {
2467
- return /* @__PURE__ */ jsx33("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx33(Spinner, { size: "lg", "aria-label": "Loading connection" }) });
2715
+ return /* @__PURE__ */ jsx39("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx39(Spinner, { size: "lg", "aria-label": "Loading connection" }) });
2468
2716
  }
2469
2717
  if (status === "error") {
2470
- return /* @__PURE__ */ jsxs22("div", { className: "flex h-full flex-col items-center justify-center gap-2 bg-[var(--color-surface-danger)] px-4", children: [
2471
- /* @__PURE__ */ jsx33(
2718
+ return /* @__PURE__ */ jsxs25("div", { className: "flex h-full flex-col items-center justify-center gap-2 bg-[var(--color-surface-danger)] px-4", children: [
2719
+ /* @__PURE__ */ jsx39(
2472
2720
  Icon,
2473
2721
  {
2474
2722
  icon: AlertCircle,
@@ -2476,13 +2724,13 @@ function PreviewArea({
2476
2724
  className: "text-[var(--color-text-danger)]"
2477
2725
  }
2478
2726
  ),
2479
- errorMessage && /* @__PURE__ */ jsx33("p", { className: "text-center text-xs text-[var(--color-text-danger)]", children: errorMessage })
2727
+ errorMessage && /* @__PURE__ */ jsx39("p", { className: "text-center text-xs text-[var(--color-text-danger)]", children: errorMessage })
2480
2728
  ] });
2481
2729
  }
2482
2730
  if (children) {
2483
- return /* @__PURE__ */ jsx33("div", { className: "h-full w-full overflow-hidden", children });
2731
+ return /* @__PURE__ */ jsx39("div", { className: "h-full w-full overflow-hidden", children });
2484
2732
  }
2485
- return /* @__PURE__ */ jsx33("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx33(
2733
+ return /* @__PURE__ */ jsx39("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx39(
2486
2734
  Icon,
2487
2735
  {
2488
2736
  icon: Database,
@@ -2524,22 +2772,22 @@ function StorageConnectionCard({
2524
2772
  },
2525
2773
  [onPress]
2526
2774
  );
2527
- const cardContent = /* @__PURE__ */ jsxs22(Fragment9, { children: [
2528
- /* @__PURE__ */ jsx33("div", { className: "aspect-[4/3] bg-[var(--color-neutral-900)] overflow-hidden rounded-t-[var(--border-radius-lg)]", children: /* @__PURE__ */ jsx33(PreviewArea, { status, errorMessage, children }) }),
2529
- /* @__PURE__ */ jsxs22("div", { className: "flex flex-col gap-1.5 border-t border-[var(--color-border-default)] bg-[var(--color-surface-default)] px-3 py-2.5 rounded-b-[var(--border-radius-lg)]", children: [
2530
- /* @__PURE__ */ jsxs22("div", { className: "flex items-start gap-2", children: [
2531
- status && /* @__PURE__ */ jsx33(
2775
+ const cardContent = /* @__PURE__ */ jsxs25(Fragment10, { children: [
2776
+ /* @__PURE__ */ jsx39("div", { className: "aspect-[4/3] bg-[var(--color-neutral-900)] overflow-hidden rounded-t-[var(--border-radius-lg)]", children: /* @__PURE__ */ jsx39(PreviewArea, { status, errorMessage, children }) }),
2777
+ /* @__PURE__ */ jsxs25("div", { className: "flex flex-col gap-1.5 border-t border-[var(--color-border-default)] bg-[var(--color-surface-default)] px-3 py-2.5 rounded-b-[var(--border-radius-lg)]", children: [
2778
+ /* @__PURE__ */ jsxs25("div", { className: "flex items-start gap-2", children: [
2779
+ status && /* @__PURE__ */ jsx39(
2532
2780
  "span",
2533
2781
  {
2534
- className: twMerge9(
2782
+ className: twMerge10(
2535
2783
  "mt-1.5 h-2 w-2 shrink-0 rounded-full",
2536
2784
  statusDotStyles[status]
2537
2785
  ),
2538
2786
  "aria-label": `Status: ${status}`
2539
2787
  }
2540
2788
  ),
2541
- /* @__PURE__ */ jsx33("span", { className: "min-w-0 flex-1 line-clamp-2 text-sm font-medium text-[var(--color-text-primary)]", children: name }),
2542
- onInfo && /* @__PURE__ */ jsx33(
2789
+ /* @__PURE__ */ jsx39("span", { className: "min-w-0 flex-1 line-clamp-2 text-sm font-medium text-[var(--color-text-primary)]", children: name }),
2790
+ onInfo && /* @__PURE__ */ jsx39(
2543
2791
  "span",
2544
2792
  {
2545
2793
  onClick: handleInfoPress,
@@ -2549,7 +2797,7 @@ function StorageConnectionCard({
2549
2797
  }
2550
2798
  },
2551
2799
  role: "presentation",
2552
- children: /* @__PURE__ */ jsx33(
2800
+ children: /* @__PURE__ */ jsx39(
2553
2801
  IconButton,
2554
2802
  {
2555
2803
  icon: Info3,
@@ -2563,10 +2811,10 @@ function StorageConnectionCard({
2563
2811
  }
2564
2812
  )
2565
2813
  ] }),
2566
- (provider || imageCount != null && (!status || status === "connected")) && /* @__PURE__ */ jsxs22("div", { className: twMerge9("flex items-center gap-2", status && "pl-4"), children: [
2567
- provider && /* @__PURE__ */ jsx33(ProviderBadge, { provider }),
2568
- provider && region && /* @__PURE__ */ jsx33("span", { className: "shrink-0 text-xs text-[var(--color-text-secondary)]", children: region }),
2569
- imageCount != null && (!status || status === "connected") && /* @__PURE__ */ jsxs22("span", { className: "ml-auto shrink-0 text-xs tabular-nums text-[var(--color-text-secondary)]", children: [
2814
+ (provider || imageCount != null && (!status || status === "connected")) && /* @__PURE__ */ jsxs25("div", { className: twMerge10("flex items-center gap-2", status && "pl-4"), children: [
2815
+ provider && /* @__PURE__ */ jsx39(ProviderBadge, { provider }),
2816
+ provider && region && /* @__PURE__ */ jsx39("span", { className: "shrink-0 text-xs text-[var(--color-text-secondary)]", children: region }),
2817
+ imageCount != null && (!status || status === "connected") && /* @__PURE__ */ jsxs25("span", { className: "ml-auto shrink-0 text-xs tabular-nums text-[var(--color-text-secondary)]", children: [
2570
2818
  imageCount,
2571
2819
  " ",
2572
2820
  imageCount === 1 ? "image" : "images"
@@ -2574,7 +2822,7 @@ function StorageConnectionCard({
2574
2822
  ] })
2575
2823
  ] })
2576
2824
  ] });
2577
- const baseStyles = twMerge9(
2825
+ const baseStyles = twMerge10(
2578
2826
  "flex flex-col overflow-hidden rounded-[var(--border-radius-lg)]",
2579
2827
  "border border-[var(--color-border-default)]",
2580
2828
  "shadow-sm transition-all",
@@ -2583,10 +2831,10 @@ function StorageConnectionCard({
2583
2831
  className
2584
2832
  );
2585
2833
  if (href) {
2586
- return /* @__PURE__ */ jsx33("a", { href, className: twMerge9(baseStyles, "no-underline"), children: cardContent });
2834
+ return /* @__PURE__ */ jsx39("a", { href, className: twMerge10(baseStyles, "no-underline"), children: cardContent });
2587
2835
  }
2588
2836
  if (onPress) {
2589
- return /* @__PURE__ */ jsx33(
2837
+ return /* @__PURE__ */ jsx39(
2590
2838
  "div",
2591
2839
  {
2592
2840
  role: "button",
@@ -2598,12 +2846,12 @@ function StorageConnectionCard({
2598
2846
  }
2599
2847
  );
2600
2848
  }
2601
- return /* @__PURE__ */ jsx33("div", { className: baseStyles, children: cardContent });
2849
+ return /* @__PURE__ */ jsx39("div", { className: baseStyles, children: cardContent });
2602
2850
  }
2603
2851
 
2604
2852
  // src/components/Badge/Badge.tsx
2605
- import { twMerge as twMerge10 } from "tailwind-merge";
2606
- import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
2853
+ import { twMerge as twMerge11 } from "tailwind-merge";
2854
+ import { jsx as jsx40, jsxs as jsxs26 } from "react/jsx-runtime";
2607
2855
  var variantStyles4 = {
2608
2856
  neutral: "bg-[var(--color-badge-neutral-bg)] text-[var(--color-badge-neutral-text)]",
2609
2857
  purple: "bg-[var(--color-badge-purple-bg)] text-[var(--color-badge-purple-text)]",
@@ -2613,7 +2861,7 @@ var variantStyles4 = {
2613
2861
  green: "bg-[var(--color-badge-green-bg)] text-[var(--color-badge-green-text)]",
2614
2862
  amber: "bg-[var(--color-badge-amber-bg)] text-[var(--color-badge-amber-text)]"
2615
2863
  };
2616
- var sizeStyles7 = {
2864
+ var sizeStyles8 = {
2617
2865
  sm: "px-1.5 py-0.5",
2618
2866
  md: "px-2 py-0.5"
2619
2867
  };
@@ -2628,18 +2876,18 @@ function Badge({
2628
2876
  icon: IconComponent,
2629
2877
  className
2630
2878
  }) {
2631
- return /* @__PURE__ */ jsxs23(
2879
+ return /* @__PURE__ */ jsxs26(
2632
2880
  "span",
2633
2881
  {
2634
- className: twMerge10(
2882
+ className: twMerge11(
2635
2883
  "inline-flex items-center gap-1 rounded-[var(--border-radius-full)]",
2636
2884
  "text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-tight)]",
2637
2885
  variantStyles4[variant],
2638
- sizeStyles7[size],
2886
+ sizeStyles8[size],
2639
2887
  className
2640
2888
  ),
2641
2889
  children: [
2642
- IconComponent && /* @__PURE__ */ jsx34(IconComponent, { size: iconSizeMap4[size], "aria-hidden": "true" }),
2890
+ IconComponent && /* @__PURE__ */ jsx40(IconComponent, { size: iconSizeMap4[size], "aria-hidden": "true" }),
2643
2891
  children
2644
2892
  ]
2645
2893
  }
@@ -2648,8 +2896,8 @@ function Badge({
2648
2896
 
2649
2897
  // src/components/Card/Card.tsx
2650
2898
  import { useCallback as useCallback5 } from "react";
2651
- import { twMerge as twMerge11 } from "tailwind-merge";
2652
- import { Fragment as Fragment10, jsx as jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
2899
+ import { twMerge as twMerge12 } from "tailwind-merge";
2900
+ import { Fragment as Fragment11, jsx as jsx41, jsxs as jsxs27 } from "react/jsx-runtime";
2653
2901
  var paddingStyles = {
2654
2902
  none: "p-0",
2655
2903
  sm: "p-3",
@@ -2667,7 +2915,7 @@ function Card({
2667
2915
  className
2668
2916
  }) {
2669
2917
  const isInteractive = interactive || !!href || !!onPress;
2670
- const containerClass = twMerge11(
2918
+ const containerClass = twMerge12(
2671
2919
  "bg-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] overflow-hidden shadow-sm",
2672
2920
  isInteractive && "transition-all hover:shadow-md hover:border-[var(--color-border-focus)] cursor-pointer",
2673
2921
  (href || onPress) && "block focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none",
@@ -2682,22 +2930,22 @@ function Card({
2682
2930
  },
2683
2931
  [onPress]
2684
2932
  );
2685
- const content = /* @__PURE__ */ jsxs24(Fragment10, { children: [
2686
- header && /* @__PURE__ */ jsx35(
2933
+ const content = /* @__PURE__ */ jsxs27(Fragment11, { children: [
2934
+ header && /* @__PURE__ */ jsx41(
2687
2935
  "div",
2688
2936
  {
2689
- className: twMerge11(
2937
+ className: twMerge12(
2690
2938
  "border-b border-[var(--color-border-default)]",
2691
2939
  paddingStyles[padding]
2692
2940
  ),
2693
2941
  children: header
2694
2942
  }
2695
2943
  ),
2696
- /* @__PURE__ */ jsx35("div", { className: paddingStyles[padding], children }),
2697
- footer && /* @__PURE__ */ jsx35(
2944
+ /* @__PURE__ */ jsx41("div", { className: paddingStyles[padding], children }),
2945
+ footer && /* @__PURE__ */ jsx41(
2698
2946
  "div",
2699
2947
  {
2700
- className: twMerge11(
2948
+ className: twMerge12(
2701
2949
  "border-t border-[var(--color-border-default)]",
2702
2950
  paddingStyles[padding]
2703
2951
  ),
@@ -2706,10 +2954,10 @@ function Card({
2706
2954
  )
2707
2955
  ] });
2708
2956
  if (href) {
2709
- return /* @__PURE__ */ jsx35("a", { href, className: containerClass, children: content });
2957
+ return /* @__PURE__ */ jsx41("a", { href, className: containerClass, children: content });
2710
2958
  }
2711
2959
  if (onPress) {
2712
- return /* @__PURE__ */ jsx35(
2960
+ return /* @__PURE__ */ jsx41(
2713
2961
  "div",
2714
2962
  {
2715
2963
  role: "button",
@@ -2721,13 +2969,13 @@ function Card({
2721
2969
  }
2722
2970
  );
2723
2971
  }
2724
- return /* @__PURE__ */ jsx35("div", { className: containerClass, children: content });
2972
+ return /* @__PURE__ */ jsx41("div", { className: containerClass, children: content });
2725
2973
  }
2726
2974
 
2727
2975
  // src/components/DeltaIndicator/DeltaIndicator.tsx
2728
2976
  import { ArrowUp, ArrowDown, Minus } from "lucide-react";
2729
- import { twMerge as twMerge12 } from "tailwind-merge";
2730
- import { jsx as jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
2977
+ import { twMerge as twMerge13 } from "tailwind-merge";
2978
+ import { jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
2731
2979
  function getDirection(current, previous) {
2732
2980
  const diff = current - previous;
2733
2981
  if (diff > 0) return "increase";
@@ -2780,16 +3028,16 @@ function DeltaIndicator({
2780
3028
  className
2781
3029
  }) {
2782
3030
  if (unavailable) {
2783
- return /* @__PURE__ */ jsxs25(
3031
+ return /* @__PURE__ */ jsxs28(
2784
3032
  "span",
2785
3033
  {
2786
- className: twMerge12(
3034
+ className: twMerge13(
2787
3035
  "inline-flex items-center gap-1 font-[number:var(--font-weight-medium)]",
2788
3036
  "text-[var(--color-text-tertiary)]",
2789
3037
  className
2790
3038
  ),
2791
3039
  children: [
2792
- label && /* @__PURE__ */ jsx36("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
3040
+ label && /* @__PURE__ */ jsx42("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
2793
3041
  unavailableText
2794
3042
  ]
2795
3043
  }
@@ -2819,10 +3067,10 @@ function DeltaIndicator({
2819
3067
  }
2820
3068
  }
2821
3069
  const isPill = mode === "pill";
2822
- return /* @__PURE__ */ jsxs25(
3070
+ return /* @__PURE__ */ jsxs28(
2823
3071
  "span",
2824
3072
  {
2825
- className: twMerge12(
3073
+ className: twMerge13(
2826
3074
  "inline-flex items-center gap-1 font-[number:var(--font-weight-medium)]",
2827
3075
  colorStyles2,
2828
3076
  isPill && [
@@ -2833,8 +3081,8 @@ function DeltaIndicator({
2833
3081
  className
2834
3082
  ),
2835
3083
  children: [
2836
- label && /* @__PURE__ */ jsx36("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
2837
- /* @__PURE__ */ jsx36(IconComponent, { size: 14, "aria-hidden": true }),
3084
+ label && /* @__PURE__ */ jsx42("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
3085
+ /* @__PURE__ */ jsx42(IconComponent, { size: 14, "aria-hidden": true }),
2838
3086
  valueText
2839
3087
  ]
2840
3088
  }
@@ -2842,8 +3090,8 @@ function DeltaIndicator({
2842
3090
  }
2843
3091
 
2844
3092
  // src/components/ProgressBar/ProgressBar.tsx
2845
- import { twMerge as twMerge13 } from "tailwind-merge";
2846
- import { jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
3093
+ import { twMerge as twMerge14 } from "tailwind-merge";
3094
+ import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
2847
3095
  var fillStyles = {
2848
3096
  brand: "bg-[var(--color-progress-fill)]",
2849
3097
  success: "bg-[var(--color-progress-fill-success)]",
@@ -2851,7 +3099,7 @@ var fillStyles = {
2851
3099
  danger: "bg-[var(--color-progress-fill-danger)]",
2852
3100
  neutral: "bg-[var(--color-text-secondary)]"
2853
3101
  };
2854
- var sizeStyles8 = {
3102
+ var sizeStyles9 = {
2855
3103
  sm: "h-1.5",
2856
3104
  md: "h-3",
2857
3105
  lg: "h-4"
@@ -2866,12 +3114,12 @@ function ProgressBar({
2866
3114
  className
2867
3115
  }) {
2868
3116
  const clampedValue = Math.min(100, Math.max(0, value));
2869
- return /* @__PURE__ */ jsxs26("div", { className: twMerge13("w-full", className), children: [
2870
- (label || description || showValue) && /* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between mb-2", children: [
2871
- /* @__PURE__ */ jsx37("span", { className: "text-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)] text-[var(--color-text-primary)]", children: label }),
2872
- /* @__PURE__ */ jsx37("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]", children: description ?? (showValue ? `${clampedValue}%` : null) })
3117
+ return /* @__PURE__ */ jsxs29("div", { className: twMerge14("w-full", className), children: [
3118
+ (label || description || showValue) && /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between mb-2", children: [
3119
+ /* @__PURE__ */ jsx43("span", { className: "text-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)] text-[var(--color-text-primary)]", children: label }),
3120
+ /* @__PURE__ */ jsx43("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]", children: description ?? (showValue ? `${clampedValue}%` : null) })
2873
3121
  ] }),
2874
- /* @__PURE__ */ jsx37(
3122
+ /* @__PURE__ */ jsx43(
2875
3123
  "div",
2876
3124
  {
2877
3125
  role: "progressbar",
@@ -2879,14 +3127,14 @@ function ProgressBar({
2879
3127
  "aria-valuemin": 0,
2880
3128
  "aria-valuemax": 100,
2881
3129
  "aria-label": label ?? "Progress",
2882
- className: twMerge13(
3130
+ className: twMerge14(
2883
3131
  "w-full rounded-[var(--border-radius-full)] bg-[var(--color-progress-track)]",
2884
- sizeStyles8[size]
3132
+ sizeStyles9[size]
2885
3133
  ),
2886
- children: /* @__PURE__ */ jsx37(
3134
+ children: /* @__PURE__ */ jsx43(
2887
3135
  "div",
2888
3136
  {
2889
- className: twMerge13(
3137
+ className: twMerge14(
2890
3138
  "h-full rounded-[var(--border-radius-full)] transition-all duration-300",
2891
3139
  fillStyles[variant]
2892
3140
  ),
@@ -2907,8 +3155,8 @@ import {
2907
3155
  CheckCircle2,
2908
3156
  X as X3
2909
3157
  } from "lucide-react";
2910
- import { twMerge as twMerge14 } from "tailwind-merge";
2911
- import { jsx as jsx38, jsxs as jsxs27 } from "react/jsx-runtime";
3158
+ import { twMerge as twMerge15 } from "tailwind-merge";
3159
+ import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
2912
3160
  var variantConfig2 = {
2913
3161
  info: {
2914
3162
  icon: Info4,
@@ -2952,40 +3200,40 @@ function Banner({
2952
3200
  setDismissed(true);
2953
3201
  onDismiss?.();
2954
3202
  };
2955
- return /* @__PURE__ */ jsxs27(
3203
+ return /* @__PURE__ */ jsxs30(
2956
3204
  "div",
2957
3205
  {
2958
3206
  role: config.role,
2959
- className: twMerge14(
3207
+ className: twMerge15(
2960
3208
  "flex items-start gap-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-3)]",
2961
3209
  "text-[length:var(--font-size-sm)]",
2962
3210
  config.containerClass,
2963
3211
  className
2964
3212
  ),
2965
3213
  children: [
2966
- /* @__PURE__ */ jsx38(
3214
+ /* @__PURE__ */ jsx44(
2967
3215
  IconComponent,
2968
3216
  {
2969
3217
  size: 20,
2970
- className: twMerge14("shrink-0 mt-0.5", config.iconClass),
3218
+ className: twMerge15("shrink-0 mt-0.5", config.iconClass),
2971
3219
  "aria-hidden": "true"
2972
3220
  }
2973
3221
  ),
2974
- /* @__PURE__ */ jsxs27("div", { className: "flex-1", children: [
2975
- title && /* @__PURE__ */ jsxs27("span", { className: "font-[number:var(--font-weight-medium)]", children: [
3222
+ /* @__PURE__ */ jsxs30("div", { className: "flex-1", children: [
3223
+ title && /* @__PURE__ */ jsxs30("span", { className: "font-[number:var(--font-weight-medium)]", children: [
2976
3224
  title,
2977
3225
  " \u2014 "
2978
3226
  ] }),
2979
3227
  children
2980
3228
  ] }),
2981
- dismissible && /* @__PURE__ */ jsx38(
3229
+ dismissible && /* @__PURE__ */ jsx44(
2982
3230
  "button",
2983
3231
  {
2984
3232
  type: "button",
2985
3233
  onClick: handleDismiss,
2986
3234
  className: "shrink-0 rounded-[var(--border-radius-sm)] p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current",
2987
3235
  "aria-label": "Dismiss",
2988
- children: /* @__PURE__ */ jsx38(X3, { size: 16, "aria-hidden": "true" })
3236
+ children: /* @__PURE__ */ jsx44(X3, { size: 16, "aria-hidden": "true" })
2989
3237
  }
2990
3238
  )
2991
3239
  ]
@@ -2994,8 +3242,8 @@ function Banner({
2994
3242
  }
2995
3243
 
2996
3244
  // src/components/MetricCard/MetricCard.tsx
2997
- import { twMerge as twMerge15 } from "tailwind-merge";
2998
- import { Fragment as Fragment11, jsx as jsx39, jsxs as jsxs28 } from "react/jsx-runtime";
3245
+ import { twMerge as twMerge16 } from "tailwind-merge";
3246
+ import { Fragment as Fragment12, jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
2999
3247
  var sizeConfig = {
3000
3248
  sm: {
3001
3249
  padding: "p-3",
@@ -3017,59 +3265,59 @@ function MetricCard({
3017
3265
  className
3018
3266
  }) {
3019
3267
  const config = sizeConfig[size];
3020
- const containerClass = twMerge15(
3268
+ const containerClass = twMerge16(
3021
3269
  "bg-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] shadow-sm",
3022
3270
  config.padding,
3023
3271
  href && "block transition-shadow hover:shadow-md hover:border-[var(--color-border-focus)] focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none",
3024
3272
  className
3025
3273
  );
3026
- const content = /* @__PURE__ */ jsxs28(Fragment11, { children: [
3027
- /* @__PURE__ */ jsx39("div", { className: twMerge15(config.labelClass, "text-[var(--color-text-secondary)]"), children: label }),
3028
- /* @__PURE__ */ jsx39(
3274
+ const content = /* @__PURE__ */ jsxs31(Fragment12, { children: [
3275
+ /* @__PURE__ */ jsx45("div", { className: twMerge16(config.labelClass, "text-[var(--color-text-secondary)]"), children: label }),
3276
+ /* @__PURE__ */ jsx45(
3029
3277
  "div",
3030
3278
  {
3031
- className: twMerge15(
3279
+ className: twMerge16(
3032
3280
  config.valueClass,
3033
3281
  "font-[number:var(--font-weight-semibold)] text-[var(--color-text-primary)] mt-1 tabular-nums"
3034
3282
  ),
3035
3283
  children: value
3036
3284
  }
3037
3285
  ),
3038
- secondary && /* @__PURE__ */ jsx39("div", { className: "mt-1 text-sm", children: secondary })
3286
+ secondary && /* @__PURE__ */ jsx45("div", { className: "mt-1 text-sm", children: secondary })
3039
3287
  ] });
3040
3288
  if (href) {
3041
- return /* @__PURE__ */ jsx39("a", { href, className: containerClass, children: content });
3289
+ return /* @__PURE__ */ jsx45("a", { href, className: containerClass, children: content });
3042
3290
  }
3043
- return /* @__PURE__ */ jsx39("div", { className: containerClass, children: content });
3291
+ return /* @__PURE__ */ jsx45("div", { className: containerClass, children: content });
3044
3292
  }
3045
3293
 
3046
3294
  // src/components/SectionHeader/SectionHeader.tsx
3047
- import { twMerge as twMerge16 } from "tailwind-merge";
3048
- import { jsx as jsx40, jsxs as jsxs29 } from "react/jsx-runtime";
3295
+ import { twMerge as twMerge17 } from "tailwind-merge";
3296
+ import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
3049
3297
  function SectionHeader({
3050
3298
  title,
3051
3299
  children,
3052
3300
  className
3053
3301
  }) {
3054
- return /* @__PURE__ */ jsxs29(
3302
+ return /* @__PURE__ */ jsxs32(
3055
3303
  "div",
3056
3304
  {
3057
- className: twMerge16(
3305
+ className: twMerge17(
3058
3306
  "flex flex-wrap items-center gap-[var(--spacing-3)] py-[var(--spacing-4)]",
3059
3307
  className
3060
3308
  ),
3061
3309
  children: [
3062
- /* @__PURE__ */ jsx40(H2, { children: title }),
3063
- children && /* @__PURE__ */ jsx40("div", { className: "ml-auto flex flex-wrap items-center gap-[var(--spacing-2)]", children })
3310
+ /* @__PURE__ */ jsx46(H2, { children: title }),
3311
+ children && /* @__PURE__ */ jsx46("div", { className: "ml-auto flex flex-wrap items-center gap-[var(--spacing-2)]", children })
3064
3312
  ]
3065
3313
  }
3066
3314
  );
3067
3315
  }
3068
3316
 
3069
3317
  // src/components/FormWizard/FormWizard.tsx
3070
- import { createContext as createContext5, useContext as useContext5, useCallback as useCallback6, useMemo } from "react";
3071
- import { jsx as jsx41 } from "react/jsx-runtime";
3072
- var FormWizardContext = createContext5({
3318
+ import { createContext as createContext6, useContext as useContext6, useCallback as useCallback6, useMemo } from "react";
3319
+ import { jsx as jsx47 } from "react/jsx-runtime";
3320
+ var FormWizardContext = createContext6({
3073
3321
  currentStep: 0,
3074
3322
  totalSteps: 1,
3075
3323
  canGoBack: false,
@@ -3078,7 +3326,7 @@ var FormWizardContext = createContext5({
3078
3326
  isLastStep: true
3079
3327
  });
3080
3328
  function useFormWizard() {
3081
- return useContext5(FormWizardContext);
3329
+ return useContext6(FormWizardContext);
3082
3330
  }
3083
3331
  function FormWizard({
3084
3332
  currentStep,
@@ -3103,13 +3351,13 @@ function FormWizard({
3103
3351
  }),
3104
3352
  [currentStep, totalSteps, canGoBack, goBack, isLastStep]
3105
3353
  );
3106
- return /* @__PURE__ */ jsx41(FormWizardContext.Provider, { value, children });
3354
+ return /* @__PURE__ */ jsx47(FormWizardContext.Provider, { value, children });
3107
3355
  }
3108
3356
 
3109
3357
  // src/components/FormWizard/FormWizardProgress.tsx
3110
- import { jsx as jsx42, jsxs as jsxs30 } from "react/jsx-runtime";
3358
+ import { jsx as jsx48, jsxs as jsxs33 } from "react/jsx-runtime";
3111
3359
  function CheckIcon2() {
3112
- return /* @__PURE__ */ jsx42(
3360
+ return /* @__PURE__ */ jsx48(
3113
3361
  "svg",
3114
3362
  {
3115
3363
  "aria-hidden": "true",
@@ -3120,24 +3368,24 @@ function CheckIcon2() {
3120
3368
  strokeWidth: "2",
3121
3369
  strokeLinecap: "round",
3122
3370
  strokeLinejoin: "round",
3123
- children: /* @__PURE__ */ jsx42("path", { d: "M3 8.5l3.5 3.5 6.5-7" })
3371
+ children: /* @__PURE__ */ jsx48("path", { d: "M3 8.5l3.5 3.5 6.5-7" })
3124
3372
  }
3125
3373
  );
3126
3374
  }
3127
3375
  function FormWizardProgress({ labels }) {
3128
3376
  const { currentStep, totalSteps } = useFormWizard();
3129
- return /* @__PURE__ */ jsx42("nav", { "aria-label": "Form progress", children: /* @__PURE__ */ jsx42("ol", { className: "flex items-start", role: "list", children: labels.map((label, index) => {
3377
+ return /* @__PURE__ */ jsx48("nav", { "aria-label": "Form progress", children: /* @__PURE__ */ jsx48("ol", { className: "flex items-start", role: "list", children: labels.map((label, index) => {
3130
3378
  const isCompleted = index < currentStep;
3131
3379
  const isCurrent = index === currentStep;
3132
3380
  const isFuture = index > currentStep;
3133
- return /* @__PURE__ */ jsxs30(
3381
+ return /* @__PURE__ */ jsxs33(
3134
3382
  "li",
3135
3383
  {
3136
3384
  className: "flex flex-1 flex-col items-center",
3137
3385
  "aria-current": isCurrent ? "step" : void 0,
3138
3386
  children: [
3139
- /* @__PURE__ */ jsxs30("div", { className: "flex w-full items-center", children: [
3140
- index > 0 ? /* @__PURE__ */ jsx42(
3387
+ /* @__PURE__ */ jsxs33("div", { className: "flex w-full items-center", children: [
3388
+ index > 0 ? /* @__PURE__ */ jsx48(
3141
3389
  "div",
3142
3390
  {
3143
3391
  "aria-hidden": "true",
@@ -3146,8 +3394,8 @@ function FormWizardProgress({ labels }) {
3146
3394
  index <= currentStep ? "bg-[var(--color-brand-primary)]" : "bg-[var(--color-border-default)]"
3147
3395
  ].join(" ")
3148
3396
  }
3149
- ) : /* @__PURE__ */ jsx42("div", { className: "flex-1", "aria-hidden": "true" }),
3150
- /* @__PURE__ */ jsx42(
3397
+ ) : /* @__PURE__ */ jsx48("div", { className: "flex-1", "aria-hidden": "true" }),
3398
+ /* @__PURE__ */ jsx48(
3151
3399
  "div",
3152
3400
  {
3153
3401
  className: [
@@ -3159,10 +3407,10 @@ function FormWizardProgress({ labels }) {
3159
3407
  isFuture ? "border-2 border-[var(--color-border-default)] bg-[var(--color-surface-default)] text-[var(--color-text-tertiary)]" : ""
3160
3408
  ].join(" "),
3161
3409
  "aria-hidden": "true",
3162
- children: isCompleted ? /* @__PURE__ */ jsx42(CheckIcon2, {}) : index + 1
3410
+ children: isCompleted ? /* @__PURE__ */ jsx48(CheckIcon2, {}) : index + 1
3163
3411
  }
3164
3412
  ),
3165
- index < totalSteps - 1 ? /* @__PURE__ */ jsx42(
3413
+ index < totalSteps - 1 ? /* @__PURE__ */ jsx48(
3166
3414
  "div",
3167
3415
  {
3168
3416
  "aria-hidden": "true",
@@ -3171,9 +3419,9 @@ function FormWizardProgress({ labels }) {
3171
3419
  index < currentStep ? "bg-[var(--color-brand-primary)]" : "bg-[var(--color-border-default)]"
3172
3420
  ].join(" ")
3173
3421
  }
3174
- ) : /* @__PURE__ */ jsx42("div", { className: "flex-1", "aria-hidden": "true" })
3422
+ ) : /* @__PURE__ */ jsx48("div", { className: "flex-1", "aria-hidden": "true" })
3175
3423
  ] }),
3176
- /* @__PURE__ */ jsx42(
3424
+ /* @__PURE__ */ jsx48(
3177
3425
  "span",
3178
3426
  {
3179
3427
  className: [
@@ -3191,15 +3439,15 @@ function FormWizardProgress({ labels }) {
3191
3439
  }
3192
3440
 
3193
3441
  // src/components/FormWizard/FormWizardNav.tsx
3194
- import { jsx as jsx43, jsxs as jsxs31 } from "react/jsx-runtime";
3442
+ import { jsx as jsx49, jsxs as jsxs34 } from "react/jsx-runtime";
3195
3443
  function FormWizardNav({
3196
3444
  onNext,
3197
3445
  isSubmitting = false,
3198
3446
  submitLabel = "Submit"
3199
3447
  }) {
3200
3448
  const { canGoBack, goBack, isLastStep } = useFormWizard();
3201
- return /* @__PURE__ */ jsxs31("div", { className: "flex items-center justify-end gap-[var(--spacing-3)]", children: [
3202
- canGoBack && /* @__PURE__ */ jsx43(
3449
+ return /* @__PURE__ */ jsxs34("div", { className: "flex items-center justify-end gap-[var(--spacing-3)]", children: [
3450
+ canGoBack && /* @__PURE__ */ jsx49(
3203
3451
  Button,
3204
3452
  {
3205
3453
  variant: "secondary",
@@ -3209,7 +3457,7 @@ function FormWizardNav({
3209
3457
  children: "Back"
3210
3458
  }
3211
3459
  ),
3212
- /* @__PURE__ */ jsx43(
3460
+ /* @__PURE__ */ jsx49(
3213
3461
  Button,
3214
3462
  {
3215
3463
  variant: "primary",
@@ -3654,6 +3902,11 @@ export {
3654
3902
  LineHeightTight,
3655
3903
  Link,
3656
3904
  Menu,
3905
+ MenuCheckboxItem,
3906
+ MenuHeader,
3907
+ MenuItem,
3908
+ MenuSection,
3909
+ MenuSeparator,
3657
3910
  MetricCard,
3658
3911
  Pill,
3659
3912
  Popover3 as Popover,
@@ -3689,6 +3942,8 @@ export {
3689
3942
  Tabs,
3690
3943
  ToastProvider,
3691
3944
  ToggleButton,
3945
+ ToggleButtonGroup,
3946
+ ToggleButtonGroupItem,
3692
3947
  Tooltip,
3693
3948
  Tree,
3694
3949
  Tab2 as UnstyledTab,