@cytario/design 1.16.0 → 1.17.1

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,7 +1695,7 @@ 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";
1698
+ import { jsx as jsx26, jsxs as jsxs18 } from "react/jsx-runtime";
1603
1699
  var popoverStyles = [
1604
1700
  "bg-[var(--color-surface-default)] rounded-[var(--border-radius-md)]",
1605
1701
  "shadow-lg border border-[var(--color-border-default)]",
@@ -1607,14 +1703,25 @@ var popoverStyles = [
1607
1703
  "entering:animate-in entering:fade-in entering:zoom-in-95",
1608
1704
  "exiting:animate-out exiting:fade-out exiting:zoom-out-95"
1609
1705
  ].join(" ");
1610
- function Menu({ items, content, children, onAction, className }) {
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 } : {};
1611
1718
  return /* @__PURE__ */ jsxs18(MenuTrigger, { children: [
1612
1719
  children,
1613
- /* @__PURE__ */ jsx25(
1720
+ /* @__PURE__ */ jsx26(
1614
1721
  Popover2,
1615
1722
  {
1616
1723
  className: [popoverStyles, className].filter(Boolean).join(" "),
1617
- children: items ? /* @__PURE__ */ jsx25(
1724
+ children: items ? /* @__PURE__ */ jsx26(
1618
1725
  AriaMenu,
1619
1726
  {
1620
1727
  items,
@@ -1623,6 +1730,7 @@ function Menu({ items, content, children, onAction, className }) {
1623
1730
  item?.onAction?.();
1624
1731
  onAction?.(key);
1625
1732
  },
1733
+ ...selectionProps,
1626
1734
  className: "outline-none",
1627
1735
  children: (item) => /* @__PURE__ */ jsxs18(
1628
1736
  AriaMenuItem,
@@ -1640,17 +1748,18 @@ function Menu({ items, content, children, onAction, className }) {
1640
1748
  item.isDanger ? "text-[var(--color-text-danger)]" : "text-[var(--color-text-primary)]"
1641
1749
  ].filter(Boolean).join(" "),
1642
1750
  children: [
1643
- item.icon && /* @__PURE__ */ jsx25(Icon, { icon: item.icon, size: "sm" }),
1644
- /* @__PURE__ */ jsx25("span", { className: "flex-1", children: item.label }),
1645
- item.endContent && /* @__PURE__ */ jsx25("span", { className: "ml-auto flex items-center", children: item.endContent })
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 })
1646
1754
  ]
1647
1755
  }
1648
1756
  )
1649
1757
  }
1650
- ) : /* @__PURE__ */ jsx25(
1758
+ ) : /* @__PURE__ */ jsx26(
1651
1759
  AriaMenu,
1652
1760
  {
1653
1761
  onAction: (key) => onAction?.(key),
1762
+ ...selectionProps,
1654
1763
  className: "outline-none",
1655
1764
  children: content
1656
1765
  }
@@ -1662,7 +1771,7 @@ function Menu({ items, content, children, onAction, className }) {
1662
1771
 
1663
1772
  // src/components/Menu/MenuItem.tsx
1664
1773
  import { MenuItem as AriaMenuItem2 } from "react-aria-components";
1665
- import { jsx as jsx26, jsxs as jsxs19 } from "react/jsx-runtime";
1774
+ import { jsx as jsx27, jsxs as jsxs19 } from "react/jsx-runtime";
1666
1775
  function MenuItem({
1667
1776
  id,
1668
1777
  children,
@@ -1695,28 +1804,63 @@ function MenuItem({
1695
1804
  className
1696
1805
  ].filter(Boolean).join(" "),
1697
1806
  children: [
1698
- icon && /* @__PURE__ */ jsx26(Icon, { icon, size: "sm" }),
1699
- /* @__PURE__ */ jsx26("span", { className: "flex-1", children }),
1700
- endContent && /* @__PURE__ */ jsx26("span", { className: "ml-auto flex items-center", children: endContent })
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 })
1701
1810
  ]
1702
1811
  }
1703
1812
  );
1704
1813
  }
1705
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
+
1706
1850
  // src/components/Menu/MenuSection.tsx
1707
1851
  import {
1708
1852
  MenuSection as AriaMenuSection,
1709
1853
  Header
1710
1854
  } from "react-aria-components";
1711
- import { jsx as jsx27, jsxs as jsxs20 } from "react/jsx-runtime";
1855
+ import { jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
1712
1856
  function MenuSection({
1713
1857
  header,
1714
1858
  children,
1715
1859
  "aria-label": ariaLabel,
1716
1860
  className
1717
1861
  }) {
1718
- return /* @__PURE__ */ jsxs20(AriaMenuSection, { className, "aria-label": ariaLabel, children: [
1719
- header && /* @__PURE__ */ jsx27(
1862
+ return /* @__PURE__ */ jsxs21(AriaMenuSection, { className, "aria-label": ariaLabel, children: [
1863
+ header && /* @__PURE__ */ jsx29(
1720
1864
  Header,
1721
1865
  {
1722
1866
  className: [
@@ -1735,16 +1879,16 @@ function MenuSection({
1735
1879
 
1736
1880
  // src/components/Menu/MenuHeader.tsx
1737
1881
  import { Header as Header2 } from "react-aria-components";
1738
- import { jsx as jsx28 } from "react/jsx-runtime";
1882
+ import { jsx as jsx30 } from "react/jsx-runtime";
1739
1883
  function MenuHeader({ children, className }) {
1740
- return /* @__PURE__ */ jsx28(Header2, { className, children });
1884
+ return /* @__PURE__ */ jsx30(Header2, { className, children });
1741
1885
  }
1742
1886
 
1743
1887
  // src/components/Menu/MenuSeparator.tsx
1744
1888
  import { Separator } from "react-aria-components";
1745
- import { jsx as jsx29 } from "react/jsx-runtime";
1889
+ import { jsx as jsx31 } from "react/jsx-runtime";
1746
1890
  function MenuSeparator({ className }) {
1747
- return /* @__PURE__ */ jsx29(
1891
+ return /* @__PURE__ */ jsx31(
1748
1892
  Separator,
1749
1893
  {
1750
1894
  className: [
@@ -1762,12 +1906,12 @@ import {
1762
1906
  Dialog as AriaDialog2,
1763
1907
  Button as AriaButton3
1764
1908
  } from "react-aria-components";
1765
- import { Fragment as Fragment7, jsx as jsx30 } from "react/jsx-runtime";
1909
+ import { Fragment as Fragment8, jsx as jsx32 } from "react/jsx-runtime";
1766
1910
  function Popover3({ children, isOpen, onOpenChange }) {
1767
- return /* @__PURE__ */ jsx30(DialogTrigger, { isOpen, onOpenChange, children });
1911
+ return /* @__PURE__ */ jsx32(DialogTrigger, { isOpen, onOpenChange, children });
1768
1912
  }
1769
1913
  function PopoverTrigger({ children, className }) {
1770
- return /* @__PURE__ */ jsx30(
1914
+ return /* @__PURE__ */ jsx32(
1771
1915
  AriaButton3,
1772
1916
  {
1773
1917
  className: [
@@ -1785,7 +1929,7 @@ function PopoverContent({
1785
1929
  className,
1786
1930
  children
1787
1931
  }) {
1788
- return /* @__PURE__ */ jsx30(
1932
+ return /* @__PURE__ */ jsx32(
1789
1933
  AriaPopover,
1790
1934
  {
1791
1935
  placement,
@@ -1802,26 +1946,26 @@ function PopoverContent({
1802
1946
  "entering:placement-right:slide-in-from-left-1",
1803
1947
  className
1804
1948
  ].filter(Boolean).join(" "),
1805
- children: /* @__PURE__ */ jsx30(AriaDialog2, { className: "outline-none", children: ({ close }) => /* @__PURE__ */ jsx30(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 }) })
1806
1950
  }
1807
1951
  );
1808
1952
  }
1809
1953
 
1810
1954
  // src/components/Tabs/Tabs.tsx
1811
- import { createContext as createContext3, useContext as useContext3 } from "react";
1812
- 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";
1813
1957
  import {
1814
1958
  Tabs as AriaTabs,
1815
1959
  TabList as AriaTabList,
1816
1960
  Tab as AriaTab,
1817
1961
  TabPanel as AriaTabPanel
1818
1962
  } from "react-aria-components";
1819
- import { jsx as jsx31 } from "react/jsx-runtime";
1820
- var TabsContext = createContext3({
1963
+ import { jsx as jsx33 } from "react/jsx-runtime";
1964
+ var TabsContext = createContext4({
1821
1965
  variant: "underline",
1822
1966
  size: "md"
1823
1967
  });
1824
- var sizeStyles5 = {
1968
+ var sizeStyles6 = {
1825
1969
  sm: "px-3 py-1.5 text-sm",
1826
1970
  md: "px-4 py-2 text-base",
1827
1971
  lg: "px-6 py-3 text-lg"
@@ -1834,12 +1978,12 @@ function Tabs({
1834
1978
  children,
1835
1979
  ...props
1836
1980
  }) {
1837
- return /* @__PURE__ */ jsx31(TabsContext.Provider, { value: { variant, size }, children: /* @__PURE__ */ jsx31(
1981
+ return /* @__PURE__ */ jsx33(TabsContext.Provider, { value: { variant, size }, children: /* @__PURE__ */ jsx33(
1838
1982
  AriaTabs,
1839
1983
  {
1840
1984
  ...props,
1841
1985
  orientation,
1842
- className: twMerge5(
1986
+ className: twMerge6(
1843
1987
  orientation === "vertical" ? "flex" : "",
1844
1988
  className
1845
1989
  ),
@@ -1851,14 +1995,14 @@ function TabList({
1851
1995
  className,
1852
1996
  ...props
1853
1997
  }) {
1854
- const { variant } = useContext3(TabsContext);
1998
+ const { variant } = useContext4(TabsContext);
1855
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";
1856
2000
  const verticalStyles = variant === "unstyled" ? "flex-col" : variant === "underline" ? "flex-col border-b-0 border-r border-[var(--color-border-default)]" : "flex-col";
1857
- return /* @__PURE__ */ jsx31(
2001
+ return /* @__PURE__ */ jsx33(
1858
2002
  AriaTabList,
1859
2003
  {
1860
2004
  ...props,
1861
- className: ({ orientation }) => twMerge5(
2005
+ className: ({ orientation }) => twMerge6(
1862
2006
  baseStyles,
1863
2007
  orientation === "vertical" ? verticalStyles : "",
1864
2008
  className
@@ -1867,21 +2011,21 @@ function TabList({
1867
2011
  );
1868
2012
  }
1869
2013
  function Tab({ className, ...props }) {
1870
- const { variant, size } = useContext3(TabsContext);
1871
- return /* @__PURE__ */ jsx31(
2014
+ const { variant, size } = useContext4(TabsContext);
2015
+ return /* @__PURE__ */ jsx33(
1872
2016
  AriaTab,
1873
2017
  {
1874
2018
  ...props,
1875
2019
  className: ({ isSelected, isDisabled, isHovered, isPressed }) => {
1876
2020
  if (variant === "unstyled") {
1877
- return twMerge5(
2021
+ return twMerge6(
1878
2022
  "cursor-pointer outline-none",
1879
2023
  "focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2",
1880
2024
  isDisabled ? "opacity-50 pointer-events-none" : "",
1881
2025
  className
1882
2026
  );
1883
2027
  }
1884
- return twMerge5(
2028
+ return twMerge6(
1885
2029
  // Base
1886
2030
  "cursor-pointer outline-none transition-colors",
1887
2031
  "font-[var(--font-weight-medium)]",
@@ -1890,7 +2034,7 @@ function Tab({ className, ...props }) {
1890
2034
  // Disabled
1891
2035
  isDisabled ? "opacity-50 pointer-events-none" : "",
1892
2036
  // Size
1893
- sizeStyles5[size],
2037
+ sizeStyles6[size],
1894
2038
  ...getTabVariantStyles(variant, {
1895
2039
  isSelected,
1896
2040
  isHovered,
@@ -1924,12 +2068,12 @@ function getTabVariantStyles(variant, state) {
1924
2068
  ];
1925
2069
  }
1926
2070
  function TabPanel({ className, ...props }) {
1927
- const { variant } = useContext3(TabsContext);
1928
- return /* @__PURE__ */ jsx31(
2071
+ const { variant } = useContext4(TabsContext);
2072
+ return /* @__PURE__ */ jsx33(
1929
2073
  AriaTabPanel,
1930
2074
  {
1931
2075
  ...props,
1932
- className: twMerge5(
2076
+ className: twMerge6(
1933
2077
  variant === "unstyled" ? "outline-none" : "mt-4 outline-none",
1934
2078
  className
1935
2079
  )
@@ -1949,8 +2093,8 @@ import {
1949
2093
  import { useCallback as useCallback2, useImperativeHandle, useRef as useRef2, useState as useState2 } from "react";
1950
2094
  import { Tree as ArboristTree } from "react-arborist";
1951
2095
  import { ChevronRight as ChevronRight2, Folder, File } from "lucide-react";
1952
- import { Check as Check2 } from "lucide-react";
1953
- import { jsx as jsx32, jsxs as jsxs21 } from "react/jsx-runtime";
2096
+ import { Check as Check3 } from "lucide-react";
2097
+ import { jsx as jsx34, jsxs as jsxs22 } from "react/jsx-runtime";
1954
2098
  var rowHeightMap = {
1955
2099
  compact: 32,
1956
2100
  comfortable: 40
@@ -1973,7 +2117,7 @@ function NodeRenderer({
1973
2117
  const isSelected = node.isSelected && !isCheckbox;
1974
2118
  const isCompact = size === "compact";
1975
2119
  const IconComponent = data.icon ? data.icon : node.isInternal ? Folder : File;
1976
- return /* @__PURE__ */ jsxs21(
2120
+ return /* @__PURE__ */ jsxs22(
1977
2121
  "div",
1978
2122
  {
1979
2123
  ref: dragHandle,
@@ -2008,7 +2152,7 @@ function NodeRenderer({
2008
2152
  }
2009
2153
  },
2010
2154
  children: [
2011
- /* @__PURE__ */ jsx32(
2155
+ /* @__PURE__ */ jsx34(
2012
2156
  "button",
2013
2157
  {
2014
2158
  type: "button",
@@ -2026,7 +2170,7 @@ function NodeRenderer({
2026
2170
  },
2027
2171
  tabIndex: -1,
2028
2172
  "aria-label": node.isOpen ? "Collapse" : "Expand",
2029
- children: /* @__PURE__ */ jsx32(
2173
+ children: /* @__PURE__ */ jsx34(
2030
2174
  ChevronRight2,
2031
2175
  {
2032
2176
  size: 14,
@@ -2038,7 +2182,7 @@ function NodeRenderer({
2038
2182
  )
2039
2183
  }
2040
2184
  ),
2041
- isCheckbox && /* @__PURE__ */ jsx32(
2185
+ isCheckbox && /* @__PURE__ */ jsx34(
2042
2186
  "div",
2043
2187
  {
2044
2188
  className: [
@@ -2049,8 +2193,8 @@ function NodeRenderer({
2049
2193
  role: "checkbox",
2050
2194
  "aria-checked": isChecked,
2051
2195
  "aria-label": `Select ${data.name}`,
2052
- children: isChecked && /* @__PURE__ */ jsx32(
2053
- Check2,
2196
+ children: isChecked && /* @__PURE__ */ jsx34(
2197
+ Check3,
2054
2198
  {
2055
2199
  className: "w-3 h-3 text-[var(--color-text-inverse)]",
2056
2200
  strokeWidth: 3
@@ -2058,7 +2202,7 @@ function NodeRenderer({
2058
2202
  )
2059
2203
  }
2060
2204
  ),
2061
- /* @__PURE__ */ jsx32(
2205
+ /* @__PURE__ */ jsx34(
2062
2206
  IconComponent,
2063
2207
  {
2064
2208
  size: 16,
@@ -2066,7 +2210,7 @@ function NodeRenderer({
2066
2210
  "aria-hidden": "true"
2067
2211
  }
2068
2212
  ),
2069
- /* @__PURE__ */ jsx32("span", { className: "truncate", children: data.name })
2213
+ /* @__PURE__ */ jsx34("span", { className: "truncate", children: data.name })
2070
2214
  ]
2071
2215
  }
2072
2216
  );
@@ -2132,13 +2276,13 @@ function Tree({
2132
2276
  );
2133
2277
  const arboristSearchMatch = searchMatch ? (node, term) => searchMatch(node.data, term) : void 0;
2134
2278
  const selectionProp = selectionMode === "single" && selectedIds && selectedIds.size > 0 ? [...selectedIds][0] : void 0;
2135
- return /* @__PURE__ */ jsx32(
2279
+ return /* @__PURE__ */ jsx34(
2136
2280
  "div",
2137
2281
  {
2138
2282
  role: "tree",
2139
2283
  "aria-label": ariaLabel,
2140
2284
  className: ["outline-none overflow-hidden", className].filter(Boolean).join(" "),
2141
- children: /* @__PURE__ */ jsx32(
2285
+ children: /* @__PURE__ */ jsx34(
2142
2286
  ArboristTree,
2143
2287
  {
2144
2288
  ref: internalRef,
@@ -2157,7 +2301,7 @@ function Tree({
2157
2301
  onSelect: handleSelect,
2158
2302
  onActivate: handleActivate,
2159
2303
  disableEdit: true,
2160
- children: (props) => /* @__PURE__ */ jsx32(
2304
+ children: (props) => /* @__PURE__ */ jsx34(
2161
2305
  NodeRenderer,
2162
2306
  {
2163
2307
  ...props,
@@ -2176,17 +2320,17 @@ function Tree({
2176
2320
  }
2177
2321
 
2178
2322
  // src/components/SegmentedControl/SegmentedControl.tsx
2179
- import { createContext as createContext4, useContext as useContext4 } from "react";
2180
- 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";
2181
2325
  import {
2182
2326
  ToggleButtonGroup as AriaToggleButtonGroup,
2183
2327
  ToggleButton as AriaToggleButton2
2184
2328
  } from "react-aria-components";
2185
- import { jsx as jsx33 } from "react/jsx-runtime";
2186
- var SegmentedControlContext = createContext4({
2329
+ import { jsx as jsx35 } from "react/jsx-runtime";
2330
+ var SegmentedControlContext = createContext5({
2187
2331
  size: "md"
2188
2332
  });
2189
- var sizeStyles6 = {
2333
+ var sizeStyles7 = {
2190
2334
  sm: "px-2.5 py-1 text-xs",
2191
2335
  md: "px-3 py-1.5 text-sm",
2192
2336
  lg: "px-4 py-2 text-base"
@@ -2202,7 +2346,7 @@ function SegmentedControl({
2202
2346
  ...props
2203
2347
  }) {
2204
2348
  const isNoneMode = selectionMode === "none";
2205
- return /* @__PURE__ */ jsx33(SegmentedControlContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx33(
2349
+ return /* @__PURE__ */ jsx35(SegmentedControlContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx35(
2206
2350
  AriaToggleButtonGroup,
2207
2351
  {
2208
2352
  ...props,
@@ -2210,7 +2354,7 @@ function SegmentedControl({
2210
2354
  selectedKeys: isNoneMode ? /* @__PURE__ */ new Set() : selectedKeys,
2211
2355
  defaultSelectedKeys: isNoneMode ? void 0 : defaultSelectedKeys,
2212
2356
  onSelectionChange: isNoneMode ? void 0 : onSelectionChange,
2213
- className: twMerge6(
2357
+ className: twMerge7(
2214
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",
2215
2359
  className
2216
2360
  ),
@@ -2222,12 +2366,12 @@ function SegmentedControlItem({
2222
2366
  className,
2223
2367
  ...props
2224
2368
  }) {
2225
- const { size } = useContext4(SegmentedControlContext);
2226
- return /* @__PURE__ */ jsx33(
2369
+ const { size } = useContext5(SegmentedControlContext);
2370
+ return /* @__PURE__ */ jsx35(
2227
2371
  AriaToggleButton2,
2228
2372
  {
2229
2373
  ...props,
2230
- className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge6(
2374
+ className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge7(
2231
2375
  // Base layout
2232
2376
  "inline-flex items-center justify-center",
2233
2377
  "rounded-[var(--border-radius-md)]",
@@ -2238,7 +2382,7 @@ function SegmentedControlItem({
2238
2382
  // Disabled
2239
2383
  isDisabled && "opacity-50 pointer-events-none",
2240
2384
  // Size
2241
- sizeStyles6[size],
2385
+ sizeStyles7[size],
2242
2386
  // Selected state
2243
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)]",
2244
2388
  className
@@ -2257,7 +2401,7 @@ import {
2257
2401
  Info as Info2,
2258
2402
  Microscope
2259
2403
  } from "lucide-react";
2260
- import { Fragment as Fragment8, jsx as jsx34, jsxs as jsxs22 } from "react/jsx-runtime";
2404
+ import { Fragment as Fragment9, jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
2261
2405
  function getFileIcon(type, extension) {
2262
2406
  if (type === "directory") return Folder2;
2263
2407
  const ext = (extension ?? "").toLowerCase();
@@ -2283,7 +2427,7 @@ function FileIcon({
2283
2427
  size = 16
2284
2428
  }) {
2285
2429
  const IconComponent = getFileIcon(type, extension);
2286
- return /* @__PURE__ */ jsx34(
2430
+ return /* @__PURE__ */ jsx36(
2287
2431
  IconComponent,
2288
2432
  {
2289
2433
  size,
@@ -2328,50 +2472,15 @@ function FileCard({
2328
2472
  },
2329
2473
  [onPress]
2330
2474
  );
2331
- const cardContent = /* @__PURE__ */ jsxs22(Fragment8, { children: [
2332
- /* @__PURE__ */ jsxs22(
2475
+ const cardContent = /* @__PURE__ */ jsxs23(Fragment9, { children: [
2476
+ /* @__PURE__ */ jsx36(
2333
2477
  "div",
2334
2478
  {
2335
- className: `shrink-0 relative overflow-hidden bg-[var(--color-neutral-900)] ${thumbnailClass}`,
2336
- children: [
2337
- children ? /* @__PURE__ */ jsx34("div", { className: "h-full w-full overflow-hidden", children }) : /* @__PURE__ */ jsx34("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx34(IconComponent, { size: iconSize, className: iconColor }) }),
2338
- onInfo && /* @__PURE__ */ jsx34(
2339
- "div",
2340
- {
2341
- className: [
2342
- "absolute opacity-0 group-hover:opacity-100 group-focus-within:opacity-100",
2343
- "transition-opacity duration-150",
2344
- compact ? "bottom-1.5 right-1.5" : "bottom-2 right-2"
2345
- ].join(" "),
2346
- children: /* @__PURE__ */ jsx34(
2347
- "span",
2348
- {
2349
- onClick: handleInfoClick,
2350
- onKeyDown: (e) => {
2351
- if (e.key === "Enter" || e.key === " ") {
2352
- handleInfoClick(e);
2353
- }
2354
- },
2355
- role: "presentation",
2356
- children: /* @__PURE__ */ jsx34(
2357
- IconButton,
2358
- {
2359
- icon: Info2,
2360
- "aria-label": `Show info for ${name}`,
2361
- variant: "ghost",
2362
- size: "sm",
2363
- className: "bg-[var(--color-neutral-900)]/75 text-[var(--color-text-inverse)] hover:bg-[var(--color-neutral-900)]/90 rounded-[var(--border-radius-sm)]",
2364
- onPress: onInfo
2365
- }
2366
- )
2367
- }
2368
- )
2369
- }
2370
- )
2371
- ]
2479
+ className: `shrink-0 overflow-hidden bg-[var(--color-neutral-900)] ${thumbnailClass}`,
2480
+ children: 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 }) })
2372
2481
  }
2373
2482
  ),
2374
- /* @__PURE__ */ jsx34(
2483
+ /* @__PURE__ */ jsx36(
2375
2484
  "div",
2376
2485
  {
2377
2486
  className: [
@@ -2379,12 +2488,35 @@ function FileCard({
2379
2488
  "bg-[var(--color-surface-default)]",
2380
2489
  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)]"
2381
2490
  ].join(" "),
2382
- children: compact ? /* @__PURE__ */ jsx34("span", { className: "text-xs font-medium text-[var(--color-text-primary)] truncate", children: name }) : /* @__PURE__ */ jsxs22(Fragment8, { children: [
2383
- /* @__PURE__ */ jsxs22("span", { className: "flex items-center gap-1.5", children: [
2384
- /* @__PURE__ */ jsx34(FileIcon, { type, extension, size: 16 }),
2385
- /* @__PURE__ */ jsx34("span", { className: "text-sm font-medium text-[var(--color-text-primary)] truncate", children: name })
2491
+ children: compact ? /* @__PURE__ */ jsx36("span", { className: "text-xs font-medium text-[var(--color-text-primary)] truncate", children: name }) : /* @__PURE__ */ jsxs23(Fragment9, { children: [
2492
+ /* @__PURE__ */ jsxs23("span", { className: "flex items-center gap-1.5", children: [
2493
+ /* @__PURE__ */ jsx36(FileIcon, { type, extension, size: 16 }),
2494
+ /* @__PURE__ */ jsx36("span", { className: "min-w-0 flex-1 text-sm font-medium text-[var(--color-text-primary)] truncate", children: name }),
2495
+ onInfo && /* @__PURE__ */ jsx36(
2496
+ "span",
2497
+ {
2498
+ onClick: handleInfoClick,
2499
+ onKeyDown: (e) => {
2500
+ if (e.key === "Enter" || e.key === " ") {
2501
+ handleInfoClick(e);
2502
+ }
2503
+ },
2504
+ role: "presentation",
2505
+ children: /* @__PURE__ */ jsx36(
2506
+ IconButton,
2507
+ {
2508
+ icon: Info2,
2509
+ "aria-label": `Show info for ${name}`,
2510
+ variant: "ghost",
2511
+ size: "sm",
2512
+ className: "shrink-0 -mt-0.5 -mr-1",
2513
+ onPress: onInfo
2514
+ }
2515
+ )
2516
+ }
2517
+ )
2386
2518
  ] }),
2387
- size && /* @__PURE__ */ jsx34("span", { className: "text-xs text-[var(--color-text-secondary)] tabular-nums pl-[22px]", children: size })
2519
+ size && /* @__PURE__ */ jsx36("span", { className: "text-xs text-[var(--color-text-secondary)] tabular-nums pl-[22px]", children: size })
2388
2520
  ] })
2389
2521
  }
2390
2522
  )
@@ -2400,7 +2532,7 @@ function FileCard({
2400
2532
  className
2401
2533
  ].filter(Boolean).join(" ");
2402
2534
  if (href) {
2403
- return /* @__PURE__ */ jsx34(
2535
+ return /* @__PURE__ */ jsx36(
2404
2536
  "a",
2405
2537
  {
2406
2538
  href,
@@ -2411,7 +2543,7 @@ function FileCard({
2411
2543
  );
2412
2544
  }
2413
2545
  if (onPress) {
2414
- return /* @__PURE__ */ jsx34(
2546
+ return /* @__PURE__ */ jsx36(
2415
2547
  "div",
2416
2548
  {
2417
2549
  role: "button",
@@ -2424,17 +2556,17 @@ function FileCard({
2424
2556
  }
2425
2557
  );
2426
2558
  }
2427
- return /* @__PURE__ */ jsx34("div", { className: baseStyles, children: cardContent });
2559
+ return /* @__PURE__ */ jsx36("div", { className: baseStyles, children: cardContent });
2428
2560
  }
2429
2561
 
2430
2562
  // src/components/StorageConnectionCard/StorageConnectionCard.tsx
2431
2563
  import { useCallback as useCallback4 } from "react";
2432
2564
  import { AlertCircle, Database, Info as Info3 } from "lucide-react";
2433
- import { twMerge as twMerge9 } from "tailwind-merge";
2565
+ import { twMerge as twMerge10 } from "tailwind-merge";
2434
2566
 
2435
2567
  // src/components/Pill/Pill.tsx
2436
- import { twMerge as twMerge7 } from "tailwind-merge";
2437
- import { jsx as jsx35 } from "react/jsx-runtime";
2568
+ import { twMerge as twMerge8 } from "tailwind-merge";
2569
+ import { jsx as jsx37 } from "react/jsx-runtime";
2438
2570
  var HASH_PALETTE = [
2439
2571
  "teal",
2440
2572
  // sky
@@ -2485,10 +2617,10 @@ function resolveColor(color, name) {
2485
2617
  }
2486
2618
  function Pill({ children, color, name, className }) {
2487
2619
  const resolved = resolveColor(color, name);
2488
- return /* @__PURE__ */ jsx35(
2620
+ return /* @__PURE__ */ jsx37(
2489
2621
  "span",
2490
2622
  {
2491
- className: twMerge7(
2623
+ className: twMerge8(
2492
2624
  "inline-flex items-center rounded-full",
2493
2625
  "px-2 py-0.5",
2494
2626
  "text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-tight)]",
@@ -2501,8 +2633,8 @@ function Pill({ children, color, name, className }) {
2501
2633
  }
2502
2634
 
2503
2635
  // src/components/Pill/GroupPill.tsx
2504
- import { twMerge as twMerge8 } from "tailwind-merge";
2505
- import { jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
2636
+ import { twMerge as twMerge9 } from "tailwind-merge";
2637
+ import { jsx as jsx38, jsxs as jsxs24 } from "react/jsx-runtime";
2506
2638
  function GroupPill({
2507
2639
  path,
2508
2640
  visibleCount = 3,
@@ -2513,10 +2645,10 @@ function GroupPill({
2513
2645
  const hiddenCount = Math.max(0, segments.length - visibleCount);
2514
2646
  const hiddenSegments = segments.slice(0, hiddenCount);
2515
2647
  const visibleSegments = segments.slice(hiddenCount);
2516
- return /* @__PURE__ */ jsxs23(
2648
+ return /* @__PURE__ */ jsxs24(
2517
2649
  "span",
2518
2650
  {
2519
- className: twMerge8(
2651
+ className: twMerge9(
2520
2652
  "inline-flex items-center gap-1",
2521
2653
  className
2522
2654
  ),
@@ -2524,10 +2656,10 @@ function GroupPill({
2524
2656
  children: [
2525
2657
  hiddenSegments.map((segment, index) => {
2526
2658
  const color = pillColorFromName(segment);
2527
- return /* @__PURE__ */ jsx36(
2659
+ return /* @__PURE__ */ jsx38(
2528
2660
  "span",
2529
2661
  {
2530
- className: twMerge8(
2662
+ className: twMerge9(
2531
2663
  "inline-block size-2 shrink-0 rounded-full",
2532
2664
  dotColorStyles[color]
2533
2665
  ),
@@ -2537,14 +2669,14 @@ function GroupPill({
2537
2669
  `dot-${index}-${segment}`
2538
2670
  );
2539
2671
  }),
2540
- visibleSegments.map((segment, index) => /* @__PURE__ */ jsx36(Pill, { name: segment, children: segment }, `pill-${index}-${segment}`))
2672
+ visibleSegments.map((segment, index) => /* @__PURE__ */ jsx38(Pill, { name: segment, children: segment }, `pill-${index}-${segment}`))
2541
2673
  ]
2542
2674
  }
2543
2675
  );
2544
2676
  }
2545
2677
 
2546
2678
  // src/components/StorageConnectionCard/StorageConnectionCard.tsx
2547
- import { Fragment as Fragment9, jsx as jsx37, jsxs as jsxs24 } from "react/jsx-runtime";
2679
+ import { Fragment as Fragment10, jsx as jsx39, jsxs as jsxs25 } from "react/jsx-runtime";
2548
2680
  var statusDotStyles = {
2549
2681
  connected: "bg-[var(--color-status-success)]",
2550
2682
  error: "border-2 border-[var(--color-status-danger)] bg-transparent",
@@ -2560,7 +2692,7 @@ function ProviderBadge({ provider }) {
2560
2692
  const config = providerConfig[provider.toLowerCase()];
2561
2693
  const label = config?.label ?? provider;
2562
2694
  const color = config?.color ?? "neutral";
2563
- return /* @__PURE__ */ jsx37(Pill, { color, children: label });
2695
+ return /* @__PURE__ */ jsx39(Pill, { color, children: label });
2564
2696
  }
2565
2697
  function PreviewArea({
2566
2698
  status = "connected",
@@ -2568,11 +2700,11 @@ function PreviewArea({
2568
2700
  children
2569
2701
  }) {
2570
2702
  if (status === "loading") {
2571
- return /* @__PURE__ */ jsx37("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx37(Spinner, { size: "lg", "aria-label": "Loading connection" }) });
2703
+ return /* @__PURE__ */ jsx39("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx39(Spinner, { size: "lg", "aria-label": "Loading connection" }) });
2572
2704
  }
2573
2705
  if (status === "error") {
2574
- return /* @__PURE__ */ jsxs24("div", { className: "flex h-full flex-col items-center justify-center gap-2 bg-[var(--color-surface-danger)] px-4", children: [
2575
- /* @__PURE__ */ jsx37(
2706
+ return /* @__PURE__ */ jsxs25("div", { className: "flex h-full flex-col items-center justify-center gap-2 bg-[var(--color-surface-danger)] px-4", children: [
2707
+ /* @__PURE__ */ jsx39(
2576
2708
  Icon,
2577
2709
  {
2578
2710
  icon: AlertCircle,
@@ -2580,13 +2712,13 @@ function PreviewArea({
2580
2712
  className: "text-[var(--color-text-danger)]"
2581
2713
  }
2582
2714
  ),
2583
- errorMessage && /* @__PURE__ */ jsx37("p", { className: "text-center text-xs text-[var(--color-text-danger)]", children: errorMessage })
2715
+ errorMessage && /* @__PURE__ */ jsx39("p", { className: "text-center text-xs text-[var(--color-text-danger)]", children: errorMessage })
2584
2716
  ] });
2585
2717
  }
2586
2718
  if (children) {
2587
- return /* @__PURE__ */ jsx37("div", { className: "h-full w-full overflow-hidden", children });
2719
+ return /* @__PURE__ */ jsx39("div", { className: "h-full w-full overflow-hidden", children });
2588
2720
  }
2589
- return /* @__PURE__ */ jsx37("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx37(
2721
+ return /* @__PURE__ */ jsx39("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsx39(
2590
2722
  Icon,
2591
2723
  {
2592
2724
  icon: Database,
@@ -2628,22 +2760,22 @@ function StorageConnectionCard({
2628
2760
  },
2629
2761
  [onPress]
2630
2762
  );
2631
- const cardContent = /* @__PURE__ */ jsxs24(Fragment9, { children: [
2632
- /* @__PURE__ */ jsx37("div", { className: "aspect-[4/3] bg-[var(--color-neutral-900)] overflow-hidden rounded-t-[var(--border-radius-lg)]", children: /* @__PURE__ */ jsx37(PreviewArea, { status, errorMessage, children }) }),
2633
- /* @__PURE__ */ jsxs24("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: [
2634
- /* @__PURE__ */ jsxs24("div", { className: "flex items-start gap-2", children: [
2635
- status && /* @__PURE__ */ jsx37(
2763
+ const cardContent = /* @__PURE__ */ jsxs25(Fragment10, { children: [
2764
+ /* @__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 }) }),
2765
+ /* @__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: [
2766
+ /* @__PURE__ */ jsxs25("div", { className: "flex items-start gap-2", children: [
2767
+ status && /* @__PURE__ */ jsx39(
2636
2768
  "span",
2637
2769
  {
2638
- className: twMerge9(
2770
+ className: twMerge10(
2639
2771
  "mt-1.5 h-2 w-2 shrink-0 rounded-full",
2640
2772
  statusDotStyles[status]
2641
2773
  ),
2642
2774
  "aria-label": `Status: ${status}`
2643
2775
  }
2644
2776
  ),
2645
- /* @__PURE__ */ jsx37("span", { className: "min-w-0 flex-1 line-clamp-2 text-sm font-medium text-[var(--color-text-primary)]", children: name }),
2646
- onInfo && /* @__PURE__ */ jsx37(
2777
+ /* @__PURE__ */ jsx39("span", { className: "min-w-0 flex-1 line-clamp-2 text-sm font-medium text-[var(--color-text-primary)]", children: name }),
2778
+ onInfo && /* @__PURE__ */ jsx39(
2647
2779
  "span",
2648
2780
  {
2649
2781
  onClick: handleInfoPress,
@@ -2653,7 +2785,7 @@ function StorageConnectionCard({
2653
2785
  }
2654
2786
  },
2655
2787
  role: "presentation",
2656
- children: /* @__PURE__ */ jsx37(
2788
+ children: /* @__PURE__ */ jsx39(
2657
2789
  IconButton,
2658
2790
  {
2659
2791
  icon: Info3,
@@ -2667,10 +2799,10 @@ function StorageConnectionCard({
2667
2799
  }
2668
2800
  )
2669
2801
  ] }),
2670
- (provider || imageCount != null && (!status || status === "connected")) && /* @__PURE__ */ jsxs24("div", { className: twMerge9("flex items-center gap-2", status && "pl-4"), children: [
2671
- provider && /* @__PURE__ */ jsx37(ProviderBadge, { provider }),
2672
- provider && region && /* @__PURE__ */ jsx37("span", { className: "shrink-0 text-xs text-[var(--color-text-secondary)]", children: region }),
2673
- imageCount != null && (!status || status === "connected") && /* @__PURE__ */ jsxs24("span", { className: "ml-auto shrink-0 text-xs tabular-nums text-[var(--color-text-secondary)]", children: [
2802
+ (provider || imageCount != null && (!status || status === "connected")) && /* @__PURE__ */ jsxs25("div", { className: twMerge10("flex items-center gap-2", status && "pl-4"), children: [
2803
+ provider && /* @__PURE__ */ jsx39(ProviderBadge, { provider }),
2804
+ provider && region && /* @__PURE__ */ jsx39("span", { className: "shrink-0 text-xs text-[var(--color-text-secondary)]", children: region }),
2805
+ imageCount != null && (!status || status === "connected") && /* @__PURE__ */ jsxs25("span", { className: "ml-auto shrink-0 text-xs tabular-nums text-[var(--color-text-secondary)]", children: [
2674
2806
  imageCount,
2675
2807
  " ",
2676
2808
  imageCount === 1 ? "image" : "images"
@@ -2678,7 +2810,7 @@ function StorageConnectionCard({
2678
2810
  ] })
2679
2811
  ] })
2680
2812
  ] });
2681
- const baseStyles = twMerge9(
2813
+ const baseStyles = twMerge10(
2682
2814
  "flex flex-col overflow-hidden rounded-[var(--border-radius-lg)]",
2683
2815
  "border border-[var(--color-border-default)]",
2684
2816
  "shadow-sm transition-all",
@@ -2687,10 +2819,10 @@ function StorageConnectionCard({
2687
2819
  className
2688
2820
  );
2689
2821
  if (href) {
2690
- return /* @__PURE__ */ jsx37("a", { href, className: twMerge9(baseStyles, "no-underline"), children: cardContent });
2822
+ return /* @__PURE__ */ jsx39("a", { href, className: twMerge10(baseStyles, "no-underline"), children: cardContent });
2691
2823
  }
2692
2824
  if (onPress) {
2693
- return /* @__PURE__ */ jsx37(
2825
+ return /* @__PURE__ */ jsx39(
2694
2826
  "div",
2695
2827
  {
2696
2828
  role: "button",
@@ -2702,12 +2834,12 @@ function StorageConnectionCard({
2702
2834
  }
2703
2835
  );
2704
2836
  }
2705
- return /* @__PURE__ */ jsx37("div", { className: baseStyles, children: cardContent });
2837
+ return /* @__PURE__ */ jsx39("div", { className: baseStyles, children: cardContent });
2706
2838
  }
2707
2839
 
2708
2840
  // src/components/Badge/Badge.tsx
2709
- import { twMerge as twMerge10 } from "tailwind-merge";
2710
- import { jsx as jsx38, jsxs as jsxs25 } from "react/jsx-runtime";
2841
+ import { twMerge as twMerge11 } from "tailwind-merge";
2842
+ import { jsx as jsx40, jsxs as jsxs26 } from "react/jsx-runtime";
2711
2843
  var variantStyles4 = {
2712
2844
  neutral: "bg-[var(--color-badge-neutral-bg)] text-[var(--color-badge-neutral-text)]",
2713
2845
  purple: "bg-[var(--color-badge-purple-bg)] text-[var(--color-badge-purple-text)]",
@@ -2717,7 +2849,7 @@ var variantStyles4 = {
2717
2849
  green: "bg-[var(--color-badge-green-bg)] text-[var(--color-badge-green-text)]",
2718
2850
  amber: "bg-[var(--color-badge-amber-bg)] text-[var(--color-badge-amber-text)]"
2719
2851
  };
2720
- var sizeStyles7 = {
2852
+ var sizeStyles8 = {
2721
2853
  sm: "px-1.5 py-0.5",
2722
2854
  md: "px-2 py-0.5"
2723
2855
  };
@@ -2732,18 +2864,18 @@ function Badge({
2732
2864
  icon: IconComponent,
2733
2865
  className
2734
2866
  }) {
2735
- return /* @__PURE__ */ jsxs25(
2867
+ return /* @__PURE__ */ jsxs26(
2736
2868
  "span",
2737
2869
  {
2738
- className: twMerge10(
2870
+ className: twMerge11(
2739
2871
  "inline-flex items-center gap-1 rounded-[var(--border-radius-full)]",
2740
2872
  "text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-tight)]",
2741
2873
  variantStyles4[variant],
2742
- sizeStyles7[size],
2874
+ sizeStyles8[size],
2743
2875
  className
2744
2876
  ),
2745
2877
  children: [
2746
- IconComponent && /* @__PURE__ */ jsx38(IconComponent, { size: iconSizeMap4[size], "aria-hidden": "true" }),
2878
+ IconComponent && /* @__PURE__ */ jsx40(IconComponent, { size: iconSizeMap4[size], "aria-hidden": "true" }),
2747
2879
  children
2748
2880
  ]
2749
2881
  }
@@ -2752,8 +2884,8 @@ function Badge({
2752
2884
 
2753
2885
  // src/components/Card/Card.tsx
2754
2886
  import { useCallback as useCallback5 } from "react";
2755
- import { twMerge as twMerge11 } from "tailwind-merge";
2756
- import { Fragment as Fragment10, jsx as jsx39, jsxs as jsxs26 } from "react/jsx-runtime";
2887
+ import { twMerge as twMerge12 } from "tailwind-merge";
2888
+ import { Fragment as Fragment11, jsx as jsx41, jsxs as jsxs27 } from "react/jsx-runtime";
2757
2889
  var paddingStyles = {
2758
2890
  none: "p-0",
2759
2891
  sm: "p-3",
@@ -2771,7 +2903,7 @@ function Card({
2771
2903
  className
2772
2904
  }) {
2773
2905
  const isInteractive = interactive || !!href || !!onPress;
2774
- const containerClass = twMerge11(
2906
+ const containerClass = twMerge12(
2775
2907
  "bg-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] overflow-hidden shadow-sm",
2776
2908
  isInteractive && "transition-all hover:shadow-md hover:border-[var(--color-border-focus)] cursor-pointer",
2777
2909
  (href || onPress) && "block focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none",
@@ -2786,22 +2918,22 @@ function Card({
2786
2918
  },
2787
2919
  [onPress]
2788
2920
  );
2789
- const content = /* @__PURE__ */ jsxs26(Fragment10, { children: [
2790
- header && /* @__PURE__ */ jsx39(
2921
+ const content = /* @__PURE__ */ jsxs27(Fragment11, { children: [
2922
+ header && /* @__PURE__ */ jsx41(
2791
2923
  "div",
2792
2924
  {
2793
- className: twMerge11(
2925
+ className: twMerge12(
2794
2926
  "border-b border-[var(--color-border-default)]",
2795
2927
  paddingStyles[padding]
2796
2928
  ),
2797
2929
  children: header
2798
2930
  }
2799
2931
  ),
2800
- /* @__PURE__ */ jsx39("div", { className: paddingStyles[padding], children }),
2801
- footer && /* @__PURE__ */ jsx39(
2932
+ /* @__PURE__ */ jsx41("div", { className: paddingStyles[padding], children }),
2933
+ footer && /* @__PURE__ */ jsx41(
2802
2934
  "div",
2803
2935
  {
2804
- className: twMerge11(
2936
+ className: twMerge12(
2805
2937
  "border-t border-[var(--color-border-default)]",
2806
2938
  paddingStyles[padding]
2807
2939
  ),
@@ -2810,10 +2942,10 @@ function Card({
2810
2942
  )
2811
2943
  ] });
2812
2944
  if (href) {
2813
- return /* @__PURE__ */ jsx39("a", { href, className: containerClass, children: content });
2945
+ return /* @__PURE__ */ jsx41("a", { href, className: containerClass, children: content });
2814
2946
  }
2815
2947
  if (onPress) {
2816
- return /* @__PURE__ */ jsx39(
2948
+ return /* @__PURE__ */ jsx41(
2817
2949
  "div",
2818
2950
  {
2819
2951
  role: "button",
@@ -2825,13 +2957,13 @@ function Card({
2825
2957
  }
2826
2958
  );
2827
2959
  }
2828
- return /* @__PURE__ */ jsx39("div", { className: containerClass, children: content });
2960
+ return /* @__PURE__ */ jsx41("div", { className: containerClass, children: content });
2829
2961
  }
2830
2962
 
2831
2963
  // src/components/DeltaIndicator/DeltaIndicator.tsx
2832
2964
  import { ArrowUp, ArrowDown, Minus } from "lucide-react";
2833
- import { twMerge as twMerge12 } from "tailwind-merge";
2834
- import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
2965
+ import { twMerge as twMerge13 } from "tailwind-merge";
2966
+ import { jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
2835
2967
  function getDirection(current, previous) {
2836
2968
  const diff = current - previous;
2837
2969
  if (diff > 0) return "increase";
@@ -2884,16 +3016,16 @@ function DeltaIndicator({
2884
3016
  className
2885
3017
  }) {
2886
3018
  if (unavailable) {
2887
- return /* @__PURE__ */ jsxs27(
3019
+ return /* @__PURE__ */ jsxs28(
2888
3020
  "span",
2889
3021
  {
2890
- className: twMerge12(
3022
+ className: twMerge13(
2891
3023
  "inline-flex items-center gap-1 font-[number:var(--font-weight-medium)]",
2892
3024
  "text-[var(--color-text-tertiary)]",
2893
3025
  className
2894
3026
  ),
2895
3027
  children: [
2896
- label && /* @__PURE__ */ jsx40("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
3028
+ label && /* @__PURE__ */ jsx42("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
2897
3029
  unavailableText
2898
3030
  ]
2899
3031
  }
@@ -2923,10 +3055,10 @@ function DeltaIndicator({
2923
3055
  }
2924
3056
  }
2925
3057
  const isPill = mode === "pill";
2926
- return /* @__PURE__ */ jsxs27(
3058
+ return /* @__PURE__ */ jsxs28(
2927
3059
  "span",
2928
3060
  {
2929
- className: twMerge12(
3061
+ className: twMerge13(
2930
3062
  "inline-flex items-center gap-1 font-[number:var(--font-weight-medium)]",
2931
3063
  colorStyles2,
2932
3064
  isPill && [
@@ -2937,8 +3069,8 @@ function DeltaIndicator({
2937
3069
  className
2938
3070
  ),
2939
3071
  children: [
2940
- label && /* @__PURE__ */ jsx40("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
2941
- /* @__PURE__ */ jsx40(IconComponent, { size: 14, "aria-hidden": true }),
3072
+ label && /* @__PURE__ */ jsx42("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)] mr-1", children: label }),
3073
+ /* @__PURE__ */ jsx42(IconComponent, { size: 14, "aria-hidden": true }),
2942
3074
  valueText
2943
3075
  ]
2944
3076
  }
@@ -2946,8 +3078,8 @@ function DeltaIndicator({
2946
3078
  }
2947
3079
 
2948
3080
  // src/components/ProgressBar/ProgressBar.tsx
2949
- import { twMerge as twMerge13 } from "tailwind-merge";
2950
- import { jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
3081
+ import { twMerge as twMerge14 } from "tailwind-merge";
3082
+ import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
2951
3083
  var fillStyles = {
2952
3084
  brand: "bg-[var(--color-progress-fill)]",
2953
3085
  success: "bg-[var(--color-progress-fill-success)]",
@@ -2955,7 +3087,7 @@ var fillStyles = {
2955
3087
  danger: "bg-[var(--color-progress-fill-danger)]",
2956
3088
  neutral: "bg-[var(--color-text-secondary)]"
2957
3089
  };
2958
- var sizeStyles8 = {
3090
+ var sizeStyles9 = {
2959
3091
  sm: "h-1.5",
2960
3092
  md: "h-3",
2961
3093
  lg: "h-4"
@@ -2970,12 +3102,12 @@ function ProgressBar({
2970
3102
  className
2971
3103
  }) {
2972
3104
  const clampedValue = Math.min(100, Math.max(0, value));
2973
- return /* @__PURE__ */ jsxs28("div", { className: twMerge13("w-full", className), children: [
2974
- (label || description || showValue) && /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between mb-2", children: [
2975
- /* @__PURE__ */ jsx41("span", { className: "text-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)] text-[var(--color-text-primary)]", children: label }),
2976
- /* @__PURE__ */ jsx41("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]", children: description ?? (showValue ? `${clampedValue}%` : null) })
3105
+ return /* @__PURE__ */ jsxs29("div", { className: twMerge14("w-full", className), children: [
3106
+ (label || description || showValue) && /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between mb-2", children: [
3107
+ /* @__PURE__ */ jsx43("span", { className: "text-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)] text-[var(--color-text-primary)]", children: label }),
3108
+ /* @__PURE__ */ jsx43("span", { className: "text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]", children: description ?? (showValue ? `${clampedValue}%` : null) })
2977
3109
  ] }),
2978
- /* @__PURE__ */ jsx41(
3110
+ /* @__PURE__ */ jsx43(
2979
3111
  "div",
2980
3112
  {
2981
3113
  role: "progressbar",
@@ -2983,14 +3115,14 @@ function ProgressBar({
2983
3115
  "aria-valuemin": 0,
2984
3116
  "aria-valuemax": 100,
2985
3117
  "aria-label": label ?? "Progress",
2986
- className: twMerge13(
3118
+ className: twMerge14(
2987
3119
  "w-full rounded-[var(--border-radius-full)] bg-[var(--color-progress-track)]",
2988
- sizeStyles8[size]
3120
+ sizeStyles9[size]
2989
3121
  ),
2990
- children: /* @__PURE__ */ jsx41(
3122
+ children: /* @__PURE__ */ jsx43(
2991
3123
  "div",
2992
3124
  {
2993
- className: twMerge13(
3125
+ className: twMerge14(
2994
3126
  "h-full rounded-[var(--border-radius-full)] transition-all duration-300",
2995
3127
  fillStyles[variant]
2996
3128
  ),
@@ -3011,8 +3143,8 @@ import {
3011
3143
  CheckCircle2,
3012
3144
  X as X3
3013
3145
  } from "lucide-react";
3014
- import { twMerge as twMerge14 } from "tailwind-merge";
3015
- import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
3146
+ import { twMerge as twMerge15 } from "tailwind-merge";
3147
+ import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
3016
3148
  var variantConfig2 = {
3017
3149
  info: {
3018
3150
  icon: Info4,
@@ -3056,40 +3188,40 @@ function Banner({
3056
3188
  setDismissed(true);
3057
3189
  onDismiss?.();
3058
3190
  };
3059
- return /* @__PURE__ */ jsxs29(
3191
+ return /* @__PURE__ */ jsxs30(
3060
3192
  "div",
3061
3193
  {
3062
3194
  role: config.role,
3063
- className: twMerge14(
3195
+ className: twMerge15(
3064
3196
  "flex items-start gap-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-3)]",
3065
3197
  "text-[length:var(--font-size-sm)]",
3066
3198
  config.containerClass,
3067
3199
  className
3068
3200
  ),
3069
3201
  children: [
3070
- /* @__PURE__ */ jsx42(
3202
+ /* @__PURE__ */ jsx44(
3071
3203
  IconComponent,
3072
3204
  {
3073
3205
  size: 20,
3074
- className: twMerge14("shrink-0 mt-0.5", config.iconClass),
3206
+ className: twMerge15("shrink-0 mt-0.5", config.iconClass),
3075
3207
  "aria-hidden": "true"
3076
3208
  }
3077
3209
  ),
3078
- /* @__PURE__ */ jsxs29("div", { className: "flex-1", children: [
3079
- title && /* @__PURE__ */ jsxs29("span", { className: "font-[number:var(--font-weight-medium)]", children: [
3210
+ /* @__PURE__ */ jsxs30("div", { className: "flex-1", children: [
3211
+ title && /* @__PURE__ */ jsxs30("span", { className: "font-[number:var(--font-weight-medium)]", children: [
3080
3212
  title,
3081
3213
  " \u2014 "
3082
3214
  ] }),
3083
3215
  children
3084
3216
  ] }),
3085
- dismissible && /* @__PURE__ */ jsx42(
3217
+ dismissible && /* @__PURE__ */ jsx44(
3086
3218
  "button",
3087
3219
  {
3088
3220
  type: "button",
3089
3221
  onClick: handleDismiss,
3090
3222
  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",
3091
3223
  "aria-label": "Dismiss",
3092
- children: /* @__PURE__ */ jsx42(X3, { size: 16, "aria-hidden": "true" })
3224
+ children: /* @__PURE__ */ jsx44(X3, { size: 16, "aria-hidden": "true" })
3093
3225
  }
3094
3226
  )
3095
3227
  ]
@@ -3098,8 +3230,8 @@ function Banner({
3098
3230
  }
3099
3231
 
3100
3232
  // src/components/MetricCard/MetricCard.tsx
3101
- import { twMerge as twMerge15 } from "tailwind-merge";
3102
- import { Fragment as Fragment11, jsx as jsx43, jsxs as jsxs30 } from "react/jsx-runtime";
3233
+ import { twMerge as twMerge16 } from "tailwind-merge";
3234
+ import { Fragment as Fragment12, jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
3103
3235
  var sizeConfig = {
3104
3236
  sm: {
3105
3237
  padding: "p-3",
@@ -3121,59 +3253,59 @@ function MetricCard({
3121
3253
  className
3122
3254
  }) {
3123
3255
  const config = sizeConfig[size];
3124
- const containerClass = twMerge15(
3256
+ const containerClass = twMerge16(
3125
3257
  "bg-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] shadow-sm",
3126
3258
  config.padding,
3127
3259
  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",
3128
3260
  className
3129
3261
  );
3130
- const content = /* @__PURE__ */ jsxs30(Fragment11, { children: [
3131
- /* @__PURE__ */ jsx43("div", { className: twMerge15(config.labelClass, "text-[var(--color-text-secondary)]"), children: label }),
3132
- /* @__PURE__ */ jsx43(
3262
+ const content = /* @__PURE__ */ jsxs31(Fragment12, { children: [
3263
+ /* @__PURE__ */ jsx45("div", { className: twMerge16(config.labelClass, "text-[var(--color-text-secondary)]"), children: label }),
3264
+ /* @__PURE__ */ jsx45(
3133
3265
  "div",
3134
3266
  {
3135
- className: twMerge15(
3267
+ className: twMerge16(
3136
3268
  config.valueClass,
3137
3269
  "font-[number:var(--font-weight-semibold)] text-[var(--color-text-primary)] mt-1 tabular-nums"
3138
3270
  ),
3139
3271
  children: value
3140
3272
  }
3141
3273
  ),
3142
- secondary && /* @__PURE__ */ jsx43("div", { className: "mt-1 text-sm", children: secondary })
3274
+ secondary && /* @__PURE__ */ jsx45("div", { className: "mt-1 text-sm", children: secondary })
3143
3275
  ] });
3144
3276
  if (href) {
3145
- return /* @__PURE__ */ jsx43("a", { href, className: containerClass, children: content });
3277
+ return /* @__PURE__ */ jsx45("a", { href, className: containerClass, children: content });
3146
3278
  }
3147
- return /* @__PURE__ */ jsx43("div", { className: containerClass, children: content });
3279
+ return /* @__PURE__ */ jsx45("div", { className: containerClass, children: content });
3148
3280
  }
3149
3281
 
3150
3282
  // src/components/SectionHeader/SectionHeader.tsx
3151
- import { twMerge as twMerge16 } from "tailwind-merge";
3152
- import { jsx as jsx44, jsxs as jsxs31 } from "react/jsx-runtime";
3283
+ import { twMerge as twMerge17 } from "tailwind-merge";
3284
+ import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
3153
3285
  function SectionHeader({
3154
3286
  title,
3155
3287
  children,
3156
3288
  className
3157
3289
  }) {
3158
- return /* @__PURE__ */ jsxs31(
3290
+ return /* @__PURE__ */ jsxs32(
3159
3291
  "div",
3160
3292
  {
3161
- className: twMerge16(
3293
+ className: twMerge17(
3162
3294
  "flex flex-wrap items-center gap-[var(--spacing-3)] py-[var(--spacing-4)]",
3163
3295
  className
3164
3296
  ),
3165
3297
  children: [
3166
- /* @__PURE__ */ jsx44(H2, { children: title }),
3167
- children && /* @__PURE__ */ jsx44("div", { className: "ml-auto flex flex-wrap items-center gap-[var(--spacing-2)]", children })
3298
+ /* @__PURE__ */ jsx46(H2, { children: title }),
3299
+ children && /* @__PURE__ */ jsx46("div", { className: "ml-auto flex flex-wrap items-center gap-[var(--spacing-2)]", children })
3168
3300
  ]
3169
3301
  }
3170
3302
  );
3171
3303
  }
3172
3304
 
3173
3305
  // src/components/FormWizard/FormWizard.tsx
3174
- import { createContext as createContext5, useContext as useContext5, useCallback as useCallback6, useMemo } from "react";
3175
- import { jsx as jsx45 } from "react/jsx-runtime";
3176
- var FormWizardContext = createContext5({
3306
+ import { createContext as createContext6, useContext as useContext6, useCallback as useCallback6, useMemo } from "react";
3307
+ import { jsx as jsx47 } from "react/jsx-runtime";
3308
+ var FormWizardContext = createContext6({
3177
3309
  currentStep: 0,
3178
3310
  totalSteps: 1,
3179
3311
  canGoBack: false,
@@ -3182,7 +3314,7 @@ var FormWizardContext = createContext5({
3182
3314
  isLastStep: true
3183
3315
  });
3184
3316
  function useFormWizard() {
3185
- return useContext5(FormWizardContext);
3317
+ return useContext6(FormWizardContext);
3186
3318
  }
3187
3319
  function FormWizard({
3188
3320
  currentStep,
@@ -3207,13 +3339,13 @@ function FormWizard({
3207
3339
  }),
3208
3340
  [currentStep, totalSteps, canGoBack, goBack, isLastStep]
3209
3341
  );
3210
- return /* @__PURE__ */ jsx45(FormWizardContext.Provider, { value, children });
3342
+ return /* @__PURE__ */ jsx47(FormWizardContext.Provider, { value, children });
3211
3343
  }
3212
3344
 
3213
3345
  // src/components/FormWizard/FormWizardProgress.tsx
3214
- import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
3346
+ import { jsx as jsx48, jsxs as jsxs33 } from "react/jsx-runtime";
3215
3347
  function CheckIcon2() {
3216
- return /* @__PURE__ */ jsx46(
3348
+ return /* @__PURE__ */ jsx48(
3217
3349
  "svg",
3218
3350
  {
3219
3351
  "aria-hidden": "true",
@@ -3224,24 +3356,24 @@ function CheckIcon2() {
3224
3356
  strokeWidth: "2",
3225
3357
  strokeLinecap: "round",
3226
3358
  strokeLinejoin: "round",
3227
- children: /* @__PURE__ */ jsx46("path", { d: "M3 8.5l3.5 3.5 6.5-7" })
3359
+ children: /* @__PURE__ */ jsx48("path", { d: "M3 8.5l3.5 3.5 6.5-7" })
3228
3360
  }
3229
3361
  );
3230
3362
  }
3231
3363
  function FormWizardProgress({ labels }) {
3232
3364
  const { currentStep, totalSteps } = useFormWizard();
3233
- return /* @__PURE__ */ jsx46("nav", { "aria-label": "Form progress", children: /* @__PURE__ */ jsx46("ol", { className: "flex items-start", role: "list", children: labels.map((label, index) => {
3365
+ return /* @__PURE__ */ jsx48("nav", { "aria-label": "Form progress", children: /* @__PURE__ */ jsx48("ol", { className: "flex items-start", role: "list", children: labels.map((label, index) => {
3234
3366
  const isCompleted = index < currentStep;
3235
3367
  const isCurrent = index === currentStep;
3236
3368
  const isFuture = index > currentStep;
3237
- return /* @__PURE__ */ jsxs32(
3369
+ return /* @__PURE__ */ jsxs33(
3238
3370
  "li",
3239
3371
  {
3240
3372
  className: "flex flex-1 flex-col items-center",
3241
3373
  "aria-current": isCurrent ? "step" : void 0,
3242
3374
  children: [
3243
- /* @__PURE__ */ jsxs32("div", { className: "flex w-full items-center", children: [
3244
- index > 0 ? /* @__PURE__ */ jsx46(
3375
+ /* @__PURE__ */ jsxs33("div", { className: "flex w-full items-center", children: [
3376
+ index > 0 ? /* @__PURE__ */ jsx48(
3245
3377
  "div",
3246
3378
  {
3247
3379
  "aria-hidden": "true",
@@ -3250,8 +3382,8 @@ function FormWizardProgress({ labels }) {
3250
3382
  index <= currentStep ? "bg-[var(--color-brand-primary)]" : "bg-[var(--color-border-default)]"
3251
3383
  ].join(" ")
3252
3384
  }
3253
- ) : /* @__PURE__ */ jsx46("div", { className: "flex-1", "aria-hidden": "true" }),
3254
- /* @__PURE__ */ jsx46(
3385
+ ) : /* @__PURE__ */ jsx48("div", { className: "flex-1", "aria-hidden": "true" }),
3386
+ /* @__PURE__ */ jsx48(
3255
3387
  "div",
3256
3388
  {
3257
3389
  className: [
@@ -3263,10 +3395,10 @@ function FormWizardProgress({ labels }) {
3263
3395
  isFuture ? "border-2 border-[var(--color-border-default)] bg-[var(--color-surface-default)] text-[var(--color-text-tertiary)]" : ""
3264
3396
  ].join(" "),
3265
3397
  "aria-hidden": "true",
3266
- children: isCompleted ? /* @__PURE__ */ jsx46(CheckIcon2, {}) : index + 1
3398
+ children: isCompleted ? /* @__PURE__ */ jsx48(CheckIcon2, {}) : index + 1
3267
3399
  }
3268
3400
  ),
3269
- index < totalSteps - 1 ? /* @__PURE__ */ jsx46(
3401
+ index < totalSteps - 1 ? /* @__PURE__ */ jsx48(
3270
3402
  "div",
3271
3403
  {
3272
3404
  "aria-hidden": "true",
@@ -3275,9 +3407,9 @@ function FormWizardProgress({ labels }) {
3275
3407
  index < currentStep ? "bg-[var(--color-brand-primary)]" : "bg-[var(--color-border-default)]"
3276
3408
  ].join(" ")
3277
3409
  }
3278
- ) : /* @__PURE__ */ jsx46("div", { className: "flex-1", "aria-hidden": "true" })
3410
+ ) : /* @__PURE__ */ jsx48("div", { className: "flex-1", "aria-hidden": "true" })
3279
3411
  ] }),
3280
- /* @__PURE__ */ jsx46(
3412
+ /* @__PURE__ */ jsx48(
3281
3413
  "span",
3282
3414
  {
3283
3415
  className: [
@@ -3295,15 +3427,15 @@ function FormWizardProgress({ labels }) {
3295
3427
  }
3296
3428
 
3297
3429
  // src/components/FormWizard/FormWizardNav.tsx
3298
- import { jsx as jsx47, jsxs as jsxs33 } from "react/jsx-runtime";
3430
+ import { jsx as jsx49, jsxs as jsxs34 } from "react/jsx-runtime";
3299
3431
  function FormWizardNav({
3300
3432
  onNext,
3301
3433
  isSubmitting = false,
3302
3434
  submitLabel = "Submit"
3303
3435
  }) {
3304
3436
  const { canGoBack, goBack, isLastStep } = useFormWizard();
3305
- return /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-end gap-[var(--spacing-3)]", children: [
3306
- canGoBack && /* @__PURE__ */ jsx47(
3437
+ return /* @__PURE__ */ jsxs34("div", { className: "flex items-center justify-end gap-[var(--spacing-3)]", children: [
3438
+ canGoBack && /* @__PURE__ */ jsx49(
3307
3439
  Button,
3308
3440
  {
3309
3441
  variant: "secondary",
@@ -3313,7 +3445,7 @@ function FormWizardNav({
3313
3445
  children: "Back"
3314
3446
  }
3315
3447
  ),
3316
- /* @__PURE__ */ jsx47(
3448
+ /* @__PURE__ */ jsx49(
3317
3449
  Button,
3318
3450
  {
3319
3451
  variant: "primary",
@@ -3758,6 +3890,7 @@ export {
3758
3890
  LineHeightTight,
3759
3891
  Link,
3760
3892
  Menu,
3893
+ MenuCheckboxItem,
3761
3894
  MenuHeader,
3762
3895
  MenuItem,
3763
3896
  MenuSection,
@@ -3797,6 +3930,8 @@ export {
3797
3930
  Tabs,
3798
3931
  ToastProvider,
3799
3932
  ToggleButton,
3933
+ ToggleButtonGroup,
3934
+ ToggleButtonGroupItem,
3800
3935
  Tooltip,
3801
3936
  Tree,
3802
3937
  Tab2 as UnstyledTab,