@cytario/design 9.4.0 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -491,7 +491,7 @@ var buttonBaseClass = `
491
491
  inline-flex items-center justify-center gap-2 shrink-0 cursor-pointer
492
492
  rounded-full
493
493
  font-medium
494
- leading-tight
494
+ leading-none
495
495
  outline-none transition-colors no-underline
496
496
  focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2
497
497
  disabled:opacity-50 disabled:pointer-events-none
@@ -1072,6 +1072,12 @@ var alignClasses = {
1072
1072
  center: "text-center",
1073
1073
  right: "text-right"
1074
1074
  };
1075
+ var sizeStyles2 = {
1076
+ xs: "text-xs h-6",
1077
+ sm: "text-sm h-7",
1078
+ md: "text-base h-8",
1079
+ lg: "text-lg h-10"
1080
+ };
1075
1081
  function Input({
1076
1082
  as: FieldProp = TextField,
1077
1083
  label,
@@ -1081,6 +1087,7 @@ function Input({
1081
1087
  type = "text",
1082
1088
  size = "md",
1083
1089
  prefix,
1090
+ suffix,
1084
1091
  align = "left",
1085
1092
  isDisabled,
1086
1093
  isRequired,
@@ -1091,6 +1098,29 @@ function Input({
1091
1098
  const isInvalid = !!errorMessage;
1092
1099
  const borderColor = isInvalid ? "border-destructive-border" : "border-border hover:border-border";
1093
1100
  const radiusClass = "rounded-md";
1101
+ const inputCx = twMerge8(
1102
+ `
1103
+ w-full
1104
+ bg-transparent text-foreground
1105
+ placeholder:text-muted-foreground
1106
+ outline-none border-none
1107
+ `,
1108
+ sizeStyles2[size],
1109
+ alignClasses[align]
1110
+ );
1111
+ const containerCx = twMerge8(
1112
+ `
1113
+ flex items-center gap-1 px-2
1114
+ border bg-background
1115
+ outline-none transition-colors
1116
+ focus-within:ring-2
1117
+ focus-within:ring-ring
1118
+ focus-within:border-ring
1119
+ `,
1120
+ radiusClass,
1121
+ borderColor,
1122
+ isDisabled && "opacity-50 pointer-events-none"
1123
+ );
1094
1124
  return /* @__PURE__ */ jsxs6(
1095
1125
  Field,
1096
1126
  {
@@ -1102,69 +1132,11 @@ function Input({
1102
1132
  className: twMerge8("flex w-full flex-col gap-1", className),
1103
1133
  children: [
1104
1134
  label && /* @__PURE__ */ jsx14(Label, { isRequired, children: label }),
1105
- prefix ? /* @__PURE__ */ jsxs6(
1106
- "div",
1107
- {
1108
- className: twMerge8(
1109
- "flex items-center overflow-hidden",
1110
- radiusClass,
1111
- "border",
1112
- "bg-background",
1113
- "outline-none transition-colors",
1114
- borderColor,
1115
- "focus-within:ring-2 focus-within:ring-ring focus-within:border-ring",
1116
- isDisabled && "opacity-50 pointer-events-none"
1117
- ),
1118
- children: [
1119
- /* @__PURE__ */ jsx14(
1120
- "span",
1121
- {
1122
- className: twMerge8(
1123
- "self-stretch flex items-center shrink-0 select-none",
1124
- "bg-card",
1125
- "border-r border-r-border",
1126
- "text-muted-foreground",
1127
- sizeStyles[size]
1128
- ),
1129
- children: prefix
1130
- }
1131
- ),
1132
- /* @__PURE__ */ jsx14(
1133
- AriaInput,
1134
- {
1135
- placeholder,
1136
- className: twMerge8(
1137
- "w-full bg-transparent",
1138
- sizeStyles[size],
1139
- alignClasses[align],
1140
- "text-foreground",
1141
- "placeholder:text-muted-foreground",
1142
- "outline-none border-none"
1143
- )
1144
- }
1145
- )
1146
- ]
1147
- }
1148
- ) : /* @__PURE__ */ jsx14(
1149
- AriaInput,
1150
- {
1151
- placeholder,
1152
- className: twMerge8(
1153
- "w-full",
1154
- sizeStyles[size],
1155
- alignClasses[align],
1156
- radiusClass,
1157
- "border",
1158
- "text-foreground",
1159
- "bg-background",
1160
- "placeholder:text-muted-foreground",
1161
- "outline-none transition-colors",
1162
- borderColor,
1163
- "focus:ring-2 focus:ring-ring focus:border-ring",
1164
- "disabled:opacity-50 disabled:pointer-events-none"
1165
- )
1166
- }
1167
- ),
1135
+ /* @__PURE__ */ jsxs6("div", { className: containerCx, children: [
1136
+ prefix,
1137
+ /* @__PURE__ */ jsx14(AriaInput, { placeholder, className: inputCx }),
1138
+ suffix
1139
+ ] }),
1168
1140
  description && /* @__PURE__ */ jsx14(Text, { slot: "description", className: "text-sm text-muted-foreground", children: description }),
1169
1141
  isInvalid && /* @__PURE__ */ jsx14(
1170
1142
  Text,
@@ -1517,7 +1489,7 @@ import {
1517
1489
  } from "react-aria-components";
1518
1490
  import { X as X2 } from "lucide-react";
1519
1491
  import { Fragment as Fragment2, jsx as jsx18, jsxs as jsxs10 } from "react/jsx-runtime";
1520
- var sizeStyles2 = {
1492
+ var sizeStyles3 = {
1521
1493
  sm: "max-w-md",
1522
1494
  md: "max-w-lg",
1523
1495
  lg: "max-w-2xl",
@@ -1549,7 +1521,7 @@ function Dialog({
1549
1521
  {
1550
1522
  className: [
1551
1523
  "w-full mx-4",
1552
- sizeStyles2[size],
1524
+ sizeStyles3[size],
1553
1525
  "bg-background rounded-lg shadow-xl max-h-[85vh] flex flex-col",
1554
1526
  "entering:animate-in entering:zoom-in-95 entering:fade-in",
1555
1527
  "exiting:animate-out exiting:zoom-out-95 exiting:fade-out",
@@ -1817,59 +1789,50 @@ function Checkbox({ children, className, ...props }) {
1817
1789
 
1818
1790
  // src/components/Form/Switch/Switch.tsx
1819
1791
  import {
1820
- Switch as AriaSwitch
1792
+ SwitchField,
1793
+ SwitchButton
1821
1794
  } from "react-aria-components";
1795
+ import { twMerge as twMerge12 } from "tailwind-merge";
1822
1796
  import { Fragment as Fragment4, jsx as jsx23, jsxs as jsxs14 } from "react/jsx-runtime";
1823
- var trackColorMap = {
1824
- primary: "bg-primary",
1825
- success: "bg-success",
1826
- destructive: "bg-destructive"
1827
- };
1828
- var presetColors = new Set(Object.keys(trackColorMap));
1829
- function isPresetColor(color) {
1830
- return presetColors.has(color);
1831
- }
1832
1797
  function Switch({
1833
1798
  children,
1834
- color = "primary",
1799
+ color = "var(--color-primary)",
1835
1800
  className,
1836
1801
  ...props
1837
1802
  }) {
1838
- const isPreset = isPresetColor(color);
1839
- return /* @__PURE__ */ jsx23(
1840
- AriaSwitch,
1841
- {
1842
- ...props,
1843
- className: [
1844
- "group flex items-center gap-2 text-sm text-foreground cursor-pointer",
1845
- "disabled:opacity-50 disabled:cursor-default",
1846
- className
1847
- ].filter(Boolean).join(" "),
1848
- children: ({ isSelected }) => /* @__PURE__ */ jsxs14(Fragment4, { children: [
1849
- /* @__PURE__ */ jsx23(
1803
+ return /* @__PURE__ */ jsx23(SwitchField, { ...props, children: /* @__PURE__ */ jsx23(SwitchButton, { className: "relative cursor-pointer", children: ({ isSelected, isFocusVisible }) => /* @__PURE__ */ jsxs14(Fragment4, { children: [
1804
+ /* @__PURE__ */ jsx23(
1805
+ "div",
1806
+ {
1807
+ className: twMerge12(
1808
+ `
1809
+ flex items-center
1810
+ border-2 border-border
1811
+ w-9 h-5 rounded-full transition-colors shrink-0
1812
+ `,
1813
+ isFocusVisible && "ring-2 ring-ring ring-offset-2",
1814
+ !isSelected && "bg-border"
1815
+ ),
1816
+ style: isSelected ? { backgroundColor: color } : void 0,
1817
+ children: /* @__PURE__ */ jsx23(
1850
1818
  "div",
1851
1819
  {
1852
- className: [
1853
- "w-9 h-5 rounded-full transition-colors shrink-0 p-0.5",
1854
- "group-focus-visible:ring-2 group-focus-visible:ring-ring group-focus-visible:ring-offset-2",
1855
- isSelected && isPreset ? trackColorMap[color] : !isSelected ? "bg-border" : ""
1856
- ].join(" "),
1857
- style: isSelected && !isPreset ? { backgroundColor: color } : void 0,
1858
- children: /* @__PURE__ */ jsx23(
1859
- "div",
1860
- {
1861
- className: [
1862
- "w-4 h-4 rounded-full bg-background transition-transform shadow-sm",
1863
- isSelected ? "translate-x-4" : "translate-x-0"
1864
- ].join(" ")
1865
- }
1820
+ className: twMerge12(
1821
+ `
1822
+ absolute top-0 left-0 w-5 h-5
1823
+ rounded-full
1824
+ transition-transform
1825
+ border-2 border-border
1826
+
1827
+ `,
1828
+ isSelected ? "translate-x-4 bg-card" : "translate-x-0 bg-background"
1866
1829
  )
1867
1830
  }
1868
- ),
1869
- children && /* @__PURE__ */ jsx23("span", { children })
1870
- ] })
1871
- }
1872
- );
1831
+ )
1832
+ }
1833
+ ),
1834
+ children && /* @__PURE__ */ jsx23("span", { children })
1835
+ ] }) }) });
1873
1836
  }
1874
1837
 
1875
1838
  // src/components/Form/Radio/Radio.tsx
@@ -2070,7 +2033,7 @@ function Breadcrumbs({ items, className }) {
2070
2033
  import {
2071
2034
  ToggleButton as AriaToggleButton2
2072
2035
  } from "react-aria-components";
2073
- import { twMerge as twMerge12 } from "tailwind-merge";
2036
+ import { twMerge as twMerge13 } from "tailwind-merge";
2074
2037
  import { jsx as jsx28 } from "react/jsx-runtime";
2075
2038
  var squareSizeStyles2 = {
2076
2039
  xs: "h-6 w-6 text-xs",
@@ -2120,7 +2083,7 @@ function ToggleButton({
2120
2083
  AriaToggleButton2,
2121
2084
  {
2122
2085
  ...props,
2123
- className: ({ isSelected }) => twMerge12(
2086
+ className: ({ isSelected }) => twMerge13(
2124
2087
  "inline-flex items-center justify-center gap-2 cursor-pointer",
2125
2088
  isSquare ? "rounded-none" : "rounded-md",
2126
2089
  "font-medium",
@@ -2143,7 +2106,7 @@ import {
2143
2106
  MenuItem as AriaMenuItem,
2144
2107
  Popover as Popover2
2145
2108
  } from "react-aria-components";
2146
- import { twMerge as twMerge13 } from "tailwind-merge";
2109
+ import { twMerge as twMerge14 } from "tailwind-merge";
2147
2110
 
2148
2111
  // src/components/Menu/menuStyles.ts
2149
2112
  var popoverStyles = `
