@cytario/design 3.1.2 → 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 +16 -34
- package/dist/index.js +83 -82
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/src/styles/tailwind.css +2 -0
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
|
-
|
|
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
|
-
|
|
481
|
-
children: React__default.ReactNode | ((opts: {
|
|
482
|
-
close: () => void;
|
|
483
|
-
}) => React__default.ReactNode);
|
|
473
|
+
children: React__default.ReactNode;
|
|
484
474
|
}
|
|
485
475
|
/**
|
|
486
|
-
*
|
|
487
|
-
|
|
488
|
-
|
|
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";
|
|
@@ -773,11 +752,14 @@ declare function Pill({ children, color, className, ...rest }: PillProps): react
|
|
|
773
752
|
|
|
774
753
|
interface PathPillProps {
|
|
775
754
|
children: string;
|
|
755
|
+
/** Number of trailing segments to show; earlier ones collapse to dots. Defaults to all. */
|
|
776
756
|
visibleCount?: number;
|
|
757
|
+
/** Override per-segment color. Falls back to hash-based `pillColorFromName`. */
|
|
758
|
+
colorFn?: (segment: string, index: number) => PillColor;
|
|
777
759
|
className?: string;
|
|
778
760
|
}
|
|
779
761
|
/** Renders a slash-separated path as overlapping, hash-colored pill segments. */
|
|
780
|
-
declare function PathPill({ children, visibleCount, className, }: PathPillProps): react_jsx_runtime.JSX.Element | null;
|
|
762
|
+
declare function PathPill({ children, visibleCount, colorFn, className, }: PathPillProps): react_jsx_runtime.JSX.Element | null;
|
|
781
763
|
|
|
782
764
|
interface FormWizardContextValue {
|
|
783
765
|
/** Zero-based index of the currently active step */
|
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
|
-
|
|
376
|
+
Field2,
|
|
375
377
|
{
|
|
376
378
|
...props,
|
|
377
379
|
type,
|
|
@@ -614,7 +616,7 @@ function Select({
|
|
|
614
616
|
sizeStyles[size]
|
|
615
617
|
),
|
|
616
618
|
children: ({ isSelected }) => /* @__PURE__ */ jsxs5(Fragment, { children: [
|
|
617
|
-
/* @__PURE__ */ jsx7("span", { className: "truncate", children: renderItem ? renderItem(item) : item.name }),
|
|
619
|
+
/* @__PURE__ */ jsx7("span", { className: renderItem ? "min-w-0 flex-1" : "truncate", children: renderItem ? renderItem(item) : item.name }),
|
|
618
620
|
isSelected && /* @__PURE__ */ jsx7(Check, { className: "h-4 w-4 shrink-0 text-(--color-action-primary)" })
|
|
619
621
|
] })
|
|
620
622
|
}
|
|
@@ -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 {
|
|
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
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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 }) =>
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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 }) =>
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
2512
|
-
import { Fragment as
|
|
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(
|
|
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:
|
|
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:
|
|
2606
|
+
meta && /* @__PURE__ */ jsx38("div", { className: twMerge11("flex items-center gap-2", status && "pl-4"), children: meta })
|
|
2608
2607
|
] })
|
|
2609
2608
|
] });
|
|
2610
|
-
const baseStyles =
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
2685
|
-
import { Fragment as
|
|
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 =
|
|
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(
|
|
2717
|
+
const content = /* @__PURE__ */ jsxs26(Fragment10, { children: [
|
|
2719
2718
|
header && /* @__PURE__ */ jsx40(
|
|
2720
2719
|
"div",
|
|
2721
2720
|
{
|
|
2722
|
-
className:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
3031
|
-
import { Fragment as
|
|
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 =
|
|
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(
|
|
3060
|
-
/* @__PURE__ */ jsx44("div", { className:
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
3129
|
+
const cx = twMerge19(
|
|
3131
3130
|
`
|
|
3132
3131
|
inline-flex items-center
|
|
3133
3132
|
rounded-full
|
|
@@ -3143,27 +3142,29 @@ function Pill({
|
|
|
3143
3142
|
}
|
|
3144
3143
|
|
|
3145
3144
|
// src/components/Pill/PathPill.tsx
|
|
3146
|
-
import { twMerge as
|
|
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,
|
|
3150
|
-
visibleCount
|
|
3149
|
+
visibleCount,
|
|
3150
|
+
colorFn,
|
|
3151
3151
|
className
|
|
3152
3152
|
}) {
|
|
3153
3153
|
const segments = children.split("/").filter(Boolean);
|
|
3154
3154
|
if (segments.length === 0) return null;
|
|
3155
|
-
const
|
|
3155
|
+
const effectiveVisible = visibleCount ?? segments.length;
|
|
3156
|
+
const dotCount = Math.max(0, segments.length - effectiveVisible);
|
|
3156
3157
|
const fullPath = segments.join(" / ");
|
|
3157
3158
|
return /* @__PURE__ */ jsx47(
|
|
3158
3159
|
"div",
|
|
3159
3160
|
{
|
|
3160
|
-
className:
|
|
3161
|
+
className: twMerge20("relative flex", className),
|
|
3161
3162
|
"aria-label": `Path: ${fullPath}`,
|
|
3162
3163
|
children: segments.map((segment, i) => {
|
|
3163
3164
|
const isCollapsed = i < dotCount;
|
|
3164
3165
|
const isLast = i === segments.length - 1;
|
|
3165
|
-
const cx =
|
|
3166
|
-
const color = pillColorFromName(segment);
|
|
3166
|
+
const cx = twMerge20(!isLast && "pr-5 -mr-4", isCollapsed && "pr-3");
|
|
3167
|
+
const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);
|
|
3167
3168
|
return /* @__PURE__ */ jsx47(
|
|
3168
3169
|
Pill,
|
|
3169
3170
|
{
|