@cytario/design 3.2.0 → 3.3.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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ButtonProps as ButtonProps$1, TextFieldProps, SelectProps as SelectProps$1, CellProps, ColumnProps, TableProps, RowProps, TableBodyProps, TableHeaderProps, CheckboxProps as CheckboxProps$1, SwitchProps as SwitchProps$1, RadioProps as RadioProps$1, RadioGroupProps as RadioGroupProps$1, LabelProps as LabelProps$1, LinkProps as LinkProps$1, ToggleButtonProps as ToggleButtonProps$1, Selection, PopoverProps as PopoverProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps as TabPanelProps$1, TabsProps as TabsProps$1, ToggleButtonGroupProps as ToggleButtonGroupProps$1, Key } from 'react-aria-components';
1
+ import { ButtonProps as ButtonProps$1, TextFieldProps, TextField, ColorField, SelectProps as SelectProps$1, CellProps, ColumnProps, TableProps, RowProps, TableBodyProps, TableHeaderProps, CheckboxProps as CheckboxProps$1, SwitchProps as SwitchProps$1, RadioProps as RadioProps$1, RadioGroupProps as RadioGroupProps$1, LabelProps as LabelProps$1, LinkProps as LinkProps$1, ToggleButtonProps as ToggleButtonProps$1, Selection, PopoverProps as PopoverProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps as TabPanelProps$1, TabsProps as TabsProps$1, ToggleButtonGroupProps as ToggleButtonGroupProps$1, Key } from 'react-aria-components';
2
2
  export { Key, RouterConfig, RouterProvider, Tab as UnstyledTab, TabList as UnstyledTabList, TabPanel as UnstyledTabPanel, Tabs as UnstyledTabs } from 'react-aria-components';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { LucideIcon } from 'lucide-react';
