Compare commits

..

No commits in common. "339857415573ff81a5c4758f3ab8266602fbe08c" and "9d5a31d559b20c460bbb9554dd0014dd527c8c13" have entirely different histories.

25 changed files with 69 additions and 1687 deletions

View File

@ -16,14 +16,6 @@
"types": "./dist/components/Button.d.ts", "types": "./dist/components/Button.d.ts",
"import": "./dist/components/Button.js" "import": "./dist/components/Button.js"
}, },
"./app-shell": {
"types": "./dist/components/AppShell.d.ts",
"import": "./dist/components/AppShell.js"
},
"./icon-button": {
"types": "./dist/components/IconButton.d.ts",
"import": "./dist/components/IconButton.js"
},
"./toast": { "./toast": {
"types": "./dist/components/Toast.d.ts", "types": "./dist/components/Toast.d.ts",
"import": "./dist/components/Toast.js" "import": "./dist/components/Toast.js"
@ -40,10 +32,6 @@
"types": "./dist/components/Badge.d.ts", "types": "./dist/components/Badge.d.ts",
"import": "./dist/components/Badge.js" "import": "./dist/components/Badge.js"
}, },
"./status-badge": {
"types": "./dist/components/StatusBadge.d.ts",
"import": "./dist/components/StatusBadge.js"
},
"./empty-state": { "./empty-state": {
"types": "./dist/components/EmptyState.d.ts", "types": "./dist/components/EmptyState.d.ts",
"import": "./dist/components/EmptyState.js" "import": "./dist/components/EmptyState.js"
@ -60,26 +48,6 @@
"types": "./dist/components/Card.d.ts", "types": "./dist/components/Card.d.ts",
"import": "./dist/components/Card.js" "import": "./dist/components/Card.js"
}, },
"./panel": {
"types": "./dist/components/Panel.d.ts",
"import": "./dist/components/Panel.js"
},
"./surface": {
"types": "./dist/components/Surface.d.ts",
"import": "./dist/components/Surface.js"
},
"./list-item-button": {
"types": "./dist/components/ListItemButton.d.ts",
"import": "./dist/components/ListItemButton.js"
},
"./timeline": {
"types": "./dist/components/Timeline.d.ts",
"import": "./dist/components/Timeline.js"
},
"./diff-card": {
"types": "./dist/components/DiffCard.d.ts",
"import": "./dist/components/DiffCard.js"
},
"./label": { "./label": {
"types": "./dist/components/Label.d.ts", "types": "./dist/components/Label.d.ts",
"import": "./dist/components/Label.js" "import": "./dist/components/Label.js"
@ -88,42 +56,6 @@
"types": "./dist/components/Select.d.ts", "types": "./dist/components/Select.d.ts",
"import": "./dist/components/Select.js" "import": "./dist/components/Select.js"
}, },
"./tabs": {
"types": "./dist/components/Tabs.d.ts",
"import": "./dist/components/Tabs.js"
},
"./segmented-control": {
"types": "./dist/components/SegmentedControl.d.ts",
"import": "./dist/components/SegmentedControl.js"
},
"./tooltip": {
"types": "./dist/components/Tooltip.d.ts",
"import": "./dist/components/Tooltip.js"
},
"./dropdown-menu": {
"types": "./dist/components/DropdownMenu.d.ts",
"import": "./dist/components/DropdownMenu.js"
},
"./checkbox": {
"types": "./dist/components/Checkbox.d.ts",
"import": "./dist/components/Checkbox.js"
},
"./radio-group": {
"types": "./dist/components/RadioGroup.d.ts",
"import": "./dist/components/RadioGroup.js"
},
"./switch": {
"types": "./dist/components/Switch.d.ts",
"import": "./dist/components/Switch.js"
},
"./data-list": {
"types": "./dist/components/DataList.d.ts",
"import": "./dist/components/DataList.js"
},
"./data-table": {
"types": "./dist/components/DataTable.d.ts",
"import": "./dist/components/DataTable.js"
},
"./separator": { "./separator": {
"types": "./dist/components/Separator.d.ts", "types": "./dist/components/Separator.d.ts",
"import": "./dist/components/Separator.js" "import": "./dist/components/Separator.js"
@ -146,27 +78,21 @@
"react-dom": "^18.0.0 || ^19.0.0" "react-dom": "^18.0.0 || ^19.0.0"
}, },
"dependencies": { "dependencies": {
"@radix-ui/react-alert-dialog": "^1.1.0",
"@radix-ui/react-checkbox": "^1.3.0",
"@radix-ui/react-dialog": "^1.1.0", "@radix-ui/react-dialog": "^1.1.0",
"@radix-ui/react-dropdown-menu": "^2.1.0", "@radix-ui/react-alert-dialog": "^1.1.0",
"@radix-ui/react-radio-group": "^1.3.0",
"@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.2.0", "lucide-react": "^0.460.0",
"@radix-ui/react-tabs": "^1.1.0", "clsx": "^2.1.0"
"@radix-ui/react-tooltip": "^1.2.0",
"clsx": "^2.1.0",
"lucide-react": "^0.460.0"
}, },
"devDependencies": { "devDependencies": {
"@storybook/addon-a11y": "^8.5.0", "typescript": "^5.7.0",
"@storybook/addon-essentials": "^8.5.0",
"@storybook/react": "^8.5.0",
"@storybook/react-vite": "^8.5.0",
"@types/react": "^19.0.0", "@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0", "@types/react-dom": "^19.0.0",
"@storybook/react-vite": "^8.5.0",
"@storybook/react": "^8.5.0",
"@storybook/addon-essentials": "^8.5.0",
"@storybook/addon-a11y": "^8.5.0",
"storybook": "^8.5.0", "storybook": "^8.5.0",
"typescript": "^5.7.0",
"vite": "^6.0.0" "vite": "^6.0.0"
}, },
"main": "./dist/index.js", "main": "./dist/index.js",

View File