@@ -2170,7 +2133,7 @@ function Menu2({
2170
2133
  const selectionProps = selectionMode && selectionMode !== "none" ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange } : {};
2171
2134
  return /* @__PURE__ */ jsxs18(MenuTrigger, { children: [
2172
2135
  children,
2173
- /* @__PURE__ */ jsx29(Popover2, { className: twMerge13(popoverStyles, className), children: items ? /* @__PURE__ */ jsx29(
2136
+ /* @__PURE__ */ jsx29(Popover2, { className: twMerge14(popoverStyles, className), children: items ? /* @__PURE__ */ jsx29(
2174
2137
  AriaMenu,
2175
2138
  {
2176
2139
  items,
@@ -2229,7 +2192,7 @@ import {
2229
2192
  Popover as Popover3,
2230
2193
  Pressable
2231
2194
  } from "react-aria-components";
2232
- import { twMerge as twMerge14 } from "tailwind-merge";
2195
+ import { twMerge as twMerge15 } from "tailwind-merge";
2233
2196
  import { jsx as jsx30, jsxs as jsxs19 } from "react/jsx-runtime";
2234
2197
  function useContextMenu({
2235
2198
  content,
@@ -2295,7 +2258,7 @@ function useContextMenu({
2295
2258
  isNonModal: true,
2296
2259
  placement: "bottom start",
2297
2260
  ref: popoverRef,
2298
- className: twMerge14(popoverStyles, className),
2261
+ className: twMerge15(popoverStyles, className),
2299
2262
  children: /* @__PURE__ */ jsx30(
2300
2263
  AriaMenu2,
2301
2264
  {
@@ -2458,7 +2421,7 @@ import {
2458
2421
  Popover as AriaPopover,
2459
2422
  Button as AriaButton3
2460
2423
  } from "react-aria-components";
2461
- import { twMerge as twMerge15 } from "tailwind-merge";
2424
+ import { twMerge as twMerge16 } from "tailwind-merge";
2462
2425
  import { jsx as jsx36 } from "react/jsx-runtime";
2463
2426
  function Popover4({ children, isOpen, onOpenChange }) {
2464
2427
  return /* @__PURE__ */ jsx36(DialogTrigger, { isOpen, onOpenChange, children });
@@ -2468,7 +2431,7 @@ function PopoverTrigger({ children, className }) {
2468
2431
  inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer
2469
2432
  focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm
2470
2433
  `;
2471
- return /* @__PURE__ */ jsx36(AriaButton3, { className: twMerge15(cx, className), children });
2434
+ return /* @__PURE__ */ jsx36(AriaButton3, { className: twMerge16(cx, className), children });
2472
2435
  }
2473
2436
  function PopoverContent({
2474
2437
  placement = "bottom",
@@ -2495,7 +2458,7 @@ function PopoverContent({
2495
2458
  ...rest,
2496
2459
  placement,
2497
2460
  offset: offsetPx,
2498
- className: twMerge15(cx, className),
2461
+ className: twMerge16(cx, className),
2499
2462
  children
2500
2463
  }
2501
2464
  );
@@ -2503,7 +2466,7 @@ function PopoverContent({
2503
2466
 
2504
2467
  // src/components/Tabs/Tabs.tsx
2505
2468
  import { createContext as createContext2, useContext as useContext2 } from "react";
2506
- import { twMerge as twMerge16 } from "tailwind-merge";
2469
+ import { twMerge as twMerge17 } from "tailwind-merge";
2507
2470
  import {
2508
2471
  Tabs as AriaTabs,
2509
2472
  TabList as AriaTabList,
@@ -2515,7 +2478,7 @@ var TabsContext = createContext2({
2515
2478
  variant: "underline",
2516
2479
  size: "md"
2517
2480
  });
2518
- var sizeStyles3 = {
2481
+ var sizeStyles4 = {
2519
2482
  sm: "px-3 py-1.5 text-sm",
2520
2483
  md: "px-4 py-2 text-base",
2521
2484
  lg: "px-6 py-3 text-lg"
@@ -2533,7 +2496,7 @@ function Tabs({
2533
2496
  {
2534
2497
  ...props,
2535
2498
  orientation,
2536
- className: twMerge16(
2499
+ className: twMerge17(
2537
2500
  orientation === "vertical" ? "flex" : "",
2538
2501
  className
2539
2502
  ),
@@ -2552,7 +2515,7 @@ function TabList({
2552
2515
  AriaTabList,
2553
2516
  {
2554
2517
  ...props,
2555
- className: ({ orientation }) => twMerge16(
2518
+ className: ({ orientation }) => twMerge17(
2556
2519
  baseStyles,
2557
2520
  orientation === "vertical" ? verticalStyles : "",
2558
2521
  className
@@ -2568,14 +2531,14 @@ function Tab({ className, ...props }) {
2568
2531
  ...props,
2569
2532
  className: ({ isSelected, isDisabled, isHovered, isPressed }) => {
2570
2533
  if (variant === "unstyled") {
2571
- return twMerge16(
2534
+ return twMerge17(
2572
2535
  "cursor-pointer outline-none",
2573
2536
  "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
2574
2537
  isDisabled ? "opacity-50 pointer-events-none" : "",
2575
2538
  className
2576
2539
  );
2577
2540
  }
2578
- return twMerge16(
2541
+ return twMerge17(
2579
2542
  // Base
2580
2543
  "cursor-pointer outline-none transition-colors",
2581
2544
  "font-medium",
@@ -2584,7 +2547,7 @@ function Tab({ className, ...props }) {
2584
2547
  // Disabled
2585
2548
  isDisabled ? "opacity-50 pointer-events-none" : "",
2586
2549
  // Size
2587
- sizeStyles3[size],
2550
+ sizeStyles4[size],
2588
2551
  ...getTabVariantStyles(variant, {
2589
2552
  isSelected,
2590
2553
  isHovered,
@@ -2623,7 +2586,7 @@ function TabPanel({ className, ...props }) {
2623
2586
  AriaTabPanel,
2624
2587
  {
2625
2588
  ...props,
2626
- className: twMerge16(
2589
+ className: twMerge17(
2627
2590
  variant === "unstyled" ? "outline-none" : "mt-4 outline-none",
2628
2591
  className
2629
2592
  )
@@ -2641,7 +2604,7 @@ import {
2641
2604
 
2642
2605
  // src/components/SegmentedControl/SegmentedControl.tsx
2643
2606
  import { createContext as createContext3, useContext as useContext3 } from "react";
2644
- import { twMerge as twMerge17 } from "tailwind-merge";
2607
+ import { twMerge as twMerge18 } from "tailwind-merge";
2645
2608
  import {
2646
2609
  ToggleButtonGroup as AriaToggleButtonGroup,
2647
2610
  ToggleButton as AriaToggleButton3
@@ -2650,7 +2613,7 @@ import { jsx as jsx38 } from "react/jsx-runtime";
2650
2613
  var SegmentedControlContext = createContext3({
2651
2614
  size: "md"
2652
2615
  });
2653
- var sizeStyles4 = {
2616
+ var sizeStyles5 = {
2654
2617
  sm: "px-2.5 py-1 text-xs",
2655
2618
  md: "px-3 py-1.5 text-sm",
2656
2619
  lg: "px-4 py-2 text-base"
@@ -2674,7 +2637,7 @@ function SegmentedControl({
2674
2637
  selectedKeys: isNoneMode ? /* @__PURE__ */ new Set() : selectedKeys,
2675
2638
  defaultSelectedKeys: isNoneMode ? void 0 : defaultSelectedKeys,
2676
2639
  onSelectionChange: isNoneMode ? void 0 : onSelectionChange,
2677
- className: twMerge17(
2640
+ className: twMerge18(
2678
2641
  "inline-flex items-center rounded-lg border border-border bg-muted p-0.5 gap-0.5",
2679
2642
  className
2680
2643
  ),
@@ -2691,7 +2654,7 @@ function SegmentedControlItem({
2691
2654
  AriaToggleButton3,
2692
2655
  {
2693
2656
  ...props,
2694
- className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge17(
2657
+ className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge18(
2695
2658
  // Base layout
2696
2659
  "inline-flex items-center justify-center",
2697
2660
  "rounded-md",
@@ -2702,7 +2665,7 @@ function SegmentedControlItem({
2702
2665
  // Disabled
2703
2666
  isDisabled && "opacity-50 pointer-events-none",
2704
2667
  // Size
2705
- sizeStyles4[size],
2668
+ sizeStyles5[size],
2706
2669
  // Selected state
2707
2670
  isSelected ? "bg-background text-foreground shadow-sm font-semibold" : isPressed ? "bg-card text-foreground" : isHovered ? "bg-card text-foreground" : "bg-transparent text-muted-foreground",
2708
2671
  className
@@ -2712,8 +2675,21 @@ function SegmentedControlItem({
2712
2675
  }
2713
2676
 
2714
2677
  // src/components/Badge/Badge.tsx
2715
- import { twMerge as twMerge18 } from "tailwind-merge";
2716
- import { jsx as jsx39, jsxs as jsxs23 } from "react/jsx-runtime";
2678
+ import { twMerge as twMerge20 } from "tailwind-merge";
2679
+
2680
+ // src/components/MetricText/MetricText.tsx
2681
+ import { twMerge as twMerge19 } from "tailwind-merge";
2682
+ import { jsx as jsx39 } from "react/jsx-runtime";
2683
+ function MetricText({ className, ...rest }) {
2684
+ const cx = twMerge19(
2685
+ "text-xs font-medium leading-none tracking-wider tabular-nums",
2686
+ className
2687
+ );
2688
+ return /* @__PURE__ */ jsx39("span", { className: cx, ...rest });
2689
+ }
2690
+
2691
+ // src/components/Badge/Badge.tsx
2692
+ import { jsx as jsx40, jsxs as jsxs23 } from "react/jsx-runtime";
2717
2693
  var colorStyles = {
2718
2694
  purple: "bg-badge-purple-bg text-badge-purple-text border-badge-purple-text/20",
2719
2695
  teal: "bg-badge-teal-bg text-badge-teal-text border-badge-teal-text/20",
@@ -2722,7 +2698,7 @@ var colorStyles = {
2722
2698
  green: "bg-badge-green-bg text-badge-green-text border-badge-green-text/20",
2723
2699
  amber: "bg-badge-amber-bg text-badge-amber-text border-badge-amber-text/20"
2724
2700
  };
2725
- var sizeStyles5 = {
2701
+ var sizeStyles6 = {
2726
2702
  xs: "px-1 py-0 text-[10px]",
2727
2703
  sm: "px-1.5 py-0.5 text-xs",
2728
2704
  md: "px-2 py-0.5 text-xs",
@@ -2737,18 +2713,17 @@ function Badge({
2737
2713
  ...rest
2738
2714
  }) {
2739
2715
  return /* @__PURE__ */ jsxs23(
2740
- "span",
2716
+ MetricText,
2741
2717
  {
2742
- className: twMerge18(
2718
+ className: twMerge20(
2743
2719
  "inline-flex items-center gap-1 rounded-full border",
2744
- "font-medium leading-tight tracking-wider tabular-nums",
2745
2720
  colorStyles[color],
2746
- sizeStyles5[size],
2721
+ sizeStyles6[size],
2747
2722
  className
2748
2723
  ),
2749
2724
  ...rest,
2750
2725
  children: [
2751
- icon && /* @__PURE__ */ jsx39(Icon, { icon, size: "xs" }),
2726
+ icon && /* @__PURE__ */ jsx40(Icon, { icon, size: "xs" }),
2752
2727
  children
2753
2728
  ]
2754
2729
  }
@@ -2756,10 +2731,10 @@ function Badge({
2756
2731
  }
2757
2732
 
2758
2733
  // src/components/Card/Card.tsx
2759
- import { twMerge as twMerge19 } from "tailwind-merge";
2760
- import { jsx as jsx40, jsxs as jsxs24 } from "react/jsx-runtime";
2734
+ import { twMerge as twMerge21 } from "tailwind-merge";
2735
+ import { jsx as jsx41, jsxs as jsxs24 } from "react/jsx-runtime";
2761
2736
  function Card({ children, header, footer, className }) {
2762
- const cx = twMerge19(
2737
+ const cx = twMerge21(
2763
2738
  `
2764
2739
  bg-card p-8
2765
2740
  border border-border
@@ -2769,16 +2744,16 @@ function Card({ children, header, footer, className }) {
2769
2744
  className
2770
2745
  );
2771
2746
  return /* @__PURE__ */ jsxs24("div", { className: cx, children: [
2772
- header && /* @__PURE__ */ jsx40("div", { className: "border-b border-border", children: header }),
2747
+ header && /* @__PURE__ */ jsx41("div", { className: "border-b border-border", children: header }),
2773
2748
  children,
2774
- footer && /* @__PURE__ */ jsx40("div", { className: "border-t border-border", children: footer })
2749
+ footer && /* @__PURE__ */ jsx41("div", { className: "border-t border-border", children: footer })
2775
2750
  ] });
2776
2751
  }
2777
2752
 
2778
2753
  // src/components/DeltaIndicator/DeltaIndicator.tsx
2779
2754
  import { ArrowUp as ArrowUp2, ArrowDown as ArrowDown2, Minus as Minus2 } from "lucide-react";
2780
- import { twMerge as twMerge20 } from "tailwind-merge";
2781
- import { jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
2755
+ import { twMerge as twMerge22 } from "tailwind-merge";
2756
+ import { jsx as jsx42, jsxs as jsxs25 } from "react/jsx-runtime";
2782
2757
  function getDirection(current, previous) {
2783
2758
  const diff = current - previous;
2784
2759
  if (diff > 0) return "increase";
@@ -2834,13 +2809,13 @@ function DeltaIndicator({
2834
2809
  return /* @__PURE__ */ jsxs25(
2835
2810
  "span",
2836
2811
  {
2837
- className: twMerge20(
2812
+ className: twMerge22(
2838
2813
  "inline-flex items-center gap-1 font-medium",
2839
2814
  "text-muted-foreground",
2840
2815
  className
2841
2816
  ),
2842
2817
  children: [
2843
- label && /* @__PURE__ */ jsx41("span", { className: "text-sm text-muted-foreground mr-1", children: label }),
2818
+ label && /* @__PURE__ */ jsx42("span", { className: "text-sm text-muted-foreground mr-1", children: label }),
2844
2819
  unavailableText
2845
2820
  ]
2846
2821
  }
@@ -2873,7 +2848,7 @@ function DeltaIndicator({
2873
2848
  return /* @__PURE__ */ jsxs25(
2874
2849
  "span",
2875
2850
  {
2876
- className: twMerge20(
2851
+ className: twMerge22(
2877
2852
  "inline-flex items-center gap-1 font-medium",
2878
2853
  colorStyles2,
2879
2854
  isPill && [
@@ -2884,8 +2859,8 @@ function DeltaIndicator({
2884
2859
  className
2885
2860
  ),
2886
2861
  children: [
2887
- label && /* @__PURE__ */ jsx41("span", { className: "text-sm text-muted-foreground mr-1", children: label }),
2888
- /* @__PURE__ */ jsx41(IconComponent, { size: 14, "aria-hidden": true }),
2862
+ label && /* @__PURE__ */ jsx42("span", { className: "text-sm text-muted-foreground mr-1", children: label }),
2863
+ /* @__PURE__ */ jsx42(IconComponent, { size: 14, "aria-hidden": true }),
2889
2864
  valueText
2890
2865
  ]
2891
2866
  }
@@ -2893,8 +2868,8 @@ function DeltaIndicator({
2893
2868
  }
2894
2869
 
2895
2870
  // src/components/ProgressBar/ProgressBar.tsx
2896
- import { twMerge as twMerge21 } from "tailwind-merge";
2897
- import { jsx as jsx42, jsxs as jsxs26 } from "react/jsx-runtime";
2871
+ import { twMerge as twMerge23 } from "tailwind-merge";
2872
+ import { jsx as jsx43, jsxs as jsxs26 } from "react/jsx-runtime";
2898
2873
  var fillStyles = {
2899
2874
  brand: "bg-progress-fill",
2900
2875
  success: "bg-progress-fill-success",
@@ -2902,7 +2877,7 @@ var fillStyles = {
2902
2877
  danger: "bg-progress-fill-danger",
2903
2878
  neutral: "bg-muted-foreground"
2904
2879
  };
2905
- var sizeStyles6 = {
2880
+ var sizeStyles7 = {
2906
2881
  sm: "h-1.5",
2907
2882
  md: "h-3",
2908
2883
  lg: "h-4"
@@ -2917,12 +2892,12 @@ function ProgressBar({
2917
2892
  className
2918
2893
  }) {
2919
2894
  const clampedValue = Math.min(100, Math.max(0, value));
2920
- return /* @__PURE__ */ jsxs26("div", { className: twMerge21("w-full", className), children: [
2895
+ return /* @__PURE__ */ jsxs26("div", { className: twMerge23("w-full", className), children: [
2921
2896
  (label || description || showValue) && /* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between mb-2", children: [
2922
- /* @__PURE__ */ jsx42("span", { className: "text-sm font-medium text-foreground", children: label }),
2923
- /* @__PURE__ */ jsx42("span", { className: "text-sm text-muted-foreground", children: description ?? (showValue ? `${clampedValue}%` : null) })
2897
+ /* @__PURE__ */ jsx43("span", { className: "text-sm font-medium text-foreground", children: label }),
2898
+ /* @__PURE__ */ jsx43("span", { className: "text-sm text-muted-foreground", children: description ?? (showValue ? `${clampedValue}%` : null) })
2924
2899
  ] }),
2925
- /* @__PURE__ */ jsx42(
2900
+ /* @__PURE__ */ jsx43(
2926
2901
  "div",
2927
2902
  {
2928
2903
  role: "progressbar",
@@ -2930,14 +2905,14 @@ function ProgressBar({
2930
2905
  "aria-valuemin": 0,
2931
2906
  "aria-valuemax": 100,
2932
2907
  "aria-label": label ?? "Progress",
2933
- className: twMerge21(
2908
+ className: twMerge23(
2934
2909
  "w-full rounded-full bg-progress-track",
2935
- sizeStyles6[size]
2910
+ sizeStyles7[size]
2936
2911
  ),
2937
- children: /* @__PURE__ */ jsx42(
2912
+ children: /* @__PURE__ */ jsx43(
2938
2913
  "div",
2939
2914
  {
2940
- className: twMerge21(
2915
+ className: twMerge23(
2941
2916
  "h-full rounded-full transition-all duration-300",
2942
2917
  fillStyles[variant]
2943
2918
  ),
@@ -2957,8 +2932,8 @@ import {
2957
2932
  AlertCircle as AlertCircle2,
2958
2933
  CheckCircle2 as CheckCircle22
2959
2934
  } from "lucide-react";
2960
- import { twMerge as twMerge22 } from "tailwind-merge";
2961
- import { jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
2935
+ import { twMerge as twMerge24 } from "tailwind-merge";
2936
+ import { jsx as jsx44, jsxs as jsxs27 } from "react/jsx-runtime";
2962
2937
  var variantConfig2 = {
2963
2938
  info: {
2964
2939
  icon: Info3,
@@ -3006,19 +2981,19 @@ function Banner({
3006
2981
  "div",
3007
2982
  {
3008
2983
  role: config.role,
3009
- className: twMerge22(
2984
+ className: twMerge24(
3010
2985
  "flex items-start gap-3 rounded-lg border px-4 py-3",
3011
2986
  "text-sm",
3012
2987
  config.containerClass,
3013
2988
  className
3014
2989
  ),
3015
2990
  children: [
3016
- /* @__PURE__ */ jsx43(
2991
+ /* @__PURE__ */ jsx44(
3017
2992
  Icon,
3018
2993
  {
3019
2994
  icon: resolvedIcon,
3020
2995
  size: "md",
3021
- className: twMerge22("mt-0.5", config.iconClass)
2996
+ className: twMerge24("mt-0.5", config.iconClass)
3022
2997
  }
3023
2998
  ),
3024
2999
  /* @__PURE__ */ jsxs27("div", { className: "flex-1", children: [
@@ -3028,14 +3003,14 @@ function Banner({
3028
3003
  ] }),
3029
3004
  children
3030
3005
  ] }),
3031
- dismissible && /* @__PURE__ */ jsx43(
3006
+ dismissible && /* @__PURE__ */ jsx44(
3032
3007
  "button",
3033
3008
  {
3034
3009
  type: "button",
3035
3010
  onClick: handleDismiss,
3036
3011
  className: "shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current",
3037
3012
  "aria-label": "Dismiss",
3038
- children: /* @__PURE__ */ jsx43(Icon, { icon: "X", size: "sm" })
3013
+ children: /* @__PURE__ */ jsx44(Icon, { icon: "X", size: "sm" })
3039
3014
  }
3040
3015
  )
3041
3016
  ]
@@ -3044,8 +3019,8 @@ function Banner({
3044
3019
  }
3045
3020
 
3046
3021
  // src/components/MetricCard/MetricCard.tsx
3047
- import { twMerge as twMerge23 } from "tailwind-merge";
3048
- import { Fragment as Fragment8, jsx as jsx44, jsxs as jsxs28 } from "react/jsx-runtime";
3022
+ import { twMerge as twMerge25 } from "tailwind-merge";
3023
+ import { Fragment as Fragment8, jsx as jsx45, jsxs as jsxs28 } from "react/jsx-runtime";
3049
3024
  var sizeConfig = {
3050
3025
  sm: {
3051
3026
  padding: "p-3",
@@ -3067,50 +3042,50 @@ function MetricCard({
3067
3042
  className
3068
3043
  }) {
3069
3044
  const config = sizeConfig[size];
3070
- const containerClass = twMerge23(
3045
+ const containerClass = twMerge25(
3071
3046
  "bg-background border border-border rounded-lg shadow-sm",
3072
3047
  config.padding,
3073
3048
  href && "block transition-shadow hover:shadow-md hover:border-ring focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 outline-none",
3074
3049
  className
3075
3050
  );
3076
3051
  const content = /* @__PURE__ */ jsxs28(Fragment8, { children: [
3077
- /* @__PURE__ */ jsx44("div", { className: twMerge23(config.labelClass, "text-muted-foreground"), children: label }),
3078
- /* @__PURE__ */ jsx44(
3052
+ /* @__PURE__ */ jsx45("div", { className: twMerge25(config.labelClass, "text-muted-foreground"), children: label }),
3053
+ /* @__PURE__ */ jsx45(
3079
3054
  "div",
3080
3055
  {
3081
- className: twMerge23(
3056
+ className: twMerge25(
3082
3057
  config.valueClass,
3083
3058
  "font-semibold text-foreground mt-1 tabular-nums"
3084
3059
  ),
3085
3060
  children: value
3086
3061
  }
3087
3062
  ),
3088
- secondary && /* @__PURE__ */ jsx44("div", { className: "mt-1 text-sm", children: secondary })
3063
+ secondary && /* @__PURE__ */ jsx45("div", { className: "mt-1 text-sm", children: secondary })
3089
3064
  ] });
3090
3065
  if (href) {
3091
- return /* @__PURE__ */ jsx44("a", { href, className: containerClass, children: content });
3066
+ return /* @__PURE__ */ jsx45("a", { href, className: containerClass, children: content });
3092
3067
  }
3093
- return /* @__PURE__ */ jsx44("div", { className: containerClass, children: content });
3068
+ return /* @__PURE__ */ jsx45("div", { className: containerClass, children: content });
3094
3069
  }
3095
3070
 
3096
3071
  // src/components/SectionHeader/SectionHeader.tsx
3097
3072
  import { forwardRef as forwardRef7 } from "react";
3098
- import { twMerge as twMerge24 } from "tailwind-merge";
3099
- import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
3073
+ import { twMerge as twMerge26 } from "tailwind-merge";
3074
+ import { jsx as jsx46, jsxs as jsxs29 } from "react/jsx-runtime";
3100
3075
  var SectionHeader = forwardRef7(
3101
3076
  function SectionHeader2({ title, as = "h2", children, className, ...rest }, ref) {
3102
3077
  return /* @__PURE__ */ jsxs29(
3103
3078
  "div",
3104
3079
  {
3105
3080
  ref,
3106
- className: twMerge24(
3081
+ className: twMerge26(
3107
3082
  "flex flex-wrap items-center gap-3 pt-0 pb-4",
3108
3083
  className
3109
3084
  ),
3110
3085
  ...rest,
3111
3086
  children: [
3112
- /* @__PURE__ */ jsx45(Heading, { as, children: title }),
3113
- children && /* @__PURE__ */ jsx45("div", { className: "ml-auto flex flex-wrap items-center gap-2", children })
3087
+ /* @__PURE__ */ jsx46(Heading, { as, children: title }),
3088
+ children && /* @__PURE__ */ jsx46("div", { className: "ml-auto flex flex-wrap items-center gap-2", children })
3114
3089
  ]
3115
3090
  }
3116
3091
  );
@@ -3120,7 +3095,7 @@ var SectionHeader = forwardRef7(
3120
3095
  // src/components/DescriptionList/DescriptionList.tsx
3121
3096
  import { createContext as createContext4, useContext as useContext4 } from "react";
3122
3097
  import { Button as AriaButton4 } from "react-aria-components";
3123
- import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
3098
+ import { jsx as jsx47, jsxs as jsxs30 } from "react/jsx-runtime";
3124
3099
  var LayoutContext = createContext4("stacked");
3125
3100
  var listGapStyles = {
3126
3101
  stacked: "gap-4",
@@ -3131,7 +3106,7 @@ function DescriptionList({
3131
3106
  layout = "stacked",
3132
3107
  className
3133
3108
  }) {
3134
- return /* @__PURE__ */ jsx46(LayoutContext.Provider, { value: layout, children: /* @__PURE__ */ jsx46(
3109
+ return /* @__PURE__ */ jsx47(LayoutContext.Provider, { value: layout, children: /* @__PURE__ */ jsx47(
3135
3110
  "dl",
3136
3111
  {
3137
3112
  className: ["flex flex-col", listGapStyles[layout], className].filter(Boolean).join(" "),
@@ -3155,17 +3130,17 @@ function DescriptionListItem({
3155
3130
  "text-sm m-0",
3156
3131
  muted ? "text-muted-foreground" : "text-foreground"
3157
3132
  ].join(" ");
3158
- const valueContent = /* @__PURE__ */ jsx46("dd", { className: valueClasses, children });
3133
+ const valueContent = /* @__PURE__ */ jsx47("dd", { className: valueClasses, children });
3159
3134
  return /* @__PURE__ */ jsxs30("div", { className: itemLayoutStyles[layout], children: [
3160
- /* @__PURE__ */ jsx46("dt", { className: labelClasses, children: label }),
3161
- fullValue ? /* @__PURE__ */ jsx46(Tooltip, { content: fullValue, children: /* @__PURE__ */ jsx46(AriaButton4, { className: "text-left outline-none cursor-default", children: valueContent }) }) : valueContent
3135
+ /* @__PURE__ */ jsx47("dt", { className: labelClasses, children: label }),
3136
+ fullValue ? /* @__PURE__ */ jsx47(Tooltip, { content: fullValue, children: /* @__PURE__ */ jsx47(AriaButton4, { className: "text-left outline-none cursor-default", children: valueContent }) }) : valueContent
3162
3137
  ] });
3163
3138
  }
3164
3139
  DescriptionList.Item = DescriptionListItem;
3165
3140
 
3166
3141
  // src/components/PathPill/PathPill.tsx
3167
- import { twMerge as twMerge25 } from "tailwind-merge";
3168
- import { jsx as jsx47 } from "react/jsx-runtime";
3142
+ import { twMerge as twMerge27 } from "tailwind-merge";
3143
+ import { jsx as jsx48 } from "react/jsx-runtime";
3169
3144
  var hashColors = [
3170
3145
  "purple",
3171
3146
  "teal",
@@ -3191,17 +3166,17 @@ function PathPill({
3191
3166
  const effectiveVisible = visibleCount ?? segments.length;
3192
3167
  const dotCount = Math.max(0, segments.length - effectiveVisible);
3193
3168
  const fullPath = segments.join(" / ");
3194
- return /* @__PURE__ */ jsx47(
3169
+ return /* @__PURE__ */ jsx48(
3195
3170
  "div",
3196
3171
  {
3197
- className: twMerge25("relative flex", className),
3172
+ className: twMerge27("relative flex", className),
3198
3173
  "aria-label": `Path: ${fullPath}`,
3199
3174
  children: segments.map((segment, i) => {
3200
3175
  const isCollapsed = i < dotCount;
3201
3176
  const isLast = i === segments.length - 1;
3202
- const cx = twMerge25(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
3177
+ const cx = twMerge27(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
3203
3178
  const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);
3204
- return /* @__PURE__ */ jsx47(
3179
+ return /* @__PURE__ */ jsx48(
3205
3180
  Badge,
3206
3181
  {
3207
3182
  className: cx,
@@ -3218,7 +3193,7 @@ function PathPill({
3218
3193
 
3219
3194
  // src/components/FormWizard/FormWizard.tsx
3220
3195
  import { createContext as createContext5, useContext as useContext5, useCallback as useCallback4, useMemo } from "react";
3221
- import { jsx as jsx48 } from "react/jsx-runtime";
3196
+ import { jsx as jsx49 } from "react/jsx-runtime";
3222
3197
  var FormWizardContext = createContext5({
3223
3198
  currentStep: 0,
3224
3199
  totalSteps: 1,
@@ -3253,13 +3228,13 @@ function FormWizard({
3253
3228
  }),
3254
3229
  [currentStep, totalSteps, canGoBack, goBack, isLastStep]
3255
3230
  );
3256
- return /* @__PURE__ */ jsx48(FormWizardContext.Provider, { value, children });
3231
+ return /* @__PURE__ */ jsx49(FormWizardContext.Provider, { value, children });
3257
3232
  }
3258
3233
 
3259
3234
  // src/components/FormWizard/FormWizardProgress.tsx
3260
- import { jsx as jsx49, jsxs as jsxs31 } from "react/jsx-runtime";
3235
+ import { jsx as jsx50, jsxs as jsxs31 } from "react/jsx-runtime";
3261
3236
  function CheckIcon() {
3262
- return /* @__PURE__ */ jsx49(
3237
+ return /* @__PURE__ */ jsx50(
3263
3238
  "svg",
3264
3239
  {
3265
3240
  "aria-hidden": "true",
@@ -3270,13 +3245,13 @@ function CheckIcon() {
3270
3245
  strokeWidth: "2",
3271
3246
  strokeLinecap: "round",
3272
3247
  strokeLinejoin: "round",
3273
- children: /* @__PURE__ */ jsx49("path", { d: "M3 8.5l3.5 3.5 6.5-7" })
3248
+ children: /* @__PURE__ */ jsx50("path", { d: "M3 8.5l3.5 3.5 6.5-7" })
3274
3249
  }
3275
3250
  );
3276
3251
  }
3277
3252
  function FormWizardProgress({ labels }) {
3278
3253
  const { currentStep, totalSteps } = useFormWizard();
3279
- return /* @__PURE__ */ jsx49("nav", { "aria-label": "Form progress", children: /* @__PURE__ */ jsx49("ol", { className: "flex items-start", role: "list", children: labels.map((label, index) => {
3254
+ return /* @__PURE__ */ jsx50("nav", { "aria-label": "Form progress", children: /* @__PURE__ */ jsx50("ol", { className: "flex items-start", role: "list", children: labels.map((label, index) => {
3280
3255
  const isCompleted = index < currentStep;
3281
3256
  const isCurrent = index === currentStep;
3282
3257
  const isFuture = index > currentStep;
@@ -3287,7 +3262,7 @@ function FormWizardProgress({ labels }) {
3287
3262
  "aria-current": isCurrent ? "step" : void 0,
3288
3263
  children: [
3289
3264
  /* @__PURE__ */ jsxs31("div", { className: "flex w-full items-center", children: [
3290
- index > 0 ? /* @__PURE__ */ jsx49(
3265
+ index > 0 ? /* @__PURE__ */ jsx50(
3291
3266
  "div",
3292
3267
  {
3293
3268
  "aria-hidden": "true",
@@ -3296,8 +3271,8 @@ function FormWizardProgress({ labels }) {
3296
3271
  index <= currentStep ? "bg-primary" : "bg-border"
3297
3272
  ].join(" ")
3298
3273
  }
3299
- ) : /* @__PURE__ */ jsx49("div", { className: "flex-1", "aria-hidden": "true" }),
3300
- /* @__PURE__ */ jsx49(
3274
+ ) : /* @__PURE__ */ jsx50("div", { className: "flex-1", "aria-hidden": "true" }),
3275
+ /* @__PURE__ */ jsx50(
3301
3276
  "div",
3302
3277
  {
3303
3278
  className: [
@@ -3309,10 +3284,10 @@ function FormWizardProgress({ labels }) {
3309
3284
  isFuture ? "border-2 border-border bg-background text-muted-foreground" : ""
3310
3285
  ].join(" "),
3311
3286
  "aria-hidden": "true",
3312
- children: isCompleted ? /* @__PURE__ */ jsx49(CheckIcon, {}) : index + 1
3287
+ children: isCompleted ? /* @__PURE__ */ jsx50(CheckIcon, {}) : index + 1
3313
3288
  }
3314
3289
  ),
3315
- index < totalSteps - 1 ? /* @__PURE__ */ jsx49(
3290
+ index < totalSteps - 1 ? /* @__PURE__ */ jsx50(
3316
3291
  "div",
3317
3292
  {
3318
3293
  "aria-hidden": "true",
@@ -3321,9 +3296,9 @@ function FormWizardProgress({ labels }) {
3321
3296
  index < currentStep ? "bg-primary" : "bg-border"
3322
3297
  ].join(" ")
3323
3298
  }
3324
- ) : /* @__PURE__ */ jsx49("div", { className: "flex-1", "aria-hidden": "true" })
3299
+ ) : /* @__PURE__ */ jsx50("div", { className: "flex-1", "aria-hidden": "true" })
3325
3300
  ] }),
3326
- /* @__PURE__ */ jsx49(
3301
+ /* @__PURE__ */ jsx50(
3327
3302
  "span",
3328
3303
  {
3329
3304
  className: [
@@ -3341,7 +3316,7 @@ function FormWizardProgress({ labels }) {
3341
3316
  }
3342
3317
 
3343
3318
  // src/components/FormWizard/FormWizardNav.tsx
3344
- import { jsx as jsx50, jsxs as jsxs32 } from "react/jsx-runtime";
3319
+ import { jsx as jsx51, jsxs as jsxs32 } from "react/jsx-runtime";
3345
3320
  function FormWizardNav({
3346
3321
  onNext,
3347
3322
  isSubmitting = false,
@@ -3349,7 +3324,7 @@ function FormWizardNav({
3349
3324
  }) {
3350
3325
  const { canGoBack, goBack, isLastStep } = useFormWizard();
3351
3326
  return /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-end gap-3", children: [
3352
- canGoBack && /* @__PURE__ */ jsx50(
3327
+ canGoBack && /* @__PURE__ */ jsx51(
3353
3328
  Button,
3354
3329
  {
3355
3330
  variant: "secondary",
@@ -3359,7 +3334,7 @@ function FormWizardNav({
3359
3334
  children: "Back"
3360
3335
  }
3361
3336
  ),
3362
- /* @__PURE__ */ jsx50(
3337
+ /* @__PURE__ */ jsx51(
3363
3338
  Button,
3364
3339
  {
3365
3340
  variant: "primary",
@@ -3413,6 +3388,7 @@ export {
3413
3388
  MenuSection,
3414
3389
  MenuSeparator,
3415
3390
  MetricCard,
3391
+ MetricText,
3416
3392
  PathPill,
3417
3393
  Popover4 as Popover,
3418
3394
  PopoverContent,
@@ -3445,11 +3421,14 @@ export {
3445
3421
  TabList2 as UnstyledTabList,
3446
3422
  TabPanel2 as UnstyledTabPanel,
3447
3423
  Tabs2 as UnstyledTabs,
3424
+ buttonBaseClass,
3448
3425
  createToastBridge,
3449
3426
  iconRegistry,
3450
3427
  pillColorFromName,
3428
+ selectedStyles,
3451
3429
  useContextMenu,
3452
3430
  useFormWizard,
3453
- useToast
3431
+ useToast,
3432
+ variantStyles
3454
3433
  };
3455
3434
  //# sourceMappingURL=index.js.map