@sypra-ui/ui 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/index.d.ts +32 -4
- package/dist/index.js +119 -27
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/styles.css +3 -0
package/README.md
CHANGED
|
@@ -82,3 +82,10 @@ import { Button, Card } from '@sypra-ui/ui';
|
|
|
82
82
|
|
|
83
83
|
The package is ESM-only. Import `@sypra-ui/ui/styles.css` exactly once per
|
|
84
84
|
application.
|
|
85
|
+
|
|
86
|
+
## Composition helpers
|
|
87
|
+
|
|
88
|
+
`FormField` keeps a visible label, optional helper text, and field error
|
|
89
|
+
together. `SettingRow` provides an aligned title, description, and trailing
|
|
90
|
+
action for settings cards. Use `ConfirmActionDialog` for destructive actions
|
|
91
|
+
that need an explicit confirmation.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ButtonHTMLAttributes, InputHTMLAttributes, ComponentPropsWithoutRef, SelectHTMLAttributes,
|
|
2
|
+
import { ButtonHTMLAttributes, InputHTMLAttributes, ReactNode, ComponentPropsWithoutRef, SelectHTMLAttributes, CSSProperties, TableHTMLAttributes } from 'react';
|
|
3
3
|
|
|
4
4
|
declare const cn: (...values: Array<string | false | null | undefined>) => string;
|
|
5
5
|
|
|
6
6
|
declare const buttonStyles: {
|
|
7
|
-
readonly primary: "bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] hover:opacity-90";
|
|
7
|
+
readonly primary: "bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] shadow-sm hover:opacity-90 hover:shadow";
|
|
8
8
|
readonly secondary: "bg-[hsl(var(--rui-secondary))] text-[hsl(var(--rui-secondary-foreground))] hover:opacity-80";
|
|
9
|
-
readonly outline: "border border-[hsl(var(--rui-border))] bg-transparent hover:bg-[hsl(var(--rui-accent))]";
|
|
9
|
+
readonly outline: "border border-[hsl(var(--rui-border))] bg-transparent shadow-sm hover:bg-[hsl(var(--rui-accent))]";
|
|
10
10
|
readonly ghost: "bg-transparent hover:bg-[hsl(var(--rui-accent))]";
|
|
11
11
|
readonly destructive: "bg-[hsl(var(--rui-destructive))] text-[hsl(var(--rui-destructive-foreground))] hover:opacity-90";
|
|
12
12
|
};
|
|
@@ -20,6 +20,15 @@ declare function IconButton({ children, 'aria-label': label, className, ...props
|
|
|
20
20
|
declare const Input: ({ className, ...props }: InputHTMLAttributes<HTMLInputElement>) => react.JSX.Element;
|
|
21
21
|
declare const Textarea: ({ className, ...props }: ComponentPropsWithoutRef<"textarea">) => react.JSX.Element;
|
|
22
22
|
declare const Label: ({ className, ...props }: ComponentPropsWithoutRef<"label">) => react.JSX.Element;
|
|
23
|
+
declare function FormField({ label, htmlFor, description, error, required, children, className, }: {
|
|
24
|
+
label: ReactNode;
|
|
25
|
+
htmlFor?: string;
|
|
26
|
+
description?: ReactNode;
|
|
27
|
+
error?: ReactNode;
|
|
28
|
+
required?: boolean;
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
className?: string;
|
|
31
|
+
}): react.JSX.Element;
|
|
23
32
|
declare const Checkbox: ({ className, ...props }: InputHTMLAttributes<HTMLInputElement>) => react.JSX.Element;
|
|
24
33
|
declare const Radio: ({ className, ...props }: InputHTMLAttributes<HTMLInputElement>) => react.JSX.Element;
|
|
25
34
|
declare const Switch: ({ checked, onChange, disabled, className, ...props }: Omit<InputHTMLAttributes<HTMLInputElement>, "type">) => react.JSX.Element;
|
|
@@ -87,6 +96,19 @@ declare const AlertDialogTitle: ({ className, ...props }: ComponentPropsWithoutR
|
|
|
87
96
|
declare const AlertDialogDescription: ({ className, ...props }: ComponentPropsWithoutRef<"p">) => react.JSX.Element;
|
|
88
97
|
declare const AlertDialogFooter: ({ className, ...props }: ComponentPropsWithoutRef<"div">) => react.JSX.Element;
|
|
89
98
|
declare const AlertDialogClose: typeof DialogClose;
|
|
99
|
+
declare function ConfirmActionDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, onConfirm, loading, confirmDisabled, variant, children, }: {
|
|
100
|
+
open: boolean;
|
|
101
|
+
onOpenChange: (open: boolean) => void;
|
|
102
|
+
title: ReactNode;
|
|
103
|
+
description?: ReactNode;
|
|
104
|
+
confirmLabel?: ReactNode;
|
|
105
|
+
cancelLabel?: ReactNode;
|
|
106
|
+
onConfirm: () => void | Promise<void>;
|
|
107
|
+
loading?: boolean;
|
|
108
|
+
confirmDisabled?: boolean;
|
|
109
|
+
variant?: 'primary' | 'destructive';
|
|
110
|
+
children?: ReactNode;
|
|
111
|
+
}): react.JSX.Element;
|
|
90
112
|
declare function Sheet({ children, ...props }: ComponentPropsWithoutRef<typeof Dialog>): react.JSX.Element;
|
|
91
113
|
declare const SheetTrigger: typeof DialogTrigger;
|
|
92
114
|
declare const SheetClose: typeof DialogClose;
|
|
@@ -217,6 +239,12 @@ declare const Section: ({ title, description, children, className, }: ChildrenPr
|
|
|
217
239
|
declare const Stack: ({ gap, className, ...props }: ComponentPropsWithoutRef<"div"> & {
|
|
218
240
|
gap?: 1 | 2 | 3 | 4 | 6 | 8;
|
|
219
241
|
}) => react.JSX.Element;
|
|
242
|
+
declare function SettingRow({ title, description, action, className, }: {
|
|
243
|
+
title: ReactNode;
|
|
244
|
+
description?: ReactNode;
|
|
245
|
+
action?: ReactNode;
|
|
246
|
+
className?: string;
|
|
247
|
+
}): react.JSX.Element;
|
|
220
248
|
declare const Container: ({ className, ...props }: ComponentPropsWithoutRef<"div">) => react.JSX.Element;
|
|
221
249
|
|
|
222
250
|
declare const Table: ({ className, ...props }: TableHTMLAttributes<HTMLTableElement>) => react.JSX.Element;
|
|
@@ -283,4 +311,4 @@ declare function FileUpload({ accept, multiple, onFiles, label, }: {
|
|
|
283
311
|
label?: string;
|
|
284
312
|
}): react.JSX.Element;
|
|
285
313
|
|
|
286
|
-
export { Accordion, Alert, AlertDialog, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, Avatar, Badge, Breadcrumb, Button, type ButtonProps, Card, CardDescription, CardHeader, CardTitle, Checkbox, Command, Container, ContextMenu, CopyButton, type DataColumn, DataTable, type DataTablePagination, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, Drawer, DrawerContent, DrawerTrigger, DropdownMenu, DropdownMenuItem, EmptyState, ErrorState, FileUpload, IconButton, Input, Label, LoadingState, MobileNav, Navbar, PageContent, PageHeader, PageShell, PaginatedTable, Pagination, PasswordInput, Popover, Progress, Radio, SearchableTable, Section, Select, Separator, Sheet, SheetClose, SheetContent, SheetTrigger, Sidebar, Skeleton, Stack, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, Textarea, Toast, Tooltip, cn };
|
|
314
|
+
export { Accordion, Alert, AlertDialog, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, Avatar, Badge, Breadcrumb, Button, type ButtonProps, Card, CardDescription, CardHeader, CardTitle, Checkbox, Command, ConfirmActionDialog, Container, ContextMenu, CopyButton, type DataColumn, DataTable, type DataTablePagination, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, Drawer, DrawerContent, DrawerTrigger, DropdownMenu, DropdownMenuItem, EmptyState, ErrorState, FileUpload, FormField, IconButton, Input, Label, LoadingState, MobileNav, Navbar, PageContent, PageHeader, PageShell, PaginatedTable, Pagination, PasswordInput, Popover, Progress, Radio, SearchableTable, Section, Select, Separator, SettingRow, Sheet, SheetClose, SheetContent, SheetTrigger, Sidebar, Skeleton, Stack, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, Textarea, Toast, Tooltip, cn };
|
package/dist/index.js
CHANGED
|
@@ -4,9 +4,9 @@ var cn = (...values) => values.filter(Boolean).join(" ");
|
|
|
4
4
|
// src/components/forms.tsx
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
var buttonStyles = {
|
|
7
|
-
primary: "bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] hover:opacity-90",
|
|
7
|
+
primary: "bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] shadow-sm hover:opacity-90 hover:shadow",
|
|
8
8
|
secondary: "bg-[hsl(var(--rui-secondary))] text-[hsl(var(--rui-secondary-foreground))] hover:opacity-80",
|
|
9
|
-
outline: "border border-[hsl(var(--rui-border))] bg-transparent hover:bg-[hsl(var(--rui-accent))]",
|
|
9
|
+
outline: "border border-[hsl(var(--rui-border))] bg-transparent shadow-sm hover:bg-[hsl(var(--rui-accent))]",
|
|
10
10
|
ghost: "bg-transparent hover:bg-[hsl(var(--rui-accent))]",
|
|
11
11
|
destructive: "bg-[hsl(var(--rui-destructive))] text-[hsl(var(--rui-destructive-foreground))] hover:opacity-90"
|
|
12
12
|
};
|
|
@@ -24,7 +24,7 @@ function Button({
|
|
|
24
24
|
"button",
|
|
25
25
|
{
|
|
26
26
|
className: cn(
|
|
27
|
-
"rui-focus inline-flex items-center justify-center gap-2 rounded-[var(--rui-radius)] font-medium transition disabled:pointer-events-none disabled:opacity-50",
|
|
27
|
+
"rui-focus inline-flex shrink-0 items-center justify-center gap-2 rounded-[var(--rui-radius)] font-medium transition-[background-color,box-shadow,transform] active:translate-y-px disabled:pointer-events-none disabled:opacity-50",
|
|
28
28
|
padding,
|
|
29
29
|
buttonStyles[variant],
|
|
30
30
|
className
|
|
@@ -63,7 +63,7 @@ var Input = ({
|
|
|
63
63
|
"input",
|
|
64
64
|
{
|
|
65
65
|
className: cn(
|
|
66
|
-
"rui-focus h-10 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 text-sm placeholder:text-[hsl(var(--rui-muted-foreground))] disabled:cursor-not-allowed disabled:opacity-50",
|
|
66
|
+
"rui-focus h-10 min-w-0 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 text-sm transition-colors placeholder:text-[hsl(var(--rui-muted-foreground))] focus:bg-[hsl(var(--rui-card))] disabled:cursor-not-allowed disabled:opacity-50",
|
|
67
67
|
className
|
|
68
68
|
),
|
|
69
69
|
...props
|
|
@@ -76,7 +76,7 @@ var Textarea = ({
|
|
|
76
76
|
"textarea",
|
|
77
77
|
{
|
|
78
78
|
className: cn(
|
|
79
|
-
"rui-focus min-h-24 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 py-2 text-sm placeholder:text-[hsl(var(--rui-muted-foreground))] disabled:cursor-not-allowed disabled:opacity-50",
|
|
79
|
+
"rui-focus min-h-24 min-w-0 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 py-2 text-sm transition-colors placeholder:text-[hsl(var(--rui-muted-foreground))] focus:bg-[hsl(var(--rui-card))] disabled:cursor-not-allowed disabled:opacity-50",
|
|
80
80
|
className
|
|
81
81
|
),
|
|
82
82
|
...props
|
|
@@ -92,6 +92,31 @@ var Label = ({
|
|
|
92
92
|
...props
|
|
93
93
|
}
|
|
94
94
|
);
|
|
95
|
+
function FormField({
|
|
96
|
+
label,
|
|
97
|
+
htmlFor,
|
|
98
|
+
description,
|
|
99
|
+
error,
|
|
100
|
+
required,
|
|
101
|
+
children,
|
|
102
|
+
className
|
|
103
|
+
}) {
|
|
104
|
+
return /* @__PURE__ */ jsxs("div", { className, children: [
|
|
105
|
+
/* @__PURE__ */ jsxs(Label, { htmlFor, children: [
|
|
106
|
+
label,
|
|
107
|
+
required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " *" })
|
|
108
|
+
] }),
|
|
109
|
+
children,
|
|
110
|
+
error ? /* @__PURE__ */ jsx(
|
|
111
|
+
"p",
|
|
112
|
+
{
|
|
113
|
+
role: "alert",
|
|
114
|
+
className: "mt-1 text-sm text-[hsl(var(--rui-destructive-text))]",
|
|
115
|
+
children: error
|
|
116
|
+
}
|
|
117
|
+
) : description && /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]", children: description })
|
|
118
|
+
] });
|
|
119
|
+
}
|
|
95
120
|
var Checkbox = ({
|
|
96
121
|
className,
|
|
97
122
|
...props
|
|
@@ -146,7 +171,7 @@ var Switch = ({
|
|
|
146
171
|
...props
|
|
147
172
|
}
|
|
148
173
|
),
|
|
149
|
-
/* @__PURE__ */ jsx("span", { className: "
|
|
174
|
+
/* @__PURE__ */ jsx("span", { className: "h-6 w-11 rounded-full bg-[hsl(var(--rui-muted))] p-0.5 transition peer-checked:bg-[hsl(var(--rui-primary))] peer-focus-visible:ring-2 peer-focus-visible:ring-[hsl(var(--rui-ring))] peer-focus-visible:ring-offset-2", children: /* @__PURE__ */ jsx("span", { className: "block size-5 rounded-full bg-[hsl(var(--rui-switch-thumb))] transition peer-checked:translate-x-5" }) })
|
|
150
175
|
]
|
|
151
176
|
}
|
|
152
177
|
);
|
|
@@ -158,7 +183,7 @@ var Select = ({
|
|
|
158
183
|
"select",
|
|
159
184
|
{
|
|
160
185
|
className: cn(
|
|
161
|
-
"rui-focus h-10 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-[hsl(var(--rui-background))] px-3 text-sm",
|
|
186
|
+
"rui-focus h-10 min-w-0 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-[hsl(var(--rui-background))] px-3 text-sm",
|
|
162
187
|
className
|
|
163
188
|
),
|
|
164
189
|
...props,
|
|
@@ -176,7 +201,7 @@ function Card({
|
|
|
176
201
|
"section",
|
|
177
202
|
{
|
|
178
203
|
className: cn(
|
|
179
|
-
"rounded-[calc(var(--rui-radius)+.15rem)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-5 shadow-sm",
|
|
204
|
+
"min-w-0 rounded-[calc(var(--rui-radius)+.15rem)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-5 shadow-sm transition-shadow",
|
|
180
205
|
className
|
|
181
206
|
),
|
|
182
207
|
...props
|
|
@@ -190,7 +215,10 @@ function CardHeader({
|
|
|
190
215
|
return /* @__PURE__ */ jsx2(
|
|
191
216
|
"div",
|
|
192
217
|
{
|
|
193
|
-
className: cn(
|
|
218
|
+
className: cn(
|
|
219
|
+
"mb-4 flex min-w-0 items-start justify-between gap-3 [&>:first-child]:min-w-0",
|
|
220
|
+
className
|
|
221
|
+
),
|
|
194
222
|
...props
|
|
195
223
|
}
|
|
196
224
|
);
|
|
@@ -199,7 +227,7 @@ function CardTitle({
|
|
|
199
227
|
className,
|
|
200
228
|
...props
|
|
201
229
|
}) {
|
|
202
|
-
return /* @__PURE__ */ jsx2("h3", { className: cn("font-semibold leading-
|
|
230
|
+
return /* @__PURE__ */ jsx2("h3", { className: cn("font-semibold leading-5", className), ...props });
|
|
203
231
|
}
|
|
204
232
|
function CardDescription({
|
|
205
233
|
className,
|
|
@@ -209,7 +237,7 @@ function CardDescription({
|
|
|
209
237
|
"p",
|
|
210
238
|
{
|
|
211
239
|
className: cn(
|
|
212
|
-
"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]",
|
|
240
|
+
"mt-1 break-words text-sm leading-5 text-[hsl(var(--rui-muted-foreground))]",
|
|
213
241
|
className
|
|
214
242
|
),
|
|
215
243
|
...props
|
|
@@ -467,7 +495,7 @@ function DialogContent({
|
|
|
467
495
|
"aria-labelledby": titleId,
|
|
468
496
|
tabIndex: -1,
|
|
469
497
|
className: cn(
|
|
470
|
-
"relative z-10 max-h-[calc(100vh-2rem)] w-full max-w-lg overflow-auto rounded-[calc(var(--rui-radius)+.2rem)] bg-[hsl(var(--rui-card))] p-
|
|
498
|
+
"relative z-10 max-h-[calc(100vh-2rem)] w-full max-w-lg overflow-auto rounded-[calc(var(--rui-radius)+.2rem)] bg-[hsl(var(--rui-card))] p-4 text-[hsl(var(--rui-foreground))] shadow-2xl outline-none sm:p-6",
|
|
471
499
|
drag && "select-none",
|
|
472
500
|
className
|
|
473
501
|
),
|
|
@@ -545,6 +573,44 @@ var AlertDialogTitle = DialogTitle;
|
|
|
545
573
|
var AlertDialogDescription = DialogDescription;
|
|
546
574
|
var AlertDialogFooter = DialogFooter;
|
|
547
575
|
var AlertDialogClose = DialogClose;
|
|
576
|
+
function ConfirmActionDialog({
|
|
577
|
+
open,
|
|
578
|
+
onOpenChange,
|
|
579
|
+
title,
|
|
580
|
+
description,
|
|
581
|
+
confirmLabel = "Confirm",
|
|
582
|
+
cancelLabel = "Cancel",
|
|
583
|
+
onConfirm,
|
|
584
|
+
loading,
|
|
585
|
+
confirmDisabled,
|
|
586
|
+
variant = "destructive",
|
|
587
|
+
children
|
|
588
|
+
}) {
|
|
589
|
+
const confirm = async () => {
|
|
590
|
+
await onConfirm();
|
|
591
|
+
onOpenChange(false);
|
|
592
|
+
};
|
|
593
|
+
return /* @__PURE__ */ jsx3(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs2(DialogContent, { children: [
|
|
594
|
+
/* @__PURE__ */ jsxs2(DialogHeader, { children: [
|
|
595
|
+
/* @__PURE__ */ jsx3(DialogTitle, { children: title }),
|
|
596
|
+
description && /* @__PURE__ */ jsx3(DialogDescription, { children: description })
|
|
597
|
+
] }),
|
|
598
|
+
children && /* @__PURE__ */ jsx3(DialogBody, { children }),
|
|
599
|
+
/* @__PURE__ */ jsxs2(DialogFooter, { children: [
|
|
600
|
+
/* @__PURE__ */ jsx3(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx3(Button, { variant: "outline", children: cancelLabel }) }),
|
|
601
|
+
/* @__PURE__ */ jsx3(
|
|
602
|
+
Button,
|
|
603
|
+
{
|
|
604
|
+
variant,
|
|
605
|
+
loading,
|
|
606
|
+
disabled: confirmDisabled,
|
|
607
|
+
onClick: () => void confirm(),
|
|
608
|
+
children: confirmLabel
|
|
609
|
+
}
|
|
610
|
+
)
|
|
611
|
+
] })
|
|
612
|
+
] }) });
|
|
613
|
+
}
|
|
548
614
|
function Sheet({
|
|
549
615
|
children,
|
|
550
616
|
...props
|
|
@@ -711,12 +777,12 @@ function Navbar({
|
|
|
711
777
|
{
|
|
712
778
|
"aria-label": label,
|
|
713
779
|
className: cn(
|
|
714
|
-
"flex min-h-14 items-center justify-between border-b border-[hsl(var(--rui-border))] px-4",
|
|
780
|
+
"flex min-h-14 min-w-0 items-center justify-between gap-3 border-b border-[hsl(var(--rui-border))] px-4",
|
|
715
781
|
className
|
|
716
782
|
),
|
|
717
783
|
children: [
|
|
718
784
|
brand,
|
|
719
|
-
/* @__PURE__ */ jsx5("div", { className: "flex items-center gap-2", children })
|
|
785
|
+
/* @__PURE__ */ jsx5("div", { className: "flex min-w-0 flex-wrap items-center justify-end gap-2", children })
|
|
720
786
|
]
|
|
721
787
|
}
|
|
722
788
|
);
|
|
@@ -802,7 +868,7 @@ function Tabs({
|
|
|
802
868
|
"div",
|
|
803
869
|
{
|
|
804
870
|
role: "tablist",
|
|
805
|
-
className: "flex gap-1 border-b border-[hsl(var(--rui-border))]",
|
|
871
|
+
className: "flex gap-1 overflow-x-auto border-b border-[hsl(var(--rui-border))]",
|
|
806
872
|
children: tabs.map((tab) => /* @__PURE__ */ jsx5(
|
|
807
873
|
"button",
|
|
808
874
|
{
|
|
@@ -811,7 +877,7 @@ function Tabs({
|
|
|
811
877
|
disabled: tab.disabled,
|
|
812
878
|
onClick: () => choose(tab.value),
|
|
813
879
|
className: cn(
|
|
814
|
-
"rui-focus border-b-2 px-3 py-2 text-sm font-medium transition",
|
|
880
|
+
"rui-focus shrink-0 whitespace-nowrap border-b-2 px-3 py-2 text-sm font-medium transition",
|
|
815
881
|
tab.value === selected ? "border-[hsl(var(--rui-primary))]" : "border-transparent text-[hsl(var(--rui-muted-foreground))]"
|
|
816
882
|
),
|
|
817
883
|
children: tab.label
|
|
@@ -903,7 +969,7 @@ function Pagination({
|
|
|
903
969
|
Select,
|
|
904
970
|
{
|
|
905
971
|
"aria-label": "Rows per page",
|
|
906
|
-
className: "ml-auto w-auto",
|
|
972
|
+
className: "sm:ml-auto w-auto",
|
|
907
973
|
value: pageSize,
|
|
908
974
|
onChange: (event) => onPageSizeChange(Number(event.target.value)),
|
|
909
975
|
children: pageSizeOptions.map((size) => /* @__PURE__ */ jsxs4("option", { value: size, children: [
|
|
@@ -936,7 +1002,7 @@ function Alert({
|
|
|
936
1002
|
className
|
|
937
1003
|
),
|
|
938
1004
|
children: [
|
|
939
|
-
title && /* @__PURE__ */ jsx6("strong", { className: "block", children: title }),
|
|
1005
|
+
title && /* @__PURE__ */ jsx6("strong", { className: "mb-1 block", children: title }),
|
|
940
1006
|
children
|
|
941
1007
|
]
|
|
942
1008
|
}
|
|
@@ -961,7 +1027,7 @@ function Toast({
|
|
|
961
1027
|
/* @__PURE__ */ jsx6("strong", { className: "text-sm", children: title }),
|
|
962
1028
|
description && /* @__PURE__ */ jsx6("p", { className: "mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]", children: description })
|
|
963
1029
|
] }),
|
|
964
|
-
action
|
|
1030
|
+
/* @__PURE__ */ jsx6("div", { className: "shrink-0", children: action })
|
|
965
1031
|
]
|
|
966
1032
|
}
|
|
967
1033
|
);
|
|
@@ -975,7 +1041,7 @@ var EmptyState = ({
|
|
|
975
1041
|
"div",
|
|
976
1042
|
{
|
|
977
1043
|
className: cn(
|
|
978
|
-
"rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-
|
|
1044
|
+
"rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center sm:p-10",
|
|
979
1045
|
className
|
|
980
1046
|
),
|
|
981
1047
|
children: [
|
|
@@ -1018,7 +1084,7 @@ var PageShell = ({
|
|
|
1018
1084
|
Component,
|
|
1019
1085
|
{
|
|
1020
1086
|
className: cn(
|
|
1021
|
-
"min-h-screen bg-[hsl(var(--rui-background))] text-[hsl(var(--rui-foreground))]",
|
|
1087
|
+
"min-h-screen min-w-0 bg-[hsl(var(--rui-background))] text-[hsl(var(--rui-foreground))]",
|
|
1022
1088
|
className
|
|
1023
1089
|
),
|
|
1024
1090
|
...props
|
|
@@ -1038,8 +1104,8 @@ var PageHeader = ({
|
|
|
1038
1104
|
className
|
|
1039
1105
|
),
|
|
1040
1106
|
children: [
|
|
1041
|
-
/* @__PURE__ */ jsxs6("div", { children: [
|
|
1042
|
-
/* @__PURE__ */ jsx7(Heading, { className: "text-2xl font-bold tracking-tight", children: title }),
|
|
1107
|
+
/* @__PURE__ */ jsxs6("div", { className: "min-w-0", children: [
|
|
1108
|
+
/* @__PURE__ */ jsx7(Heading, { className: "text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
|
|
1043
1109
|
description && /* @__PURE__ */ jsx7("p", { className: "mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]", children: description })
|
|
1044
1110
|
] }),
|
|
1045
1111
|
actions
|
|
@@ -1055,9 +1121,9 @@ var Section = ({
|
|
|
1055
1121
|
description,
|
|
1056
1122
|
children,
|
|
1057
1123
|
className
|
|
1058
|
-
}) => /* @__PURE__ */ jsxs6("section", { className: cn("space-y-4", className), children: [
|
|
1124
|
+
}) => /* @__PURE__ */ jsxs6("section", { className: cn("min-w-0 space-y-4", className), children: [
|
|
1059
1125
|
title && /* @__PURE__ */ jsxs6("div", { children: [
|
|
1060
|
-
/* @__PURE__ */ jsx7("h2", { className: "font-semibold", children: title }),
|
|
1126
|
+
/* @__PURE__ */ jsx7("h2", { className: "text-lg font-semibold tracking-tight", children: title }),
|
|
1061
1127
|
description && /* @__PURE__ */ jsx7("p", { className: "mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]", children: description })
|
|
1062
1128
|
] }),
|
|
1063
1129
|
children
|
|
@@ -1084,6 +1150,29 @@ var Stack = ({
|
|
|
1084
1150
|
...props
|
|
1085
1151
|
}
|
|
1086
1152
|
);
|
|
1153
|
+
function SettingRow({
|
|
1154
|
+
title,
|
|
1155
|
+
description,
|
|
1156
|
+
action,
|
|
1157
|
+
className
|
|
1158
|
+
}) {
|
|
1159
|
+
return /* @__PURE__ */ jsxs6(
|
|
1160
|
+
"div",
|
|
1161
|
+
{
|
|
1162
|
+
className: cn(
|
|
1163
|
+
"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
1164
|
+
className
|
|
1165
|
+
),
|
|
1166
|
+
children: [
|
|
1167
|
+
/* @__PURE__ */ jsxs6("div", { className: "min-w-0", children: [
|
|
1168
|
+
/* @__PURE__ */ jsx7(CardTitle, { children: title }),
|
|
1169
|
+
description && /* @__PURE__ */ jsx7(CardDescription, { children: description })
|
|
1170
|
+
] }),
|
|
1171
|
+
action
|
|
1172
|
+
]
|
|
1173
|
+
}
|
|
1174
|
+
);
|
|
1175
|
+
}
|
|
1087
1176
|
var Container = ({
|
|
1088
1177
|
className,
|
|
1089
1178
|
...props
|
|
@@ -1432,7 +1521,7 @@ function PasswordInput({
|
|
|
1432
1521
|
"button",
|
|
1433
1522
|
{
|
|
1434
1523
|
type: "button",
|
|
1435
|
-
className: "rui-focus absolute right-2 top-2 text-xs text-[hsl(var(--rui-muted-foreground))]",
|
|
1524
|
+
className: "rui-focus absolute right-2 top-2 rounded px-1 text-xs text-[hsl(var(--rui-muted-foreground))]",
|
|
1436
1525
|
onClick: () => setVisible(!visible),
|
|
1437
1526
|
children: visible ? "Hide" : "Show"
|
|
1438
1527
|
}
|
|
@@ -1462,7 +1551,7 @@ function FileUpload({
|
|
|
1462
1551
|
Label,
|
|
1463
1552
|
{
|
|
1464
1553
|
htmlFor: id,
|
|
1465
|
-
className: "cursor-pointer rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center text-sm text-[hsl(var(--rui-muted-foreground))]",
|
|
1554
|
+
className: "flex w-full cursor-pointer items-center justify-center rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center text-sm text-[hsl(var(--rui-muted-foreground))]",
|
|
1466
1555
|
children: label
|
|
1467
1556
|
}
|
|
1468
1557
|
)
|
|
@@ -1489,6 +1578,7 @@ export {
|
|
|
1489
1578
|
CardTitle,
|
|
1490
1579
|
Checkbox,
|
|
1491
1580
|
Command,
|
|
1581
|
+
ConfirmActionDialog,
|
|
1492
1582
|
Container,
|
|
1493
1583
|
ContextMenu,
|
|
1494
1584
|
CopyButton,
|
|
@@ -1510,6 +1600,7 @@ export {
|
|
|
1510
1600
|
EmptyState,
|
|
1511
1601
|
ErrorState,
|
|
1512
1602
|
FileUpload,
|
|
1603
|
+
FormField,
|
|
1513
1604
|
IconButton,
|
|
1514
1605
|
Input,
|
|
1515
1606
|
Label,
|
|
@@ -1529,6 +1620,7 @@ export {
|
|
|
1529
1620
|
Section,
|
|
1530
1621
|
Select,
|
|
1531
1622
|
Separator,
|
|
1623
|
+
SettingRow,
|
|
1532
1624
|
Sheet,
|
|
1533
1625
|
SheetClose,
|
|
1534
1626
|
SheetContent,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/forms.tsx","../src/components/display.tsx","../src/components/dialog.tsx","../src/components/overlays.tsx","../src/components/navigation.tsx","../src/components/feedback.tsx","../src/components/layout.tsx","../src/components/tables.tsx","../src/components/utilities.tsx"],"sourcesContent":["export const cn = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(' ');\n","import type {\n ButtonHTMLAttributes,\n ComponentPropsWithoutRef,\n InputHTMLAttributes,\n SelectHTMLAttributes,\n} from 'react';\nimport { cn } from '../lib/utils';\n\nconst buttonStyles = {\n primary:\n 'bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] hover:opacity-90',\n secondary:\n 'bg-[hsl(var(--rui-secondary))] text-[hsl(var(--rui-secondary-foreground))] hover:opacity-80',\n outline:\n 'border border-[hsl(var(--rui-border))] bg-transparent hover:bg-[hsl(var(--rui-accent))]',\n ghost: 'bg-transparent hover:bg-[hsl(var(--rui-accent))]',\n destructive:\n 'bg-[hsl(var(--rui-destructive))] text-[hsl(var(--rui-destructive-foreground))] hover:opacity-90',\n} as const;\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: keyof typeof buttonStyles;\n size?: 'sm' | 'md' | 'lg';\n loading?: boolean;\n}\nexport function Button({\n variant = 'primary',\n size = 'md',\n loading,\n className,\n children,\n disabled,\n ...props\n}: ButtonProps) {\n const padding =\n size === 'sm'\n ? 'h-8 px-3 text-sm'\n : size === 'lg'\n ? 'h-11 px-5 text-base'\n : 'h-10 px-4 text-sm';\n return (\n <button\n className={cn(\n 'rui-focus inline-flex items-center justify-center gap-2 rounded-[var(--rui-radius)] font-medium transition disabled:pointer-events-none disabled:opacity-50',\n padding,\n buttonStyles[variant],\n className,\n )}\n disabled={disabled || loading}\n aria-busy={loading}\n {...props}\n >\n {loading && (\n <span className=\"size-4 animate-spin rounded-full border-2 border-current border-r-transparent\" />\n )}{' '}\n {children}\n </button>\n );\n}\nexport function IconButton({\n children,\n 'aria-label': label,\n className,\n ...props\n}: ButtonProps) {\n return (\n <Button\n className={cn('size-10 px-0', className)}\n aria-label={label}\n {...props}\n >\n {children}\n </Button>\n );\n}\nexport const Input = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n className={cn(\n 'rui-focus h-10 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 text-sm placeholder:text-[hsl(var(--rui-muted-foreground))] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n);\nexport const Textarea = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'textarea'>) => (\n <textarea\n className={cn(\n 'rui-focus min-h-24 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 py-2 text-sm placeholder:text-[hsl(var(--rui-muted-foreground))] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n);\nexport const Label = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'label'>) => (\n <label\n className={cn('mb-1.5 block text-sm font-medium', className)}\n {...props}\n />\n);\nexport const Checkbox = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n type=\"checkbox\"\n className={cn(\n 'rui-focus size-4 accent-[hsl(var(--rui-primary))]',\n className,\n )}\n {...props}\n />\n);\nexport const Radio = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n type=\"radio\"\n className={cn(\n 'rui-focus size-4 accent-[hsl(var(--rui-primary))]',\n className,\n )}\n {...props}\n />\n);\nexport const Switch = ({\n checked,\n onChange,\n disabled,\n className,\n ...props\n}: Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>) => (\n <label\n className={cn(\n 'inline-flex cursor-pointer items-center',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n >\n <input\n type=\"checkbox\"\n className=\"peer sr-only\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n {...props}\n />\n <span className=\"rui-focus h-6 w-11 rounded-full bg-[hsl(var(--rui-muted))] p-0.5 transition peer-checked:bg-[hsl(var(--rui-primary))]\">\n <span className=\"block size-5 rounded-full bg-[hsl(var(--rui-switch-thumb))] transition peer-checked:translate-x-5\" />\n </span>\n </label>\n);\nexport const Select = ({\n className,\n children,\n ...props\n}: SelectHTMLAttributes<HTMLSelectElement>) => (\n <select\n className={cn(\n 'rui-focus h-10 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-[hsl(var(--rui-background))] px-3 text-sm',\n className,\n )}\n {...props}\n >\n {children}\n </select>\n);\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\nexport function Card({\n className,\n ...props\n}: ComponentPropsWithoutRef<'section'>) {\n return (\n <section\n className={cn(\n 'rounded-[calc(var(--rui-radius)+.15rem)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-5 shadow-sm',\n className,\n )}\n {...props}\n />\n );\n}\nexport function CardHeader({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n className={cn('mb-4 flex items-start justify-between gap-3', className)}\n {...props}\n />\n );\n}\nexport function CardTitle({\n className,\n ...props\n}: ComponentPropsWithoutRef<'h3'>) {\n return (\n <h3 className={cn('font-semibold leading-none', className)} {...props} />\n );\n}\nexport function CardDescription({\n className,\n ...props\n}: ComponentPropsWithoutRef<'p'>) {\n return (\n <p\n className={cn(\n 'mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n );\n}\nexport function Badge({\n className,\n variant = 'default',\n ...props\n}: ChildrenProps & {\n variant?: 'default' | 'success' | 'warning' | 'destructive' | 'outline';\n}) {\n const variants = {\n default: 'bg-[hsl(var(--rui-secondary))]',\n success:\n 'bg-[hsl(var(--rui-success-background))] text-[hsl(var(--rui-success-foreground))]',\n warning:\n 'bg-[hsl(var(--rui-warning-background))] text-[hsl(var(--rui-warning-foreground))]',\n destructive:\n 'bg-[hsl(var(--rui-destructive-background))] text-[hsl(var(--rui-destructive-text))]',\n outline: 'border border-[hsl(var(--rui-border))]',\n };\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variants[variant],\n className,\n )}\n >\n {props.children}\n </span>\n );\n}\nexport function Avatar({\n src,\n alt = '',\n fallback,\n className,\n}: {\n src?: string;\n alt?: string;\n fallback?: ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n 'inline-flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[hsl(var(--rui-muted))] text-sm font-medium',\n className,\n )}\n >\n {src ? (\n <img className=\"size-full object-cover\" src={src} alt={alt} />\n ) : (\n (fallback ?? alt.slice(0, 2).toUpperCase())\n )}\n </span>\n );\n}\nexport const Separator = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n role=\"separator\"\n className={cn('h-px w-full bg-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const Skeleton = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn(\n 'animate-pulse rounded bg-[hsl(var(--rui-muted))]',\n className,\n )}\n {...props}\n />\n);\nexport function Progress({\n value,\n max = 100,\n label,\n className,\n}: {\n value: number;\n max?: number;\n label?: string;\n className?: string;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n return (\n <div\n className={className}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n >\n <div className=\"h-2 overflow-hidden rounded-full bg-[hsl(var(--rui-muted))]\">\n <div\n className=\"h-full rounded-full bg-[hsl(var(--rui-primary))] transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from './forms';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\ntype DialogState = { open: boolean; setOpen: (open: boolean) => void };\nconst DialogContext = createContext<DialogState | null>(null);\nconst DialogTitleContext = createContext<string | undefined>(undefined);\nconst useDialog = () => {\n const value = useContext(DialogContext);\n if (!value) throw new Error('Dialog components must be inside Dialog');\n return value;\n};\nexport function Dialog({\n open: controlled,\n defaultOpen = false,\n onOpenChange,\n children,\n}: {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const open = controlled ?? uncontrolled;\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [controlled, onOpenChange],\n );\n return (\n <DialogContext.Provider value={{ open, setOpen }}>\n {children}\n </DialogContext.Provider>\n );\n}\nexport function DialogTrigger({\n children,\n asChild = false,\n}: {\n children: ReactNode;\n asChild?: boolean;\n}) {\n const { setOpen } = useDialog();\n if (asChild && isValidElement<{ onClick?: () => void }>(children))\n return cloneElement(children, {\n onClick: () => {\n children.props.onClick?.();\n setOpen(true);\n },\n });\n return <Button onClick={() => setOpen(true)}>{children}</Button>;\n}\nexport function DialogClose({\n children,\n asChild = false,\n}: {\n children: ReactNode;\n asChild?: boolean;\n}) {\n const { setOpen } = useDialog();\n if (asChild && isValidElement<{ onClick?: () => void }>(children))\n return cloneElement(children, {\n onClick: () => {\n children.props.onClick?.();\n setOpen(false);\n },\n });\n return (\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>\n {children}\n </Button>\n );\n}\nexport function DialogContent({\n children,\n className,\n movable = false,\n constrainToViewport = true,\n style,\n ...props\n}: ChildrenProps & {\n movable?: boolean;\n constrainToViewport?: boolean;\n style?: CSSProperties;\n}) {\n const { open, setOpen } = useDialog();\n const panel = useRef<HTMLDivElement>(null);\n const previousFocus = useRef<HTMLElement | null>(null);\n const [drag, setDrag] = useState<{ x: number; y: number } | null>(null);\n const [offset, setOffset] = useState({ x: 0, y: 0 });\n const titleId = useId();\n useEffect(() => {\n if (!open) return;\n previousFocus.current = document.activeElement as HTMLElement;\n const timer = window.setTimeout(() => panel.current?.focus(), 0);\n const key = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n if (event.key === 'Tab' && panel.current) {\n const nodes = panel.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n const first = nodes[0],\n last = nodes[nodes.length - 1];\n if (!first || !last) return;\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', key);\n return () => {\n window.clearTimeout(timer);\n document.removeEventListener('keydown', key);\n previousFocus.current?.focus();\n };\n }, [open, setOpen]);\n useEffect(() => {\n if (!drag) return;\n const move = (event: PointerEvent) => {\n let x = offset.x + event.clientX - drag.x;\n let y = offset.y + event.clientY - drag.y;\n if (constrainToViewport && panel.current) {\n const rect = panel.current.getBoundingClientRect();\n x = Math.min(\n Math.max(x, -rect.left + 12),\n window.innerWidth - rect.right - 12 + offset.x,\n );\n y = Math.min(\n Math.max(y, -rect.top + 12),\n window.innerHeight - rect.bottom - 12 + offset.y,\n );\n }\n setOffset({ x, y });\n };\n const up = () => setDrag(null);\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n }, [drag, offset, constrainToViewport]);\n if (!open || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 grid place-items-center p-4\"\n role=\"presentation\"\n >\n <button\n className=\"absolute inset-0 cursor-default bg-[hsl(var(--rui-overlay))]/50\"\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n />\n <div\n ref={panel}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n className={cn(\n 'relative z-10 max-h-[calc(100vh-2rem)] w-full max-w-lg overflow-auto rounded-[calc(var(--rui-radius)+.2rem)] bg-[hsl(var(--rui-card))] p-6 text-[hsl(var(--rui-foreground))] shadow-2xl outline-none',\n drag && 'select-none',\n className,\n )}\n style={{\n ...style,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n {...props}\n >\n {movable && (\n <div\n onPointerDown={(event) => {\n if (\n window.innerWidth < 640 ||\n (event.target as HTMLElement).closest(\n 'button,input,select,textarea,a,[role=button]',\n )\n )\n return;\n event.preventDefault();\n setDrag({ x: event.clientX, y: event.clientY });\n }}\n className=\"-mx-2 -mt-2 mb-3 cursor-grab touch-none rounded px-2 py-1 text-xs text-[hsl(var(--rui-muted-foreground))] active:cursor-grabbing\"\n >\n Drag to move\n </div>\n )}\n <DialogTitleContext.Provider value={titleId}>\n {children}\n </DialogTitleContext.Provider>\n </div>\n </div>,\n document.body,\n );\n}\nexport const DialogHeader = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('mb-5 space-y-1.5', className)} {...props} />\n);\nexport const DialogTitle = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'h2'>) => {\n const id = useContext(DialogTitleContext);\n return (\n <h2 id={id} className={cn('text-lg font-semibold', className)} {...props} />\n );\n};\nexport const DialogDescription = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'p'>) => (\n <p\n className={cn('text-sm text-[hsl(var(--rui-muted-foreground))]', className)}\n {...props}\n />\n);\nexport const DialogBody = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('space-y-4', className)} {...props} />\n);\nexport const DialogFooter = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn('mt-6 flex flex-wrap justify-end gap-2', className)}\n {...props}\n />\n);\nexport const AlertDialog = Dialog;\nexport const AlertDialogTrigger = DialogTrigger;\nexport const AlertDialogContent = DialogContent;\nexport const AlertDialogHeader = DialogHeader;\nexport const AlertDialogTitle = DialogTitle;\nexport const AlertDialogDescription = DialogDescription;\nexport const AlertDialogFooter = DialogFooter;\nexport const AlertDialogClose = DialogClose;\nexport function Sheet({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof Dialog>) {\n return <Dialog {...props}>{children}</Dialog>;\n}\nexport const SheetTrigger = DialogTrigger;\nexport const SheetClose = DialogClose;\nexport function SheetContent({\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof DialogContent>) {\n return (\n <DialogContent\n className={cn('ml-auto h-full max-h-none rounded-r-none', className)}\n {...props}\n />\n );\n}\nexport const Drawer = Sheet;\nexport const DrawerTrigger = SheetTrigger;\nexport const DrawerContent = SheetContent;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../lib/utils';\n\nexport function Popover({\n trigger,\n children,\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n}: {\n trigger: ReactNode;\n children: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const root = useRef<HTMLSpanElement>(null);\n const contentId = useId();\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [controlledOpen, onOpenChange],\n );\n useEffect(() => {\n if (!open) return;\n const dismiss = (event: PointerEvent) => {\n if (!root.current?.contains(event.target as Node)) setOpen(false);\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', dismiss);\n document.addEventListener('keydown', escape);\n return () => {\n document.removeEventListener('pointerdown', dismiss);\n document.removeEventListener('keydown', escape);\n };\n }, [open, setOpen]);\n const triggerProps = {\n 'aria-controls': contentId,\n 'aria-expanded': open,\n 'aria-haspopup': 'dialog' as const,\n onClick: () => setOpen(!open),\n };\n const triggerElement = isValidElement<{\n onClick?: () => void;\n 'aria-controls'?: string;\n 'aria-expanded'?: boolean;\n 'aria-haspopup'?: 'dialog';\n }>(trigger) ? (\n cloneElement(trigger, {\n ...triggerProps,\n onClick: () => {\n trigger.props.onClick?.();\n setOpen(!open);\n },\n })\n ) : (\n <button type=\"button\" {...triggerProps}>\n {trigger}\n </button>\n );\n return (\n <span ref={root} className=\"relative inline-block\">\n {triggerElement}\n {open && (\n <span\n id={contentId}\n role=\"dialog\"\n className={cn(\n 'absolute z-30 mt-2 block min-w-52 rounded-[var(--rui-radius)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-3 shadow-lg',\n className,\n )}\n >\n {children}\n </span>\n )}\n </span>\n );\n}\nexport const Tooltip = ({\n content,\n children,\n className,\n}: {\n content: string;\n children: ReactNode;\n className?: string;\n}) => {\n const [visible, setVisible] = useState(false);\n const id = useId();\n return (\n <span\n className=\"relative inline-flex\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n onFocus={() => setVisible(true)}\n onBlur={() => setVisible(false)}\n aria-describedby={visible ? id : undefined}\n >\n {children}\n {visible && (\n <span\n id={id}\n role=\"tooltip\"\n className={cn(\n 'absolute bottom-full left-1/2 z-30 mb-2 w-max max-w-52 -translate-x-1/2 rounded bg-[hsl(var(--rui-tooltip))] px-2 py-1 text-xs text-[hsl(var(--rui-tooltip-foreground))] shadow',\n className,\n )}\n >\n {content}\n </span>\n )}\n </span>\n );\n};\nexport function DropdownMenu({\n trigger,\n children,\n}: {\n trigger: ReactNode;\n children: ReactNode;\n}) {\n return (\n <Popover trigger={trigger} className=\"right-0 p-1\">\n {children}\n </Popover>\n );\n}\nexport const DropdownMenuItem = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'button'>) => (\n <button\n className={cn(\n 'rui-focus block w-full rounded px-2 py-1.5 text-left text-sm hover:bg-[hsl(var(--rui-accent))]',\n className,\n )}\n {...props}\n />\n);\n","'use client';\n\nimport { useState, type ReactNode } from 'react';\nimport { Button, Select } from './forms';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\nexport function Navbar({\n brand,\n children,\n className,\n label = 'Main navigation',\n}: {\n brand?: ReactNode;\n children?: ReactNode;\n className?: string;\n label?: string;\n}) {\n return (\n <nav\n aria-label={label}\n className={cn(\n 'flex min-h-14 items-center justify-between border-b border-[hsl(var(--rui-border))] px-4',\n className,\n )}\n >\n {brand}\n <div className=\"flex items-center gap-2\">{children}</div>\n </nav>\n );\n}\nexport function Sidebar({\n children,\n className,\n label = 'Sidebar',\n}: ChildrenProps & { label?: string }) {\n return (\n <aside\n aria-label={label}\n className={cn(\n 'w-60 shrink-0 border-r border-[hsl(var(--rui-border))] p-3',\n className,\n )}\n >\n {children}\n </aside>\n );\n}\nexport function MobileNav({\n children,\n className,\n label = 'Mobile navigation',\n}: ChildrenProps & { label?: string }) {\n return (\n <nav\n aria-label={label}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-40 flex justify-around border-t border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-2 sm:hidden',\n className,\n )}\n >\n {children}\n </nav>\n );\n}\nexport function Breadcrumb({\n items,\n}: {\n items: Array<{ label: string; href?: string }>;\n}) {\n return (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex flex-wrap items-center gap-2 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {items.map((item, index) => (\n <li\n key={`${item.label}-${index}`}\n className=\"flex items-center gap-2\"\n >\n {index > 0 && <span aria-hidden>/</span>}\n {item.href ? (\n <a\n className=\"hover:text-[hsl(var(--rui-foreground))]\"\n href={item.href}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={index === items.length - 1 ? 'page' : undefined}\n >\n {item.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n );\n}\nexport function Tabs({\n tabs,\n value,\n defaultValue,\n onValueChange,\n className,\n}: {\n tabs: Array<{\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n }>;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n className?: string;\n}) {\n const [local, setLocal] = useState(defaultValue ?? tabs[0]?.value ?? '');\n const selected = value ?? local;\n const choose = (next: string) => {\n if (value === undefined) setLocal(next);\n onValueChange?.(next);\n };\n const active = tabs.find((tab) => tab.value === selected);\n return (\n <div className={className}>\n <div\n role=\"tablist\"\n className=\"flex gap-1 border-b border-[hsl(var(--rui-border))]\"\n >\n {tabs.map((tab) => (\n <button\n key={tab.value}\n role=\"tab\"\n aria-selected={tab.value === selected}\n disabled={tab.disabled}\n onClick={() => choose(tab.value)}\n className={cn(\n 'rui-focus border-b-2 px-3 py-2 text-sm font-medium transition',\n tab.value === selected\n ? 'border-[hsl(var(--rui-primary))]'\n : 'border-transparent text-[hsl(var(--rui-muted-foreground))]',\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div role=\"tabpanel\" className=\"py-4\">\n {active?.content}\n </div>\n </div>\n );\n}\nexport function Accordion({\n items,\n type = 'single',\n}: {\n items: Array<{ value: string; title: ReactNode; content: ReactNode }>;\n type?: 'single' | 'multiple';\n}) {\n const [open, setOpen] = useState<string[]>([]);\n const toggle = (value: string) =>\n setOpen((current) =>\n current.includes(value)\n ? current.filter((item) => item !== value)\n : type === 'single'\n ? [value]\n : [...current, value],\n );\n return (\n <div className=\"divide-y divide-[hsl(var(--rui-border))]\">\n {items.map((item) => (\n <div key={item.value}>\n <button\n className=\"rui-focus flex w-full items-center justify-between py-3 text-left font-medium\"\n aria-expanded={open.includes(item.value)}\n onClick={() => toggle(item.value)}\n >\n {item.title}\n <span>{open.includes(item.value) ? '−' : '+'}</span>\n </button>\n {open.includes(item.value) && (\n <div className=\"pb-3 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {item.content}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\nexport function Pagination({\n page,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50],\n ariaLabel = 'Pagination',\n className,\n}: {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n pageSizeOptions?: number[];\n ariaLabel?: string;\n className?: string;\n}) {\n const pages = Math.max(1, Math.ceil(total / pageSize));\n const visible = Array.from(\n { length: Math.min(pages, 5) },\n (_, i) => Math.max(1, Math.min(pages - 4, page - 3)) + i,\n );\n return (\n <nav\n aria-label={ariaLabel}\n className={cn('flex flex-wrap items-center gap-2', className)}\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n Previous\n </Button>\n {visible.map((number) => (\n <Button\n key={number}\n variant={number === page ? 'primary' : 'ghost'}\n size=\"sm\"\n aria-current={number === page ? 'page' : undefined}\n onClick={() => onPageChange(number)}\n >\n {number}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n Next\n </Button>\n {onPageSizeChange && (\n <Select\n aria-label=\"Rows per page\"\n className=\"ml-auto w-auto\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </Select>\n )}\n </nav>\n );\n}\n","import { type ReactNode } from 'react';\nimport { Button } from './forms';\nimport { cn } from '../lib/utils';\n\nexport function Alert({\n title,\n children,\n variant = 'default',\n className,\n}: {\n title?: ReactNode;\n children?: ReactNode;\n variant?: 'default' | 'destructive' | 'success';\n className?: string;\n}) {\n const color =\n variant === 'destructive'\n ? 'border-[hsl(var(--rui-destructive))] bg-[hsl(var(--rui-destructive-background))] text-[hsl(var(--rui-destructive-text))]'\n : variant === 'success'\n ? 'border-[hsl(var(--rui-success))] bg-[hsl(var(--rui-success-background))] text-[hsl(var(--rui-success-foreground))]'\n : 'border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-muted))]';\n return (\n <div\n role=\"alert\"\n className={cn(\n 'rounded-[var(--rui-radius)] border p-3 text-sm',\n color,\n className,\n )}\n >\n {title && <strong className=\"block\">{title}</strong>}\n {children}\n </div>\n );\n}\nexport function Toast({\n title,\n description,\n action,\n className,\n}: {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n role=\"status\"\n className={cn(\n 'flex max-w-sm items-start gap-4 rounded-[var(--rui-radius)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-4 shadow-lg',\n className,\n )}\n >\n <div className=\"flex-1\">\n <strong className=\"text-sm\">{title}</strong>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n {action}\n </div>\n );\n}\nexport const EmptyState = ({\n title = 'Nothing here yet',\n description,\n action,\n className,\n}: {\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) => (\n <div\n className={cn(\n 'rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-10 text-center',\n className,\n )}\n >\n <h3 className=\"font-semibold\">{title}</h3>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n);\nexport const ErrorState = ({\n title = 'Something went wrong',\n onRetry,\n className,\n}: {\n title?: ReactNode;\n onRetry?: () => void;\n className?: string;\n}) => (\n <Alert title={title} variant=\"destructive\" className={className}>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={onRetry}>\n Try again\n </Button>\n )}\n </Alert>\n);\nexport const LoadingState = ({\n label = 'Loading',\n className,\n}: {\n label?: string;\n className?: string;\n}) => (\n <div\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 p-4 text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n >\n <span className=\"size-4 animate-spin rounded-full border-2 border-current border-r-transparent\" />\n {label}\n </div>\n);\n","import { type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\nexport const PageShell = ({\n as: Component = 'main',\n className,\n ...props\n}: ComponentPropsWithoutRef<'main'> & { as?: 'main' | 'div' }) => (\n <Component\n className={cn(\n 'min-h-screen bg-[hsl(var(--rui-background))] text-[hsl(var(--rui-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport const PageHeader = ({\n as: Heading = 'h1',\n title,\n description,\n actions,\n className,\n}: {\n title: ReactNode;\n as?: 'h1' | 'h2' | 'h3';\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}) => (\n <header\n className={cn(\n 'flex flex-wrap items-start justify-between gap-4 border-b border-[hsl(var(--rui-border))] pb-5',\n className,\n )}\n >\n <div>\n <Heading className=\"text-2xl font-bold tracking-tight\">{title}</Heading>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n {actions}\n </header>\n);\nexport const PageContent = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('py-6', className)} {...props} />\n);\nexport const Section = ({\n title,\n description,\n children,\n className,\n}: ChildrenProps & { title?: ReactNode; description?: ReactNode }) => (\n <section className={cn('space-y-4', className)}>\n {title && (\n <div>\n <h2 className=\"font-semibold\">{title}</h2>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n )}\n {children}\n </section>\n);\nexport const Stack = ({\n gap = 4,\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'> & { gap?: 1 | 2 | 3 | 4 | 6 | 8 }) => (\n <div\n className={cn(\n 'flex flex-col',\n {\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 6: 'gap-6',\n 8: 'gap-8',\n }[gap],\n className,\n )}\n {...props}\n />\n);\nexport const Container = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn('mx-auto w-full max-w-6xl px-4 sm:px-6', className)}\n {...props}\n />\n);\n","'use client';\n\nimport {\n useMemo,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n type TableHTMLAttributes,\n} from 'react';\nimport { Input } from './forms';\nimport { EmptyState, ErrorState, LoadingState } from './feedback';\nimport { Pagination } from './navigation';\nimport { cn } from '../lib/utils';\n\nexport const Table = ({\n className,\n ...props\n}: TableHTMLAttributes<HTMLTableElement>) => (\n <div className=\"w-full overflow-x-auto\">\n <table className={cn('w-full text-left text-sm', className)} {...props} />\n </div>\n);\nexport const TableHeader = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'thead'>) => (\n <thead\n className={cn(\n 'border-b border-[hsl(var(--rui-border))] text-xs uppercase tracking-wide text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport const TableBody = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tbody'>) => (\n <tbody\n className={cn('divide-y divide-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const TableFooter = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tfoot'>) => (\n <tfoot\n className={cn('border-t border-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const TableRow = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tr'>) => (\n <tr\n className={cn('transition hover:bg-[hsl(var(--rui-muted))]/60', className)}\n {...props}\n />\n);\nexport const TableHead = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'th'>) => (\n <th\n scope=\"col\"\n className={cn('px-4 py-3 font-medium', className)}\n {...props}\n />\n);\nexport const TableCell = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'td'>) => (\n <td className={cn('px-4 py-3', className)} {...props} />\n);\nexport const TableCaption = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'caption'>) => (\n <caption\n className={cn(\n 'mt-3 text-left text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport type DataColumn<T> = {\n key: keyof T | string;\n header: ReactNode;\n cell?: (row: T) => ReactNode;\n sortable?: boolean;\n className?: string;\n};\nexport type DataTablePagination = {\n page: number;\n pageSize: number;\n total: number;\n};\nexport function DataTable<T extends Record<string, unknown>>({\n data,\n columns,\n loading,\n error,\n pagination,\n onPageChange,\n onRowClick,\n emptyMessage = 'No results found.',\n className,\n}: {\n data: T[];\n columns: DataColumn<T>[];\n loading?: boolean;\n error?: ReactNode;\n pagination?: DataTablePagination;\n onPageChange?: (page: number) => void;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n}) {\n const [sort, setSort] = useState<{\n key: string;\n direction: 'asc' | 'desc';\n } | null>(null);\n const rows = useMemo(() => {\n if (!sort) return data;\n return [...data].sort((a, b) => {\n const result = String(a[sort.key] ?? '').localeCompare(\n String(b[sort.key] ?? ''),\n undefined,\n { numeric: true },\n );\n return sort.direction === 'asc' ? result : -result;\n });\n }, [data, sort]);\n const toggle = (column: DataColumn<T>) => {\n if (!column.sortable) return;\n const key = String(column.key);\n setSort((current) =>\n current?.key === key && current.direction === 'asc'\n ? { key, direction: 'desc' }\n : { key, direction: 'asc' },\n );\n };\n if (error) return <ErrorState title={error} />;\n return (\n <div className={className} aria-busy={loading}>\n {loading && <LoadingState label=\"Updating table…\" />}\n {!loading && !rows.length ? (\n <EmptyState title={emptyMessage} />\n ) : (\n <>\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={column.className}\n >\n {column.sortable ? (\n <button\n className=\"rui-focus inline-flex items-center gap-1\"\n onClick={() => toggle(column)}\n >\n {column.header}\n <span aria-hidden=\"true\">\n {sort?.key === String(column.key)\n ? sort.direction === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n ) : (\n column.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n key={String(row.id ?? index)}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={() => onRowClick?.(row)}\n onKeyDown={(event) => {\n if (\n onRowClick &&\n (event.key === 'Enter' || event.key === ' ')\n )\n onRowClick(row);\n }}\n className={onRowClick ? 'cursor-pointer' : undefined}\n >\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={column.className}\n >\n {column.cell\n ? column.cell(row)\n : String(row[column.key] ?? '')}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n {pagination && onPageChange && (\n <Pagination\n className=\"mt-4\"\n {...pagination}\n ariaLabel=\"Table pagination\"\n onPageChange={onPageChange}\n />\n )}\n </>\n )}\n </div>\n );\n}\nexport function SearchableTable<T extends Record<string, unknown>>({\n data,\n columns,\n searchKeys,\n ...props\n}: Omit<ComponentPropsWithoutRef<typeof DataTable<T>>, 'data'> & {\n data: T[];\n columns: DataColumn<T>[];\n searchKeys: Array<keyof T>;\n}) {\n const [query, setQuery] = useState('');\n const filtered = data.filter((row) =>\n searchKeys.some((key) =>\n String(row[key] ?? '')\n .toLowerCase()\n .includes(query.toLowerCase()),\n ),\n );\n return (\n <div className=\"space-y-3\">\n <Input\n aria-label=\"Search table\"\n placeholder=\"Search…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <DataTable data={filtered} columns={columns} {...props} />\n </div>\n );\n}\nexport const PaginatedTable = DataTable;\n","'use client';\n\nimport { createPortal } from 'react-dom';\nimport {\n useEffect,\n useId,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { Button, Input, Label } from './forms';\nimport { Dialog, DialogContent } from './dialog';\nimport { cn } from '../lib/utils';\n\nexport function Command({\n open,\n onOpenChange,\n items,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: Array<{ label: string; onSelect: () => void; keywords?: string[] }>;\n}) {\n const [query, setQuery] = useState('');\n useEffect(() => {\n const listener = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n onOpenChange(!open);\n }\n };\n window.addEventListener('keydown', listener);\n return () => window.removeEventListener('keydown', listener);\n }, [open, onOpenChange]);\n const matches = items.filter((item) =>\n `${item.label} ${item.keywords?.join(' ') ?? ''}`\n .toLowerCase()\n .includes(query.toLowerCase()),\n );\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-md p-3\">\n <Input\n autoFocus\n placeholder=\"Type a command…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />{' '}\n <div className=\"mt-2\">\n {matches.map((item) => (\n <button\n key={item.label}\n className=\"rui-focus block w-full rounded p-2 text-left text-sm hover:bg-[hsl(var(--rui-accent))]\"\n onClick={() => {\n item.onSelect();\n onOpenChange(false);\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\nexport function ContextMenu({\n children,\n menu,\n}: {\n children: ReactNode;\n menu: ReactNode;\n}) {\n const [point, setPoint] = useState<{ x: number; y: number } | null>(null);\n useEffect(() => {\n if (!point) return;\n const close = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setPoint(null);\n };\n document.addEventListener('keydown', close);\n return () => document.removeEventListener('keydown', close);\n }, [point]);\n return (\n <div\n onContextMenu={(event) => {\n event.preventDefault();\n setPoint({\n x: Math.min(event.clientX, window.innerWidth - 180),\n y: Math.min(event.clientY, window.innerHeight - 120),\n });\n }}\n >\n {children}\n {point &&\n createPortal(\n <>\n <button\n className=\"fixed inset-0 z-40 cursor-default\"\n aria-label=\"Close context menu\"\n onClick={() => setPoint(null)}\n />\n <div\n role=\"menu\"\n className=\"fixed z-50 rounded border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-1 shadow-lg\"\n style={{ left: point.x, top: point.y }}\n >\n {menu}\n </div>\n </>,\n document.body,\n )}\n </div>\n );\n}\nexport function CopyButton({\n value,\n children = 'Copy',\n onCopy,\n}: {\n value: string;\n children?: ReactNode;\n onCopy?: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={async () => {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.();\n window.setTimeout(() => setCopied(false), 1500);\n }}\n >\n {copied ? 'Copied' : children}\n </Button>\n );\n}\nexport function PasswordInput({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) {\n const [visible, setVisible] = useState(false);\n return (\n <div className=\"relative\">\n <Input\n type={visible ? 'text' : 'password'}\n className={cn('pr-16', className)}\n {...props}\n />\n <button\n type=\"button\"\n className=\"rui-focus absolute right-2 top-2 text-xs text-[hsl(var(--rui-muted-foreground))]\"\n onClick={() => setVisible(!visible)}\n >\n {visible ? 'Hide' : 'Show'}\n </button>\n </div>\n );\n}\nexport function FileUpload({\n accept,\n multiple,\n onFiles,\n label = 'Choose files',\n}: {\n accept?: string;\n multiple?: boolean;\n onFiles: (files: File[]) => void;\n label?: string;\n}) {\n const id = useId();\n return (\n <div>\n <input\n id={id}\n className=\"sr-only\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(event) => onFiles(Array.from(event.target.files ?? []))}\n />\n <Label\n htmlFor={id}\n className=\"cursor-pointer rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center text-sm text-[hsl(var(--rui-muted-foreground))]\"\n >\n {label}\n </Label>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsxs","cloneElement","isValidElement","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useState","useRef","useId","useCallback","useEffect","isValidElement","cloneElement","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","createPortal","useEffect","useId","useState","Fragment","jsx","jsxs","useState","useEffect","createPortal","useId"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/forms.tsx","../src/components/display.tsx","../src/components/dialog.tsx","../src/components/overlays.tsx","../src/components/navigation.tsx","../src/components/feedback.tsx","../src/components/layout.tsx","../src/components/tables.tsx","../src/components/utilities.tsx"],"sourcesContent":["export const cn = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(' ');\n","import type {\n ButtonHTMLAttributes,\n ComponentPropsWithoutRef,\n InputHTMLAttributes,\n ReactNode,\n SelectHTMLAttributes,\n} from 'react';\nimport { cn } from '../lib/utils';\n\nconst buttonStyles = {\n primary:\n 'bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] shadow-sm hover:opacity-90 hover:shadow',\n secondary:\n 'bg-[hsl(var(--rui-secondary))] text-[hsl(var(--rui-secondary-foreground))] hover:opacity-80',\n outline:\n 'border border-[hsl(var(--rui-border))] bg-transparent shadow-sm hover:bg-[hsl(var(--rui-accent))]',\n ghost: 'bg-transparent hover:bg-[hsl(var(--rui-accent))]',\n destructive:\n 'bg-[hsl(var(--rui-destructive))] text-[hsl(var(--rui-destructive-foreground))] hover:opacity-90',\n} as const;\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: keyof typeof buttonStyles;\n size?: 'sm' | 'md' | 'lg';\n loading?: boolean;\n}\nexport function Button({\n variant = 'primary',\n size = 'md',\n loading,\n className,\n children,\n disabled,\n ...props\n}: ButtonProps) {\n const padding =\n size === 'sm'\n ? 'h-8 px-3 text-sm'\n : size === 'lg'\n ? 'h-11 px-5 text-base'\n : 'h-10 px-4 text-sm';\n return (\n <button\n className={cn(\n 'rui-focus inline-flex shrink-0 items-center justify-center gap-2 rounded-[var(--rui-radius)] font-medium transition-[background-color,box-shadow,transform] active:translate-y-px disabled:pointer-events-none disabled:opacity-50',\n padding,\n buttonStyles[variant],\n className,\n )}\n disabled={disabled || loading}\n aria-busy={loading}\n {...props}\n >\n {loading && (\n <span className=\"size-4 animate-spin rounded-full border-2 border-current border-r-transparent\" />\n )}{' '}\n {children}\n </button>\n );\n}\nexport function IconButton({\n children,\n 'aria-label': label,\n className,\n ...props\n}: ButtonProps) {\n return (\n <Button\n className={cn('size-10 px-0', className)}\n aria-label={label}\n {...props}\n >\n {children}\n </Button>\n );\n}\nexport const Input = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n className={cn(\n 'rui-focus h-10 min-w-0 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 text-sm transition-colors placeholder:text-[hsl(var(--rui-muted-foreground))] focus:bg-[hsl(var(--rui-card))] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n);\nexport const Textarea = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'textarea'>) => (\n <textarea\n className={cn(\n 'rui-focus min-h-24 min-w-0 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 py-2 text-sm transition-colors placeholder:text-[hsl(var(--rui-muted-foreground))] focus:bg-[hsl(var(--rui-card))] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n);\nexport const Label = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'label'>) => (\n <label\n className={cn('mb-1.5 block text-sm font-medium', className)}\n {...props}\n />\n);\nexport function FormField({\n label,\n htmlFor,\n description,\n error,\n required,\n children,\n className,\n}: {\n label: ReactNode;\n htmlFor?: string;\n description?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div className={className}>\n <Label htmlFor={htmlFor}>\n {label}\n {required && <span aria-hidden=\"true\"> *</span>}\n </Label>\n {children}\n {error ? (\n <p\n role=\"alert\"\n className=\"mt-1 text-sm text-[hsl(var(--rui-destructive-text))]\"\n >\n {error}\n </p>\n ) : (\n description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )\n )}\n </div>\n );\n}\nexport const Checkbox = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n type=\"checkbox\"\n className={cn(\n 'rui-focus size-4 accent-[hsl(var(--rui-primary))]',\n className,\n )}\n {...props}\n />\n);\nexport const Radio = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n type=\"radio\"\n className={cn(\n 'rui-focus size-4 accent-[hsl(var(--rui-primary))]',\n className,\n )}\n {...props}\n />\n);\nexport const Switch = ({\n checked,\n onChange,\n disabled,\n className,\n ...props\n}: Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>) => (\n <label\n className={cn(\n 'inline-flex cursor-pointer items-center',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n >\n <input\n type=\"checkbox\"\n className=\"peer sr-only\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n {...props}\n />\n <span className=\"h-6 w-11 rounded-full bg-[hsl(var(--rui-muted))] p-0.5 transition peer-checked:bg-[hsl(var(--rui-primary))] peer-focus-visible:ring-2 peer-focus-visible:ring-[hsl(var(--rui-ring))] peer-focus-visible:ring-offset-2\">\n <span className=\"block size-5 rounded-full bg-[hsl(var(--rui-switch-thumb))] transition peer-checked:translate-x-5\" />\n </span>\n </label>\n);\nexport const Select = ({\n className,\n children,\n ...props\n}: SelectHTMLAttributes<HTMLSelectElement>) => (\n <select\n className={cn(\n 'rui-focus h-10 min-w-0 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-[hsl(var(--rui-background))] px-3 text-sm',\n className,\n )}\n {...props}\n >\n {children}\n </select>\n);\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\nexport function Card({\n className,\n ...props\n}: ComponentPropsWithoutRef<'section'>) {\n return (\n <section\n className={cn(\n 'min-w-0 rounded-[calc(var(--rui-radius)+.15rem)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-5 shadow-sm transition-shadow',\n className,\n )}\n {...props}\n />\n );\n}\nexport function CardHeader({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n className={cn(\n 'mb-4 flex min-w-0 items-start justify-between gap-3 [&>:first-child]:min-w-0',\n className,\n )}\n {...props}\n />\n );\n}\nexport function CardTitle({\n className,\n ...props\n}: ComponentPropsWithoutRef<'h3'>) {\n return <h3 className={cn('font-semibold leading-5', className)} {...props} />;\n}\nexport function CardDescription({\n className,\n ...props\n}: ComponentPropsWithoutRef<'p'>) {\n return (\n <p\n className={cn(\n 'mt-1 break-words text-sm leading-5 text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n );\n}\nexport function Badge({\n className,\n variant = 'default',\n ...props\n}: ChildrenProps & {\n variant?: 'default' | 'success' | 'warning' | 'destructive' | 'outline';\n}) {\n const variants = {\n default: 'bg-[hsl(var(--rui-secondary))]',\n success:\n 'bg-[hsl(var(--rui-success-background))] text-[hsl(var(--rui-success-foreground))]',\n warning:\n 'bg-[hsl(var(--rui-warning-background))] text-[hsl(var(--rui-warning-foreground))]',\n destructive:\n 'bg-[hsl(var(--rui-destructive-background))] text-[hsl(var(--rui-destructive-text))]',\n outline: 'border border-[hsl(var(--rui-border))]',\n };\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variants[variant],\n className,\n )}\n >\n {props.children}\n </span>\n );\n}\nexport function Avatar({\n src,\n alt = '',\n fallback,\n className,\n}: {\n src?: string;\n alt?: string;\n fallback?: ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n 'inline-flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[hsl(var(--rui-muted))] text-sm font-medium',\n className,\n )}\n >\n {src ? (\n <img className=\"size-full object-cover\" src={src} alt={alt} />\n ) : (\n (fallback ?? alt.slice(0, 2).toUpperCase())\n )}\n </span>\n );\n}\nexport const Separator = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n role=\"separator\"\n className={cn('h-px w-full bg-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const Skeleton = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn(\n 'animate-pulse rounded bg-[hsl(var(--rui-muted))]',\n className,\n )}\n {...props}\n />\n);\nexport function Progress({\n value,\n max = 100,\n label,\n className,\n}: {\n value: number;\n max?: number;\n label?: string;\n className?: string;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n return (\n <div\n className={className}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n >\n <div className=\"h-2 overflow-hidden rounded-full bg-[hsl(var(--rui-muted))]\">\n <div\n className=\"h-full rounded-full bg-[hsl(var(--rui-primary))] transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from './forms';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\ntype DialogState = { open: boolean; setOpen: (open: boolean) => void };\nconst DialogContext = createContext<DialogState | null>(null);\nconst DialogTitleContext = createContext<string | undefined>(undefined);\nconst useDialog = () => {\n const value = useContext(DialogContext);\n if (!value) throw new Error('Dialog components must be inside Dialog');\n return value;\n};\nexport function Dialog({\n open: controlled,\n defaultOpen = false,\n onOpenChange,\n children,\n}: {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const open = controlled ?? uncontrolled;\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [controlled, onOpenChange],\n );\n return (\n <DialogContext.Provider value={{ open, setOpen }}>\n {children}\n </DialogContext.Provider>\n );\n}\nexport function DialogTrigger({\n children,\n asChild = false,\n}: {\n children: ReactNode;\n asChild?: boolean;\n}) {\n const { setOpen } = useDialog();\n if (asChild && isValidElement<{ onClick?: () => void }>(children))\n return cloneElement(children, {\n onClick: () => {\n children.props.onClick?.();\n setOpen(true);\n },\n });\n return <Button onClick={() => setOpen(true)}>{children}</Button>;\n}\nexport function DialogClose({\n children,\n asChild = false,\n}: {\n children: ReactNode;\n asChild?: boolean;\n}) {\n const { setOpen } = useDialog();\n if (asChild && isValidElement<{ onClick?: () => void }>(children))\n return cloneElement(children, {\n onClick: () => {\n children.props.onClick?.();\n setOpen(false);\n },\n });\n return (\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>\n {children}\n </Button>\n );\n}\nexport function DialogContent({\n children,\n className,\n movable = false,\n constrainToViewport = true,\n style,\n ...props\n}: ChildrenProps & {\n movable?: boolean;\n constrainToViewport?: boolean;\n style?: CSSProperties;\n}) {\n const { open, setOpen } = useDialog();\n const panel = useRef<HTMLDivElement>(null);\n const previousFocus = useRef<HTMLElement | null>(null);\n const [drag, setDrag] = useState<{ x: number; y: number } | null>(null);\n const [offset, setOffset] = useState({ x: 0, y: 0 });\n const titleId = useId();\n useEffect(() => {\n if (!open) return;\n previousFocus.current = document.activeElement as HTMLElement;\n const timer = window.setTimeout(() => panel.current?.focus(), 0);\n const key = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n if (event.key === 'Tab' && panel.current) {\n const nodes = panel.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n const first = nodes[0],\n last = nodes[nodes.length - 1];\n if (!first || !last) return;\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', key);\n return () => {\n window.clearTimeout(timer);\n document.removeEventListener('keydown', key);\n previousFocus.current?.focus();\n };\n }, [open, setOpen]);\n useEffect(() => {\n if (!drag) return;\n const move = (event: PointerEvent) => {\n let x = offset.x + event.clientX - drag.x;\n let y = offset.y + event.clientY - drag.y;\n if (constrainToViewport && panel.current) {\n const rect = panel.current.getBoundingClientRect();\n x = Math.min(\n Math.max(x, -rect.left + 12),\n window.innerWidth - rect.right - 12 + offset.x,\n );\n y = Math.min(\n Math.max(y, -rect.top + 12),\n window.innerHeight - rect.bottom - 12 + offset.y,\n );\n }\n setOffset({ x, y });\n };\n const up = () => setDrag(null);\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n }, [drag, offset, constrainToViewport]);\n if (!open || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 grid place-items-center p-4\"\n role=\"presentation\"\n >\n <button\n className=\"absolute inset-0 cursor-default bg-[hsl(var(--rui-overlay))]/50\"\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n />\n <div\n ref={panel}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n className={cn(\n 'relative z-10 max-h-[calc(100vh-2rem)] w-full max-w-lg overflow-auto rounded-[calc(var(--rui-radius)+.2rem)] bg-[hsl(var(--rui-card))] p-4 text-[hsl(var(--rui-foreground))] shadow-2xl outline-none sm:p-6',\n drag && 'select-none',\n className,\n )}\n style={{\n ...style,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n {...props}\n >\n {movable && (\n <div\n onPointerDown={(event) => {\n if (\n window.innerWidth < 640 ||\n (event.target as HTMLElement).closest(\n 'button,input,select,textarea,a,[role=button]',\n )\n )\n return;\n event.preventDefault();\n setDrag({ x: event.clientX, y: event.clientY });\n }}\n className=\"-mx-2 -mt-2 mb-3 cursor-grab touch-none rounded px-2 py-1 text-xs text-[hsl(var(--rui-muted-foreground))] active:cursor-grabbing\"\n >\n Drag to move\n </div>\n )}\n <DialogTitleContext.Provider value={titleId}>\n {children}\n </DialogTitleContext.Provider>\n </div>\n </div>,\n document.body,\n );\n}\nexport const DialogHeader = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('mb-5 space-y-1.5', className)} {...props} />\n);\nexport const DialogTitle = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'h2'>) => {\n const id = useContext(DialogTitleContext);\n return (\n <h2 id={id} className={cn('text-lg font-semibold', className)} {...props} />\n );\n};\nexport const DialogDescription = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'p'>) => (\n <p\n className={cn('text-sm text-[hsl(var(--rui-muted-foreground))]', className)}\n {...props}\n />\n);\nexport const DialogBody = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('space-y-4', className)} {...props} />\n);\nexport const DialogFooter = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn('mt-6 flex flex-wrap justify-end gap-2', className)}\n {...props}\n />\n);\nexport const AlertDialog = Dialog;\nexport const AlertDialogTrigger = DialogTrigger;\nexport const AlertDialogContent = DialogContent;\nexport const AlertDialogHeader = DialogHeader;\nexport const AlertDialogTitle = DialogTitle;\nexport const AlertDialogDescription = DialogDescription;\nexport const AlertDialogFooter = DialogFooter;\nexport const AlertDialogClose = DialogClose;\nexport function ConfirmActionDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n loading,\n confirmDisabled,\n variant = 'destructive',\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: ReactNode;\n cancelLabel?: ReactNode;\n onConfirm: () => void | Promise<void>;\n loading?: boolean;\n confirmDisabled?: boolean;\n variant?: 'primary' | 'destructive';\n children?: ReactNode;\n}) {\n const confirm = async () => {\n await onConfirm();\n onOpenChange(false);\n };\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n {children && <DialogBody>{children}</DialogBody>}\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">{cancelLabel}</Button>\n </DialogClose>\n <Button\n variant={variant}\n loading={loading}\n disabled={confirmDisabled}\n onClick={() => void confirm()}\n >\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\nexport function Sheet({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof Dialog>) {\n return <Dialog {...props}>{children}</Dialog>;\n}\nexport const SheetTrigger = DialogTrigger;\nexport const SheetClose = DialogClose;\nexport function SheetContent({\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof DialogContent>) {\n return (\n <DialogContent\n className={cn('ml-auto h-full max-h-none rounded-r-none', className)}\n {...props}\n />\n );\n}\nexport const Drawer = Sheet;\nexport const DrawerTrigger = SheetTrigger;\nexport const DrawerContent = SheetContent;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../lib/utils';\n\nexport function Popover({\n trigger,\n children,\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n}: {\n trigger: ReactNode;\n children: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const root = useRef<HTMLSpanElement>(null);\n const contentId = useId();\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [controlledOpen, onOpenChange],\n );\n useEffect(() => {\n if (!open) return;\n const dismiss = (event: PointerEvent) => {\n if (!root.current?.contains(event.target as Node)) setOpen(false);\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', dismiss);\n document.addEventListener('keydown', escape);\n return () => {\n document.removeEventListener('pointerdown', dismiss);\n document.removeEventListener('keydown', escape);\n };\n }, [open, setOpen]);\n const triggerProps = {\n 'aria-controls': contentId,\n 'aria-expanded': open,\n 'aria-haspopup': 'dialog' as const,\n onClick: () => setOpen(!open),\n };\n const triggerElement = isValidElement<{\n onClick?: () => void;\n 'aria-controls'?: string;\n 'aria-expanded'?: boolean;\n 'aria-haspopup'?: 'dialog';\n }>(trigger) ? (\n cloneElement(trigger, {\n ...triggerProps,\n onClick: () => {\n trigger.props.onClick?.();\n setOpen(!open);\n },\n })\n ) : (\n <button type=\"button\" {...triggerProps}>\n {trigger}\n </button>\n );\n return (\n <span ref={root} className=\"relative inline-block\">\n {triggerElement}\n {open && (\n <span\n id={contentId}\n role=\"dialog\"\n className={cn(\n 'absolute z-30 mt-2 block min-w-52 rounded-[var(--rui-radius)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-3 shadow-lg',\n className,\n )}\n >\n {children}\n </span>\n )}\n </span>\n );\n}\nexport const Tooltip = ({\n content,\n children,\n className,\n}: {\n content: string;\n children: ReactNode;\n className?: string;\n}) => {\n const [visible, setVisible] = useState(false);\n const id = useId();\n return (\n <span\n className=\"relative inline-flex\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n onFocus={() => setVisible(true)}\n onBlur={() => setVisible(false)}\n aria-describedby={visible ? id : undefined}\n >\n {children}\n {visible && (\n <span\n id={id}\n role=\"tooltip\"\n className={cn(\n 'absolute bottom-full left-1/2 z-30 mb-2 w-max max-w-52 -translate-x-1/2 rounded bg-[hsl(var(--rui-tooltip))] px-2 py-1 text-xs text-[hsl(var(--rui-tooltip-foreground))] shadow',\n className,\n )}\n >\n {content}\n </span>\n )}\n </span>\n );\n};\nexport function DropdownMenu({\n trigger,\n children,\n}: {\n trigger: ReactNode;\n children: ReactNode;\n}) {\n return (\n <Popover trigger={trigger} className=\"right-0 p-1\">\n {children}\n </Popover>\n );\n}\nexport const DropdownMenuItem = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'button'>) => (\n <button\n className={cn(\n 'rui-focus block w-full rounded px-2 py-1.5 text-left text-sm hover:bg-[hsl(var(--rui-accent))]',\n className,\n )}\n {...props}\n />\n);\n","'use client';\n\nimport { useState, type ReactNode } from 'react';\nimport { Button, Select } from './forms';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\nexport function Navbar({\n brand,\n children,\n className,\n label = 'Main navigation',\n}: {\n brand?: ReactNode;\n children?: ReactNode;\n className?: string;\n label?: string;\n}) {\n return (\n <nav\n aria-label={label}\n className={cn(\n 'flex min-h-14 min-w-0 items-center justify-between gap-3 border-b border-[hsl(var(--rui-border))] px-4',\n className,\n )}\n >\n {brand}\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2\">\n {children}\n </div>\n </nav>\n );\n}\nexport function Sidebar({\n children,\n className,\n label = 'Sidebar',\n}: ChildrenProps & { label?: string }) {\n return (\n <aside\n aria-label={label}\n className={cn(\n 'w-60 shrink-0 border-r border-[hsl(var(--rui-border))] p-3',\n className,\n )}\n >\n {children}\n </aside>\n );\n}\nexport function MobileNav({\n children,\n className,\n label = 'Mobile navigation',\n}: ChildrenProps & { label?: string }) {\n return (\n <nav\n aria-label={label}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-40 flex justify-around border-t border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-2 sm:hidden',\n className,\n )}\n >\n {children}\n </nav>\n );\n}\nexport function Breadcrumb({\n items,\n}: {\n items: Array<{ label: string; href?: string }>;\n}) {\n return (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex flex-wrap items-center gap-2 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {items.map((item, index) => (\n <li\n key={`${item.label}-${index}`}\n className=\"flex items-center gap-2\"\n >\n {index > 0 && <span aria-hidden>/</span>}\n {item.href ? (\n <a\n className=\"hover:text-[hsl(var(--rui-foreground))]\"\n href={item.href}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={index === items.length - 1 ? 'page' : undefined}\n >\n {item.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n );\n}\nexport function Tabs({\n tabs,\n value,\n defaultValue,\n onValueChange,\n className,\n}: {\n tabs: Array<{\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n }>;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n className?: string;\n}) {\n const [local, setLocal] = useState(defaultValue ?? tabs[0]?.value ?? '');\n const selected = value ?? local;\n const choose = (next: string) => {\n if (value === undefined) setLocal(next);\n onValueChange?.(next);\n };\n const active = tabs.find((tab) => tab.value === selected);\n return (\n <div className={className}>\n <div\n role=\"tablist\"\n className=\"flex gap-1 overflow-x-auto border-b border-[hsl(var(--rui-border))]\"\n >\n {tabs.map((tab) => (\n <button\n key={tab.value}\n role=\"tab\"\n aria-selected={tab.value === selected}\n disabled={tab.disabled}\n onClick={() => choose(tab.value)}\n className={cn(\n 'rui-focus shrink-0 whitespace-nowrap border-b-2 px-3 py-2 text-sm font-medium transition',\n tab.value === selected\n ? 'border-[hsl(var(--rui-primary))]'\n : 'border-transparent text-[hsl(var(--rui-muted-foreground))]',\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div role=\"tabpanel\" className=\"py-4\">\n {active?.content}\n </div>\n </div>\n );\n}\nexport function Accordion({\n items,\n type = 'single',\n}: {\n items: Array<{ value: string; title: ReactNode; content: ReactNode }>;\n type?: 'single' | 'multiple';\n}) {\n const [open, setOpen] = useState<string[]>([]);\n const toggle = (value: string) =>\n setOpen((current) =>\n current.includes(value)\n ? current.filter((item) => item !== value)\n : type === 'single'\n ? [value]\n : [...current, value],\n );\n return (\n <div className=\"divide-y divide-[hsl(var(--rui-border))]\">\n {items.map((item) => (\n <div key={item.value}>\n <button\n className=\"rui-focus flex w-full items-center justify-between py-3 text-left font-medium\"\n aria-expanded={open.includes(item.value)}\n onClick={() => toggle(item.value)}\n >\n {item.title}\n <span>{open.includes(item.value) ? '−' : '+'}</span>\n </button>\n {open.includes(item.value) && (\n <div className=\"pb-3 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {item.content}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\nexport function Pagination({\n page,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50],\n ariaLabel = 'Pagination',\n className,\n}: {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n pageSizeOptions?: number[];\n ariaLabel?: string;\n className?: string;\n}) {\n const pages = Math.max(1, Math.ceil(total / pageSize));\n const visible = Array.from(\n { length: Math.min(pages, 5) },\n (_, i) => Math.max(1, Math.min(pages - 4, page - 3)) + i,\n );\n return (\n <nav\n aria-label={ariaLabel}\n className={cn('flex flex-wrap items-center gap-2', className)}\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n Previous\n </Button>\n {visible.map((number) => (\n <Button\n key={number}\n variant={number === page ? 'primary' : 'ghost'}\n size=\"sm\"\n aria-current={number === page ? 'page' : undefined}\n onClick={() => onPageChange(number)}\n >\n {number}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n Next\n </Button>\n {onPageSizeChange && (\n <Select\n aria-label=\"Rows per page\"\n className=\"sm:ml-auto w-auto\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </Select>\n )}\n </nav>\n );\n}\n","import { type ReactNode } from 'react';\nimport { Button } from './forms';\nimport { cn } from '../lib/utils';\n\nexport function Alert({\n title,\n children,\n variant = 'default',\n className,\n}: {\n title?: ReactNode;\n children?: ReactNode;\n variant?: 'default' | 'destructive' | 'success';\n className?: string;\n}) {\n const color =\n variant === 'destructive'\n ? 'border-[hsl(var(--rui-destructive))] bg-[hsl(var(--rui-destructive-background))] text-[hsl(var(--rui-destructive-text))]'\n : variant === 'success'\n ? 'border-[hsl(var(--rui-success))] bg-[hsl(var(--rui-success-background))] text-[hsl(var(--rui-success-foreground))]'\n : 'border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-muted))]';\n return (\n <div\n role=\"alert\"\n className={cn(\n 'rounded-[var(--rui-radius)] border p-3 text-sm',\n color,\n className,\n )}\n >\n {title && <strong className=\"mb-1 block\">{title}</strong>}\n {children}\n </div>\n );\n}\nexport function Toast({\n title,\n description,\n action,\n className,\n}: {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n role=\"status\"\n className={cn(\n 'flex max-w-sm items-start gap-4 rounded-[var(--rui-radius)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-4 shadow-lg',\n className,\n )}\n >\n <div className=\"flex-1\">\n <strong className=\"text-sm\">{title}</strong>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n <div className=\"shrink-0\">{action}</div>\n </div>\n );\n}\nexport const EmptyState = ({\n title = 'Nothing here yet',\n description,\n action,\n className,\n}: {\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) => (\n <div\n className={cn(\n 'rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center sm:p-10',\n className,\n )}\n >\n <h3 className=\"font-semibold\">{title}</h3>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n);\nexport const ErrorState = ({\n title = 'Something went wrong',\n onRetry,\n className,\n}: {\n title?: ReactNode;\n onRetry?: () => void;\n className?: string;\n}) => (\n <Alert title={title} variant=\"destructive\" className={className}>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={onRetry}>\n Try again\n </Button>\n )}\n </Alert>\n);\nexport const LoadingState = ({\n label = 'Loading',\n className,\n}: {\n label?: string;\n className?: string;\n}) => (\n <div\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 p-4 text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n >\n <span className=\"size-4 animate-spin rounded-full border-2 border-current border-r-transparent\" />\n {label}\n </div>\n);\n","import { type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { cn } from '../lib/utils';\nimport { CardDescription, CardTitle } from './display';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\nexport const PageShell = ({\n as: Component = 'main',\n className,\n ...props\n}: ComponentPropsWithoutRef<'main'> & { as?: 'main' | 'div' }) => (\n <Component\n className={cn(\n 'min-h-screen min-w-0 bg-[hsl(var(--rui-background))] text-[hsl(var(--rui-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport const PageHeader = ({\n as: Heading = 'h1',\n title,\n description,\n actions,\n className,\n}: {\n title: ReactNode;\n as?: 'h1' | 'h2' | 'h3';\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}) => (\n <header\n className={cn(\n 'flex flex-wrap items-start justify-between gap-4 border-b border-[hsl(var(--rui-border))] pb-5',\n className,\n )}\n >\n <div className=\"min-w-0\">\n <Heading className=\"text-2xl font-bold tracking-tight sm:text-3xl\">\n {title}\n </Heading>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n {actions}\n </header>\n);\nexport const PageContent = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('py-6', className)} {...props} />\n);\nexport const Section = ({\n title,\n description,\n children,\n className,\n}: ChildrenProps & { title?: ReactNode; description?: ReactNode }) => (\n <section className={cn('min-w-0 space-y-4', className)}>\n {title && (\n <div>\n <h2 className=\"text-lg font-semibold tracking-tight\">{title}</h2>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n )}\n {children}\n </section>\n);\nexport const Stack = ({\n gap = 4,\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'> & { gap?: 1 | 2 | 3 | 4 | 6 | 8 }) => (\n <div\n className={cn(\n 'flex flex-col',\n {\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 6: 'gap-6',\n 8: 'gap-8',\n }[gap],\n className,\n )}\n {...props}\n />\n);\nexport function SettingRow({\n title,\n description,\n action,\n className,\n}: {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className,\n )}\n >\n <div className=\"min-w-0\">\n <CardTitle>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </div>\n {action}\n </div>\n );\n}\nexport const Container = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn('mx-auto w-full max-w-6xl px-4 sm:px-6', className)}\n {...props}\n />\n);\n","'use client';\n\nimport {\n useMemo,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n type TableHTMLAttributes,\n} from 'react';\nimport { Input } from './forms';\nimport { EmptyState, ErrorState, LoadingState } from './feedback';\nimport { Pagination } from './navigation';\nimport { cn } from '../lib/utils';\n\nexport const Table = ({\n className,\n ...props\n}: TableHTMLAttributes<HTMLTableElement>) => (\n <div className=\"w-full overflow-x-auto\">\n <table className={cn('w-full text-left text-sm', className)} {...props} />\n </div>\n);\nexport const TableHeader = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'thead'>) => (\n <thead\n className={cn(\n 'border-b border-[hsl(var(--rui-border))] text-xs uppercase tracking-wide text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport const TableBody = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tbody'>) => (\n <tbody\n className={cn('divide-y divide-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const TableFooter = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tfoot'>) => (\n <tfoot\n className={cn('border-t border-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const TableRow = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tr'>) => (\n <tr\n className={cn('transition hover:bg-[hsl(var(--rui-muted))]/60', className)}\n {...props}\n />\n);\nexport const TableHead = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'th'>) => (\n <th\n scope=\"col\"\n className={cn('px-4 py-3 font-medium', className)}\n {...props}\n />\n);\nexport const TableCell = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'td'>) => (\n <td className={cn('px-4 py-3', className)} {...props} />\n);\nexport const TableCaption = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'caption'>) => (\n <caption\n className={cn(\n 'mt-3 text-left text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport type DataColumn<T> = {\n key: keyof T | string;\n header: ReactNode;\n cell?: (row: T) => ReactNode;\n sortable?: boolean;\n className?: string;\n};\nexport type DataTablePagination = {\n page: number;\n pageSize: number;\n total: number;\n};\nexport function DataTable<T extends Record<string, unknown>>({\n data,\n columns,\n loading,\n error,\n pagination,\n onPageChange,\n onRowClick,\n emptyMessage = 'No results found.',\n className,\n}: {\n data: T[];\n columns: DataColumn<T>[];\n loading?: boolean;\n error?: ReactNode;\n pagination?: DataTablePagination;\n onPageChange?: (page: number) => void;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n}) {\n const [sort, setSort] = useState<{\n key: string;\n direction: 'asc' | 'desc';\n } | null>(null);\n const rows = useMemo(() => {\n if (!sort) return data;\n return [...data].sort((a, b) => {\n const result = String(a[sort.key] ?? '').localeCompare(\n String(b[sort.key] ?? ''),\n undefined,\n { numeric: true },\n );\n return sort.direction === 'asc' ? result : -result;\n });\n }, [data, sort]);\n const toggle = (column: DataColumn<T>) => {\n if (!column.sortable) return;\n const key = String(column.key);\n setSort((current) =>\n current?.key === key && current.direction === 'asc'\n ? { key, direction: 'desc' }\n : { key, direction: 'asc' },\n );\n };\n if (error) return <ErrorState title={error} />;\n return (\n <div className={className} aria-busy={loading}>\n {loading && <LoadingState label=\"Updating table…\" />}\n {!loading && !rows.length ? (\n <EmptyState title={emptyMessage} />\n ) : (\n <>\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={column.className}\n >\n {column.sortable ? (\n <button\n className=\"rui-focus inline-flex items-center gap-1\"\n onClick={() => toggle(column)}\n >\n {column.header}\n <span aria-hidden=\"true\">\n {sort?.key === String(column.key)\n ? sort.direction === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n ) : (\n column.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n key={String(row.id ?? index)}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={() => onRowClick?.(row)}\n onKeyDown={(event) => {\n if (\n onRowClick &&\n (event.key === 'Enter' || event.key === ' ')\n )\n onRowClick(row);\n }}\n className={onRowClick ? 'cursor-pointer' : undefined}\n >\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={column.className}\n >\n {column.cell\n ? column.cell(row)\n : String(row[column.key] ?? '')}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n {pagination && onPageChange && (\n <Pagination\n className=\"mt-4\"\n {...pagination}\n ariaLabel=\"Table pagination\"\n onPageChange={onPageChange}\n />\n )}\n </>\n )}\n </div>\n );\n}\nexport function SearchableTable<T extends Record<string, unknown>>({\n data,\n columns,\n searchKeys,\n ...props\n}: Omit<ComponentPropsWithoutRef<typeof DataTable<T>>, 'data'> & {\n data: T[];\n columns: DataColumn<T>[];\n searchKeys: Array<keyof T>;\n}) {\n const [query, setQuery] = useState('');\n const filtered = data.filter((row) =>\n searchKeys.some((key) =>\n String(row[key] ?? '')\n .toLowerCase()\n .includes(query.toLowerCase()),\n ),\n );\n return (\n <div className=\"space-y-3\">\n <Input\n aria-label=\"Search table\"\n placeholder=\"Search…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <DataTable data={filtered} columns={columns} {...props} />\n </div>\n );\n}\nexport const PaginatedTable = DataTable;\n","'use client';\n\nimport { createPortal } from 'react-dom';\nimport {\n useEffect,\n useId,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { Button, Input, Label } from './forms';\nimport { Dialog, DialogContent } from './dialog';\nimport { cn } from '../lib/utils';\n\nexport function Command({\n open,\n onOpenChange,\n items,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: Array<{ label: string; onSelect: () => void; keywords?: string[] }>;\n}) {\n const [query, setQuery] = useState('');\n useEffect(() => {\n const listener = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n onOpenChange(!open);\n }\n };\n window.addEventListener('keydown', listener);\n return () => window.removeEventListener('keydown', listener);\n }, [open, onOpenChange]);\n const matches = items.filter((item) =>\n `${item.label} ${item.keywords?.join(' ') ?? ''}`\n .toLowerCase()\n .includes(query.toLowerCase()),\n );\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-md p-3\">\n <Input\n autoFocus\n placeholder=\"Type a command…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />{' '}\n <div className=\"mt-2\">\n {matches.map((item) => (\n <button\n key={item.label}\n className=\"rui-focus block w-full rounded p-2 text-left text-sm hover:bg-[hsl(var(--rui-accent))]\"\n onClick={() => {\n item.onSelect();\n onOpenChange(false);\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\nexport function ContextMenu({\n children,\n menu,\n}: {\n children: ReactNode;\n menu: ReactNode;\n}) {\n const [point, setPoint] = useState<{ x: number; y: number } | null>(null);\n useEffect(() => {\n if (!point) return;\n const close = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setPoint(null);\n };\n document.addEventListener('keydown', close);\n return () => document.removeEventListener('keydown', close);\n }, [point]);\n return (\n <div\n onContextMenu={(event) => {\n event.preventDefault();\n setPoint({\n x: Math.min(event.clientX, window.innerWidth - 180),\n y: Math.min(event.clientY, window.innerHeight - 120),\n });\n }}\n >\n {children}\n {point &&\n createPortal(\n <>\n <button\n className=\"fixed inset-0 z-40 cursor-default\"\n aria-label=\"Close context menu\"\n onClick={() => setPoint(null)}\n />\n <div\n role=\"menu\"\n className=\"fixed z-50 rounded border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-1 shadow-lg\"\n style={{ left: point.x, top: point.y }}\n >\n {menu}\n </div>\n </>,\n document.body,\n )}\n </div>\n );\n}\nexport function CopyButton({\n value,\n children = 'Copy',\n onCopy,\n}: {\n value: string;\n children?: ReactNode;\n onCopy?: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={async () => {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.();\n window.setTimeout(() => setCopied(false), 1500);\n }}\n >\n {copied ? 'Copied' : children}\n </Button>\n );\n}\nexport function PasswordInput({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) {\n const [visible, setVisible] = useState(false);\n return (\n <div className=\"relative\">\n <Input\n type={visible ? 'text' : 'password'}\n className={cn('pr-16', className)}\n {...props}\n />\n <button\n type=\"button\"\n className=\"rui-focus absolute right-2 top-2 rounded px-1 text-xs text-[hsl(var(--rui-muted-foreground))]\"\n onClick={() => setVisible(!visible)}\n >\n {visible ? 'Hide' : 'Show'}\n </button>\n </div>\n );\n}\nexport function FileUpload({\n accept,\n multiple,\n onFiles,\n label = 'Choose files',\n}: {\n accept?: string;\n multiple?: boolean;\n onFiles: (files: File[]) => void;\n label?: string;\n}) {\n const id = useId();\n return (\n <div>\n <input\n id={id}\n className=\"sr-only\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(event) => onFiles(Array.from(event.target.files ?? []))}\n />\n <Label\n htmlFor={id}\n className=\"flex w-full cursor-pointer items-center justify-center rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center text-sm text-[hsl(var(--rui-muted-foreground))]\"\n >\n {label}\n </Label>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsxs","cloneElement","isValidElement","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useState","useRef","useId","useCallback","useEffect","isValidElement","cloneElement","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","createPortal","useEffect","useId","useState","Fragment","jsx","jsxs","useState","useEffect","createPortal","useId"]}
|
package/package.json
CHANGED
package/src/styles.css
CHANGED
|
@@ -61,8 +61,11 @@
|
|
|
61
61
|
--rui-ring: 224 76% 58%;
|
|
62
62
|
}
|
|
63
63
|
.rui-root {
|
|
64
|
+
min-width: 0;
|
|
64
65
|
color: hsl(var(--rui-foreground));
|
|
65
66
|
background: hsl(var(--rui-background));
|
|
67
|
+
-webkit-font-smoothing: antialiased;
|
|
68
|
+
text-rendering: optimizeLegibility;
|
|
66
69
|
}
|
|
67
70
|
.rui-focus:focus-visible {
|
|
68
71
|
outline: 2px solid hsl(var(--rui-ring));
|