@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 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, ReactNode, CSSProperties, TableHTMLAttributes } from 'react';
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: "rui-focus h-6 w-11 rounded-full bg-[hsl(var(--rui-muted))] p-0.5 transition peer-checked:bg-[hsl(var(--rui-primary))]", children: /* @__PURE__ */ jsx("span", { className: "block size-5 rounded-full bg-[hsl(var(--rui-switch-thumb))] transition peer-checked:translate-x-5" }) })
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("mb-4 flex items-start justify-between gap-3", className),
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-none", className), ...props });
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-6 text-[hsl(var(--rui-foreground))] shadow-2xl outline-none",
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-10 text-center",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sypra-ui/ui",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Accessible, themeable React UI primitives.",
5
5
  "license": "MIT",
6
6
  "repository": {
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));