@cytario/design 9.0.0 → 9.2.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
@@ -1411,6 +1411,7 @@ import {
1411
1411
  TableBody as AriaTableBody,
1412
1412
  TableHeader as AriaTableHeader
1413
1413
  } from "react-aria-components";
1414
+ import { twMerge as twMerge11 } from "tailwind-merge";
1414
1415
  import { jsx as jsx17, jsxs as jsxs9 } from "react/jsx-runtime";
1415
1416
  var tableSizeClass = {
1416
1417
  compact: "[--table-row-py:theme(spacing.1)]",
@@ -1425,28 +1426,29 @@ function Table2({
1425
1426
  AriaTable,
1426
1427
  {
1427
1428
  ...props,
1428
- className: [
1429
+ className: twMerge11(
1429
1430
  "w-full border-collapse text-sm text-foreground",
1430
1431
  tableSizeClass[size],
1431
1432
  className
1432
- ].filter(Boolean).join(" ")
1433
+ )
1433
1434
  }
1434
1435
  );
1435
1436
  }
1436
1437
  function TableHeader(props) {
1437
1438
  return /* @__PURE__ */ jsx17(AriaTableHeader, { ...props });
1438
1439
  }
1439
- function Column(props) {
1440
+ function Column({ className, ...props }) {
1440
1441
  return /* @__PURE__ */ jsx17(
1441
1442
  AriaColumn,
1442
1443
  {
1443
1444
  ...props,
1444
- className: [
1445
+ className: twMerge11(
1445
1446
  "px-3 py-2 text-left font-semibold text-muted-foreground",
1446
1447
  "border-b-2 border-border",
1447
1448
  "cursor-default select-none outline-none",
1448
- "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]"
1449
- ].join(" "),
1449
+ "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]",
1450
+ className
1451
+ ),
1450
1452
  children: ({ allowsSorting, sortDirection }) => /* @__PURE__ */ jsxs9("span", { className: "inline-flex items-center gap-1", children: [
1451
1453
  props.children,
1452
1454
  allowsSorting && /* @__PURE__ */ jsx17("span", { "aria-hidden": "true", className: "text-muted-foreground", children: sortDirection === "ascending" ? "\u25B2" : sortDirection === "descending" ? "\u25BC" : "\u25B4" })
@@ -1457,33 +1459,40 @@ function Column(props) {
1457
1459
  function TableBody(props) {
1458
1460
  return /* @__PURE__ */ jsx17(AriaTableBody, { ...props });
1459
1461
  }
1460
- function Row(props) {
1462
+ function Row({
1463
+ className,
1464
+ ...props
1465
+ }) {
1461
1466
  return /* @__PURE__ */ jsx17(
1462
1467
  AriaRow,
1463
1468
  {
1464
1469
  ...props,
1465
- className: [
1470
+ className: twMerge11(
1466
1471
  "border-b border-border",
1467
1472
  "even:bg-card",
1468
1473
  "hover:bg-muted",
1474
+ "data-[selected]:bg-accent",
1475
+ "data-[selected]:ring-2 data-[selected]:ring-ring data-[selected]:ring-inset",
1469
1476
  "outline-none",
1470
1477
  "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]",
1471
- "transition-colors"
1472
- ].join(" ")
1478
+ "transition-colors",
1479
+ className
1480
+ )
1473
1481
  }
1474
1482
  );
1475
1483
  }
1476
- function Cell(props) {
1484
+ function Cell({ className, ...props }) {
1477
1485
  return /* @__PURE__ */ jsx17(
1478
1486
  AriaCell,
1479
1487
  {
1480
1488
  ...props,
1481
- className: [
1489
+ className: twMerge11(
1482
1490
  "px-3 py-(--table-row-py)",
1483
1491
  "text-foreground",
1484
1492
  "outline-none",
1485
- "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]"
1486
- ].join(" ")
1493
+ "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]",
1494
+ className
1495
+ )
1487
1496
  }
1488
1497
  );
1489
1498
  }
@@ -2050,7 +2059,7 @@ function Breadcrumbs({ items, className }) {
2050
2059
  import {
2051
2060
  ToggleButton as AriaToggleButton2
2052
2061
  } from "react-aria-components";
2053
- import { twMerge as twMerge11 } from "tailwind-merge";
2062
+ import { twMerge as twMerge12 } from "tailwind-merge";
2054
2063
  import { jsx as jsx28 } from "react/jsx-runtime";
2055
2064
  var squareSizeStyles2 = {
2056
2065
  xs: "h-6 w-6 text-xs",
@@ -2100,7 +2109,7 @@ function ToggleButton({
2100
2109
  AriaToggleButton2,
2101
2110
  {
2102
2111
  ...props,
2103
- className: ({ isSelected }) => twMerge11(
2112
+ className: ({ isSelected }) => twMerge12(
2104
2113
  "inline-flex items-center justify-center gap-2 cursor-pointer",
2105
2114
  isSquare ? "rounded-none" : "rounded-md",
2106
2115
  "font-medium",
@@ -2123,7 +2132,7 @@ import {
2123
2132
  MenuItem as AriaMenuItem,
2124
2133
  Popover as Popover2
2125
2134
  } from "react-aria-components";
2126
- import { twMerge as twMerge12 } from "tailwind-merge";
2135
+ import { twMerge as twMerge13 } from "tailwind-merge";
2127
2136
 
2128
2137
  // src/components/Menu/menuStyles.ts
2129
2138
  var popoverStyles = `
@@ -2150,7 +2159,7 @@ function Menu2({
2150
2159
  const selectionProps = selectionMode && selectionMode !== "none" ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange } : {};
2151
2160
  return /* @__PURE__ */ jsxs18(MenuTrigger, { children: [
2152
2161
  children,
2153
- /* @__PURE__ */ jsx29(Popover2, { className: twMerge12(popoverStyles, className), children: items ? /* @__PURE__ */ jsx29(
2162
+ /* @__PURE__ */ jsx29(Popover2, { className: twMerge13(popoverStyles, className), children: items ? /* @__PURE__ */ jsx29(
2154
2163
  AriaMenu,
2155
2164
  {
2156
2165
  items,
@@ -2209,7 +2218,7 @@ import {
2209
2218
  Popover as Popover3,
2210
2219
  Pressable
2211
2220
  } from "react-aria-components";
2212
- import { twMerge as twMerge13 } from "tailwind-merge";
2221
+ import { twMerge as twMerge14 } from "tailwind-merge";
2213
2222
  import { jsx as jsx30, jsxs as jsxs19 } from "react/jsx-runtime";
2214
2223
  function useContextMenu({
2215
2224
  content,
@@ -2275,7 +2284,7 @@ function useContextMenu({
2275
2284
  isNonModal: true,
2276
2285
  placement: "bottom start",
2277
2286
  ref: popoverRef,
2278
- className: twMerge13(popoverStyles, className),
2287
+ className: twMerge14(popoverStyles, className),
2279
2288
  children: /* @__PURE__ */ jsx30(
2280
2289
  AriaMenu2,
2281
2290
  {
@@ -2438,7 +2447,7 @@ import {
2438
2447
  Popover as AriaPopover,
2439
2448
  Button as AriaButton3
2440
2449
  } from "react-aria-components";
2441
- import { twMerge as twMerge14 } from "tailwind-merge";
2450
+ import { twMerge as twMerge15 } from "tailwind-merge";
2442
2451
  import { jsx as jsx36 } from "react/jsx-runtime";
2443
2452
  function Popover4({ children, isOpen, onOpenChange }) {
2444
2453
  return /* @__PURE__ */ jsx36(DialogTrigger, { isOpen, onOpenChange, children });
@@ -2448,7 +2457,7 @@ function PopoverTrigger({ children, className }) {
2448
2457
  inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer
2449
2458
  focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm
2450
2459
  `;
2451
- return /* @__PURE__ */ jsx36(AriaButton3, { className: twMerge14(cx, className), children });
2460
+ return /* @__PURE__ */ jsx36(AriaButton3, { className: twMerge15(cx, className), children });
2452
2461
  }
2453
2462
  function PopoverContent({
2454
2463
  placement = "bottom",
@@ -2475,7 +2484,7 @@ function PopoverContent({
2475
2484
  ...rest,
2476
2485
  placement,
2477
2486
  offset: offsetPx,
2478
- className: twMerge14(cx, className),
2487
+ className: twMerge15(cx, className),
2479
2488
  children
2480
2489
  }
2481
2490
  );
@@ -2483,7 +2492,7 @@ function PopoverContent({
2483
2492
 
2484
2493
  // src/components/Tabs/Tabs.tsx
2485
2494
  import { createContext as createContext2, useContext as useContext2 } from "react";
2486
- import { twMerge as twMerge15 } from "tailwind-merge";
2495
+ import { twMerge as twMerge16 } from "tailwind-merge";
2487
2496
  import {
2488
2497
  Tabs as AriaTabs,
2489
2498
  TabList as AriaTabList,
@@ -2513,7 +2522,7 @@ function Tabs({
2513
2522
  {
2514
2523
  ...props,
2515
2524
  orientation,
2516
- className: twMerge15(
2525
+ className: twMerge16(
2517
2526
  orientation === "vertical" ? "flex" : "",
2518
2527
  className
2519
2528
  ),
@@ -2532,7 +2541,7 @@ function TabList({
2532
2541
  AriaTabList,
2533
2542
  {
2534
2543
  ...props,
2535
- className: ({ orientation }) => twMerge15(
2544
+ className: ({ orientation }) => twMerge16(
2536
2545
  baseStyles,
2537
2546
  orientation === "vertical" ? verticalStyles : "",
2538
2547
  className
@@ -2548,14 +2557,14 @@ function Tab({ className, ...props }) {
2548
2557
  ...props,
2549
2558
  className: ({ isSelected, isDisabled, isHovered, isPressed }) => {
2550
2559
  if (variant === "unstyled") {
2551
- return twMerge15(
2560
+ return twMerge16(
2552
2561
  "cursor-pointer outline-none",
2553
2562
  "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
2554
2563
  isDisabled ? "opacity-50 pointer-events-none" : "",
2555
2564
  className
2556
2565
  );
2557
2566
  }
2558
- return twMerge15(
2567
+ return twMerge16(
2559
2568
  // Base
2560
2569
  "cursor-pointer outline-none transition-colors",
2561
2570
  "font-medium",
@@ -2603,7 +2612,7 @@ function TabPanel({ className, ...props }) {
2603
2612
  AriaTabPanel,
2604
2613
  {
2605
2614
  ...props,
2606
- className: twMerge15(
2615
+ className: twMerge16(
2607
2616
  variant === "unstyled" ? "outline-none" : "mt-4 outline-none",
2608
2617
  className
2609
2618
  )
@@ -2621,7 +2630,7 @@ import {
2621
2630
 
2622
2631
  // src/components/SegmentedControl/SegmentedControl.tsx
2623
2632
  import { createContext as createContext3, useContext as useContext3 } from "react";
2624
- import { twMerge as twMerge16 } from "tailwind-merge";
2633
+ import { twMerge as twMerge17 } from "tailwind-merge";
2625
2634
  import {
2626
2635
  ToggleButtonGroup as AriaToggleButtonGroup,
2627
2636
  ToggleButton as AriaToggleButton3
@@ -2654,7 +2663,7 @@ function SegmentedControl({
2654
2663
  selectedKeys: isNoneMode ? /* @__PURE__ */ new Set() : selectedKeys,
2655
2664
  defaultSelectedKeys: isNoneMode ? void 0 : defaultSelectedKeys,
2656
2665
  onSelectionChange: isNoneMode ? void 0 : onSelectionChange,
2657
- className: twMerge16(
2666
+ className: twMerge17(
2658
2667
  "inline-flex items-center rounded-lg border border-border bg-muted p-0.5 gap-0.5",
2659
2668
  className
2660
2669
  ),
@@ -2671,7 +2680,7 @@ function SegmentedControlItem({
2671
2680
  AriaToggleButton3,
2672
2681
  {
2673
2682
  ...props,
2674
- className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge16(
2683
+ className: ({ isSelected, isHovered, isPressed, isDisabled }) => twMerge17(
2675
2684
  // Base layout
2676
2685
  "inline-flex items-center justify-center",
2677
2686
  "rounded-md",
@@ -2692,7 +2701,7 @@ function SegmentedControlItem({
2692
2701
  }
2693
2702
 
2694
2703
  // src/components/Badge/Badge.tsx
2695
- import { twMerge as twMerge17 } from "tailwind-merge";
2704
+ import { twMerge as twMerge18 } from "tailwind-merge";
2696
2705
  import { jsx as jsx39, jsxs as jsxs23 } from "react/jsx-runtime";
2697
2706
  var colorStyles = {
2698
2707
  purple: "bg-badge-purple-bg text-badge-purple-text border-badge-purple-text/20",
@@ -2719,7 +2728,7 @@ function Badge({
2719
2728
  return /* @__PURE__ */ jsxs23(
2720
2729
  "span",
2721
2730
  {
2722
- className: twMerge17(
2731
+ className: twMerge18(
2723
2732
  "inline-flex items-center gap-1 rounded-full border",
2724
2733
  "font-medium leading-tight tracking-wider tabular-nums",
2725
2734
  colorStyles[color],
@@ -2736,10 +2745,10 @@ function Badge({
2736
2745
  }
2737
2746
 
2738
2747
  // src/components/Card/Card.tsx
2739
- import { twMerge as twMerge18 } from "tailwind-merge";
2748
+ import { twMerge as twMerge19 } from "tailwind-merge";
2740
2749
  import { jsx as jsx40, jsxs as jsxs24 } from "react/jsx-runtime";
2741
2750
  function Card({ children, header, footer, className }) {
2742
- const cx = twMerge18(
2751
+ const cx = twMerge19(
2743
2752
  `
2744
2753
  bg-card p-8
2745
2754
  border border-border
@@ -2757,7 +2766,7 @@ function Card({ children, header, footer, className }) {
2757
2766
 
2758
2767
  // src/components/DeltaIndicator/DeltaIndicator.tsx
2759
2768
  import { ArrowUp as ArrowUp2, ArrowDown as ArrowDown2, Minus as Minus2 } from "lucide-react";
2760
- import { twMerge as twMerge19 } from "tailwind-merge";
2769
+ import { twMerge as twMerge20 } from "tailwind-merge";
2761
2770
  import { jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
2762
2771
  function getDirection(current, previous) {
2763
2772
  const diff = current - previous;
@@ -2814,7 +2823,7 @@ function DeltaIndicator({
2814
2823
  return /* @__PURE__ */ jsxs25(
2815
2824
  "span",
2816
2825
  {
2817
- className: twMerge19(
2826
+ className: twMerge20(
2818
2827
  "inline-flex items-center gap-1 font-medium",
2819
2828
  "text-muted-foreground",
2820
2829
  className
@@ -2853,7 +2862,7 @@ function DeltaIndicator({
2853
2862
  return /* @__PURE__ */ jsxs25(
2854
2863
  "span",
2855
2864
  {
2856
- className: twMerge19(
2865
+ className: twMerge20(
2857
2866
  "inline-flex items-center gap-1 font-medium",
2858
2867
  colorStyles2,
2859
2868
  isPill && [
@@ -2873,7 +2882,7 @@ function DeltaIndicator({
2873
2882
  }
2874
2883
 
2875
2884
  // src/components/ProgressBar/ProgressBar.tsx
2876
- import { twMerge as twMerge20 } from "tailwind-merge";
2885
+ import { twMerge as twMerge21 } from "tailwind-merge";
2877
2886
  import { jsx as jsx42, jsxs as jsxs26 } from "react/jsx-runtime";
2878
2887
  var fillStyles = {
2879
2888
  brand: "bg-progress-fill",
@@ -2897,7 +2906,7 @@ function ProgressBar({
2897
2906
  className
2898
2907
  }) {
2899
2908
  const clampedValue = Math.min(100, Math.max(0, value));
2900
- return /* @__PURE__ */ jsxs26("div", { className: twMerge20("w-full", className), children: [
2909
+ return /* @__PURE__ */ jsxs26("div", { className: twMerge21("w-full", className), children: [
2901
2910
  (label || description || showValue) && /* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between mb-2", children: [
2902
2911
  /* @__PURE__ */ jsx42("span", { className: "text-sm font-medium text-foreground", children: label }),
2903
2912
  /* @__PURE__ */ jsx42("span", { className: "text-sm text-muted-foreground", children: description ?? (showValue ? `${clampedValue}%` : null) })
@@ -2910,14 +2919,14 @@ function ProgressBar({
2910
2919
  "aria-valuemin": 0,
2911
2920
  "aria-valuemax": 100,
2912
2921
  "aria-label": label ?? "Progress",
2913
- className: twMerge20(
2922
+ className: twMerge21(
2914
2923
  "w-full rounded-full bg-progress-track",
2915
2924
  sizeStyles6[size]
2916
2925
  ),
2917
2926
  children: /* @__PURE__ */ jsx42(
2918
2927
  "div",
2919
2928
  {
2920
- className: twMerge20(
2929
+ className: twMerge21(
2921
2930
  "h-full rounded-full transition-all duration-300",
2922
2931
  fillStyles[variant]
2923
2932
  ),
@@ -2937,7 +2946,7 @@ import {
2937
2946
  AlertCircle as AlertCircle2,
2938
2947
  CheckCircle2 as CheckCircle22
2939
2948
  } from "lucide-react";
2940
- import { twMerge as twMerge21 } from "tailwind-merge";
2949
+ import { twMerge as twMerge22 } from "tailwind-merge";
2941
2950
  import { jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
2942
2951
  var variantConfig2 = {
2943
2952
  info: {
@@ -2986,7 +2995,7 @@ function Banner({
2986
2995
  "div",
2987
2996
  {
2988
2997
  role: config.role,
2989
- className: twMerge21(
2998
+ className: twMerge22(
2990
2999
  "flex items-start gap-3 rounded-lg border px-4 py-3",
2991
3000
  "text-sm",
2992
3001
  config.containerClass,
@@ -2998,7 +3007,7 @@ function Banner({
2998
3007
  {
2999
3008
  icon: resolvedIcon,
3000
3009
  size: "md",
3001
- className: twMerge21("mt-0.5", config.iconClass)
3010
+ className: twMerge22("mt-0.5", config.iconClass)
3002
3011
  }
3003
3012
  ),
3004
3013
  /* @__PURE__ */ jsxs27("div", { className: "flex-1", children: [
@@ -3024,7 +3033,7 @@ function Banner({
3024
3033
  }
3025
3034
 
3026
3035
  // src/components/MetricCard/MetricCard.tsx
3027
- import { twMerge as twMerge22 } from "tailwind-merge";
3036
+ import { twMerge as twMerge23 } from "tailwind-merge";
3028
3037
  import { Fragment as Fragment8, jsx as jsx44, jsxs as jsxs28 } from "react/jsx-runtime";
3029
3038
  var sizeConfig = {
3030
3039
  sm: {
@@ -3047,18 +3056,18 @@ function MetricCard({
3047
3056
  className
3048
3057
  }) {
3049
3058
  const config = sizeConfig[size];
3050
- const containerClass = twMerge22(
3059
+ const containerClass = twMerge23(
3051
3060
  "bg-background border border-border rounded-lg shadow-sm",
3052
3061
  config.padding,
3053
3062
  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",
3054
3063
  className
3055
3064
  );
3056
3065
  const content = /* @__PURE__ */ jsxs28(Fragment8, { children: [
3057
- /* @__PURE__ */ jsx44("div", { className: twMerge22(config.labelClass, "text-muted-foreground"), children: label }),
3066
+ /* @__PURE__ */ jsx44("div", { className: twMerge23(config.labelClass, "text-muted-foreground"), children: label }),
3058
3067
  /* @__PURE__ */ jsx44(
3059
3068
  "div",
3060
3069
  {
3061
- className: twMerge22(
3070
+ className: twMerge23(
3062
3071
  config.valueClass,
3063
3072
  "font-semibold text-foreground mt-1 tabular-nums"
3064
3073
  ),
@@ -3075,7 +3084,7 @@ function MetricCard({
3075
3084
 
3076
3085
  // src/components/SectionHeader/SectionHeader.tsx
3077
3086
  import { forwardRef as forwardRef7 } from "react";
3078
- import { twMerge as twMerge23 } from "tailwind-merge";
3087
+ import { twMerge as twMerge24 } from "tailwind-merge";
3079
3088
  import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
3080
3089
  var SectionHeader = forwardRef7(
3081
3090
  function SectionHeader2({ title, as = "h2", children, className, ...rest }, ref) {
@@ -3083,7 +3092,7 @@ var SectionHeader = forwardRef7(
3083
3092
  "div",
3084
3093
  {
3085
3094
  ref,
3086
- className: twMerge23(
3095
+ className: twMerge24(
3087
3096
  "flex flex-wrap items-center gap-3 pt-0 pb-4",
3088
3097
  className
3089
3098
  ),
@@ -3144,7 +3153,7 @@ function DescriptionListItem({
3144
3153
  DescriptionList.Item = DescriptionListItem;
3145
3154
 
3146
3155
  // src/components/PathPill/PathPill.tsx
3147
- import { twMerge as twMerge24 } from "tailwind-merge";
3156
+ import { twMerge as twMerge25 } from "tailwind-merge";
3148
3157
  import { jsx as jsx47 } from "react/jsx-runtime";
3149
3158
  var hashColors = [
3150
3159
  "purple",
@@ -3174,12 +3183,12 @@ function PathPill({
3174
3183
  return /* @__PURE__ */ jsx47(
3175
3184
  "div",
3176
3185
  {
3177
- className: twMerge24("relative flex", className),
3186
+ className: twMerge25("relative flex", className),
3178
3187
  "aria-label": `Path: ${fullPath}`,
3179
3188
  children: segments.map((segment, i) => {
3180
3189
  const isCollapsed = i < dotCount;
3181
3190
  const isLast = i === segments.length - 1;
3182
- const cx = twMerge24(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
3191
+ const cx = twMerge25(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
3183
3192
  const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);
3184
3193
  return /* @__PURE__ */ jsx47(
3185
3194
  Badge,