@ -1,313 +0,0 @@
import * as React from 'react';
import { clsx } from 'clsx';
import { Menu, X } from 'lucide-react';
type ShellStyle = React.CSSProperties & {
'--bl-app-sidebar-width'?: string;
};
export interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {
sidebarWidth?: number;
}
export function AppShell({
sidebarWidth = 280,
className,
style,
children,
...props
}: AppShellProps) {
const shellStyle: ShellStyle = {
'--bl-app-sidebar-width': `${sidebarWidth}px`,
...style,
};
return (
<div
className={clsx(
'bl-app-shell min-h-screen bg-[var(--bl-bg-canvas)] text-[var(--bl-text-primary)]',
className
)}
style={shellStyle}
{...props}
>
<style>
{`
.bl-app-shell-mobile-toggle {
display: inline-flex;
}
.bl-app-shell-overlay {
display: none;
}
.bl-app-shell-overlay[data-open="true"] {
display: block;
}
.bl-app-shell-sidebar {
transform: translateX(-100%);
transition: transform 200ms ease-out;
}
.bl-app-shell-sidebar[data-open="true"] {
transform: translateX(0);
}
.bl-app-shell-main {
padding: 4rem 1.25rem 1.25rem;
}
@media (min-width: 1024px) {
.bl-app-shell-mobile-toggle,
.bl-app-shell-overlay {
display: none !important;
}
.bl-app-shell-sidebar {
transform: translateX(0);
}
.bl-app-shell-main {
padding: 2rem 2rem 2rem calc(var(--bl-app-sidebar-width, 280px) + 2rem);
}
}
`}
</style>
{children}
</div>
);
}
export interface AppShellSkipLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
label?: string;
}
export function AppShellSkipLink({
href = '#main-content',
label = 'Skip to main content',
className,
children,
...props
}: AppShellSkipLinkProps) {
return (
<a
href={href}
className={clsx(
'sr-only focus:not-sr-only focus:fixed focus:left-3 focus:top-3 focus:z-50',
'focus:rounded-md focus:border focus:border-[var(--bl-accent)]',
'focus:bg-[var(--bl-bg-elevated)] focus:px-4 focus:py-3 focus:text-sm',
'focus:font-semibold focus:text-[var(--bl-accent)]',
className
)}
{...props}
>
{children ?? label}
</a>
);
}
export interface AppShellMobileToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
open: boolean;
openLabel?: string;
closeLabel?: string;
}
export function AppShellMobileToggle({
open,
openLabel = 'Open menu',
closeLabel = 'Close menu',
className,
children,
...props
}: AppShellMobileToggleProps) {
return (
<button
type="button"
aria-label={open ? closeLabel : openLabel}
className={clsx(
'bl-app-shell-mobile-toggle fixed left-3 top-3 z-[38] h-10 w-10 items-center justify-center',
'rounded-md border border-[var(--bl-border)] bg-[var(--bl-bg-elevated)]',
'text-[var(--bl-text-primary)] shadow-sm transition-colors',
'hover:bg-[var(--bl-surface-muted)] focus-visible:outline-none',
'focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)] lg:hidden',
className
)}
{...props}
>
{children ??
(open ? <X size={20} aria-hidden="true" /> : <Menu size={20} aria-hidden="true" />)}
</button>
);
}
export interface AppShellOverlayProps extends React.HTMLAttributes<HTMLDivElement> {
open: boolean;
}
export function AppShellOverlay({ open, className, ...props }: AppShellOverlayProps) {
return (
<div
aria-hidden="true"
data-open={open ? 'true' : 'false'}
className={clsx(
'bl-app-shell-overlay fixed inset-0 z-[39] bg-[var(--bl-overlay-scrim,rgba(0,0,0,0.5))]',
className
)}
{...props}
/>
);
}
export interface AppShellSidebarProps extends React.HTMLAttributes<HTMLElement> {
open: boolean;
width?: number;
label?: string;
}
export function AppShellSidebar({
open,
width = 280,
label = 'Primary',
className,
style,
children,
...props
}: AppShellSidebarProps) {
return (
<aside
aria-label={label}
data-open={open ? 'true' : 'false'}
className={clsx(
'bl-app-shell-sidebar fixed left-0 top-0 z-40 flex h-screen flex-col overflow-y-auto',
'border-r border-[var(--bl-border)] bg-[var(--bl-surface-sidebar,var(--bl-bg-elevated))]',
'transition-transform duration-200 ease-out lg:translate-x-0',
className
)}
style={{
width,
minWidth: width,
...style,
}}
{...props}
>
{children}
</aside>
);
}
export interface AppShellMainProps extends React.HTMLAttributes<HTMLElement> {
labelledBy?: string;
}
export function AppShellMain({
id = 'main-content',
labelledBy,
className,
style,
children,
...props
}: AppShellMainProps) {
return (
<main
id={id}
tabIndex={-1}
aria-labelledby={labelledBy}
className={clsx('bl-app-shell-main min-h-screen min-w-0', className)}
style={style}
{...props}
>
<div className="grid gap-6">{children}</div>
</main>
);
}
export interface AppShellPageHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
title: React.ReactNode;
description?: React.ReactNode;
actions?: React.ReactNode;
titleId?: string;
}
export function AppShellPageHeader({
title,
description,
actions,
titleId = 'page-title',
className,
children,
...props
}: AppShellPageHeaderProps) {
return (
<header className={className} {...props}>
<div className="flex flex-wrap items-start justify-between gap-4 rounded-lg border border-[var(--bl-border)] bg-[var(--bl-surface-card)] p-6 shadow-sm">
<div className="grid max-w-3xl gap-2">
<h1
id={titleId}
className="m-0 font-[var(--bl-font-display,var(--font-display,inherit))] text-2xl font-bold"
>
{title}
</h1>
{description ? (
<div className="text-sm leading-6 text-[var(--bl-text-secondary)]">{description}</div>
) : null}
{children}
</div>
{actions ? <div aria-label="Page actions">{actions}</div> : null}
</div>
</header>
);
}
export interface AppShellNavProps extends React.HTMLAttributes<HTMLElement> {
label?: string;
}
export function AppShellNav({
label = 'Primary navigation',
className,
children,
...props
}: AppShellNavProps) {
return (
<nav aria-label={label} className={clsx('grid gap-2', className)} {...props}>
{children}
</nav>
);
}
export interface AppShellNavItemProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
active?: boolean;
icon?: React.ReactNode;
}
export function AppShellNavItem({
active,
icon,
className,
children,
...props
}: AppShellNavItemProps) {
return (
<a
aria-current={active ? 'page' : undefined}
className={clsx(
'flex items-center gap-3 rounded-md border px-3.5 py-3 text-sm no-underline',
'transition-colors focus-visible:outline-none focus-visible:ring-2',
'focus-visible:ring-[var(--bl-accent)]',
active
? 'border-[var(--bl-accent)] bg-[var(--bl-accent-muted)] text-[var(--bl-text-primary)]'
: 'border-[var(--bl-border)] bg-[var(--bl-surface-muted)] text-[var(--bl-text-secondary)] hover:text-[var(--bl-text-primary)]',
className
)}
{...props}
>
{icon ? (
<span className="shrink-0" aria-hidden="true">
{icon}
</span>
) : null}
<span>{children}</span>
</a>
);
}

View File