@@ -84,26 +84,18 @@ interface IconButtonProps extends Omit<ButtonProps$1, "className"> {
84
84
  declare function IconButton({ icon, "aria-label": ariaLabel, variant, size, showTooltip, tooltipPlacement, isLoading, isDisabled, className, ...props }: IconButtonProps): react_jsx_runtime.JSX.Element;
85
85
 
86
86
  interface InputProps extends Omit<TextFieldProps, "children" | "className"> {
87
- /** Label text displayed above the input. Omit for raw input mode. */
87
+ as?: typeof TextField | typeof ColorField;
88
88
  label?: string;
89
- /** Placeholder text shown when the input is empty */
90
89
  placeholder?: string;
91
- /** Help text shown below the input */
92
90
  description?: string;
93
- /** Error message shown below the input (triggers error styling) */
94
91
  errorMessage?: string;
95
- /** HTML input type */
96
92
  type?: "text" | "email" | "password" | "number";
97
- /** Controls padding and font size */
98
93
  size?: Size;
99
- /** Text prefix shown inside the input on the left (e.g., "$", "https://") */
100
94
  prefix?: string;
101
- /** Text alignment within the input */
102
95
  align?: "left" | "center" | "right";
103
- /** Additional CSS class for the outer wrapper */
104
96
  className?: string;
105
97
  }
106
- declare function Input({ label, placeholder, description, errorMessage, type, size, prefix, align, isDisabled, isRequired, className, ...props }: InputProps): react_jsx_runtime.JSX.Element;
98
+ declare function Input({ as: FieldProp, label, placeholder, description, errorMessage, type, size, prefix, align, isDisabled, isRequired, className, ...props }: InputProps): react_jsx_runtime.JSX.Element;
107
99
 
108
100
  interface SelectItem {
109
101
  id: string;
@@ -465,40 +457,27 @@ interface PopoverProps {
465
457
  onOpenChange?: (isOpen: boolean) => void;
466
458
  children: React__default.ReactNode;
467
459
  }
460
+ /** Provides open/close state to a paired PopoverTrigger and PopoverContent. */
461
+ declare function Popover({ children, isOpen, onOpenChange }: PopoverProps): react_jsx_runtime.JSX.Element;
468
462
  interface PopoverTriggerProps {
469
463
  children: React__default.ReactNode;
470
464
  /** Additional CSS classes for the trigger wrapper */
471
465
  className?: string;
472
466
  }
467
+ /** Wraps its child in an AriaButton so it can toggle the parent Popover. */
468
+ declare function PopoverTrigger({ children, className }: PopoverTriggerProps): react_jsx_runtime.JSX.Element;
473
469
  interface PopoverContentProps {
474
- /** Placement relative to the trigger element */
475
470
  placement?: PopoverProps$1["placement"];
476
- /** Offset from the trigger in pixels */
477
471
  offset?: number;
478
- /** Additional CSS classes */
479
472
  className?: string;
480
- /** Content to render inside the popover. Can be a render function receiving { close }. */
481
- children: React__default.ReactNode | ((opts: {
482
- close: () => void;
483
- }) => React__default.ReactNode);
473
+ children: React__default.ReactNode;
484
474
  }
485
475
  /**
486
- * Popover root -- wraps React Aria's DialogTrigger.
487
- */
488
- declare function Popover({ children, isOpen, onOpenChange }: PopoverProps): react_jsx_runtime.JSX.Element;
489
- /**
490
- * PopoverTrigger -- wraps the child in a React Aria Button so it
491
- * participates in DialogTrigger's open/close handling.
492
- *
493
- * Renders as an unstyled inline element. Pass your visual trigger
494
- * (text, icon, swatch) as children.
495
- */
496
- declare function PopoverTrigger({ children, className }: PopoverTriggerProps): react_jsx_runtime.JSX.Element;
497
- /**
498
- * PopoverContent -- the floating panel anchored to the trigger.
499
- * Built on React Aria's Popover + Dialog for accessible focus management.
476
+ * Floating panel anchored to the trigger. Provides focus trap,
477
+ * Escape-to-close, focus restore, and outside-click dismiss via RAC's
478
+ * Popover (no Dialog wrapper needed for those behaviors).
500
479
  */
501
- declare function PopoverContent({ placement, offset: offsetPx, className, children, }: PopoverContentProps): react_jsx_runtime.JSX.Element;
480
+ declare function PopoverContent({ placement, offset: offsetPx, className, children, ...rest }: PopoverContentProps): react_jsx_runtime.JSX.Element;
502
481
 
503
482
  type TabsVariant = "underline" | "pills" | "unstyled";
504
483
  type TabsSize = "sm" | "md" | "lg";
package/dist/index.js CHANGED
@@ -352,6 +352,7 @@ function groupRadiusClasses(position) {
352
352
  }
353
353
  }
354
354
  function Input({
355
+ as: FieldProp = TextField,
355
356
  label,
356
357
  placeholder,
357
358
  description,
@@ -365,13 +366,14 @@ function Input({
365
366
  className,
366
367
  ...props
367
368
  }) {
369
+ const Field2 = FieldProp;
368
370
  const isInvalid = !!errorMessage;
369
371
  const { inGroup, position } = useInputGroup();
370
372
  const borderColor = isInvalid ? "border-(--color-border-danger)" : "border-(--color-border-default) hover:border-(--color-border-strong)";
371
373
  const radiusClass = inGroup ? groupRadiusClasses(position) : "rounded-md";
372
374
  const marginClass = inGroup && position !== "start" && position !== "standalone" ? "-ml-px" : "";
373
375
  return /* @__PURE__ */ jsxs4(
374
- TextField,
376
+ Field2,
375
377
  {
376
378
  ...props,
377
379
  type,
@@ -1894,57 +1896,54 @@ function MenuSeparator({ className }) {
1894
1896
  import {
1895
1897
  DialogTrigger,
1896
1898
  Popover as AriaPopover,
1897
- Dialog as AriaDialog2,
1898
1899
  Button as AriaButton3
1899
1900
  } from "react-aria-components";
1900
- import { Fragment as Fragment8, jsx as jsx33 } from "react/jsx-runtime";
1901
+ import { twMerge as twMerge8 } from "tailwind-merge";
1902
+ import { jsx as jsx33 } from "react/jsx-runtime";
1901
1903
  function Popover3({ children, isOpen, onOpenChange }) {
1902
1904
  return /* @__PURE__ */ jsx33(DialogTrigger, { isOpen, onOpenChange, children });
1903
1905
  }
1904
1906
  function PopoverTrigger({ children, className }) {
1905
- return /* @__PURE__ */ jsx33(
1906
- AriaButton3,
1907
- {
1908
- className: [
1909
- "inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer",
1910
- "focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:rounded-sm",
1911
- className
1912
- ].filter(Boolean).join(" "),
1913
- children
1914
- }
1915
- );
1907
+ const cx = `
1908
+ inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer
1909
+ focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:rounded-sm
1910
+ `;
1911
+ return /* @__PURE__ */ jsx33(AriaButton3, { className: twMerge8(cx, className), children });
1916
1912
  }
1917
1913
  function PopoverContent({
1918
1914
  placement = "bottom",
1919
1915
  offset: offsetPx = 8,
1920
1916
  className,
1921
- children
1917
+ children,
1918
+ ...rest
1922
1919
  }) {
1920
+ const cx = `
1921
+ z-50
1922
+ bg-(--color-surface-default)
1923
+ border border-(--color-border-default)
1924
+ rounded-md shadow-lg
1925
+ entering:animate-in entering:fade-in entering:duration-300
1926
+ exiting:animate-out exiting:fade-out exiting:duration-300
1927
+ entering:placement-top:slide-in-from-bottom-1
1928
+ entering:placement-bottom:slide-in-from-top-1
1929
+ entering:placement-left:slide-in-from-right-1
1930
+ entering:placement-right:slide-in-from-left-1
1931
+ `;
1923
1932
  return /* @__PURE__ */ jsx33(
1924
1933
  AriaPopover,
1925
1934
  {
1935
+ ...rest,
1926
1936
  placement,
1927
1937
  offset: offsetPx,
1928
- className: [
1929
- "z-50",
1930
- "bg-(--color-surface-default) border border-(--color-border-default)",
1931
- "rounded-md shadow-lg",
1932
- "entering:animate-in entering:fade-in entering:duration-150",
1933
- "exiting:animate-out exiting:fade-out exiting:duration-100",
1934
- "entering:placement-top:slide-in-from-bottom-1",
1935
- "entering:placement-bottom:slide-in-from-top-1",
1936
- "entering:placement-left:slide-in-from-right-1",
1937
- "entering:placement-right:slide-in-from-left-1",
1938
- className
1939
- ].filter(Boolean).join(" "),
1940
- children: /* @__PURE__ */ jsx33(AriaDialog2, { className: "outline-none", children: ({ close }) => /* @__PURE__ */ jsx33(Fragment8, { children: typeof children === "function" ? children({ close }) : children }) })
1938
+ className: twMerge8(cx, className),
1939
+ children
1941
1940
  }
1942
1941
  );
1943
1942
  }
1944
1943
 
1945
1944
  // src/components/Tabs/Tabs.tsx
1946
1945
  import { createContext as createContext4, useContext as useContext4 } from "react";
1947
- import { twMerge as twMerge8 } from "tailwind-merge";
1946
+ import { twMerge as twMerge9 } from "tailwind-merge";
1948
1947
  import {
1949
1948
  Tabs as AriaTabs,
1950
1949
  TabList as AriaTabList,
@@ -1974,7 +1973,7 @@ function Tabs({
1974
1973
  {
1975
1974
  ...props,
1976
1975
  orientation,
1977
- className: twMerge8(
1976
+ className: twMerge9(
1978
1977
  orientation === "vertical" ? "flex" : "",
1979
1978
  className
1980
1979
  ),
@@ -1993,7 +1992,7 @@ function TabList({
1993
1992
  AriaTabList,
1994
1993
  {
1995
1994
  ...props,
1996
- className: ({ orientation }) => twMerge8(
1995
+ className: ({ orientation }) => twMerge9(
1997
1996
  baseStyles,
1998
1997
  orientation === "vertical" ? verticalStyles : "",
1999
1998
  className
@@ -2009,14 +2008,14 @@ function Tab({ className, ...props }) {
2009
2008
  ...props,
2010
2009
  className: ({ isSelected, isDisabled, isHovered, isPressed }) => {
2011
2010
  if (variant === "unstyled") {
2012
- return twMerge8(
2011
+ return twMerge9(
2013
2012
  "cursor-pointer outline-none",
2014
2013
  "focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2",
2015
2014
  isDisabled ? "opacity-50 pointer-events-none" : "",
2016
2015
  className
2017
2016
  );
2018
2017
  }
2019
- return twMerge8(
2018
+ return twMerge9(
2020
2019
  // Base
2021
2020
  "cursor-pointer outline-none transition-colors",
2022
2021
  "font-medium",
@@ -2064,7 +2063,7 @@ function TabPanel({ className, ...props }) {
2064
2063
  AriaTabPanel,
2065
2064
  {
2066
2065
  ...props,
2067
- className: twMerge8(
2066
+ className: twMerge9(
2068
2067
  variant === "unstyled" ? "outline-none" : "mt-4 outline-none",
2069
2068
  className
2070
2069
  )
@@ -2316,7 +2315,7 @@ function Tree({
2316
2315
 
2317
2316
  // src/components/SegmentedControl/SegmentedControl.tsx
2318
2317
  import { createContext as createContext5, useContext as useContext5 } from "react";
2319
- import { twMerge as twMerge9 } from "tailwind-merge";
2318
+ import { twMerge as twMerge10 } from "tailwind-merge";
2320
2319
  import {
2321
2320
  ToggleButtonGroup as AriaToggleButtonGroup,
2322
2321
  ToggleButton as AriaToggleButton2
@@ -2349,7 +2348,7 @@ function SegmentedControl({
2349
2348
  selectedKeys: isNoneMode ? /* @__PURE__ */ new Set() : selectedKeys,
2350
2349
  defaultSelectedKeys: isNoneMode ? void 0 : defaultSelectedKeys,
2351
2350
  onSelectionChange: isNoneMode ? void 0 : onSelectionChange,
2352
- className: twMerge9(
2351
+ className: twMerge10(
2353
2352
  "inline-flex items-center rounded-lg border border-(--color-border-default) bg-(--color-surface-muted) p-0.5 gap-0.5",
2354
2353
  className
2355
2354
  ),
@@ -2366,7 +2365,7 @@ function SegmentedControlItem({
2366
2365
  AriaToggleButton2,
2367
2366
  {
2368
2367
  ...props,
2369
- className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge9(
2368
+ className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge10(
2370
2369
  // Base layout
2371
2370
  "inline-flex items-center justify-center",
2372
2371
  "rounded-md",
@@ -2389,7 +2388,7 @@ function SegmentedControlItem({
2389
2388
  // src/components/FileCard/FileCard.tsx
2390
2389
  import { useCallback as useCallback3 } from "react";
2391
2390
  import { File as File2, Info as Info2 } from "lucide-react";
2392
- import { Fragment as Fragment9, jsx as jsx37, jsxs as jsxs23 } from "react/jsx-runtime";
2391
+ import { Fragment as Fragment8, jsx as jsx37, jsxs as jsxs23 } from "react/jsx-runtime";
2393
2392
  function FileCard({
2394
2393
  name,
2395
2394
  icon: IconComponent = File2,
@@ -2423,7 +2422,7 @@ function FileCard({
2423
2422
  },
2424
2423
  [onPress]
2425
2424
  );
2426
- const cardContent = /* @__PURE__ */ jsxs23(Fragment9, { children: [
2425
+ const cardContent = /* @__PURE__ */ jsxs23(Fragment8, { children: [
2427
2426
  /* @__PURE__ */ jsx37(
2428
2427
  "div",
2429
2428
  {
@@ -2439,7 +2438,7 @@ function FileCard({
2439
2438
  "bg-(--color-surface-default)",
2440
2439
  compact ? "px-2 py-1.5 rounded-b-(--border-radius-md)" : "gap-0.5 px-3 py-2 rounded-b-(--border-radius-lg)"
2441
2440
  ].join(" "),
2442
- children: compact ? /* @__PURE__ */ jsx37("span", { className: "text-xs font-medium text-(--color-text-primary) truncate", children: name }) : /* @__PURE__ */ jsxs23(Fragment9, { children: [
2441
+ children: compact ? /* @__PURE__ */ jsx37("span", { className: "text-xs font-medium text-(--color-text-primary) truncate", children: name }) : /* @__PURE__ */ jsxs23(Fragment8, { children: [
2443
2442
  /* @__PURE__ */ jsxs23("span", { className: "flex items-center gap-1.5", children: [
2444
2443
  /* @__PURE__ */ jsx37(
2445
2444
  IconComponent,
@@ -2508,8 +2507,8 @@ function FileCard({
2508
2507
  // src/components/StorageConnectionCard/StorageConnectionCard.tsx
2509
2508
  import { useCallback as useCallback4 } from "react";
2510
2509
  import { AlertCircle, Database } from "lucide-react";
2511
- import { twMerge as twMerge10 } from "tailwind-merge";
2512
- import { Fragment as Fragment10, jsx as jsx38, jsxs as jsxs24 } from "react/jsx-runtime";
2510
+ import { twMerge as twMerge11 } from "tailwind-merge";
2511
+ import { Fragment as Fragment9, jsx as jsx38, jsxs as jsxs24 } from "react/jsx-runtime";
2513
2512
  var statusDotStyles = {
2514
2513
  connected: "bg-(--color-status-success)",
2515
2514
  error: "border-2 border-(--color-status-danger) bg-transparent",
@@ -2569,14 +2568,14 @@ function StorageConnectionCard({
2569
2568
  },
2570
2569
  [onPress]
2571
2570
  );
2572
- const cardContent = /* @__PURE__ */ jsxs24(Fragment10, { children: [
2571
+ const cardContent = /* @__PURE__ */ jsxs24(Fragment9, { children: [
2573
2572
  /* @__PURE__ */ jsx38("div", { className: "aspect-[4/3] bg-neutral-900 overflow-hidden rounded-t-(--border-radius-lg)", children: /* @__PURE__ */ jsx38(PreviewArea, { status, errorMessage, children }) }),
2574
2573
  /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-1.5 border-t border-(--color-border-default) bg-(--color-surface-default) px-3 py-2.5 rounded-b-(--border-radius-lg)", children: [
2575
2574
  /* @__PURE__ */ jsxs24("div", { className: "flex items-start gap-2", children: [
2576
2575
  status && /* @__PURE__ */ jsx38(
2577
2576
  "span",
2578
2577
  {
2579
- className: twMerge10(
2578
+ className: twMerge11(
2580
2579
  "mt-1.5 h-2 w-2 shrink-0 rounded-full",
2581
2580
  statusDotStyles[status]
2582
2581
  ),
@@ -2604,10 +2603,10 @@ function StorageConnectionCard({
2604
2603
  }
2605
2604
  )
2606
2605
  ] }),
2607
- meta && /* @__PURE__ */ jsx38("div", { className: twMerge10("flex items-center gap-2", status && "pl-4"), children: meta })
2606
+ meta && /* @__PURE__ */ jsx38("div", { className: twMerge11("flex items-center gap-2", status && "pl-4"), children: meta })
2608
2607
  ] })
2609
2608
  ] });
2610
- const baseStyles = twMerge10(
2609
+ const baseStyles = twMerge11(
2611
2610
  "flex flex-col overflow-hidden rounded-lg",
2612
2611
  "border border-(--color-border-default)",
2613
2612
  "shadow-sm transition-all",
@@ -2616,7 +2615,7 @@ function StorageConnectionCard({
2616
2615
  className
2617
2616
  );
2618
2617
  if (href) {
2619
- return /* @__PURE__ */ jsx38("a", { href, className: twMerge10(baseStyles, "no-underline"), children: cardContent });
2618
+ return /* @__PURE__ */ jsx38("a", { href, className: twMerge11(baseStyles, "no-underline"), children: cardContent });
2620
2619
  }
2621
2620
  if (onPress) {
2622
2621
  return /* @__PURE__ */ jsx38(
@@ -2635,7 +2634,7 @@ function StorageConnectionCard({
2635
2634
  }
2636
2635
 
2637
2636
  // src/components/Badge/Badge.tsx
2638
- import { twMerge as twMerge11 } from "tailwind-merge";
2637
+ import { twMerge as twMerge12 } from "tailwind-merge";
2639
2638
  import { jsx as jsx39, jsxs as jsxs25 } from "react/jsx-runtime";
2640
2639
  var variantStyles4 = {
2641
2640
  neutral: "bg-(--color-badge-neutral-bg) text-(--color-badge-neutral-text)",
@@ -2664,7 +2663,7 @@ function Badge({
2664
2663
  return /* @__PURE__ */ jsxs25(
2665
2664
  "span",
2666
2665
  {
2667
- className: twMerge11(
2666
+ className: twMerge12(
2668
2667
  "inline-flex items-center gap-1 rounded-full",
2669
2668
  "text-xs font-medium leading-tight",
2670
2669
  variantStyles4[variant],
@@ -2681,8 +2680,8 @@ function Badge({
2681
2680
 
2682
2681
  // src/components/Card/Card.tsx
2683
2682
  import { useCallback as useCallback5 } from "react";
2684
- import { twMerge as twMerge12 } from "tailwind-merge";
2685
- import { Fragment as Fragment11, jsx as jsx40, jsxs as jsxs26 } from "react/jsx-runtime";
2683
+ import { twMerge as twMerge13 } from "tailwind-merge";
2684
+ import { Fragment as Fragment10, jsx as jsx40, jsxs as jsxs26 } from "react/jsx-runtime";
2686
2685
  var paddingStyles = {
2687
2686
  none: "p-0",
2688
2687
  sm: "p-3",
@@ -2700,7 +2699,7 @@ function Card({
2700
2699
  className
2701
2700
  }) {
2702
2701
  const isInteractive = interactive || !!href || !!onPress;
2703
- const containerClass = twMerge12(
2702
+ const containerClass = twMerge13(
2704
2703
  "bg-(--color-surface-default) border border-(--color-border-default) rounded-lg overflow-hidden shadow-sm",
2705
2704
  isInteractive && "transition-all hover:shadow-md hover:border-(--color-border-focus) cursor-pointer",
2706
2705
  (href || onPress) && "block focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 outline-none",
@@ -2715,11 +2714,11 @@ function Card({
2715
2714
  },
2716
2715
  [onPress]
2717
2716
  );
2718
- const content = /* @__PURE__ */ jsxs26(Fragment11, { children: [
2717
+ const content = /* @__PURE__ */ jsxs26(Fragment10, { children: [
2719
2718
  header && /* @__PURE__ */ jsx40(
2720
2719
  "div",
2721
2720
  {
2722
- className: twMerge12(
2721
+ className: twMerge13(
2723
2722
  "border-b border-(--color-border-default)",
2724
2723
  paddingStyles[padding]
2725
2724
  ),
@@ -2730,7 +2729,7 @@ function Card({
2730
2729
  footer && /* @__PURE__ */ jsx40(
2731
2730
  "div",
2732
2731
  {
2733
- className: twMerge12(
2732
+ className: twMerge13(
2734
2733
  "border-t border-(--color-border-default)",
2735
2734
  paddingStyles[padding]
2736
2735
  ),
@@ -2759,7 +2758,7 @@ function Card({
2759
2758
 
2760
2759
  // src/components/DeltaIndicator/DeltaIndicator.tsx
2761
2760
  import { ArrowUp, ArrowDown, Minus } from "lucide-react";
2762
- import { twMerge as twMerge13 } from "tailwind-merge";
2761
+ import { twMerge as twMerge14 } from "tailwind-merge";
2763
2762
  import { jsx as jsx41, jsxs as jsxs27 } from "react/jsx-runtime";
2764
2763
  function getDirection(current, previous) {
2765
2764
  const diff = current - previous;
@@ -2816,7 +2815,7 @@ function DeltaIndicator({
2816
2815
  return /* @__PURE__ */ jsxs27(
2817
2816
  "span",
2818
2817
  {
2819
- className: twMerge13(
2818
+ className: twMerge14(
2820
2819
  "inline-flex items-center gap-1 font-medium",
2821
2820
  "text-(--color-text-tertiary)",
2822
2821
  className
@@ -2855,7 +2854,7 @@ function DeltaIndicator({
2855
2854
  return /* @__PURE__ */ jsxs27(
2856
2855
  "span",
2857
2856
  {
2858
- className: twMerge13(
2857
+ className: twMerge14(
2859
2858
  "inline-flex items-center gap-1 font-medium",
2860
2859
  colorStyles2,
2861
2860
  isPill && [
@@ -2875,7 +2874,7 @@ function DeltaIndicator({
2875
2874
  }
2876
2875
 
2877
2876
  // src/components/ProgressBar/ProgressBar.tsx
2878
- import { twMerge as twMerge14 } from "tailwind-merge";
2877
+ import { twMerge as twMerge15 } from "tailwind-merge";
2879
2878
  import { jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
2880
2879
  var fillStyles = {
2881
2880
  brand: "bg-(--color-progress-fill)",
@@ -2899,7 +2898,7 @@ function ProgressBar({
2899
2898
  className
2900
2899
  }) {
2901
2900
  const clampedValue = Math.min(100, Math.max(0, value));
2902
- return /* @__PURE__ */ jsxs28("div", { className: twMerge14("w-full", className), children: [
2901
+ return /* @__PURE__ */ jsxs28("div", { className: twMerge15("w-full", className), children: [
2903
2902
  (label || description || showValue) && /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between mb-2", children: [
2904
2903
  /* @__PURE__ */ jsx42("span", { className: "text-sm font-medium text-(--color-text-primary)", children: label }),
2905
2904
  /* @__PURE__ */ jsx42("span", { className: "text-sm text-(--color-text-secondary)", children: description ?? (showValue ? `${clampedValue}%` : null) })
@@ -2912,14 +2911,14 @@ function ProgressBar({
2912
2911
  "aria-valuemin": 0,
2913
2912
  "aria-valuemax": 100,
2914
2913
  "aria-label": label ?? "Progress",
2915
- className: twMerge14(
2914
+ className: twMerge15(
2916
2915
  "w-full rounded-full bg-(--color-progress-track)",
2917
2916
  sizeStyles9[size]
2918
2917
  ),
2919
2918
  children: /* @__PURE__ */ jsx42(
2920
2919
  "div",
2921
2920
  {
2922
- className: twMerge14(
2921
+ className: twMerge15(
2923
2922
  "h-full rounded-full transition-all duration-300",
2924
2923
  fillStyles[variant]
2925
2924
  ),
@@ -2940,7 +2939,7 @@ import {
2940
2939
  CheckCircle2,
2941
2940
  X as X3
2942
2941
  } from "lucide-react";
2943
- import { twMerge as twMerge15 } from "tailwind-merge";
2942
+ import { twMerge as twMerge16 } from "tailwind-merge";
2944
2943
  import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
2945
2944
  var variantConfig2 = {
2946
2945
  info: {
@@ -2989,7 +2988,7 @@ function Banner({
2989
2988
  "div",
2990
2989
  {
2991
2990
  role: config.role,
2992
- className: twMerge15(
2991
+ className: twMerge16(
2993
2992
  "flex items-start gap-3 rounded-lg border px-4 py-3",
2994
2993
  "text-sm",
2995
2994
  config.containerClass,
@@ -3000,7 +2999,7 @@ function Banner({
3000
2999
  IconComponent,
3001
3000
  {
3002
3001
  size: 20,
3003
- className: twMerge15("shrink-0 mt-0.5", config.iconClass),
3002
+ className: twMerge16("shrink-0 mt-0.5", config.iconClass),
3004
3003
  "aria-hidden": "true"
3005
3004
  }
3006
3005
  ),
@@ -3027,8 +3026,8 @@ function Banner({
3027
3026
  }
3028
3027
 
3029
3028
  // src/components/MetricCard/MetricCard.tsx
3030
- import { twMerge as twMerge16 } from "tailwind-merge";
3031
- import { Fragment as Fragment12, jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
3029
+ import { twMerge as twMerge17 } from "tailwind-merge";
3030
+ import { Fragment as Fragment11, jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
3032
3031
  var sizeConfig = {
3033
3032
  sm: {
3034
3033
  padding: "p-3",
@@ -3050,18 +3049,18 @@ function MetricCard({
3050
3049
  className
3051
3050
  }) {
3052
3051
  const config = sizeConfig[size];
3053
- const containerClass = twMerge16(
3052
+ const containerClass = twMerge17(
3054
3053
  "bg-(--color-surface-default) border border-(--color-border-default) rounded-lg shadow-sm",
3055
3054
  config.padding,
3056
3055
  href && "block transition-shadow hover:shadow-md hover:border-(--color-border-focus) focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 outline-none",
3057
3056
  className
3058
3057
  );
3059
- const content = /* @__PURE__ */ jsxs30(Fragment12, { children: [
3060
- /* @__PURE__ */ jsx44("div", { className: twMerge16(config.labelClass, "text-(--color-text-secondary)"), children: label }),
3058
+ const content = /* @__PURE__ */ jsxs30(Fragment11, { children: [
3059
+ /* @__PURE__ */ jsx44("div", { className: twMerge17(config.labelClass, "text-(--color-text-secondary)"), children: label }),
3061
3060
  /* @__PURE__ */ jsx44(
3062
3061
  "div",
3063
3062
  {
3064
- className: twMerge16(
3063
+ className: twMerge17(
3065
3064
  config.valueClass,
3066
3065
  "font-semibold text-(--color-text-primary) mt-1 tabular-nums"
3067
3066
  ),
@@ -3077,7 +3076,7 @@ function MetricCard({
3077
3076
  }
3078
3077
 
3079
3078
  // src/components/SectionHeader/SectionHeader.tsx
3080
- import { twMerge as twMerge17 } from "tailwind-merge";
3079
+ import { twMerge as twMerge18 } from "tailwind-merge";
3081
3080
  import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
3082
3081
  function SectionHeader({
3083
3082
  title,
@@ -3087,7 +3086,7 @@ function SectionHeader({
3087
3086
  return /* @__PURE__ */ jsxs31(
3088
3087
  "div",
3089
3088
  {
3090
- className: twMerge17(
3089
+ className: twMerge18(
3091
3090
  "flex flex-wrap items-center gap-3 py-4",
3092
3091
  className
3093
3092
  ),
@@ -3100,7 +3099,7 @@ function SectionHeader({
3100
3099
  }
3101
3100
 
3102
3101
  // src/components/Pill/Pill.tsx
3103
- import { twMerge as twMerge18 } from "tailwind-merge";
3102
+ import { twMerge as twMerge19 } from "tailwind-merge";
3104
3103
  import { jsx as jsx46 } from "react/jsx-runtime";
3105
3104
  var hashColors = {
3106
3105
  purple: "bg-(--color-badge-purple-bg) text-(--color-badge-purple-text) border-(--color-badge-purple-text)/20",
@@ -3127,7 +3126,7 @@ function Pill({
3127
3126
  className,
3128
3127
  ...rest
3129
3128
  }) {
3130
- const cx = twMerge18(
3129
+ const cx = twMerge19(
3131
3130
  `
3132
3131
  inline-flex items-center
3133
3132
  rounded-full
@@ -3143,7 +3142,7 @@ function Pill({
3143
3142
  }
3144
3143
 
3145
3144
  // src/components/Pill/PathPill.tsx
3146
- import { twMerge as twMerge19 } from "tailwind-merge";
3145
+ import { twMerge as twMerge20 } from "tailwind-merge";
3147
3146
  import { jsx as jsx47 } from "react/jsx-runtime";
3148
3147
  function PathPill({
3149
3148
  children,
@@ -3159,12 +3158,12 @@ function PathPill({
3159
3158
  return /* @__PURE__ */ jsx47(
3160
3159
  "div",
3161
3160
  {
3162
- className: twMerge19("relative flex", className),
3161
+ className: twMerge20("relative flex", className),
3163
3162
  "aria-label": `Path: ${fullPath}`,
3164
3163
  children: segments.map((segment, i) => {
3165
3164
  const isCollapsed = i < dotCount;
3166
3165
  const isLast = i === segments.length - 1;
3167
- const cx = twMerge19(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
3166
+ const cx = twMerge20(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
3168
3167
  const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);
3169
3168
  return /* @__PURE__ */ jsx47(
3170
3169
  Pill,