Compare commits
10 Commits
9d5a31d559
...
3398574155
| Author | SHA1 | Date | |
|---|---|---|---|
| 3398574155 | |||
| efb0162be0 | |||
| cd6546ef97 | |||
| 50617c1813 | |||
| 5e7b349a7c | |||
| 5af6154e80 | |||
| 5b720fda33 | |||
| 0876bc125f | |||
| 48ad3deb7f | |||
| f37fd480fe |
@ -16,6 +16,14 @@
|
|||||||
"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"
|
||||||
@ -32,6 +40,10 @@
|
|||||||
"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"
|
||||||
@ -48,6 +60,26 @@
|
|||||||
"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"
|
||||||
@ -56,6 +88,42 @@
|
|||||||
"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"
|
||||||
@ -78,21 +146,27 @@
|
|||||||
"react-dom": "^18.0.0 || ^19.0.0"
|
"react-dom": "^18.0.0 || ^19.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@radix-ui/react-dialog": "^1.1.0",
|
|
||||||
"@radix-ui/react-alert-dialog": "^1.1.0",
|
"@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-dropdown-menu": "^2.1.0",
|
||||||
|
"@radix-ui/react-radio-group": "^1.3.0",
|
||||||
"@radix-ui/react-slot": "^1.1.0",
|
"@radix-ui/react-slot": "^1.1.0",
|
||||||
"lucide-react": "^0.460.0",
|
"@radix-ui/react-switch": "^1.2.0",
|
||||||
"clsx": "^2.1.0"
|
"@radix-ui/react-tabs": "^1.1.0",
|
||||||
|
"@radix-ui/react-tooltip": "^1.2.0",
|
||||||
|
"clsx": "^2.1.0",
|
||||||
|
"lucide-react": "^0.460.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"typescript": "^5.7.0",
|
"@storybook/addon-a11y": "^8.5.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",
|
||||||
|
|||||||
313
packages/ui/src/components/AppShell.tsx
Normal file
313
packages/ui/src/components/AppShell.tsx
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -5,7 +5,10 @@ const meta: Meta<typeof Badge> = {
|
|||||||
title: 'Components/Badge',
|
title: 'Components/Badge',
|
||||||
component: Badge,
|
component: Badge,
|
||||||
argTypes: {
|
argTypes: {
|
||||||
variant: { control: 'select', options: ['success', 'warning', 'error', 'info', 'neutral'] },
|
variant: {
|
||||||
|
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' },
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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' | 'info' | 'neutral';
|
variant?: 'success' | 'warning' | 'error' | 'danger' | 'info' | 'neutral' | 'accent';
|
||||||
size?: 'sm' | 'md';
|
size?: 'sm' | 'md';
|
||||||
dot?: boolean;
|
dot?: boolean;
|
||||||
}
|
}
|
||||||
@ -14,17 +14,23 @@ 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({
|
||||||
|
|||||||
@ -5,7 +5,10 @@ const meta: Meta<typeof Button> = {
|
|||||||
title: 'Components/Button',
|
title: 'Components/Button',
|
||||||
component: Button,
|
component: Button,
|
||||||
argTypes: {
|
argTypes: {
|
||||||
variant: { control: 'select', options: ['primary', 'secondary', 'ghost', 'danger'] },
|
variant: {
|
||||||
|
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' },
|
||||||
@ -28,7 +31,7 @@ export const Ghost: Story = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const Danger: Story = {
|
export const Danger: Story = {
|
||||||
args: { children: 'Danger Button', variant: 'danger' },
|
args: { children: 'Danger Button', variant: 'destructive' },
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Loading: Story = {
|
export const Loading: Story = {
|
||||||
|
|||||||
@ -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';
|
variant?: 'primary' | 'secondary' | 'ghost' | 'destructive' | 'outline' | 'subtle' | 'link';
|
||||||
size?: 'sm' | 'md' | 'lg';
|
size?: 'sm' | 'md' | 'lg';
|
||||||
loading?: boolean;
|
loading?: boolean;
|
||||||
asChild?: boolean;
|
asChild?: boolean;
|
||||||
@ -21,14 +21,19 @@ 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: 'bg-[var(--bl-accent,#5A8CFF)] text-white hover:opacity-90',
|
primary:
|
||||||
|
'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: 'bg-red-600 text-white hover:bg-red-700',
|
destructive:
|
||||||
|
'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> = {
|
||||||
|
|||||||
@ -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 style={{ color: 'var(--bl-text-secondary, #a0a0b0)', fontSize: 14 }}>Body content</p>
|
<p className="text-sm text-[var(--bl-text-secondary)]">Body content</p>
|
||||||
</Card>
|
</Card>
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|||||||
@ -3,6 +3,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13,12 +14,26 @@ const paddings: Record<string, string> = {
|
|||||||
lg: 'p-6',
|
lg: 'p-6',
|
||||||
};
|
};
|
||||||
|
|
||||||
export function Card({ padding = 'md', hover, className, children, ...props }: CardProps) {
|
export function Card({
|
||||||
|
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',
|
||||||
'bg-[var(--bl-surface-card,#1a1a2e)] border-[var(--bl-border,#2a2a4a)]',
|
variants[variant],
|
||||||
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
|
||||||
|
|||||||
43
packages/ui/src/components/Checkbox.tsx
Normal file
43
packages/ui/src/components/Checkbox.tsx
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
'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';
|
||||||
92
packages/ui/src/components/Controls.stories.tsx
Normal file
92
packages/ui/src/components/Controls.stories.tsx
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
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>
|
||||||
|
),
|
||||||
|
};
|
||||||
56
packages/ui/src/components/DataList.tsx
Normal file
56
packages/ui/src/components/DataList.tsx
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
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>
|
||||||
|
);
|
||||||
|
}
|
||||||
60
packages/ui/src/components/DataTable.tsx
Normal file
60
packages/ui/src/components/DataTable.tsx
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
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} />;
|
||||||
|
}
|
||||||
86
packages/ui/src/components/DropdownMenu.tsx
Normal file
86
packages/ui/src/components/DropdownMenu.tsx
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
'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';
|
||||||
@ -5,11 +5,27 @@ 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) => {
|
(
|
||||||
const inputId = id ?? (label ? `input-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
|
{ label, error, hint, controlSize = 'md', variant = 'surface', className, id, ...props },
|
||||||
|
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">
|
||||||
@ -25,11 +41,13 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|||||||
ref={ref}
|
ref={ref}
|
||||||
id={inputId}
|
id={inputId}
|
||||||
className={clsx(
|
className={clsx(
|
||||||
'w-full rounded-md border px-3 py-2 text-sm outline-none transition-colors',
|
'w-full rounded-md border outline-none transition-colors',
|
||||||
'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)]',
|
variants[variant],
|
||||||
|
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-red-500' : 'border-[var(--bl-border,#2a2a4a)]',
|
error ? 'border-[var(--bl-danger)]' : 'border-[var(--bl-border,#2a2a4a)]',
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
aria-invalid={error ? 'true' : undefined}
|
aria-invalid={error ? 'true' : undefined}
|
||||||
@ -37,7 +55,7 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
{error && (
|
{error && (
|
||||||
<p id={`${inputId}-error`} className="text-xs text-red-400" role="alert">
|
<p id={`${inputId}-error`} className="text-xs text-[var(--bl-danger)]" role="alert">
|
||||||
{error}
|
{error}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
120
packages/ui/src/components/OperationalPrimitives.stories.tsx
Normal file
120
packages/ui/src/components/OperationalPrimitives.stories.tsx
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
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>
|
||||||
|
),
|
||||||
|
};
|
||||||
49
packages/ui/src/components/RadioGroup.tsx
Normal file
49
packages/ui/src/components/RadioGroup.tsx
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
'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';
|
||||||
51
packages/ui/src/components/SegmentedControl.tsx
Normal file
51
packages/ui/src/components/SegmentedControl.tsx
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -7,12 +7,37 @@ 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 =
|
{
|
||||||
id ?? (label ? `select-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
|
label,
|
||||||
|
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">
|
||||||
@ -29,13 +54,16 @@ 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 px-3 py-2 pr-8 text-sm outline-none transition-colors',
|
'w-full appearance-none rounded-md border outline-none transition-colors',
|
||||||
'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)]',
|
variants[variant],
|
||||||
|
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-red-500' : 'border-[var(--bl-border,#2a2a4a)]',
|
error ? 'border-[var(--bl-danger)]' : '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 && (
|
||||||
@ -55,7 +83,7 @@ export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{error && (
|
{error && (
|
||||||
<p className="text-xs text-red-400" role="alert">
|
<p id={`${selectId}-error`} className="text-xs text-[var(--bl-danger)]" role="alert">
|
||||||
{error}
|
{error}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
100
packages/ui/src/components/Surface.tsx
Normal file
100
packages/ui/src/components/Surface.tsx
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
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>
|
||||||
|
);
|
||||||
|
}
|
||||||
42
packages/ui/src/components/Switch.tsx
Normal file
42
packages/ui/src/components/Switch.tsx
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
'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';
|
||||||
60
packages/ui/src/components/Tabs.tsx
Normal file
60
packages/ui/src/components/Tabs.tsx
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
'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';
|
||||||
@ -5,12 +5,27 @@ 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) => {
|
(
|
||||||
const textareaId =
|
{ label, error, hint, controlSize = 'md', variant = 'surface', className, id, ...props },
|
||||||
id ?? (label ? `textarea-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
|
ref
|
||||||
|
) => {
|
||||||
|
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">
|
||||||
@ -26,11 +41,13 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|||||||
ref={ref}
|
ref={ref}
|
||||||
id={textareaId}
|
id={textareaId}
|
||||||
className={clsx(
|
className={clsx(
|
||||||
'w-full rounded-md border px-3 py-2 text-sm outline-none transition-colors resize-y',
|
'w-full resize-y rounded-md border outline-none transition-colors',
|
||||||
'bg-[var(--bl-surface-card,#1a1a2e)] text-[var(--bl-text-primary,#fff)]',
|
variants[variant],
|
||||||
|
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-red-500' : 'border-[var(--bl-border,#2a2a4a)]',
|
error ? 'border-[var(--bl-danger)]' : 'border-[var(--bl-border,#2a2a4a)]',
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
aria-invalid={error ? 'true' : undefined}
|
aria-invalid={error ? 'true' : undefined}
|
||||||
@ -38,7 +55,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
{error && (
|
{error && (
|
||||||
<p id={`${textareaId}-error`} className="text-xs text-red-400" role="alert">
|
<p id={`${textareaId}-error`} className="text-xs text-[var(--bl-danger)]" role="alert">
|
||||||
{error}
|
{error}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
30
packages/ui/src/components/Tooltip.tsx
Normal file
30
packages/ui/src/components/Tooltip.tsx
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
'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';
|
||||||
@ -1,5 +1,25 @@
|
|||||||
export { Button, type ButtonProps } from './components/Button';
|
export { Button, type ButtonProps } from './components/Button.js';
|
||||||
export { IconButton, type IconButtonProps } from './components/IconButton';
|
export {
|
||||||
|
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,
|
||||||
@ -7,20 +27,20 @@ export {
|
|||||||
toast,
|
toast,
|
||||||
dismissToast,
|
dismissToast,
|
||||||
type ToastMessage,
|
type ToastMessage,
|
||||||
} from './components/Toast';
|
} from './components/Toast.js';
|
||||||
export { Modal, type ModalProps } from './components/Modal';
|
export { Modal, type ModalProps } from './components/Modal.js';
|
||||||
export { ConfirmDialog, type ConfirmDialogProps } from './components/ConfirmDialog';
|
export { ConfirmDialog, type ConfirmDialogProps } from './components/ConfirmDialog.js';
|
||||||
export { Badge, type BadgeProps } from './components/Badge';
|
export { Badge, type BadgeProps } from './components/Badge.js';
|
||||||
export {
|
export {
|
||||||
StatusBadge,
|
StatusBadge,
|
||||||
StatusDot,
|
StatusDot,
|
||||||
type StatusBadgeProps,
|
type StatusBadgeProps,
|
||||||
type StatusTone,
|
type StatusTone,
|
||||||
} from './components/StatusBadge';
|
} from './components/StatusBadge.js';
|
||||||
export { EmptyState, type EmptyStateProps } from './components/EmptyState';
|
export { EmptyState, type EmptyStateProps } from './components/EmptyState.js';
|
||||||
export { Input, type InputProps } from './components/Input';
|
export { Input, type InputProps } from './components/Input.js';
|
||||||
export { Textarea, type TextareaProps } from './components/Textarea';
|
export { Textarea, type TextareaProps } from './components/Textarea.js';
|
||||||
export { Card, CardHeader, CardTitle, CardDescription, type CardProps } from './components/Card';
|
export { Card, CardHeader, CardTitle, CardDescription, type CardProps } from './components/Card.js';
|
||||||
export {
|
export {
|
||||||
Panel,
|
Panel,
|
||||||
PanelBody,
|
PanelBody,
|
||||||
@ -32,18 +52,87 @@ export {
|
|||||||
type PanelHeaderProps,
|
type PanelHeaderProps,
|
||||||
type PanelProps,
|
type PanelProps,
|
||||||
type PanelTitleProps,
|
type PanelTitleProps,
|
||||||
} from './components/Panel';
|
} from './components/Panel.js';
|
||||||
export { ListItemButton, type ListItemButtonProps } from './components/ListItemButton';
|
export {
|
||||||
export { Timeline, type TimelineItem, type TimelineProps } from './components/Timeline';
|
Surface,
|
||||||
export { DiffCard, type DiffCardProps } from './components/DiffCard';
|
SurfaceList,
|
||||||
export { Label, type LabelProps } from './components/Label';
|
SurfaceListItem,
|
||||||
export { Select, type SelectProps } from './components/Select';
|
type SurfaceListItemProps,
|
||||||
export { Separator, type SeparatorProps } from './components/Separator';
|
type SurfaceListProps,
|
||||||
|
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';
|
} from './components/Sidebar.js';
|
||||||
export { StatCard, type StatCardProps } from './components/StatCard';
|
export { StatCard, type StatCardProps } from './components/StatCard.js';
|
||||||
export { LoadingSpinner, type LoadingSpinnerProps } from './components/LoadingSpinner';
|
export { LoadingSpinner, type LoadingSpinnerProps } from './components/LoadingSpinner.js';
|
||||||
|
|||||||
278
pnpm-lock.yaml
generated
278
pnpm-lock.yaml
generated
@ -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.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
|
||||||
@ -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.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
|
||||||
@ -873,12 +873,30 @@ 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
|
||||||
@ -14757,6 +14775,7 @@ 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:
|
||||||
@ -14764,6 +14783,7 @@ 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:
|
||||||
@ -17043,6 +17063,12 @@ 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)':
|
||||||
@ -17630,6 +17656,15 @@ 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)
|
||||||
@ -17668,6 +17703,22 @@ 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
|
||||||
@ -17696,6 +17747,18 @@ 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
|
||||||
@ -17784,6 +17847,12 @@ 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
|
||||||
@ -17825,6 +17894,21 @@ 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
|
||||||
@ -17939,6 +18023,32 @@ 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
|
||||||
@ -18056,6 +18166,24 @@ 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)
|
||||||
@ -18142,6 +18270,24 @@ 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
|
||||||
@ -18159,6 +18305,23 @@ 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
|
||||||
@ -18262,6 +18425,21 @@ 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
|
||||||
@ -18278,6 +18456,22 @@ 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
|
||||||
@ -18359,6 +18553,26 @@ 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
|
||||||
@ -18440,6 +18654,12 @@ 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
|
||||||
@ -18447,6 +18667,13 @@ 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)
|
||||||
@ -18454,6 +18681,13 @@ 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)
|
||||||
@ -18463,6 +18697,15 @@ 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': {}
|
||||||
@ -19595,14 +19838,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@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@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))':
|
||||||
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@22.19.11)(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@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:
|
||||||
@ -20913,7 +21156,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)(eslint@9.39.2(jiti@2.6.1))
|
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-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))
|
||||||
@ -20936,7 +21179,7 @@ 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)):
|
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)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nolyfill/is-core-module': 1.0.39
|
'@nolyfill/is-core-module': 1.0.39
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
@ -20951,6 +21194,21 @@ 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
|
||||||
@ -20962,14 +21220,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@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-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)):
|
||||||
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)(eslint@9.39.2(jiti@2.6.1))
|
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))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@ -21013,7 +21271,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@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-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))
|
||||||
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
|
||||||
@ -25647,7 +25905,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@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': 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/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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user