@ -5,10 +5,7 @@ const meta: Meta<typeof Badge> = {
title: 'Components/Badge', title: 'Components/Badge',
component: Badge, component: Badge,
argTypes: { argTypes: {
variant: { variant: { control: 'select', options: ['success', 'warning', 'error', 'info', 'neutral'] },
control: 'select',
options: ['success', 'warning', 'error', 'danger', 'info', 'neutral', 'accent'],
},
size: { control: 'select', options: ['sm', 'md'] }, size: { control: 'select', options: ['sm', 'md'] },
dot: { control: 'boolean' }, dot: { control: 'boolean' },
}, },

View File

@ -2,7 +2,7 @@ import * as React from 'react';
import { clsx } from 'clsx'; import { clsx } from 'clsx';
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> { export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
variant?: 'success' | 'warning' | 'error' | 'danger' | 'info' | 'neutral' | 'accent'; variant?: 'success' | 'warning' | 'error' | 'info' | 'neutral';
size?: 'sm' | 'md'; size?: 'sm' | 'md';
dot?: boolean; dot?: boolean;
} }
@ -14,23 +14,17 @@ const variantStyles: Record<string, string> = {
'bg-[var(--bl-warning-muted,var(--bl-surface-muted))] text-[var(--bl-warning)] border-[var(--bl-warning-border,var(--bl-warning))]', 'bg-[var(--bl-warning-muted,var(--bl-surface-muted))] text-[var(--bl-warning)] border-[var(--bl-warning-border,var(--bl-warning))]',
error: error:
'bg-[var(--bl-danger-muted,var(--bl-surface-muted))] text-[var(--bl-danger)] border-[var(--bl-danger-border,var(--bl-danger))]', 'bg-[var(--bl-danger-muted,var(--bl-surface-muted))] text-[var(--bl-danger)] border-[var(--bl-danger-border,var(--bl-danger))]',
danger:
'bg-[var(--bl-danger-muted,var(--bl-surface-muted))] text-[var(--bl-danger)] border-[var(--bl-danger-border,var(--bl-danger))]',
info: 'bg-[var(--bl-info-muted,var(--bl-surface-muted))] text-[var(--bl-info,var(--bl-accent))] border-[var(--bl-info-border,var(--bl-info,var(--bl-accent)))]', info: 'bg-[var(--bl-info-muted,var(--bl-surface-muted))] text-[var(--bl-info,var(--bl-accent))] border-[var(--bl-info-border,var(--bl-info,var(--bl-accent)))]',
neutral: neutral:
'bg-[var(--bl-surface-muted,#252540)] text-[var(--bl-text-secondary,#a0a0b0)] border-[var(--bl-border,#2a2a4a)]', 'bg-[var(--bl-surface-muted,#252540)] text-[var(--bl-text-secondary,#a0a0b0)] border-[var(--bl-border,#2a2a4a)]',
accent:
'bg-[var(--bl-accent-muted,var(--bl-surface-muted))] text-[var(--bl-text-primary)] border-[var(--bl-accent)]',
}; };
const dotColors: Record<string, string> = { const dotColors: Record<string, string> = {
success: 'bg-[var(--bl-success)]', success: 'bg-[var(--bl-success)]',
error: 'bg-[var(--bl-danger)]', error: 'bg-[var(--bl-danger)]',
danger: 'bg-[var(--bl-danger)]',
warning: 'bg-[var(--bl-warning)]', warning: 'bg-[var(--bl-warning)]',
info: 'bg-[var(--bl-info,var(--bl-accent))]', info: 'bg-[var(--bl-info,var(--bl-accent))]',
neutral: 'bg-[var(--bl-text-tertiary,var(--bl-text-secondary))]', neutral: 'bg-[var(--bl-text-tertiary,var(--bl-text-secondary))]',
accent: 'bg-[var(--bl-accent)]',
}; };
export function Badge({ export function Badge({

View File

@ -5,10 +5,7 @@ const meta: Meta<typeof Button> = {
title: 'Components/Button', title: 'Components/Button',
component: Button, component: Button,
argTypes: { argTypes: {
variant: { variant: { control: 'select', options: ['primary', 'secondary', 'ghost', 'danger'] },
control: 'select',
options: ['primary', 'secondary', 'ghost', 'destructive', 'outline', 'subtle', 'link'],
},
size: { control: 'select', options: ['sm', 'md', 'lg'] }, size: { control: 'select', options: ['sm', 'md', 'lg'] },
loading: { control: 'boolean' }, loading: { control: 'boolean' },
disabled: { control: 'boolean' }, disabled: { control: 'boolean' },
@ -31,7 +28,7 @@ export const Ghost: Story = {
}; };
export const Danger: Story = { export const Danger: Story = {
args: { children: 'Danger Button', variant: 'destructive' }, args: { children: 'Danger Button', variant: 'danger' },
}; };
export const Loading: Story = { export const Loading: Story = {

View File

@ -4,7 +4,7 @@ import { clsx } from 'clsx';
import { Loader2 } from 'lucide-react'; import { Loader2 } from 'lucide-react';
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'ghost' | 'destructive' | 'outline' | 'subtle' | 'link'; variant?: 'primary' | 'secondary' | 'ghost' | 'destructive' | 'outline';
size?: 'sm' | 'md' | 'lg'; size?: 'sm' | 'md' | 'lg';
loading?: boolean; loading?: boolean;
asChild?: boolean; asChild?: boolean;
@ -21,19 +21,14 @@ export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
'inline-flex items-center justify-center font-medium rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50'; 'inline-flex items-center justify-center font-medium rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50';
const variants: Record<string, string> = { const variants: Record<string, string> = {
primary: primary: 'bg-[var(--bl-accent,#5A8CFF)] text-white hover:opacity-90',
'bg-[var(--bl-accent,#5A8CFF)] text-[var(--bl-accent-foreground,var(--bl-bg-canvas,#0b0f17))] hover:opacity-90',
secondary: secondary:
'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)] border border-[var(--bl-border,#2a2a4a)] hover:bg-[var(--bl-surface-muted,#252540)]', 'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)] border border-[var(--bl-border,#2a2a4a)] hover:bg-[var(--bl-surface-muted,#252540)]',
ghost: ghost:
'text-[var(--bl-text-secondary,#a0a0b0)] hover:bg-[var(--bl-surface-muted,#252540)] hover:text-[var(--bl-text-primary,#fff)]', 'text-[var(--bl-text-secondary,#a0a0b0)] hover:bg-[var(--bl-surface-muted,#252540)] hover:text-[var(--bl-text-primary,#fff)]',
destructive: destructive: 'bg-red-600 text-white hover:bg-red-700',
'bg-[var(--bl-danger)] text-[var(--bl-danger-foreground,var(--bl-bg-canvas,#0b0f17))] hover:opacity-90',
outline: outline:
'border border-[var(--bl-border,#2a2a4a)] text-[var(--bl-text-primary,#fff)] hover:bg-[var(--bl-surface-muted,#252540)]', 'border border-[var(--bl-border,#2a2a4a)] text-[var(--bl-text-primary,#fff)] hover:bg-[var(--bl-surface-muted,#252540)]',
subtle:
'bg-[var(--bl-surface-muted,#252540)] text-[var(--bl-text-primary,#fff)] hover:bg-[var(--bl-surface-card,#1a1a2e)]',
link: 'h-auto rounded-none p-0 text-[var(--bl-accent,#5A8CFF)] underline-offset-4 hover:underline',
}; };
const sizes: Record<string, string> = { const sizes: Record<string, string> = {

View File

@ -24,7 +24,7 @@ export const WithHeader: Story = {
<CardTitle>Card Title</CardTitle> <CardTitle>Card Title</CardTitle>
<CardDescription>A short description of this card.</CardDescription> <CardDescription>A short description of this card.</CardDescription>
</CardHeader> </CardHeader>
<p className="text-sm text-[var(--bl-text-secondary)]">Body content</p> <p style={{ color: 'var(--bl-text-secondary, #a0a0b0)', fontSize: 14 }}>Body content</p>
</Card> </Card>
), ),
}; };

View File

@ -3,7 +3,6 @@ import { clsx } from 'clsx';
export interface CardProps extends React.HTMLAttributes<HTMLDivElement> { export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
padding?: 'none' | 'sm' | 'md' | 'lg'; padding?: 'none' | 'sm' | 'md' | 'lg';
variant?: 'default' | 'muted' | 'elevated' | 'outline';
hover?: boolean; hover?: boolean;
} }
@ -14,26 +13,12 @@ const paddings: Record<string, string> = {
lg: 'p-6', lg: 'p-6',
}; };
export function Card({ export function Card({ padding = 'md', hover, className, children, ...props }: CardProps) {
padding = 'md',
variant = 'default',
hover,
className,
children,
...props
}: CardProps) {
const variants: Record<NonNullable<CardProps['variant']>, string> = {
default: 'bg-[var(--bl-surface-card,#1a1a2e)] border-[var(--bl-border,#2a2a4a)]',
muted: 'bg-[var(--bl-surface-muted,#252540)] border-[var(--bl-border,#2a2a4a)]',
elevated: 'bg-[var(--bl-bg-elevated,#12151c)] border-[var(--bl-border,#2a2a4a)] shadow-sm',
outline: 'bg-transparent border-[var(--bl-border,#2a2a4a)]',
};
return ( return (
<div <div
className={clsx( className={clsx(
'rounded-xl border', 'rounded-xl border',
variants[variant], 'bg-[var(--bl-surface-card,#1a1a2e)] border-[var(--bl-border,#2a2a4a)]',
hover && 'transition-colors hover:border-[var(--bl-accent,#5A8CFF)]/40', hover && 'transition-colors hover:border-[var(--bl-accent,#5A8CFF)]/40',
paddings[padding], paddings[padding],
className className

View File

@ -1,43 +0,0 @@
'use client';
import * as React from 'react';
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
import { clsx } from 'clsx';
import { Check } from 'lucide-react';
export interface CheckboxProps extends React.ComponentPropsWithoutRef<
typeof CheckboxPrimitive.Root
> {
label?: React.ReactNode;
}
export const Checkbox = React.forwardRef<
React.ElementRef<typeof CheckboxPrimitive.Root>,
CheckboxProps
>(({ label, className, id, ...props }, ref) => {
const generatedId = React.useId();
const checkboxId = id ?? (label ? `checkbox-${generatedId}` : undefined);
return (
<label className="inline-flex items-center gap-2 text-sm text-[var(--bl-text-primary)]">
<CheckboxPrimitive.Root
ref={ref}
id={checkboxId}
className={clsx(
'flex h-4 w-4 items-center justify-center rounded border border-[var(--bl-border)] bg-[var(--bl-surface-card)]',
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)]',
'data-[state=checked]:border-[var(--bl-accent)] data-[state=checked]:bg-[var(--bl-accent)] data-[state=checked]:text-[var(--bl-accent-foreground,var(--bl-bg-canvas))]',
className
)}
{...props}
>
<CheckboxPrimitive.Indicator>
<Check className="h-3 w-3" />
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
{label}
</label>
);
});
Checkbox.displayName = 'Checkbox';

View File

@ -1,92 +0,0 @@
import * as React from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { MoreHorizontal } from 'lucide-react';
import { Checkbox } from './Checkbox.js';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from './DropdownMenu.js';
import { IconButton } from './IconButton.js';
import { RadioGroup, RadioGroupItem } from './RadioGroup.js';
import { SegmentedControl } from './SegmentedControl.js';
import { Switch } from './Switch.js';
import { Tabs, TabsContent, TabsList, TabsTrigger } from './Tabs.js';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './Tooltip.js';
const meta: Meta = {
title: 'Components/Controls',
};
export default meta;
type Story = StoryObj;
export const ChoiceControls: Story = {
render: () => {
const [mode, setMode] = React.useState('review');
return (
<div className="grid max-w-xl gap-4">
<SegmentedControl
aria-label="Queue mode"
value={mode}
onValueChange={setMode}
options={[
{ value: 'review', label: 'Review' },
{ value: 'approved', label: 'Approved' },
{ value: 'rejected', label: 'Rejected' },
]}
/>
<Checkbox label="Include archived notes" />
<Switch label="Auto-refresh queue" />
<RadioGroup defaultValue="compact" aria-label="Density">
<RadioGroupItem value="compact" label="Compact" />
<RadioGroupItem value="comfortable" label="Comfortable" />
</RadioGroup>
</div>
);
},
};
export const OverlaysAndTabs: Story = {
render: () => (
<TooltipProvider>
<div className="grid max-w-xl gap-4">
<Tabs defaultValue="queue">
<TabsList aria-label="Review sections">
<TabsTrigger value="queue">Queue</TabsTrigger>
<TabsTrigger value="timeline">Timeline</TabsTrigger>
</TabsList>
<TabsContent value="queue" className="pt-3">
Queue content
</TabsContent>
<TabsContent value="timeline" className="pt-3">
Timeline content
</TabsContent>
</Tabs>
<div className="flex gap-2">
<Tooltip>
<TooltipTrigger asChild>
<IconButton icon={<MoreHorizontal className="h-4 w-4" />} label="More actions" />
</TooltipTrigger>
<TooltipContent>More actions</TooltipContent>
</Tooltip>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<IconButton icon={<MoreHorizontal className="h-4 w-4" />} label="Open menu" />
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuLabel>Actions</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>Approve</DropdownMenuItem>
<DropdownMenuItem>Reject</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
</TooltipProvider>
),
};

View File

@ -1,56 +0,0 @@
import * as React from 'react';
import { clsx } from 'clsx';
export interface DataListProps extends React.HTMLAttributes<HTMLDivElement> {
density?: 'compact' | 'normal' | 'spacious';
}
const densityClasses: Record<NonNullable<DataListProps['density']>, string> = {
compact: 'gap-1',
normal: 'gap-2',
spacious: 'gap-3',
};
export function DataList({ density = 'normal', className, children, ...props }: DataListProps) {
return (
<div className={clsx('grid', densityClasses[density], className)} {...props}>
{children}
</div>
);
}
export interface DataListItemProps extends React.HTMLAttributes<HTMLDivElement> {
selected?: boolean;
}
export function DataListItem({ selected, className, children, ...props }: DataListItemProps) {
return (
<div
data-selected={selected ? 'true' : undefined}
className={clsx(
'rounded-lg border border-[var(--bl-border)] bg-[var(--bl-surface-card)] p-3 text-[var(--bl-text-primary)]',
selected && 'border-[var(--bl-accent)] bg-[var(--bl-accent-muted,var(--bl-surface-muted))]',
className
)}
{...props}
>
{children}
</div>
);
}
export interface DataListMetaProps extends React.HTMLAttributes<HTMLDivElement> {}
export function DataListMeta({ className, children, ...props }: DataListMetaProps) {
return (
<div
className={clsx(
'flex flex-wrap items-center gap-2 text-xs text-[var(--bl-text-secondary)]',
className
)}
{...props}
>
{children}
</div>
);
}

View File

@ -1,60 +0,0 @@
import * as React from 'react';
import { clsx } from 'clsx';
export type DataTableProps = React.TableHTMLAttributes<HTMLElement>;
export function DataTable({ className, children, ...props }: DataTableProps) {
return (
<div className="w-full overflow-x-auto rounded-lg border border-[var(--bl-border)]">
<table
className={clsx(
'w-full border-collapse text-left text-sm text-[var(--bl-text-primary)]',
className
)}
{...props}
>
{children}
</table>
</div>
);
}
export type DataTableHeaderProps = React.HTMLAttributes<HTMLElement>;
export function DataTableHeader({ className, ...props }: DataTableHeaderProps) {
return <thead className={clsx('bg-[var(--bl-surface-muted)]', className)} {...props} />;
}
export type DataTableBodyProps = React.HTMLAttributes<HTMLElement>;
export function DataTableBody({ className, ...props }: DataTableBodyProps) {
return <tbody className={clsx('divide-y divide-[var(--bl-border)]', className)} {...props} />;
}
export type DataTableRowProps = React.HTMLAttributes<HTMLElement>;
export function DataTableRow({ className, ...props }: DataTableRowProps) {
return (
<tr
className={clsx('transition-colors hover:bg-[var(--bl-surface-muted)]', className)}
{...props}
/>
);
}
export type DataTableHeadProps = React.ThHTMLAttributes<HTMLElement>;
export function DataTableHead({ className, ...props }: DataTableHeadProps) {
return (
<th
className={clsx('px-3 py-2 text-xs font-medium text-[var(--bl-text-secondary)]', className)}
{...props}
/>
);
}
export type DataTableCellProps = React.TdHTMLAttributes<HTMLElement>;
export function DataTableCell({ className, ...props }: DataTableCellProps) {
return <td className={clsx('px-3 py-2 align-middle', className)} {...props} />;
}

View File

@ -1,86 +0,0 @@
'use client';
import * as React from 'react';
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import { clsx } from 'clsx';
export const DropdownMenu = DropdownMenuPrimitive.Root;
export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
export const DropdownMenuGroup = DropdownMenuPrimitive.Group;
export const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
export const DropdownMenuSub = DropdownMenuPrimitive.Sub;
export const DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger;
export type DropdownMenuContentProps = React.ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Content
>;
export const DropdownMenuContent = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Content>,
DropdownMenuContentProps
>(({ className, sideOffset = 6, ...props }, ref) => (
<DropdownMenuPrimitive.Portal>
<DropdownMenuPrimitive.Content
ref={ref}
sideOffset={sideOffset}
className={clsx(
'z-50 min-w-44 rounded-lg border border-[var(--bl-border)] bg-[var(--bl-bg-elevated)] p-1 text-[var(--bl-text-primary)] shadow-md',
className
)}
{...props}
/>
</DropdownMenuPrimitive.Portal>
));
DropdownMenuContent.displayName = 'DropdownMenuContent';
export type DropdownMenuItemProps = React.ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Item
>;
export const DropdownMenuItem = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Item>,
DropdownMenuItemProps
>(({ className, ...props }, ref) => (
<DropdownMenuPrimitive.Item
ref={ref}
className={clsx(
'flex min-h-8 cursor-default select-none items-center gap-2 rounded-md px-2.5 text-sm outline-none',
'focus:bg-[var(--bl-surface-muted)] focus:text-[var(--bl-text-primary)] data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
className
)}
{...props}
/>
));
DropdownMenuItem.displayName = 'DropdownMenuItem';
export type DropdownMenuLabelProps = React.ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Label
>;
export const DropdownMenuLabel = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Label>,
DropdownMenuLabelProps
>(({ className, ...props }, ref) => (
<DropdownMenuPrimitive.Label
ref={ref}
className={clsx('px-2.5 py-1.5 text-xs font-medium text-[var(--bl-text-secondary)]', className)}
{...props}
/>
));
DropdownMenuLabel.displayName = 'DropdownMenuLabel';
export const DropdownMenuSeparator = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
>(({ className, ...props }, ref) => (
<DropdownMenuPrimitive.Separator
ref={ref}
className={clsx('-mx-1 my-1 h-px bg-[var(--bl-border)]', className)}
{...props}
/>
));
DropdownMenuSeparator.displayName = 'DropdownMenuSeparator';

View File

@ -5,27 +5,11 @@ export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement>
label?: string; label?: string;
error?: string; error?: string;
hint?: string; hint?: string;
controlSize?: 'sm' | 'md' | 'lg';
variant?: 'surface' | 'muted' | 'ghost';
} }
export const Input = React.forwardRef<HTMLInputElement, InputProps>( export const Input = React.forwardRef<HTMLInputElement, InputProps>(
( ({ label, error, hint, className, id, ...props }, ref) => {
{ label, error, hint, controlSize = 'md', variant = 'surface', className, id, ...props }, const inputId = id ?? (label ? `input-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
ref
) => {
const generatedId = React.useId();
const inputId = id ?? (label || error || hint ? `input-${generatedId}` : undefined);
const sizes: Record<NonNullable<InputProps['controlSize']>, string> = {
sm: 'h-8 px-2.5 text-xs',
md: 'h-10 px-3 text-sm',
lg: 'h-12 px-4 text-base',
};
const variants: Record<NonNullable<InputProps['variant']>, string> = {
surface: 'bg-[var(--bl-surface-card,#1a1a2e)]',
muted: 'bg-[var(--bl-surface-muted,#252540)]',
ghost: 'bg-transparent',
};
return ( return (
<div className="space-y-1"> <div className="space-y-1">
@ -41,13 +25,11 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
ref={ref} ref={ref}
id={inputId} id={inputId}
className={clsx( className={clsx(
'w-full rounded-md border outline-none transition-colors', 'w-full rounded-md border px-3 py-2 text-sm outline-none transition-colors',
variants[variant], 'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)]',
sizes[controlSize],
'text-[var(--bl-text-primary,#fff)]',
'placeholder:text-[var(--bl-text-tertiary,#555)]', 'placeholder:text-[var(--bl-text-tertiary,#555)]',
'focus:ring-2 focus:ring-[var(--bl-accent,#5A8CFF)] focus:ring-offset-0', 'focus:ring-2 focus:ring-[var(--bl-accent,#5A8CFF)] focus:ring-offset-0',
error ? 'border-[var(--bl-danger)]' : 'border-[var(--bl-border,#2a2a4a)]', error ? 'border-red-500' : 'border-[var(--bl-border,#2a2a4a)]',
className className
)} )}
aria-invalid={error ? 'true' : undefined} aria-invalid={error ? 'true' : undefined}
@ -55,7 +37,7 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
{...props} {...props}
/> />
{error && ( {error && (
<p id={`${inputId}-error`} className="text-xs text-[var(--bl-danger)]" role="alert"> <p id={`${inputId}-error`} className="text-xs text-red-400" role="alert">
{error} {error}
</p> </p>
)} )}

View File

@ -1,120 +0,0 @@
import type { Meta, StoryObj } from '@storybook/react';
import { Check, Clock } from 'lucide-react';
import { Button } from './Button.js';
import { DataList, DataListItem, DataListMeta } from './DataList.js';
import {
DataTable,
DataTableBody,
DataTableCell,
DataTableHead,
DataTableHeader,
DataTableRow,
} from './DataTable.js';
import { DiffCard } from './DiffCard.js';
import { IconButton } from './IconButton.js';
import { ListItemButton } from './ListItemButton.js';
import { Panel, PanelBody, PanelDescription, PanelHeader, PanelTitle } from './Panel.js';
import { StatusBadge } from './StatusBadge.js';
import { Surface, SurfaceList, SurfaceListItem } from './Surface.js';
import { Timeline } from './Timeline.js';
const meta: Meta = {
title: 'Components/Operational Primitives',
};
export default meta;
type Story = StoryObj;
export const SurfacesAndLists: Story = {
render: () => (
<div className="grid max-w-2xl gap-4">
<Panel>
<PanelHeader>
<div>
<PanelTitle>Review queue</PanelTitle>
<PanelDescription>Dense operator work surface</PanelDescription>
</div>
<IconButton icon={<Check className="h-4 w-4" />} label="Approve selected" />
</PanelHeader>
<PanelBody>
<ListItemButton selected>
<div className="font-medium">Merge duplicate research notes</div>
<div className="text-sm text-[var(--bl-text-secondary)]">2 linked notes affected</div>
</ListItemButton>
<SurfaceList>
<SurfaceListItem selected>Selected surface row</SurfaceListItem>
<SurfaceListItem>Normal surface row</SurfaceListItem>
</SurfaceList>
</PanelBody>
</Panel>
<Surface variant="muted">Reusable muted surface</Surface>
</div>
),
};
export const StatusTimelineAndDiff: Story = {
render: () => (
<div className="grid max-w-2xl gap-4">
<div className="flex gap-2">
<StatusBadge tone="success" dot>
Approved
</StatusBadge>
<StatusBadge tone="warning" dot>
Needs review
</StatusBadge>
</div>
<Timeline
items={[
{
id: '1',
title: 'Draft created',
description: 'Agent proposed a note update',
status: 'Draft',
tone: 'info',
},
{
id: '2',
title: 'Human review',
description: 'Awaiting decision',
status: 'Pending',
tone: 'warning',
},
]}
/>
<DiffCard before="Original note body" after="Improved note body with extracted actions" />
</div>
),
};
export const DataDisplay: Story = {
render: () => (
<div className="grid max-w-3xl gap-4">
<DataList>
<DataListItem selected>
<div className="font-medium">Workspace intelligence</div>
<DataListMeta>
<Clock className="h-3.5 w-3.5" /> Updated 4 minutes ago
</DataListMeta>
</DataListItem>
<DataListItem>Inbox processing</DataListItem>
</DataList>
<DataTable>
<DataTableHeader>
<DataTableRow>
<DataTableHead>Name</DataTableHead>
<DataTableHead>Status</DataTableHead>
</DataTableRow>
</DataTableHeader>
<DataTableBody>
<DataTableRow>
<DataTableCell>Research notes</DataTableCell>
<DataTableCell>
<StatusBadge tone="success">Healthy</StatusBadge>
</DataTableCell>
</DataTableRow>
</DataTableBody>
</DataTable>
<Button variant="subtle">Open details</Button>
</div>
),
};

View File

@ -1,49 +0,0 @@
'use client';
import * as React from 'react';
import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
import { clsx } from 'clsx';
export const RadioGroup = React.forwardRef<
React.ElementRef<typeof RadioGroupPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>
>(({ className, ...props }, ref) => (
<RadioGroupPrimitive.Root ref={ref} className={clsx('grid gap-2', className)} {...props} />
));
RadioGroup.displayName = 'RadioGroup';
export interface RadioGroupItemProps extends React.ComponentPropsWithoutRef<
typeof RadioGroupPrimitive.Item
> {
label?: React.ReactNode;
}
export const RadioGroupItem = React.forwardRef<
React.ElementRef<typeof RadioGroupPrimitive.Item>,
RadioGroupItemProps
>(({ label, className, id, ...props }, ref) => {
const generatedId = React.useId();
const radioId = id ?? (label ? `radio-${generatedId}` : undefined);
return (
<label className="inline-flex items-center gap-2 text-sm text-[var(--bl-text-primary)]">
<RadioGroupPrimitive.Item
ref={ref}
id={radioId}
className={clsx(
'flex h-4 w-4 items-center justify-center rounded-full border border-[var(--bl-border)] bg-[var(--bl-surface-card)]',
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)]',
'data-[state=checked]:border-[var(--bl-accent)]',
className
)}
{...props}
>
<RadioGroupPrimitive.Indicator className="h-2 w-2 rounded-full bg-[var(--bl-accent)]" />
</RadioGroupPrimitive.Item>
{label}
</label>
);
});
RadioGroupItem.displayName = 'RadioGroupItem';

View File

@ -1,51 +0,0 @@
import * as React from 'react';
import { clsx } from 'clsx';
export interface SegmentedControlOption {
value: string;
label: React.ReactNode;
disabled?: boolean;
}
export interface SegmentedControlProps {
value: string;
options: SegmentedControlOption[];
onValueChange: (value: string) => void;
'aria-label': string;
className?: string;
}
export function SegmentedControl({
value,
options,
onValueChange,
className,
'aria-label': ariaLabel,
}: SegmentedControlProps) {
return (
<div
role="radiogroup"
aria-label={ariaLabel}
className={clsx('inline-flex rounded-lg bg-[var(--bl-surface-muted)] p-1', className)}
>
{options.map(option => (
<button
key={option.value}
type="button"
role="radio"
aria-checked={option.value === value}
disabled={option.disabled}
className={clsx(
'min-h-8 rounded-md px-3 text-sm font-medium text-[var(--bl-text-secondary)] transition-colors',
'hover:text-[var(--bl-text-primary)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)]',
'disabled:pointer-events-none disabled:opacity-50',
option.value === value && 'bg-[var(--bl-surface-card)] text-[var(--bl-text-primary)]'
)}
onClick={() => onValueChange(option.value)}
>
{option.label}
</button>
))}
</div>
);
}

View File

@ -7,37 +7,12 @@ export interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElemen
error?: string; error?: string;
options: Array<{ value: string; label: string; disabled?: boolean }>; options: Array<{ value: string; label: string; disabled?: boolean }>;
placeholder?: string; placeholder?: string;
controlSize?: 'sm' | 'md' | 'lg';
variant?: 'surface' | 'muted' | 'ghost';
} }
export const Select = React.forwardRef<HTMLSelectElement, SelectProps>( export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
( ({ label, error, options, placeholder, className, id, ...props }, ref) => {
{ const selectId =
label, id ?? (label ? `select-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
error,
options,
placeholder,
controlSize = 'md',
variant = 'surface',
className,
id,
...props
},
ref
) => {
const generatedId = React.useId();
const selectId = id ?? (label || error ? `select-${generatedId}` : undefined);
const sizes: Record<NonNullable<SelectProps['controlSize']>, string> = {
sm: 'h-8 px-2.5 pr-8 text-xs',
md: 'h-10 px-3 pr-8 text-sm',
lg: 'h-12 px-4 pr-9 text-base',
};
const variants: Record<NonNullable<SelectProps['variant']>, string> = {
surface: 'bg-[var(--bl-surface-card,#1a1a2e)]',
muted: 'bg-[var(--bl-surface-muted,#252540)]',
ghost: 'bg-transparent',
};
return ( return (
<div className="space-y-1"> <div className="space-y-1">
@ -54,16 +29,13 @@ export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
ref={ref} ref={ref}
id={selectId} id={selectId}
className={clsx( className={clsx(
'w-full appearance-none rounded-md border outline-none transition-colors', 'w-full appearance-none rounded-md border px-3 py-2 pr-8 text-sm outline-none transition-colors',
variants[variant], 'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)]',
sizes[controlSize],
'text-[var(--bl-text-primary,#fff)]',
'focus:ring-2 focus:ring-[var(--bl-accent,#5A8CFF)] focus:ring-offset-0', 'focus:ring-2 focus:ring-[var(--bl-accent,#5A8CFF)] focus:ring-offset-0',
error ? 'border-[var(--bl-danger)]' : 'border-[var(--bl-border,#2a2a4a)]', error ? 'border-red-500' : 'border-[var(--bl-border,#2a2a4a)]',
className className
)} )}
aria-invalid={error ? 'true' : undefined} aria-invalid={error ? 'true' : undefined}
aria-describedby={error ? `${selectId}-error` : undefined}
{...props} {...props}
> >
{placeholder && ( {placeholder && (
@ -83,7 +55,7 @@ export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
/> />
</div> </div>
{error && ( {error && (
<p id={`${selectId}-error`} className="text-xs text-[var(--bl-danger)]" role="alert"> <p className="text-xs text-red-400" role="alert">
{error} {error}
</p> </p>
)} )}

View File

@ -1,100 +0,0 @@
import * as React from 'react';
import { clsx } from 'clsx';
export interface SurfaceProps extends React.HTMLAttributes<HTMLElement> {
as?: 'section' | 'aside' | 'article' | 'div';
variant?: 'default' | 'muted' | 'elevated' | 'outline' | 'plain';
padding?: 'none' | 'sm' | 'md' | 'lg';
}
const surfaceVariants: Record<NonNullable<SurfaceProps['variant']>, string> = {
default: 'border border-[var(--bl-border)] bg-[var(--bl-surface-card)]',
muted: 'border border-[var(--bl-border)] bg-[var(--bl-surface-muted)]',
elevated: 'border border-[var(--bl-border)] bg-[var(--bl-bg-elevated)] shadow-sm',
outline: 'border border-[var(--bl-border)] bg-transparent',
plain: 'border-transparent bg-transparent',
};
const surfacePadding: Record<NonNullable<SurfaceProps['padding']>, string> = {
none: '',
sm: 'p-3',
md: 'p-4',
lg: 'p-6',
};
export function Surface({
as: Comp = 'section',
variant = 'default',
padding = 'md',
className,
children,
...props
}: SurfaceProps) {
return (
<Comp
className={clsx(
'rounded-lg text-[var(--bl-text-primary)]',
surfaceVariants[variant],
surfacePadding[padding],
className
)}
{...props}
>
{children}
</Comp>
);
}
export interface SurfaceListProps extends React.HTMLAttributes<HTMLDivElement> {
density?: 'compact' | 'normal' | 'spacious';
divided?: boolean;
}
const listDensity: Record<NonNullable<SurfaceListProps['density']>, string> = {
compact: 'gap-1',
normal: 'gap-2',
spacious: 'gap-3',
};
export function SurfaceList({
density = 'normal',
divided,
className,
children,
...props
}: SurfaceListProps) {
return (
<div
className={clsx(
'grid',
listDensity[density],
divided &&
'divide-y divide-[var(--bl-border)] overflow-hidden rounded-lg border border-[var(--bl-border)]',
className
)}
{...props}
>
{children}
</div>
);
}
export interface SurfaceListItemProps extends React.HTMLAttributes<HTMLDivElement> {
selected?: boolean;
}
export function SurfaceListItem({ selected, className, children, ...props }: SurfaceListItemProps) {
return (
<div
data-selected={selected ? 'true' : undefined}
className={clsx(
'rounded-md border border-[var(--bl-border)] bg-[var(--bl-surface-muted)] p-3 text-[var(--bl-text-primary)]',
selected && 'border-[var(--bl-accent)] bg-[var(--bl-accent-muted,var(--bl-surface-card))]',
className
)}
{...props}
>
{children}
</div>
);
}

View File

@ -1,42 +0,0 @@
'use client';
import * as React from 'react';
import * as SwitchPrimitive from '@radix-ui/react-switch';
import { clsx } from 'clsx';
export interface SwitchProps extends React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root> {
label?: React.ReactNode;
}
export const Switch = React.forwardRef<React.ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(
({ label, className, id, ...props }, ref) => {
const generatedId = React.useId();
const switchId = id ?? (label ? `switch-${generatedId}` : undefined);
return (
<label className="inline-flex items-center gap-2 text-sm text-[var(--bl-text-primary)]">
<SwitchPrimitive.Root
ref={ref}
id={switchId}
className={clsx(
'relative h-5 w-9 rounded-full border border-[var(--bl-border)] bg-[var(--bl-surface-muted)] transition-colors',
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)]',
'data-[state=checked]:border-[var(--bl-accent)] data-[state=checked]:bg-[var(--bl-accent)]',
className
)}
{...props}
>
<SwitchPrimitive.Thumb
className={clsx(
'block h-4 w-4 translate-x-0.5 rounded-full bg-[var(--bl-text-primary)] transition-transform',
'data-[state=checked]:translate-x-4 data-[state=checked]:bg-[var(--bl-accent-foreground,var(--bl-bg-canvas))]'
)}
/>
</SwitchPrimitive.Root>
{label}
</label>
);
}
);
Switch.displayName = 'Switch';

View File

@ -1,60 +0,0 @@
'use client';
import * as React from 'react';
import * as TabsPrimitive from '@radix-ui/react-tabs';
import { clsx } from 'clsx';
export const Tabs = TabsPrimitive.Root;
export type TabsListProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>;
export const TabsList = React.forwardRef<
React.ElementRef<typeof TabsPrimitive.List>,
TabsListProps
>(({ className, ...props }, ref) => (
<TabsPrimitive.List
ref={ref}
className={clsx('inline-flex rounded-lg bg-[var(--bl-surface-muted)] p-1', className)}
{...props}
/>
));
TabsList.displayName = 'TabsList';
export type TabsTriggerProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>;
export const TabsTrigger = React.forwardRef<
React.ElementRef<typeof TabsPrimitive.Trigger>,
TabsTriggerProps
>(({ className, ...props }, ref) => (
<TabsPrimitive.Trigger
ref={ref}
className={clsx(
'inline-flex min-h-8 items-center justify-center rounded-md px-3 text-sm font-medium text-[var(--bl-text-secondary)] transition-colors',
'hover:text-[var(--bl-text-primary)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)]',
'data-[state=active]:bg-[var(--bl-surface-card)] data-[state=active]:text-[var(--bl-text-primary)]',
className
)}
{...props}
/>
));
TabsTrigger.displayName = 'TabsTrigger';
export type TabsContentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;
export const TabsContent = React.forwardRef<
React.ElementRef<typeof TabsPrimitive.Content>,
TabsContentProps
>(({ className, ...props }, ref) => (
<TabsPrimitive.Content
ref={ref}
className={clsx(
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bl-accent)]',
className
)}
{...props}
/>
));
TabsContent.displayName = 'TabsContent';

View File

@ -5,27 +5,12 @@ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextArea
label?: string; label?: string;
error?: string; error?: string;
hint?: string; hint?: string;
controlSize?: 'sm' | 'md' | 'lg';
variant?: 'surface' | 'muted' | 'ghost';
} }
export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>( export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
( ({ label, error, hint, className, id, ...props }, ref) => {
{ label, error, hint, controlSize = 'md', variant = 'surface', className, id, ...props }, const textareaId =
ref id ?? (label ? `textarea-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
) => {
const generatedId = React.useId();
const textareaId = id ?? (label || error || hint ? `textarea-${generatedId}` : undefined);
const sizes: Record<NonNullable<TextareaProps['controlSize']>, string> = {
sm: 'min-h-20 px-2.5 py-2 text-xs',
md: 'min-h-24 px-3 py-2 text-sm',
lg: 'min-h-32 px-4 py-3 text-base',
};
const variants: Record<NonNullable<TextareaProps['variant']>, string> = {
surface: 'bg-[var(--bl-surface-card,#1a1a2e)]',
muted: 'bg-[var(--bl-surface-muted,#252540)]',
ghost: 'bg-transparent',
};
return ( return (
<div className="space-y-1"> <div className="space-y-1">
@ -41,13 +26,11 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
ref={ref} ref={ref}
id={textareaId} id={textareaId}
className={clsx( className={clsx(
'w-full resize-y rounded-md border outline-none transition-colors', 'w-full rounded-md border px-3 py-2 text-sm outline-none transition-colors resize-y',
variants[variant], 'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)]',
sizes[controlSize],
'text-[var(--bl-text-primary,#fff)]',
'placeholder:text-[var(--bl-text-tertiary,#555)]', 'placeholder:text-[var(--bl-text-tertiary,#555)]',
'focus:ring-2 focus:ring-[var(--bl-accent,#5A8CFF)] focus:ring-offset-0', 'focus:ring-2 focus:ring-[var(--bl-accent,#5A8CFF)] focus:ring-offset-0',
error ? 'border-[var(--bl-danger)]' : 'border-[var(--bl-border,#2a2a4a)]', error ? 'border-red-500' : 'border-[var(--bl-border,#2a2a4a)]',
className className
)} )}
aria-invalid={error ? 'true' : undefined} aria-invalid={error ? 'true' : undefined}
@ -55,7 +38,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
{...props} {...props}
/> />
{error && ( {error && (
<p id={`${textareaId}-error`} className="text-xs text-[var(--bl-danger)]" role="alert"> <p id={`${textareaId}-error`} className="text-xs text-red-400" role="alert">
{error} {error}
</p> </p>
)} )}

View File

@ -1,30 +0,0 @@
'use client';
import * as React from 'react';
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
import { clsx } from 'clsx';
export const TooltipProvider = TooltipPrimitive.Provider;
export const Tooltip = TooltipPrimitive.Root;
export const TooltipTrigger = TooltipPrimitive.Trigger;
export type TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>;
export const TooltipContent = React.forwardRef<
React.ElementRef<typeof TooltipPrimitive.Content>,
TooltipContentProps
>(({ className, sideOffset = 6, ...props }, ref) => (
<TooltipPrimitive.Portal>
<TooltipPrimitive.Content
ref={ref}
sideOffset={sideOffset}
className={clsx(
'z-50 rounded-md border border-[var(--bl-border)] bg-[var(--bl-bg-elevated)] px-2.5 py-1.5 text-xs text-[var(--bl-text-primary)] shadow-md',
className
)}
{...props}
/>
</TooltipPrimitive.Portal>
));
TooltipContent.displayName = 'TooltipContent';

View File

@ -1,25 +1,5 @@
export { Button, type ButtonProps } from './components/Button.js'; export { Button, type ButtonProps } from './components/Button';
export { export { IconButton, type IconButtonProps } from './components/IconButton';
AppShell,
AppShellMain,
AppShellMobileToggle,
AppShellNav,
AppShellNavItem,
AppShellOverlay,
AppShellPageHeader,
AppShellSidebar,
AppShellSkipLink,
type AppShellMainProps,
type AppShellMobileToggleProps,
type AppShellNavItemProps,
type AppShellNavProps,
type AppShellOverlayProps,
type AppShellPageHeaderProps,
type AppShellProps,
type AppShellSidebarProps,
type AppShellSkipLinkProps,
} from './components/AppShell.js';
export { IconButton, type IconButtonProps } from './components/IconButton.js';
export { export {
Toast, Toast,
ToastProvider, ToastProvider,
@ -27,20 +7,20 @@ export {
toast, toast,
dismissToast, dismissToast,
type ToastMessage, type ToastMessage,
} from './components/Toast.js'; } from './components/Toast';
export { Modal, type ModalProps } from './components/Modal.js'; export { Modal, type ModalProps } from './components/Modal';
export { ConfirmDialog, type ConfirmDialogProps } from './components/ConfirmDialog.js'; export { ConfirmDialog, type ConfirmDialogProps } from './components/ConfirmDialog';
export { Badge, type BadgeProps } from './components/Badge.js'; export { Badge, type BadgeProps } from './components/Badge';
export { export {
StatusBadge, StatusBadge,
StatusDot, StatusDot,
type StatusBadgeProps, type StatusBadgeProps,
type StatusTone, type StatusTone,
} from './components/StatusBadge.js'; } from './components/StatusBadge';
export { EmptyState, type EmptyStateProps } from './components/EmptyState.js'; export { EmptyState, type EmptyStateProps } from './components/EmptyState';
export { Input, type InputProps } from './components/Input.js'; export { Input, type InputProps } from './components/Input';
export { Textarea, type TextareaProps } from './components/Textarea.js'; export { Textarea, type TextareaProps } from './components/Textarea';
export { Card, CardHeader, CardTitle, CardDescription, type CardProps } from './components/Card.js'; export { Card, CardHeader, CardTitle, CardDescription, type CardProps } from './components/Card';
export { export {
Panel, Panel,
PanelBody, PanelBody,
@ -52,87 +32,18 @@ export {
type PanelHeaderProps, type PanelHeaderProps,
type PanelProps, type PanelProps,
type PanelTitleProps, type PanelTitleProps,
} from './components/Panel.js'; } from './components/Panel';
export { export { ListItemButton, type ListItemButtonProps } from './components/ListItemButton';
Surface, export { Timeline, type TimelineItem, type TimelineProps } from './components/Timeline';
SurfaceList, export { DiffCard, type DiffCardProps } from './components/DiffCard';
SurfaceListItem, export { Label, type LabelProps } from './components/Label';
type SurfaceListItemProps, export { Select, type SelectProps } from './components/Select';
type SurfaceListProps, export { Separator, type SeparatorProps } from './components/Separator';
type SurfaceProps,
} from './components/Surface.js';
export { ListItemButton, type ListItemButtonProps } from './components/ListItemButton.js';
export { Timeline, type TimelineItem, type TimelineProps } from './components/Timeline.js';
export { DiffCard, type DiffCardProps } from './components/DiffCard.js';
export {
DataList,
DataListItem,
DataListMeta,
type DataListItemProps,
type DataListMetaProps,
type DataListProps,
} from './components/DataList.js';
export {
DataTable,
DataTableBody,
DataTableCell,
DataTableHead,
DataTableHeader,
DataTableRow,
type DataTableBodyProps,
type DataTableCellProps,
type DataTableHeadProps,
type DataTableHeaderProps,
type DataTableProps,
type DataTableRowProps,
} from './components/DataTable.js';
export { Label, type LabelProps } from './components/Label.js';
export { Select, type SelectProps } from './components/Select.js';
export {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
type TabsContentProps,
type TabsListProps,
type TabsTriggerProps,
} from './components/Tabs.js';
export {
SegmentedControl,
type SegmentedControlOption,
type SegmentedControlProps,
} from './components/SegmentedControl.js';
export {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
type TooltipContentProps,
} from './components/Tooltip.js';
export {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
type DropdownMenuContentProps,
type DropdownMenuItemProps,
type DropdownMenuLabelProps,
} from './components/DropdownMenu.js';
export { Checkbox, type CheckboxProps } from './components/Checkbox.js';
export { RadioGroup, RadioGroupItem, type RadioGroupItemProps } from './components/RadioGroup.js';
export { Switch, type SwitchProps } from './components/Switch.js';
export { Separator, type SeparatorProps } from './components/Separator.js';
export { export {
Sidebar, Sidebar,
SidebarItem, SidebarItem,
type SidebarProps, type SidebarProps,
type SidebarItemProps, type SidebarItemProps,
} from './components/Sidebar.js'; } from './components/Sidebar';
export { StatCard, type StatCardProps } from './components/StatCard.js'; export { StatCard, type StatCardProps } from './components/StatCard';
export { LoadingSpinner, type LoadingSpinnerProps } from './components/LoadingSpinner.js'; export { LoadingSpinner, type LoadingSpinnerProps } from './components/LoadingSpinner';

278
pnpm-lock.yaml generated
View File

@ -194,7 +194,7 @@ importers:
version: 9.39.2(jiti@2.6.1) version: 9.39.2(jiti@2.6.1)
eslint-config-next: eslint-config-next:
specifier: 16.1.6 specifier: 16.1.6
version: 16.1.6(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) version: 16.1.6(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
husky: husky:
specifier: ^9.0.0 specifier: ^9.0.0
version: 9.1.7 version: 9.1.7
@ -291,7 +291,7 @@ importers:
version: 9.39.2(jiti@2.6.1) version: 9.39.2(jiti@2.6.1)
eslint-config-next: eslint-config-next:
specifier: 16.1.6 specifier: 16.1.6
version: 16.1.6(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) version: 16.1.6(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
husky: husky:
specifier: ^9.0.0 specifier: ^9.0.0
version: 9.1.7 version: 9.1.7
@ -873,30 +873,12 @@ importers:
'@radix-ui/react-alert-dialog': '@radix-ui/react-alert-dialog':
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-checkbox':
specifier: ^1.3.0
version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-dialog': '@radix-ui/react-dialog':
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.0
version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-radio-group':
specifier: ^1.3.0
version: 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-slot': '@radix-ui/react-slot':
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.2.3(@types/react@19.2.14)(react@19.2.4) version: 1.2.3(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-switch':
specifier: ^1.2.0
version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-tabs':
specifier: ^1.1.0
version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-tooltip':
specifier: ^1.2.0
version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
clsx: clsx:
specifier: ^2.1.0 specifier: ^2.1.0
version: 2.1.1 version: 2.1.1
@ -14775,7 +14757,6 @@ packages:
{ {
integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==, integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==,
} }
deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
hasBin: true hasBin: true
uuid@8.3.2: uuid@8.3.2:
@ -14783,7 +14764,6 @@ packages:
{ {
integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==,
} }
deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
hasBin: true hasBin: true
uuid@9.0.1: uuid@9.0.1:
@ -17063,12 +17043,6 @@ snapshots:
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
'@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@floating-ui/dom': 1.7.5
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
'@floating-ui/utils@0.2.10': {} '@floating-ui/utils@0.2.10': {}
'@hono/node-server@1.19.9(hono@4.12.3)': '@hono/node-server@1.19.9(hono@4.12.3)':
@ -17656,15 +17630,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -17703,22 +17668,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
@ -17747,18 +17696,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.3)': '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.3)':
dependencies: dependencies:
react: 19.2.3 react: 19.2.3
@ -17847,12 +17784,6 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
'@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
@ -17894,21 +17825,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.3)': '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.3)':
dependencies: dependencies:
react: 19.2.3 react: 19.2.3
@ -18023,32 +17939,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
aria-hidden: 1.2.6
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
@ -18166,24 +18056,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/rect': 1.1.1
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -18270,24 +18142,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
@ -18305,23 +18159,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/number': 1.1.1 '@radix-ui/number': 1.1.1
@ -18425,21 +18262,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
@ -18456,22 +18278,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
@ -18553,26 +18359,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.3)': '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.3)':
dependencies: dependencies:
react: 19.2.3 react: 19.2.3
@ -18654,12 +18440,6 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
'@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.3)': '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/rect': 1.1.1 '@radix-ui/rect': 1.1.1
@ -18667,13 +18447,6 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
'@radix-ui/rect': 1.1.1
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
'@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.3)': '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3)
@ -18681,13 +18454,6 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
'@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -18697,15 +18463,6 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@radix-ui/rect@1.1.1': {} '@radix-ui/rect@1.1.1': {}
'@react-native/assets-registry@0.84.1': {} '@react-native/assets-registry@0.84.1': {}
@ -19838,14 +19595,14 @@ snapshots:
msw: 2.12.10(@types/node@20.19.33)(typescript@5.9.3) msw: 2.12.10(@types/node@20.19.33)(typescript@5.9.3)
vite: 7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite: 7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/mocker@3.2.4(msw@2.12.10(@types/node@22.19.11)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': '@vitest/mocker@3.2.4(msw@2.12.10(@types/node@22.19.11)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies: dependencies:
'@vitest/spy': 3.2.4 '@vitest/spy': 3.2.4
estree-walker: 3.0.3 estree-walker: 3.0.3
magic-string: 0.30.21 magic-string: 0.30.21
optionalDependencies: optionalDependencies:
msw: 2.12.10(@types/node@22.19.11)(typescript@5.9.3) msw: 2.12.10(@types/node@22.19.11)(typescript@5.9.3)
vite: 7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite: 7.3.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/mocker@4.0.18(msw@2.12.10(@types/node@20.19.33)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@20.19.33)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies: dependencies:
@ -21156,7 +20913,7 @@ snapshots:
'@next/eslint-plugin-next': 16.1.6 '@next/eslint-plugin-next': 16.1.6
eslint: 9.39.2(jiti@2.6.1) eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1))
@ -21179,7 +20936,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.4.3 debug: 4.4.3
@ -21194,21 +20951,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.3
eslint: 9.39.2(jiti@2.6.1)
get-tsconfig: 4.13.6
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): eslint-module-utils@2.12.1(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
@ -21220,14 +20962,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
eslint: 9.39.2(jiti@2.6.1) eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -21271,7 +21013,7 @@ snapshots:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.39.2(jiti@2.6.1) eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.16.1 is-core-module: 2.16.1
is-glob: 4.0.3 is-glob: 4.0.3
@ -25905,7 +25647,7 @@ snapshots:
dependencies: dependencies:
'@types/chai': 5.2.3 '@types/chai': 5.2.3
'@vitest/expect': 3.2.4 '@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(msw@2.12.10(@types/node@22.19.11)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.33)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/mocker': 3.2.4(msw@2.12.10(@types/node@22.19.11)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@vitest/pretty-format': 3.2.4 '@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4 '@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4 '@vitest/snapshot': 3.2.4