@nextlyhq/ui 0.0.2-alpha.5 → 0.0.2-alpha.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,55 +1,51 @@
1
- import { Slot } from '@radix-ui/react-slot';
2
- import { cva } from 'class-variance-authority';
3
- import * as React5 from 'react';
4
- import { forwardRef, createContext, useContext } from 'react';
5
- import { clsx } from 'clsx';
6
- import { twMerge } from 'tailwind-merge';
7
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { Root as Root$3 } from '@radix-ui/react-label';
9
- import * as SeparatorPrimitive from '@radix-ui/react-separator';
10
- import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
11
- import { Minus, Check, ChevronDown, X, ChevronRight, Circle, Search, Loader2, ChevronUp, XCircle, AlertTriangle, AlertCircle, CheckCircle2, FileQuestion, ChevronsLeft, ChevronLeft, ChevronsRight } from 'lucide-react';
12
- import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
13
- import { Root as Root$4, Thumb } from '@radix-ui/react-switch';
14
- import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
15
- import * as AccordionPrimitive from '@radix-ui/react-accordion';
16
- import { Root, Image, Fallback } from '@radix-ui/react-avatar';
17
- import { List, Trigger, Content, Root as Root$1 } from '@radix-ui/react-tabs';
18
- import { Content as Content$1, Root as Root$2, Provider, Trigger as Trigger$1 } from '@radix-ui/react-tooltip';
19
- import * as PopoverPrimitive from '@radix-ui/react-popover';
20
- import * as DialogPrimitive from '@radix-ui/react-dialog';
21
- import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
22
- import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
23
- import * as SelectPrimitive from '@radix-ui/react-select';
24
- import { Command as Command$1 } from 'cmdk';
25
- import { Toaster as Toaster$1 } from 'sonner';
26
- export { toast } from 'sonner';
1
+ "use client";
27
2
 
28
3
  // src/components/button.tsx
4
+ import { Slot } from "@radix-ui/react-slot";
5
+ import { cva } from "class-variance-authority";
6
+ import * as React from "react";
7
+ import { forwardRef } from "react";
8
+
9
+ // src/lib/utils.ts
10
+ import { clsx } from "clsx";
11
+ import { twMerge } from "tailwind-merge";
29
12
  function cn(...inputs) {
30
13
  return twMerge(clsx(inputs));
31
14
  }
15
+
16
+ // src/components/button.tsx
17
+ import { jsx } from "react/jsx-runtime";
32
18
  var buttonVariants = cva(
33
- "inline-flex items-center justify-center whitespace-nowrap rounded-none text-sm font-medium cursor-pointer transition-all duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed active:scale-[0.98] [&_svg]:text-current",
19
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed active:scale-[0.98] [&_svg]:text-current",
34
20
  {
35
21
  variants: {
36
22
  variant: {
37
23
  default: "bg-primary text-primary-foreground border border-transparent hover:opacity-90",
38
24
  primary: "bg-primary text-primary-foreground border border-transparent hover:opacity-90",
39
- destructive: "bg-destructive text-destructive-foreground border border-transparent hover:opacity-90",
40
- outline: "border border-primary/10 text-foreground hover-unified bg-background",
41
- secondary: "bg-background border border-primary/10 text-foreground hover:bg-primary/5",
25
+ // Solid fill uses the emphasis token so white on-color text stays AA in
26
+ // dark mode (the base token is the readable text color, too light here).
27
+ // Hover darkens to a deeper shade instead of opacity-90, which would
28
+ // composite the fill toward the page and drop white text under 4.5:1.
29
+ destructive: "bg-destructive-solid text-destructive-foreground border border-transparent hover:bg-destructive-700",
30
+ // border-border is the decorative separator token, and it is the right
31
+ // one here: a button is identified by its label and fill, so its edge
32
+ // carries no meaning on its own and is not held to the 3:1 minimum that
33
+ // border-input meets for controls identified by their boundary. It is
34
+ // still used in preference to a faint primary alpha, which reads as a
35
+ // tint of the brand colour rather than as an edge.
36
+ outline: "border border-border text-foreground hover-unified bg-background",
37
+ secondary: "bg-background border border-border text-foreground hover:bg-primary/5",
42
38
  ghost: "text-foreground border border-transparent hover-unified",
43
39
  link: "text-primary border border-transparent underline-offset-4 hover:underline"
44
40
  },
45
41
  size: {
46
- default: "h-10 px-6 py-2",
47
- sm: "h-9 px-4 text-[13px]",
48
- md: "h-10 px-6 text-sm",
49
- lg: "h-11 px-8 text-base",
50
- icon: "h-10 w-10 p-0",
51
- "icon-sm": "h-9 w-9 p-0",
52
- "icon-lg": "h-11 w-11 p-0"
42
+ default: "h-[var(--nx-control-height)] px-6 py-2",
43
+ sm: "h-[var(--nx-control-height-md)] px-4 text-sm",
44
+ md: "h-[var(--nx-control-height)] px-6 text-sm",
45
+ lg: "h-[var(--nx-control-height-lg)] px-8 text-base",
46
+ icon: "h-[var(--nx-control-height)] w-[var(--nx-control-height)] p-0",
47
+ "icon-sm": "h-[var(--nx-control-height-md)] w-[var(--nx-control-height-md)] p-0",
48
+ "icon-lg": "h-[var(--nx-control-height-lg)] w-[var(--nx-control-height-lg)] p-0"
53
49
  }
54
50
  },
55
51
  defaultVariants: {
@@ -68,7 +64,7 @@ var Button = forwardRef(
68
64
  ...props
69
65
  }, ref) => {
70
66
  const Comp = asChild ? Slot : "button";
71
- const hasMultipleChildren = React5.Children.count(children) > 1;
67
+ const hasMultipleChildren = React.Children.count(children) > 1;
72
68
  return /* @__PURE__ */ jsx(
73
69
  Comp,
74
70
  {
@@ -85,14 +81,19 @@ var Button = forwardRef(
85
81
  }
86
82
  );
87
83
  Button.displayName = "Button";
88
- var inputVariants = cva(
89
- "file:text-foreground placeholder:text-muted-foreground placeholder:opacity-50 selection:bg-primary selection:text-primary-foreground w-full min-w-0 rounded-none border border-input bg-background text-sm transition-all duration-150 outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus:ring-0 focus:ring-offset-0 focus:outline-none focus:!border-primary focus-visible:!border-primary aria-invalid:border-destructive aria-invalid:focus:!border-destructive data-[invalid=true]:border-destructive data-[invalid=true]:focus:!border-destructive",
84
+
85
+ // src/components/input.tsx
86
+ import { cva as cva2 } from "class-variance-authority";
87
+ import { forwardRef as forwardRef2 } from "react";
88
+ import { jsx as jsx2 } from "react/jsx-runtime";
89
+ var inputVariants = cva2(
90
+ "file:text-foreground placeholder:text-muted-foreground placeholder:opacity-50 selection:bg-primary selection:text-primary-foreground w-full min-w-0 rounded-md border border-input bg-background text-sm transition-all duration-150 outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus:ring-0 focus:ring-offset-0 focus:outline-none focus:border-primary! focus-visible:border-primary! aria-invalid:border-destructive aria-invalid:focus:border-destructive! data-[invalid=true]:border-destructive data-[invalid=true]:focus:border-destructive!",
90
91
  {
91
92
  variants: {
92
93
  size: {
93
- sm: "h-8 px-2.5 py-2 text-sm",
94
- default: "h-10 px-3 py-2.5 text-sm",
95
- lg: "h-11 px-4 py-3 text-base"
94
+ sm: "h-[var(--nx-control-height-sm)] px-2.5 py-2 text-sm",
95
+ default: "h-[var(--nx-control-height)] px-3 py-2.5 text-sm",
96
+ lg: "h-[var(--nx-control-height-lg)] px-4 py-3 text-base"
96
97
  }
97
98
  },
98
99
  defaultVariants: {
@@ -100,9 +101,9 @@ var inputVariants = cva(
100
101
  }
101
102
  }
102
103
  );
103
- var Input = forwardRef(
104
+ var Input = forwardRef2(
104
105
  ({ className, type, size, ...props }, ref) => {
105
- return /* @__PURE__ */ jsx(
106
+ return /* @__PURE__ */ jsx2(
106
107
  "input",
107
108
  {
108
109
  type,
@@ -115,14 +116,20 @@ var Input = forwardRef(
115
116
  }
116
117
  );
117
118
  Input.displayName = "Input";
118
- var Textarea = forwardRef(({ className, ...props }, ref) => {
119
- return /* @__PURE__ */ jsx(
119
+
120
+ // src/components/textarea.tsx
121
+ import { forwardRef as forwardRef3 } from "react";
122
+ import { jsx as jsx3 } from "react/jsx-runtime";
123
+ var Textarea = forwardRef3(({ className, ...props }, ref) => {
124
+ return /* @__PURE__ */ jsx3(
120
125
  "textarea",
121
126
  {
122
127
  "data-slot": "textarea",
123
128
  className: cn(
124
- "flex min-h-[80px] w-full rounded-none border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground placeholder:opacity-50 transition-all duration-200 focus:!border-primary focus-visible:!border-primary focus:outline-none hover:border-primary/30 disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 resize-y",
125
- "aria-invalid:border-destructive aria-invalid:focus:!border-destructive",
129
+ // hover:border-primary (full strength) keeps the hover boundary more
130
+ // visible than the resting border-input, not a fainter alpha of it.
131
+ "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground placeholder:opacity-50 transition-all duration-200 focus:border-primary! focus-visible:border-primary! focus:outline-none hover:border-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 resize-y",
132
+ "aria-invalid:border-destructive aria-invalid:focus:border-destructive!",
126
133
  className
127
134
  ),
128
135
  ref,
@@ -131,9 +138,13 @@ var Textarea = forwardRef(({ className, ...props }, ref) => {
131
138
  );
132
139
  });
133
140
  Textarea.displayName = "Textarea";
141
+
142
+ // src/components/label.tsx
143
+ import { Root as LabelRoot } from "@radix-ui/react-label";
144
+ import { jsx as jsx4 } from "react/jsx-runtime";
134
145
  function Label({ className, ...props }) {
135
- return /* @__PURE__ */ jsx(
136
- Root$3,
146
+ return /* @__PURE__ */ jsx4(
147
+ LabelRoot,
137
148
  {
138
149
  "data-slot": "label",
139
150
  className: cn(
@@ -144,17 +155,127 @@ function Label({ className, ...props }) {
144
155
  }
145
156
  );
146
157
  }
147
- var badgeVariants = cva(
148
- "inline-flex items-center rounded-none px-2.5 py-0.5 h-[22px] text-xs font-medium transition-colors",
158
+
159
+ // src/components/form-label-with-tooltip.tsx
160
+ import { Info } from "lucide-react";
161
+ import * as React2 from "react";
162
+
163
+ // src/components/tooltip.tsx
164
+ import {
165
+ Provider,
166
+ Root,
167
+ Trigger,
168
+ Portal,
169
+ Content
170
+ } from "@radix-ui/react-tooltip";
171
+ import { forwardRef as forwardRef4 } from "react";
172
+
173
+ // src/providers/portal-provider.tsx
174
+ import { createContext, useContext } from "react";
175
+ import { jsx as jsx5 } from "react/jsx-runtime";
176
+ var PortalContext = createContext({ container: null });
177
+ function PortalProvider({ container, children }) {
178
+ return /* @__PURE__ */ jsx5(PortalContext.Provider, { value: { container }, children });
179
+ }
180
+ function usePortalContainer() {
181
+ const { container } = useContext(PortalContext);
182
+ return container ?? void 0;
183
+ }
184
+
185
+ // src/components/tooltip.tsx
186
+ import { jsx as jsx6 } from "react/jsx-runtime";
187
+ var TooltipProvider = Provider;
188
+ var Tooltip = Root;
189
+ var TooltipTrigger = Trigger;
190
+ var TooltipContent = forwardRef4(({ className, sideOffset = 4, ...props }, ref) => {
191
+ const portalContainer = usePortalContainer();
192
+ return (
193
+ // Portalled for the same reason as every other overlay here, plus one
194
+ // specific to the tooltip: the positioner measures against the nearest
195
+ // containing block, and it counts `container-type` as one while the
196
+ // browser does not. Left inline under a `@container` element, the content
197
+ // is offset by that element's own position. Portalling lifts it out of any
198
+ // such ancestor, so the two agree again.
199
+ /* @__PURE__ */ jsx6(Portal, { container: portalContainer, children: /* @__PURE__ */ jsx6(
200
+ Content,
201
+ {
202
+ ref,
203
+ sideOffset,
204
+ "data-slot": "tooltip-content",
205
+ className: cn(
206
+ "z-50 overflow-hidden rounded-lg px-3 py-1.5 text-xs shadow-lg border border-border bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
207
+ className
208
+ ),
209
+ ...props
210
+ }
211
+ ) })
212
+ );
213
+ });
214
+ TooltipContent.displayName = Content.displayName;
215
+
216
+ // src/components/form-label-with-tooltip.tsx
217
+ import { jsx as jsx7, jsxs } from "react/jsx-runtime";
218
+ var FormLabelWithTooltip = React2.forwardRef(
219
+ ({
220
+ className,
221
+ labelClassName,
222
+ tooltipClassName,
223
+ label,
224
+ description,
225
+ required,
226
+ ...props
227
+ }, ref) => {
228
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
229
+ /* @__PURE__ */ jsxs(Label, { ref, className: labelClassName, ...props, children: [
230
+ label,
231
+ required && /* @__PURE__ */ jsx7("span", { className: "text-destructive ml-1", children: "*" })
232
+ ] }),
233
+ description && /* @__PURE__ */ jsx7(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { delayDuration: 200, children: [
234
+ /* @__PURE__ */ jsxs(
235
+ TooltipTrigger,
236
+ {
237
+ type: "button",
238
+ tabIndex: -1,
239
+ className: "shrink-0 text-muted-foreground hover:text-foreground focus:outline-none focus:text-foreground transition-colors cursor-help",
240
+ children: [
241
+ /* @__PURE__ */ jsx7(Info, { className: "h-3.5 w-3.5" }),
242
+ /* @__PURE__ */ jsx7("span", { className: "sr-only", children: "Toggle description" })
243
+ ]
244
+ }
245
+ ),
246
+ /* @__PURE__ */ jsx7(
247
+ TooltipContent,
248
+ {
249
+ side: "right",
250
+ className: cn(
251
+ "max-w-[250px] text-xs break-words relative z-[100] shadow-md border border-border bg-primary text-primary-foreground px-3 py-2 rounded-lg",
252
+ tooltipClassName
253
+ ),
254
+ children: description
255
+ }
256
+ )
257
+ ] }) })
258
+ ] });
259
+ }
260
+ );
261
+ FormLabelWithTooltip.displayName = "FormLabelWithTooltip";
262
+
263
+ // src/components/badge.tsx
264
+ import { cva as cva3 } from "class-variance-authority";
265
+ import { jsx as jsx8 } from "react/jsx-runtime";
266
+ var badgeVariants = cva3(
267
+ "inline-flex items-center rounded-sm px-2.5 py-0.5 h-[22px] text-xs font-medium transition-colors",
149
268
  {
150
269
  variants: {
151
270
  variant: {
152
- default: "bg-primary/5 text-slate-900 dark:bg-slate-800 dark:text-slate-100",
153
- primary: "bg-primary/5 text-primary dark:bg-primary/20 dark:text-primary-foreground/90",
154
- success: "bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-100",
155
- warning: "bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-100",
156
- destructive: "bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-100",
157
- outline: "border !border-primary/5 bg-transparent text-slate-700 dark:text-slate-300 dark:!border-primary/5"
271
+ // Clear, legible chip in both modes (was bg-primary/5 at ~5% opacity,
272
+ // which was nearly invisible on dark backgrounds).
273
+ default: "bg-muted text-foreground",
274
+ primary: "bg-primary/10 text-primary dark:bg-primary/20",
275
+ success: "bg-success-100 text-success-700 dark:bg-success-900 dark:text-success-100",
276
+ warning: "bg-warning-100 text-warning-700 dark:bg-warning-900 dark:text-warning-100",
277
+ destructive: "bg-destructive-100 text-destructive-700 dark:bg-destructive-900 dark:text-destructive-100",
278
+ outline: "border border-border! bg-transparent text-foreground dark:text-muted-foreground dark:border-border!"
158
279
  }
159
280
  },
160
281
  defaultVariants: {
@@ -163,7 +284,7 @@ var badgeVariants = cva(
163
284
  }
164
285
  );
165
286
  function Badge({ className, variant = "default", ...props }) {
166
- return /* @__PURE__ */ jsx(
287
+ return /* @__PURE__ */ jsx8(
167
288
  "div",
168
289
  {
169
290
  "data-slot": `badge.${variant}`,
@@ -172,8 +293,13 @@ function Badge({ className, variant = "default", ...props }) {
172
293
  }
173
294
  );
174
295
  }
175
- var cardVariants = cva(
176
- "bg-card text-foreground rounded-none border border-primary/5 transition-all duration-200",
296
+
297
+ // src/components/card.tsx
298
+ import { cva as cva4 } from "class-variance-authority";
299
+ import { forwardRef as forwardRef6 } from "react";
300
+ import { jsx as jsx9 } from "react/jsx-runtime";
301
+ var cardVariants = cva4(
302
+ "bg-card text-foreground rounded-lg border border-border transition-all duration-200",
177
303
  {
178
304
  variants: {
179
305
  variant: {
@@ -187,9 +313,9 @@ var cardVariants = cva(
187
313
  }
188
314
  }
189
315
  );
190
- var Card = forwardRef(
316
+ var Card = forwardRef6(
191
317
  ({ className, variant, ...props }, ref) => {
192
- return /* @__PURE__ */ jsx(
318
+ return /* @__PURE__ */ jsx9(
193
319
  "div",
194
320
  {
195
321
  ref,
@@ -201,16 +327,23 @@ var Card = forwardRef(
201
327
  }
202
328
  );
203
329
  Card.displayName = "Card";
204
- var CardHeader = forwardRef(
330
+ var CardHeader = forwardRef6(
205
331
  ({ className, noBorder = false, ...props }, ref) => {
206
- return /* @__PURE__ */ jsx(
332
+ return /* @__PURE__ */ jsx9(
207
333
  "div",
208
334
  {
209
335
  ref,
210
336
  "data-slot": "card-header",
211
337
  className: cn(
212
- "flex flex-col p-4",
213
- !noBorder && "border-b border-primary/5",
338
+ // Mirrors CardFooter: a header that carries its own tint runs the full
339
+ // width of the card, so at a nonzero --radius it would paint square
340
+ // across the card's curved top corners. `inherit` takes the parent's
341
+ // computed radius rather than restating a step. It only helps when the
342
+ // header is a direct child of the card; a header nested inside another
343
+ // wrapper inherits that wrapper's radius instead, and such a card needs
344
+ // `overflow-hidden` to clip the fill.
345
+ "flex flex-col rounded-t-[inherit] p-4",
346
+ !noBorder && "border-b border-border",
214
347
  className
215
348
  ),
216
349
  ...props
@@ -219,9 +352,9 @@ var CardHeader = forwardRef(
219
352
  }
220
353
  );
221
354
  CardHeader.displayName = "CardHeader";
222
- var CardTitle = forwardRef(
355
+ var CardTitle = forwardRef6(
223
356
  ({ className, ...props }, ref) => {
224
- return /* @__PURE__ */ jsx(
357
+ return /* @__PURE__ */ jsx9(
225
358
  "h3",
226
359
  {
227
360
  ref,
@@ -233,9 +366,9 @@ var CardTitle = forwardRef(
233
366
  }
234
367
  );
235
368
  CardTitle.displayName = "CardTitle";
236
- var CardDescription = forwardRef(
369
+ var CardDescription = forwardRef6(
237
370
  ({ className, ...props }, ref) => {
238
- return /* @__PURE__ */ jsx(
371
+ return /* @__PURE__ */ jsx9(
239
372
  "p",
240
373
  {
241
374
  ref,
@@ -247,9 +380,9 @@ var CardDescription = forwardRef(
247
380
  }
248
381
  );
249
382
  CardDescription.displayName = "CardDescription";
250
- var CardAction = forwardRef(
383
+ var CardAction = forwardRef6(
251
384
  ({ className, ...props }, ref) => {
252
- return /* @__PURE__ */ jsx(
385
+ return /* @__PURE__ */ jsx9(
253
386
  "div",
254
387
  {
255
388
  ref,
@@ -261,9 +394,9 @@ var CardAction = forwardRef(
261
394
  }
262
395
  );
263
396
  CardAction.displayName = "CardAction";
264
- var CardContent = forwardRef(
397
+ var CardContent = forwardRef6(
265
398
  ({ className, ...props }, ref) => {
266
- return /* @__PURE__ */ jsx(
399
+ return /* @__PURE__ */ jsx9(
267
400
  "div",
268
401
  {
269
402
  ref,
@@ -275,15 +408,21 @@ var CardContent = forwardRef(
275
408
  }
276
409
  );
277
410
  CardContent.displayName = "CardContent";
278
- var CardFooter = forwardRef(
411
+ var CardFooter = forwardRef6(
279
412
  ({ className, ...props }, ref) => {
280
- return /* @__PURE__ */ jsx(
413
+ return /* @__PURE__ */ jsx9(
281
414
  "div",
282
415
  {
283
416
  ref,
284
417
  "data-slot": "card-footer",
285
418
  className: cn(
286
- "flex items-center px-6 py-4 border-t border-primary/5 bg-primary/5",
419
+ // The footer's tint runs the full width of the card, so at a nonzero
420
+ // --radius it would paint square across the card's curved bottom
421
+ // corners. `inherit` takes the card's own computed radius rather than
422
+ // restating a step, so a card whose radius is overridden stays
423
+ // matched, and it can never disagree with the card at any --radius,
424
+ // including the shipped 0 where `rounded-lg` is 0.
425
+ "flex items-center px-6 py-4 border-t border-border bg-primary/5 rounded-b-[inherit]",
287
426
  className
288
427
  ),
289
428
  ...props
@@ -292,15 +431,80 @@ var CardFooter = forwardRef(
292
431
  }
293
432
  );
294
433
  CardFooter.displayName = "CardFooter";
295
- var alertVariants = cva(
296
- "relative flex items-start gap-3 rounded-none border border-primary/5 p-4 text-sm transition-colors duration-150",
434
+
435
+ // src/components/layout.tsx
436
+ import { forwardRef as forwardRef7 } from "react";
437
+ import { jsx as jsx10, jsxs as jsxs2 } from "react/jsx-runtime";
438
+ var GAP = {
439
+ 0: "gap-0",
440
+ 1: "gap-1",
441
+ 2: "gap-2",
442
+ 3: "gap-3",
443
+ 4: "gap-4",
444
+ 6: "gap-6",
445
+ 8: "gap-8"
446
+ };
447
+ var COLS = {
448
+ 1: "grid-cols-1",
449
+ 2: "grid-cols-2",
450
+ 3: "grid-cols-3",
451
+ 4: "grid-cols-4",
452
+ 6: "grid-cols-6"
453
+ };
454
+ var Stack = forwardRef7(
455
+ ({ direction = "col", gap = 4, className, ...props }, ref) => /* @__PURE__ */ jsx10(
456
+ "div",
457
+ {
458
+ ref,
459
+ className: cn(
460
+ "flex",
461
+ direction === "col" ? "flex-col" : "flex-row",
462
+ GAP[gap],
463
+ className
464
+ ),
465
+ ...props
466
+ }
467
+ )
468
+ );
469
+ Stack.displayName = "Stack";
470
+ var Grid = forwardRef7(
471
+ ({ cols = 2, gap = 4, className, ...props }, ref) => /* @__PURE__ */ jsx10(
472
+ "div",
473
+ {
474
+ ref,
475
+ className: cn("grid", COLS[cols], GAP[gap], className),
476
+ ...props
477
+ }
478
+ )
479
+ );
480
+ Grid.displayName = "Grid";
481
+ var Stat = forwardRef7(
482
+ ({ label, value, className, ...props }, ref) => /* @__PURE__ */ jsxs2("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
483
+ /* @__PURE__ */ jsx10("span", { className: "text-sm text-muted-foreground", children: label }),
484
+ /* @__PURE__ */ jsx10("span", { className: "text-2xl font-semibold text-foreground", children: value })
485
+ ] })
486
+ );
487
+ Stat.displayName = "Stat";
488
+
489
+ // src/components/alert.tsx
490
+ import { cva as cva5 } from "class-variance-authority";
491
+ import { forwardRef as forwardRef8 } from "react";
492
+ import { jsx as jsx11 } from "react/jsx-runtime";
493
+ var alertVariants = cva5(
494
+ "relative flex items-start gap-3 rounded-md border border-border p-4 text-sm transition-colors duration-150",
297
495
  {
298
496
  variants: {
299
497
  variant: {
300
- info: "border-primary/5 bg-primary/5 text-primary dark:border-primary/30 dark:bg-primary/5 dark:text-primary-foreground/90",
301
- success: "border-green-200 bg-green-50 text-green-900 dark:border-green-900 dark:bg-green-950 dark:text-green-100",
302
- warning: "border-amber-200 bg-amber-50 text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100",
303
- destructive: "border-red-200 bg-red-50 text-red-900 dark:border-red-900 dark:bg-red-950 dark:text-red-100"
498
+ // text-primary is mode-correct (dark ink on light in light mode, light
499
+ // ink on dark in dark mode); the previous dark text override rendered
500
+ // dark slate on the dark tint at about 1:1.
501
+ info: "bg-primary/5 text-primary",
502
+ // dark:border-l-* re-asserts the strong base accent on the left after
503
+ // the dark:border-*-900 all-sides rule, so the meaningful accent stays
504
+ // visible in dark mode instead of collapsing to the faint -900 shade.
505
+ success: "border-success-200 bg-success-50 text-success-900 border-l-4 border-l-success dark:border-success-900 dark:border-l-success dark:bg-success-950 dark:text-success-100",
506
+ warning: "border-warning-200 bg-warning-50 text-warning-900 border-l-4 border-l-warning dark:border-warning-900 dark:border-l-warning dark:bg-warning-950 dark:text-warning-100",
507
+ destructive: "border-destructive-200 bg-destructive-50 text-destructive-900 border-l-4 border-l-destructive dark:border-destructive-900 dark:border-l-destructive dark:bg-destructive-950 dark:text-destructive-100"
304
508
  }
305
509
  },
306
510
  defaultVariants: {
@@ -308,9 +512,9 @@ var alertVariants = cva(
308
512
  }
309
513
  }
310
514
  );
311
- var Alert = forwardRef(
515
+ var Alert = forwardRef8(
312
516
  ({ className, variant = "info", role = "alert", ...props }, ref) => {
313
- return /* @__PURE__ */ jsx(
517
+ return /* @__PURE__ */ jsx11(
314
518
  "div",
315
519
  {
316
520
  ref,
@@ -323,9 +527,9 @@ var Alert = forwardRef(
323
527
  }
324
528
  );
325
529
  Alert.displayName = "Alert";
326
- var AlertTitle = forwardRef(
530
+ var AlertTitle = forwardRef8(
327
531
  ({ className, ...props }, ref) => {
328
- return /* @__PURE__ */ jsx(
532
+ return /* @__PURE__ */ jsx11(
329
533
  "h5",
330
534
  {
331
535
  ref,
@@ -340,9 +544,9 @@ var AlertTitle = forwardRef(
340
544
  }
341
545
  );
342
546
  AlertTitle.displayName = "AlertTitle";
343
- var AlertDescription = forwardRef(
547
+ var AlertDescription = forwardRef8(
344
548
  ({ className, ...props }, ref) => {
345
- return /* @__PURE__ */ jsx(
549
+ return /* @__PURE__ */ jsx11(
346
550
  "div",
347
551
  {
348
552
  ref,
@@ -354,13 +558,17 @@ var AlertDescription = forwardRef(
354
558
  }
355
559
  );
356
560
  AlertDescription.displayName = "AlertDescription";
561
+
562
+ // src/components/separator.tsx
563
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
564
+ import { jsx as jsx12 } from "react/jsx-runtime";
357
565
  function Separator({
358
566
  className,
359
567
  orientation = "horizontal",
360
568
  decorative = true,
361
569
  ...props
362
570
  }) {
363
- return /* @__PURE__ */ jsx(
571
+ return /* @__PURE__ */ jsx12(
364
572
  SeparatorPrimitive.Root,
365
573
  {
366
574
  "data-slot": "separator",
@@ -374,16 +582,20 @@ function Separator({
374
582
  }
375
583
  );
376
584
  }
377
- var Skeleton = React5.forwardRef(
585
+
586
+ // src/components/skeleton.tsx
587
+ import * as React3 from "react";
588
+ import { jsx as jsx13 } from "react/jsx-runtime";
589
+ var Skeleton = React3.forwardRef(
378
590
  ({ className, ...props }, ref) => {
379
- return /* @__PURE__ */ jsx(
591
+ return /* @__PURE__ */ jsx13(
380
592
  "div",
381
593
  {
382
594
  ref,
383
595
  "data-slot": "skeleton",
384
596
  "aria-hidden": "true",
385
597
  className: cn(
386
- "bg-primary/5 animate-pulse rounded-none motion-reduce:animate-none",
598
+ "bg-primary/5 animate-pulse rounded-md motion-reduce:animate-none",
387
599
  className
388
600
  ),
389
601
  ...props
@@ -392,11 +604,16 @@ var Skeleton = React5.forwardRef(
392
604
  }
393
605
  );
394
606
  Skeleton.displayName = "Skeleton";
395
- var progressVariants = cva("h-full rounded-none transition-all", {
607
+
608
+ // src/components/progress.tsx
609
+ import { cva as cva6 } from "class-variance-authority";
610
+ import * as React4 from "react";
611
+ import { jsx as jsx14 } from "react/jsx-runtime";
612
+ var progressVariants = cva6("h-full rounded-none transition-all", {
396
613
  variants: {
397
614
  variant: {
398
615
  default: "bg-primary-500",
399
- success: "bg-green-500",
616
+ success: "bg-success-500",
400
617
  error: "bg-destructive"
401
618
  }
402
619
  },
@@ -404,7 +621,7 @@ var progressVariants = cva("h-full rounded-none transition-all", {
404
621
  variant: "default"
405
622
  }
406
623
  });
407
- var Progress = React5.forwardRef(
624
+ var Progress = React4.forwardRef(
408
625
  ({
409
626
  value,
410
627
  max = 100,
@@ -415,7 +632,7 @@ var Progress = React5.forwardRef(
415
632
  }, ref) => {
416
633
  const clampedValue = Math.min(Math.max(0, value), max);
417
634
  const percentage = clampedValue / max * 100;
418
- return /* @__PURE__ */ jsx(
635
+ return /* @__PURE__ */ jsx14(
419
636
  "div",
420
637
  {
421
638
  ref,
@@ -425,11 +642,11 @@ var Progress = React5.forwardRef(
425
642
  "aria-valuemax": max,
426
643
  "aria-label": ariaLabel || `Progress: ${Math.round(percentage)}%`,
427
644
  className: cn(
428
- "relative h-2 w-full overflow-hidden rounded-none bg-accent",
645
+ "relative h-2 w-full overflow-hidden rounded-full bg-accent",
429
646
  className
430
647
  ),
431
648
  ...props,
432
- children: /* @__PURE__ */ jsx(
649
+ children: /* @__PURE__ */ jsx14(
433
650
  "div",
434
651
  {
435
652
  className: cn(progressVariants({ variant })),
@@ -444,28 +661,41 @@ var Progress = React5.forwardRef(
444
661
  }
445
662
  );
446
663
  Progress.displayName = "Progress";
447
- var Checkbox = forwardRef(({ className, indeterminate, ...props }, ref) => /* @__PURE__ */ jsx(
664
+
665
+ // src/components/checkbox.tsx
666
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
667
+ import { Check, Minus } from "lucide-react";
668
+ import { forwardRef as forwardRef11 } from "react";
669
+ import { jsx as jsx15 } from "react/jsx-runtime";
670
+ var Checkbox = forwardRef11(({ className, indeterminate, ...props }, ref) => /* @__PURE__ */ jsx15(
448
671
  CheckboxPrimitive.Root,
449
672
  {
450
673
  ref,
451
674
  "data-slot": "checkbox",
452
675
  className: cn(
453
- "peer h-4 w-4 shrink-0 rounded-none border border-primary/5 ring-offset-background focus:!border-primary focus-visible:!border-primary focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:!border-destructive aria-invalid:focus-visible:!border-destructive disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary transition-all duration-200",
676
+ // Resting border uses border-input (a visible 3:1 boundary); the checked
677
+ // state switches to border-primary below, keeping the two states distinct.
678
+ "peer relative h-4 w-4 shrink-0 rounded-sm border border-input ring-offset-background before:absolute before:left-1/2 before:top-1/2 before:h-6 before:w-6 before:-translate-x-1/2 before:-translate-y-1/2 before:content-[''] focus:border-primary! focus-visible:border-primary! focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:border-destructive! aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground data-[state=indeterminate]:border-primary transition-all duration-200",
454
679
  className
455
680
  ),
456
681
  ...props,
457
- children: /* @__PURE__ */ jsx(
682
+ children: /* @__PURE__ */ jsx15(
458
683
  CheckboxPrimitive.Indicator,
459
684
  {
460
685
  className: cn("flex items-center justify-center text-current"),
461
- children: indeterminate ? /* @__PURE__ */ jsx(Minus, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" })
686
+ children: indeterminate ? /* @__PURE__ */ jsx15(Minus, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx15(Check, { className: "h-3 w-3" })
462
687
  }
463
688
  )
464
689
  }
465
690
  ));
466
691
  Checkbox.displayName = "Checkbox";
467
- var RadioGroup = forwardRef(({ className, ...props }, ref) => {
468
- return /* @__PURE__ */ jsx(
692
+
693
+ // src/components/radio-group.tsx
694
+ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
695
+ import { forwardRef as forwardRef12 } from "react";
696
+ import { jsx as jsx16 } from "react/jsx-runtime";
697
+ var RadioGroup = forwardRef12(({ className, ...props }, ref) => {
698
+ return /* @__PURE__ */ jsx16(
469
699
  RadioGroupPrimitive.Root,
470
700
  {
471
701
  className: cn("grid gap-2", className),
@@ -476,52 +706,76 @@ var RadioGroup = forwardRef(({ className, ...props }, ref) => {
476
706
  );
477
707
  });
478
708
  RadioGroup.displayName = "RadioGroup";
479
- var RadioGroupItem = forwardRef(({ className, ...props }, ref) => {
480
- return /* @__PURE__ */ jsx(
709
+ var RadioGroupItem = forwardRef12(({ className, ...props }, ref) => {
710
+ return /* @__PURE__ */ jsx16(
481
711
  RadioGroupPrimitive.Item,
482
712
  {
483
713
  ref,
484
714
  "data-slot": "radio-group-item",
485
715
  className: cn(
486
- "peer h-4 w-4 shrink-0 rounded-none border border-primary/5 bg-background cursor-pointer transition-all duration-150 focus:!border-primary focus-visible:!border-primary focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:!border-destructive aria-invalid:focus-visible:!border-destructive disabled:cursor-not-allowed disabled:opacity-50 hover:border-primary/30 data-[state=checked]:border-primary data-[state=checked]:border-[5px]",
716
+ // Unchecked outline uses primary/40 (clearly visible) instead of primary/5
717
+ // (~5% opacity, effectively invisible); hover strengthens above the resting state.
718
+ // Resting border uses border-input (a visible 3:1 boundary); the checked
719
+ // state switches to border-primary below, keeping the two states distinct.
720
+ // rounded-full is fixed rather than derived from --radius: the circle is
721
+ // what tells the user only one option can be chosen. The thick checked
722
+ // border leaves a background-coloured core, and because the border's
723
+ // inner edge is curved too that core reads as a round dot.
724
+ "peer h-4 w-4 shrink-0 rounded-full border border-input bg-background cursor-pointer transition-all duration-150 focus:border-primary! focus-visible:border-primary! focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:border-destructive! aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50 hover:border-primary/70 data-[state=checked]:border-primary data-[state=checked]:border-[5px]",
487
725
  className
488
726
  ),
489
727
  ...props,
490
- children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, {})
728
+ children: /* @__PURE__ */ jsx16(RadioGroupPrimitive.Indicator, { className: "block size-full rounded-full" })
491
729
  }
492
730
  );
493
731
  });
494
732
  RadioGroupItem.displayName = "RadioGroupItem";
733
+
734
+ // src/components/switch.tsx
735
+ import {
736
+ Root as SwitchRoot,
737
+ Thumb as SwitchThumb
738
+ } from "@radix-ui/react-switch";
739
+ import { jsx as jsx17 } from "react/jsx-runtime";
495
740
  function Switch({ className, ...props }) {
496
- return /* @__PURE__ */ jsx(
497
- Root$4,
741
+ return /* @__PURE__ */ jsx17(
742
+ SwitchRoot,
498
743
  {
499
744
  "data-slot": "switch",
500
745
  className: cn(
501
- "peer inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-none border border-primary/5 transition-all outline-none focus-visible:border-primary aria-invalid:border-destructive aria-invalid:focus-visible:!border-destructive disabled:cursor-not-allowed disabled:opacity-50",
502
- "data-[state=checked]:bg-primary data-[state=checked]:!border-primary",
503
- "data-[state=unchecked]:bg-input data-[state=unchecked]:border-primary/5 dark:data-[state=unchecked]:bg-input/80",
746
+ "peer inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-border transition-all outline-none focus-visible:border-primary aria-invalid:border-destructive aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50",
747
+ "data-[state=checked]:bg-primary data-[state=checked]:border-primary!",
748
+ "data-[state=unchecked]:bg-input data-[state=unchecked]:border-border dark:data-[state=unchecked]:bg-input/80",
504
749
  className
505
750
  ),
506
751
  ...props,
507
- children: /* @__PURE__ */ jsx(
508
- Thumb,
752
+ children: /* @__PURE__ */ jsx17(
753
+ SwitchThumb,
509
754
  {
510
755
  "data-slot": "switch-thumb",
511
756
  className: cn(
512
- "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-none ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
757
+ "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
513
758
  )
514
759
  }
515
760
  )
516
761
  }
517
762
  );
518
763
  }
764
+
765
+ // src/components/collapsible.tsx
766
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
519
767
  var Collapsible = CollapsiblePrimitive.Root;
520
768
  var CollapsibleTrigger2 = CollapsiblePrimitive.CollapsibleTrigger;
521
769
  var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
770
+
771
+ // src/components/accordion.tsx
772
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
773
+ import { ChevronDown } from "lucide-react";
774
+ import { forwardRef as forwardRef13 } from "react";
775
+ import { jsx as jsx18, jsxs as jsxs3 } from "react/jsx-runtime";
522
776
  var Accordion = AccordionPrimitive.Root;
523
- var AccordionItem = forwardRef(
524
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
777
+ var AccordionItem = forwardRef13(
778
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx18(
525
779
  AccordionPrimitive.Item,
526
780
  {
527
781
  ref,
@@ -532,8 +786,8 @@ var AccordionItem = forwardRef(
532
786
  )
533
787
  );
534
788
  AccordionItem.displayName = "AccordionItem";
535
- var AccordionTrigger = forwardRef(
536
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "flex", "data-slot": "accordion-header", children: /* @__PURE__ */ jsxs(
789
+ var AccordionTrigger = forwardRef13(
790
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx18(AccordionPrimitive.Header, { className: "flex", "data-slot": "accordion-header", children: /* @__PURE__ */ jsxs3(
537
791
  AccordionPrimitive.Trigger,
538
792
  {
539
793
  ref,
@@ -545,27 +799,37 @@ var AccordionTrigger = forwardRef(
545
799
  ...props,
546
800
  children: [
547
801
  children,
548
- /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-150" })
802
+ /* @__PURE__ */ jsx18(ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-150 will-change-transform" })
549
803
  ]
550
804
  }
551
805
  ) })
552
806
  );
553
807
  AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
554
- var AccordionContent = forwardRef(
555
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
808
+ var AccordionContent = forwardRef13(
809
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx18(
556
810
  AccordionPrimitive.Content,
557
811
  {
558
812
  ref,
559
813
  "data-slot": "accordion-content",
560
- className: "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
814
+ className: "overflow-hidden text-sm transition-all will-change-[height] transform-[translateZ(0)] data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
561
815
  ...props,
562
- children: /* @__PURE__ */ jsx("div", { className: cn("pb-4 pt-0", className), children })
816
+ children: /* @__PURE__ */ jsx18("div", { className: cn("pb-4 pt-0", className), children })
563
817
  }
564
818
  )
565
819
  );
566
820
  AccordionContent.displayName = AccordionPrimitive.Content.displayName;
567
- var avatarVariants = cva(
568
- "relative inline-flex shrink-0 overflow-hidden rounded-none items-center justify-center bg-primary/5 text-muted-foreground",
821
+
822
+ // src/components/avatar.tsx
823
+ import {
824
+ Root as AvatarRoot,
825
+ Image as AvatarImagePrimitive,
826
+ Fallback as AvatarFallbackPrimitive
827
+ } from "@radix-ui/react-avatar";
828
+ import { cva as cva7 } from "class-variance-authority";
829
+ import { createContext as createContext2, forwardRef as forwardRef14, useContext as useContext2 } from "react";
830
+ import { jsx as jsx19 } from "react/jsx-runtime";
831
+ var avatarVariants = cva7(
832
+ "relative inline-flex shrink-0 overflow-hidden rounded-full items-center justify-center bg-primary/5 text-muted-foreground",
569
833
  {
570
834
  variants: {
571
835
  size: {
@@ -593,11 +857,11 @@ var fallbackTextSizeMap = {
593
857
  "2xl": "text-2xl"
594
858
  // 24px for 80px avatar
595
859
  };
596
- var AvatarSizeContext = createContext("md");
597
- var Avatar = forwardRef(
860
+ var AvatarSizeContext = createContext2("md");
861
+ var Avatar = forwardRef14(
598
862
  ({ className, size = "md", ...props }, ref) => {
599
- return /* @__PURE__ */ jsx(AvatarSizeContext.Provider, { value: size, children: /* @__PURE__ */ jsx(
600
- Root,
863
+ return /* @__PURE__ */ jsx19(AvatarSizeContext.Provider, { value: size, children: /* @__PURE__ */ jsx19(
864
+ AvatarRoot,
601
865
  {
602
866
  ref,
603
867
  "data-slot": "avatar",
@@ -608,10 +872,10 @@ var Avatar = forwardRef(
608
872
  }
609
873
  );
610
874
  Avatar.displayName = "Avatar";
611
- var AvatarImage = forwardRef(
875
+ var AvatarImage = forwardRef14(
612
876
  ({ className, ...props }, ref) => {
613
- return /* @__PURE__ */ jsx(
614
- Image,
877
+ return /* @__PURE__ */ jsx19(
878
+ AvatarImagePrimitive,
615
879
  {
616
880
  ref,
617
881
  "data-slot": "avatar-image",
@@ -622,17 +886,17 @@ var AvatarImage = forwardRef(
622
886
  }
623
887
  );
624
888
  AvatarImage.displayName = "AvatarImage";
625
- var AvatarFallback = forwardRef(
889
+ var AvatarFallback = forwardRef14(
626
890
  ({ className, children, ...props }, ref) => {
627
- const size = useContext(AvatarSizeContext) || "md";
891
+ const size = useContext2(AvatarSizeContext) || "md";
628
892
  const textSize = fallbackTextSizeMap[size];
629
- return /* @__PURE__ */ jsx(
630
- Fallback,
893
+ return /* @__PURE__ */ jsx19(
894
+ AvatarFallbackPrimitive,
631
895
  {
632
896
  ref,
633
897
  "data-slot": "avatar-fallback",
634
898
  className: cn(
635
- "bg-primary/5 text-muted-foreground flex size-full items-center justify-center rounded-none font-medium",
899
+ "bg-primary/5 text-muted-foreground flex size-full items-center justify-center rounded-full font-medium",
636
900
  textSize,
637
901
  className
638
902
  ),
@@ -643,14 +907,20 @@ var AvatarFallback = forwardRef(
643
907
  }
644
908
  );
645
909
  AvatarFallback.displayName = "AvatarFallback";
646
- var Tabs = Root$1;
647
- var TabsList = forwardRef(
648
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
910
+
911
+ // src/components/tabs.tsx
912
+ import { Root as Root7, List, Trigger as Trigger3, Content as Content3 } from "@radix-ui/react-tabs";
913
+ import { forwardRef as forwardRef15 } from "react";
914
+ import { jsx as jsx20 } from "react/jsx-runtime";
915
+ var Tabs = Root7;
916
+ var TabsList = forwardRef15(
917
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx20(
649
918
  List,
650
919
  {
651
920
  ref,
652
921
  "data-slot": "tabs-list",
653
922
  className: cn(
923
+ // Square corners: underline tabs, so the list never draws a rounded surface.
654
924
  "inline-flex h-10 items-center justify-center gap-1 rounded-none p-0 text-muted-foreground",
655
925
  className
656
926
  ),
@@ -659,67 +929,49 @@ var TabsList = forwardRef(
659
929
  )
660
930
  );
661
931
  TabsList.displayName = List.displayName;
662
- var TabsTrigger = forwardRef(
663
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
664
- Trigger,
932
+ var TabsTrigger = forwardRef15(
933
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx20(
934
+ Trigger3,
665
935
  {
666
936
  ref,
667
937
  "data-slot": "tabs-trigger",
668
938
  className: cn(
669
- "inline-flex items-center justify-center whitespace-nowrap rounded-none bg-transparent px-4 py-2 text-sm font-medium cursor-pointer transition-all duration-200 border-b-2 relative -mb-0.5 data-[state=active]:!border-b-primary data-[state=active]:text-primary data-[state=inactive]:border-transparent data-[state=inactive]:text-muted-foreground hover:text-primary hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/20 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed",
939
+ // Square corners: the active state is a 2px bottom border that has to
940
+ // run the full width of the trigger.
941
+ "inline-flex items-center justify-center whitespace-nowrap rounded-none bg-transparent px-4 py-2 text-sm font-medium cursor-pointer transition-all duration-200 border-b-2 relative -mb-0.5 data-[state=active]:border-b-primary! data-[state=active]:text-primary data-[state=inactive]:border-transparent data-[state=inactive]:text-muted-foreground hover:text-primary hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed",
670
942
  className
671
943
  ),
672
944
  ...props
673
945
  }
674
946
  )
675
947
  );
676
- TabsTrigger.displayName = Trigger.displayName;
677
- var TabsContent = forwardRef(
678
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
679
- Content,
948
+ TabsTrigger.displayName = Trigger3.displayName;
949
+ var TabsContent = forwardRef15(
950
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx20(
951
+ Content3,
680
952
  {
681
953
  ref,
682
954
  "data-slot": "tabs-content",
683
955
  className: cn(
684
- "mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/20 focus-visible:ring-offset-2",
956
+ "mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
685
957
  className
686
958
  ),
687
959
  ...props
688
960
  }
689
961
  )
690
962
  );
691
- TabsContent.displayName = Content.displayName;
692
- var TooltipProvider = Provider;
693
- var Tooltip = Root$2;
694
- var TooltipTrigger = Trigger$1;
695
- var TooltipContent = forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
696
- Content$1,
697
- {
698
- ref,
699
- sideOffset,
700
- "data-slot": "tooltip-content",
701
- className: cn(
702
- "z-50 overflow-hidden rounded-none px-3 py-1.5 text-xs shadow-lg border border-primary/5 bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
703
- className
704
- ),
705
- ...props
706
- }
707
- ));
708
- TooltipContent.displayName = Content$1.displayName;
709
- var PortalContext = createContext({ container: null });
710
- function PortalProvider({ container, children }) {
711
- return /* @__PURE__ */ jsx(PortalContext.Provider, { value: { container }, children });
712
- }
713
- function usePortalContainer() {
714
- const { container } = useContext(PortalContext);
715
- return container ?? void 0;
716
- }
963
+ TabsContent.displayName = Content3.displayName;
964
+
965
+ // src/components/popover.tsx
966
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
967
+ import * as React5 from "react";
968
+ import { jsx as jsx21 } from "react/jsx-runtime";
717
969
  var Popover = PopoverPrimitive.Root;
718
970
  var PopoverTrigger = PopoverPrimitive.Trigger;
719
971
  var PopoverAnchor = PopoverPrimitive.Anchor;
720
972
  var PopoverContent = React5.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => {
721
973
  const portalContainer = usePortalContainer();
722
- return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
974
+ return /* @__PURE__ */ jsx21(PopoverPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx21(
723
975
  PopoverPrimitive.Content,
724
976
  {
725
977
  ref,
@@ -727,7 +979,7 @@ var PopoverContent = React5.forwardRef(({ className, align = "center", sideOffse
727
979
  sideOffset,
728
980
  "data-slot": "popover-content",
729
981
  className: cn(
730
- "z-[100] w-72 rounded-none border border-primary/5 bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",
982
+ "z-[100] w-72 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",
731
983
  className
732
984
  ),
733
985
  ...props
@@ -735,16 +987,26 @@ var PopoverContent = React5.forwardRef(({ className, align = "center", sideOffse
735
987
  ) });
736
988
  });
737
989
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
990
+
991
+ // src/components/dialog.tsx
992
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
993
+ import { cva as cva8 } from "class-variance-authority";
994
+ import { X } from "lucide-react";
995
+ import { forwardRef as forwardRef17 } from "react";
996
+ import { jsx as jsx22, jsxs as jsxs4 } from "react/jsx-runtime";
738
997
  var Dialog = DialogPrimitive.Root;
739
998
  var DialogTrigger = DialogPrimitive.Trigger;
740
999
  var DialogPortal = DialogPrimitive.Portal;
741
1000
  var DialogClose = DialogPrimitive.Close;
742
- var DialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1001
+ var DialogOverlay = forwardRef17(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
743
1002
  DialogPrimitive.Overlay,
744
1003
  {
745
1004
  ref,
746
1005
  "data-slot": "dialog-overlay",
747
1006
  className: cn(
1007
+ // A modal scrim: a black wash is the point, so it stays a literal
1008
+ // rather than a surface token. Painting it from `background` would
1009
+ // make it a white veil in light mode and near-invisible in dark.
748
1010
  "fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-opacity duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
749
1011
  className
750
1012
  ),
@@ -752,7 +1014,7 @@ var DialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
752
1014
  }
753
1015
  ));
754
1016
  DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
755
- var dialogContentVariants = cva("", {
1017
+ var dialogContentVariants = cva8("", {
756
1018
  variants: {
757
1019
  size: {
758
1020
  sm: "max-w-sm",
@@ -766,31 +1028,31 @@ var dialogContentVariants = cva("", {
766
1028
  size: "md"
767
1029
  }
768
1030
  });
769
- var DialogContent = forwardRef(({ className, children, size, ...props }, ref) => {
1031
+ var DialogContent = forwardRef17(({ className, children, size, ...props }, ref) => {
770
1032
  const portalContainer = usePortalContainer();
771
- return /* @__PURE__ */ jsxs(DialogPortal, { container: portalContainer, children: [
772
- /* @__PURE__ */ jsx(DialogOverlay, {}),
773
- /* @__PURE__ */ jsxs(
1033
+ return /* @__PURE__ */ jsxs4(DialogPortal, { container: portalContainer, children: [
1034
+ /* @__PURE__ */ jsx22(DialogOverlay, {}),
1035
+ /* @__PURE__ */ jsxs4(
774
1036
  DialogPrimitive.Content,
775
1037
  {
776
1038
  ref,
777
1039
  "data-slot": "dialog-content",
778
1040
  className: cn(
779
- "fixed left-[50%] top-[50%] z-[51] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border border-primary/5 bg-background p-6 shadow-xl rounded-none duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
1041
+ "fixed left-[50%] top-[50%] z-[51] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-xl rounded-lg duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
780
1042
  dialogContentVariants({ size }),
781
1043
  className
782
1044
  ),
783
1045
  ...props,
784
1046
  children: [
785
1047
  children,
786
- /* @__PURE__ */ jsxs(
1048
+ /* @__PURE__ */ jsxs4(
787
1049
  DialogPrimitive.Close,
788
1050
  {
789
1051
  "data-slot": "dialog-close",
790
- className: "absolute right-4 top-4 rounded-none p-1 text-muted-foreground cursor-pointer transition-colors duration-150 hover-unified focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed",
1052
+ className: "absolute right-4 top-4 rounded-md p-1 text-muted-foreground cursor-pointer transition-colors duration-150 hover-unified focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed",
791
1053
  children: [
792
- /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
793
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
1054
+ /* @__PURE__ */ jsx22(X, { className: "h-4 w-4" }),
1055
+ /* @__PURE__ */ jsx22("span", { className: "sr-only", children: "Close" })
794
1056
  ]
795
1057
  }
796
1058
  )
@@ -800,8 +1062,8 @@ var DialogContent = forwardRef(({ className, children, size, ...props }, ref) =>
800
1062
  ] });
801
1063
  });
802
1064
  DialogContent.displayName = DialogPrimitive.Content.displayName;
803
- var DialogHeader = forwardRef(
804
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1065
+ var DialogHeader = forwardRef17(
1066
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
805
1067
  "div",
806
1068
  {
807
1069
  ref,
@@ -814,8 +1076,8 @@ var DialogHeader = forwardRef(
814
1076
  )
815
1077
  );
816
1078
  DialogHeader.displayName = "DialogHeader";
817
- var DialogFooter = forwardRef(
818
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1079
+ var DialogFooter = forwardRef17(
1080
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
819
1081
  "div",
820
1082
  {
821
1083
  ref,
@@ -828,7 +1090,7 @@ var DialogFooter = forwardRef(
828
1090
  )
829
1091
  );
830
1092
  DialogFooter.displayName = "DialogFooter";
831
- var DialogTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1093
+ var DialogTitle = forwardRef17(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
832
1094
  DialogPrimitive.Title,
833
1095
  {
834
1096
  ref,
@@ -840,7 +1102,7 @@ var DialogTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ j
840
1102
  }
841
1103
  ));
842
1104
  DialogTitle.displayName = DialogPrimitive.Title.displayName;
843
- var DialogDescription = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1105
+ var DialogDescription = forwardRef17(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
844
1106
  DialogPrimitive.Description,
845
1107
  {
846
1108
  ref,
@@ -849,14 +1111,24 @@ var DialogDescription = forwardRef(({ className, ...props }, ref) => /* @__PURE_
849
1111
  }
850
1112
  ));
851
1113
  DialogDescription.displayName = DialogPrimitive.Description.displayName;
1114
+
1115
+ // src/components/alert-dialog.tsx
1116
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
1117
+ import {
1118
+ forwardRef as forwardRef18
1119
+ } from "react";
1120
+ import { jsx as jsx23, jsxs as jsxs5 } from "react/jsx-runtime";
852
1121
  var AlertDialog = AlertDialogPrimitive.Root;
853
1122
  var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
854
1123
  var AlertDialogPortal = AlertDialogPrimitive.Portal;
855
- var AlertDialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1124
+ var AlertDialogOverlay = forwardRef18(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
856
1125
  AlertDialogPrimitive.Overlay,
857
1126
  {
858
1127
  ref,
859
1128
  className: cn(
1129
+ // A modal scrim: a black wash is the point, so it stays a literal
1130
+ // rather than a surface token. Painting it from `background` would
1131
+ // make it a white veil in light mode and near-invisible in dark.
860
1132
  "fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-opacity duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
861
1133
  className
862
1134
  ),
@@ -864,16 +1136,16 @@ var AlertDialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE
864
1136
  }
865
1137
  ));
866
1138
  AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
867
- var AlertDialogContent = forwardRef(({ className, ...props }, ref) => {
1139
+ var AlertDialogContent = forwardRef18(({ className, ...props }, ref) => {
868
1140
  const portalContainer = usePortalContainer();
869
- return /* @__PURE__ */ jsxs(AlertDialogPortal, { container: portalContainer, children: [
870
- /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
871
- /* @__PURE__ */ jsx(
1141
+ return /* @__PURE__ */ jsxs5(AlertDialogPortal, { container: portalContainer, children: [
1142
+ /* @__PURE__ */ jsx23(AlertDialogOverlay, {}),
1143
+ /* @__PURE__ */ jsx23(
872
1144
  AlertDialogPrimitive.Content,
873
1145
  {
874
1146
  ref,
875
1147
  className: cn(
876
- "fixed left-[50%] top-[50%] z-[51] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-primary/5 bg-background p-6 shadow-xl rounded-none duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
1148
+ "fixed left-[50%] top-[50%] z-[51] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-xl rounded-lg duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
877
1149
  className
878
1150
  ),
879
1151
  ...props
@@ -882,8 +1154,8 @@ var AlertDialogContent = forwardRef(({ className, ...props }, ref) => {
882
1154
  ] });
883
1155
  });
884
1156
  AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
885
- var AlertDialogHeader = forwardRef(
886
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1157
+ var AlertDialogHeader = forwardRef18(
1158
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
887
1159
  "div",
888
1160
  {
889
1161
  ref,
@@ -896,8 +1168,8 @@ var AlertDialogHeader = forwardRef(
896
1168
  )
897
1169
  );
898
1170
  AlertDialogHeader.displayName = "AlertDialogHeader";
899
- var AlertDialogFooter = forwardRef(
900
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1171
+ var AlertDialogFooter = forwardRef18(
1172
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
901
1173
  "div",
902
1174
  {
903
1175
  ref,
@@ -910,7 +1182,7 @@ var AlertDialogFooter = forwardRef(
910
1182
  )
911
1183
  );
912
1184
  AlertDialogFooter.displayName = "AlertDialogFooter";
913
- var AlertDialogTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1185
+ var AlertDialogTitle = forwardRef18(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
914
1186
  AlertDialogPrimitive.Title,
915
1187
  {
916
1188
  ref,
@@ -922,7 +1194,7 @@ var AlertDialogTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__
922
1194
  }
923
1195
  ));
924
1196
  AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
925
- var AlertDialogDescription = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1197
+ var AlertDialogDescription = forwardRef18(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
926
1198
  AlertDialogPrimitive.Description,
927
1199
  {
928
1200
  ref,
@@ -931,7 +1203,7 @@ var AlertDialogDescription = forwardRef(({ className, ...props }, ref) => /* @__
931
1203
  }
932
1204
  ));
933
1205
  AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
934
- var AlertDialogAction = forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
1206
+ var AlertDialogAction = forwardRef18(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx23(
935
1207
  AlertDialogPrimitive.Action,
936
1208
  {
937
1209
  ref,
@@ -941,7 +1213,7 @@ var AlertDialogAction = forwardRef(({ className, children, ...props }, ref) => /
941
1213
  }
942
1214
  ));
943
1215
  AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
944
- var AlertDialogCancel = forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
1216
+ var AlertDialogCancel = forwardRef18(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx23(
945
1217
  AlertDialogPrimitive.Cancel,
946
1218
  {
947
1219
  ref,
@@ -955,50 +1227,58 @@ var AlertDialogCancel = forwardRef(({ className, children, ...props }, ref) => /
955
1227
  }
956
1228
  ));
957
1229
  AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
1230
+
1231
+ // src/components/dropdown-menu.tsx
1232
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
1233
+ import { Check as Check2, ChevronRight, Circle } from "lucide-react";
1234
+ import * as React6 from "react";
1235
+ import { jsx as jsx24, jsxs as jsxs6 } from "react/jsx-runtime";
958
1236
  var DropdownMenu = DropdownMenuPrimitive.Root;
959
1237
  var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
960
1238
  var DropdownMenuGroup = DropdownMenuPrimitive.Group;
961
1239
  var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
962
1240
  var DropdownMenuSub = DropdownMenuPrimitive.Sub;
963
1241
  var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
964
- var DropdownMenuSubTrigger = React5.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1242
+ var menuItemBase = "cursor-pointer transition-colors data-[highlighted]:bg-muted data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
1243
+ var DropdownMenuSubTrigger = React6.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs6(
965
1244
  DropdownMenuPrimitive.SubTrigger,
966
1245
  {
967
1246
  ref,
968
1247
  className: cn(
969
- "flex cursor-default select-none items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-none hover-unified focus:bg-primary/5 focus:text-primary data-[state=open]:bg-primary/5 data-[state=open]:text-primary [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
1248
+ "flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-muted data-[state=open]:text-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
1249
+ menuItemBase,
970
1250
  inset && "pl-8",
971
1251
  className
972
1252
  ),
973
1253
  ...props,
974
1254
  children: [
975
1255
  children,
976
- /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto" })
1256
+ /* @__PURE__ */ jsx24(ChevronRight, { className: "ml-auto" })
977
1257
  ]
978
1258
  }
979
1259
  ));
980
1260
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
981
- var DropdownMenuSubContent = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1261
+ var DropdownMenuSubContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx24(
982
1262
  DropdownMenuPrimitive.SubContent,
983
1263
  {
984
1264
  ref,
985
1265
  className: cn(
986
- "z-50 min-w-[8rem] overflow-hidden rounded-none border border-primary/5 bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
1266
+ "z-50 min-w-[8rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
987
1267
  className
988
1268
  ),
989
1269
  ...props
990
1270
  }
991
1271
  ));
992
1272
  DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
993
- var DropdownMenuContent = React5.forwardRef(({ className, sideOffset = 4, ...props }, ref) => {
1273
+ var DropdownMenuContent = React6.forwardRef(({ className, sideOffset = 4, ...props }, ref) => {
994
1274
  const portalContainer = usePortalContainer();
995
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
1275
+ return /* @__PURE__ */ jsx24(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx24(
996
1276
  DropdownMenuPrimitive.Content,
997
1277
  {
998
1278
  ref,
999
1279
  sideOffset,
1000
1280
  className: cn(
1001
- "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-none border border-primary/5 bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
1281
+ "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
1002
1282
  className
1003
1283
  ),
1004
1284
  ...props
@@ -1006,12 +1286,13 @@ var DropdownMenuContent = React5.forwardRef(({ className, sideOffset = 4, ...pro
1006
1286
  ) });
1007
1287
  });
1008
1288
  DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
1009
- var DropdownMenuItem = React5.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
1289
+ var DropdownMenuItem = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx24(
1010
1290
  DropdownMenuPrimitive.Item,
1011
1291
  {
1012
1292
  ref,
1013
1293
  className: cn(
1014
- "relative flex cursor-pointer select-none items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-none transition-colors hover-unified focus:bg-primary/5 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
1294
+ "relative flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
1295
+ menuItemBase,
1015
1296
  inset && "pl-8",
1016
1297
  className
1017
1298
  ),
@@ -1019,40 +1300,42 @@ var DropdownMenuItem = React5.forwardRef(({ className, inset, ...props }, ref) =
1019
1300
  }
1020
1301
  ));
1021
1302
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
1022
- var DropdownMenuCheckboxItem = React5.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
1303
+ var DropdownMenuCheckboxItem = React6.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs6(
1023
1304
  DropdownMenuPrimitive.CheckboxItem,
1024
1305
  {
1025
1306
  ref,
1026
1307
  className: cn(
1027
- "relative flex cursor-default select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover-primary-light focus:bg-primary/5 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1308
+ "relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none",
1309
+ menuItemBase,
1028
1310
  className
1029
1311
  ),
1030
1312
  checked,
1031
1313
  ...props,
1032
1314
  children: [
1033
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) }) }),
1315
+ /* @__PURE__ */ jsx24("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx24(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx24(Check2, { className: "h-4 w-4" }) }) }),
1034
1316
  children
1035
1317
  ]
1036
1318
  }
1037
1319
  ));
1038
1320
  DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
1039
- var DropdownMenuRadioItem = React5.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1321
+ var DropdownMenuRadioItem = React6.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs6(
1040
1322
  DropdownMenuPrimitive.RadioItem,
1041
1323
  {
1042
1324
  ref,
1043
1325
  className: cn(
1044
- "relative flex cursor-default select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover-primary-light focus:bg-primary/5 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1326
+ "relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none",
1327
+ menuItemBase,
1045
1328
  className
1046
1329
  ),
1047
1330
  ...props,
1048
1331
  children: [
1049
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
1332
+ /* @__PURE__ */ jsx24("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx24(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx24(Circle, { className: "h-2 w-2 fill-current" }) }) }),
1050
1333
  children
1051
1334
  ]
1052
1335
  }
1053
1336
  ));
1054
1337
  DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
1055
- var DropdownMenuLabel = React5.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
1338
+ var DropdownMenuLabel = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx24(
1056
1339
  DropdownMenuPrimitive.Label,
1057
1340
  {
1058
1341
  ref,
@@ -1065,7 +1348,7 @@ var DropdownMenuLabel = React5.forwardRef(({ className, inset, ...props }, ref)
1065
1348
  }
1066
1349
  ));
1067
1350
  DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
1068
- var DropdownMenuSeparator = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1351
+ var DropdownMenuSeparator = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx24(
1069
1352
  DropdownMenuPrimitive.Separator,
1070
1353
  {
1071
1354
  ref,
@@ -1074,8 +1357,8 @@ var DropdownMenuSeparator = React5.forwardRef(({ className, ...props }, ref) =>
1074
1357
  }
1075
1358
  ));
1076
1359
  DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
1077
- var DropdownMenuShortcut = React5.forwardRef(({ className, ...props }, ref) => {
1078
- return /* @__PURE__ */ jsx(
1360
+ var DropdownMenuShortcut = React6.forwardRef(({ className, ...props }, ref) => {
1361
+ return /* @__PURE__ */ jsx24(
1079
1362
  "span",
1080
1363
  {
1081
1364
  ref,
@@ -1085,27 +1368,36 @@ var DropdownMenuShortcut = React5.forwardRef(({ className, ...props }, ref) => {
1085
1368
  );
1086
1369
  });
1087
1370
  DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
1371
+
1372
+ // src/components/select.tsx
1373
+ import * as SelectPrimitive from "@radix-ui/react-select";
1374
+ import { cva as cva9 } from "class-variance-authority";
1375
+ import { Check as Check3, ChevronDown as ChevronDown2, ChevronUp } from "lucide-react";
1376
+ import { forwardRef as forwardRef20 } from "react";
1377
+ import { jsx as jsx25, jsxs as jsxs7 } from "react/jsx-runtime";
1088
1378
  function Select({ ...props }) {
1089
- return /* @__PURE__ */ jsx(SelectPrimitive.Root, { "data-slot": "select", ...props });
1379
+ return /* @__PURE__ */ jsx25(SelectPrimitive.Root, { "data-slot": "select", ...props });
1090
1380
  }
1091
1381
  function SelectGroup({
1092
1382
  ...props
1093
1383
  }) {
1094
- return /* @__PURE__ */ jsx(SelectPrimitive.Group, { "data-slot": "select-group", ...props });
1384
+ return /* @__PURE__ */ jsx25(SelectPrimitive.Group, { "data-slot": "select-group", ...props });
1095
1385
  }
1096
1386
  function SelectValue({
1097
1387
  ...props
1098
1388
  }) {
1099
- return /* @__PURE__ */ jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
1389
+ return /* @__PURE__ */ jsx25(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
1100
1390
  }
1101
- var selectTriggerVariants = cva(
1102
- "flex w-full items-center justify-between gap-2 rounded-none border border-input bg-background px-3 text-sm text-foreground cursor-pointer transition-all duration-150 focus:!border-primary focus-visible:!border-primary focus:outline-none hover:border-primary/30 disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 data-[placeholder]:text-muted-foreground aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:!border-destructive [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4",
1391
+ var selectTriggerVariants = cva9(
1392
+ // hover:border-primary (full strength) keeps the hover boundary more visible
1393
+ // than the resting border-input, not a fainter alpha of it.
1394
+ "flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 text-sm text-foreground cursor-pointer transition-all duration-150 focus:border-primary! focus-visible:border-primary! focus:outline-none hover:border-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 data-[placeholder]:text-muted-foreground aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:border-destructive! [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4",
1103
1395
  {
1104
1396
  variants: {
1105
1397
  size: {
1106
- sm: "h-8 text-sm",
1107
- default: "h-10 text-sm",
1108
- lg: "h-11 text-base"
1398
+ sm: "h-[var(--nx-control-height-sm)] text-sm",
1399
+ default: "h-[var(--nx-control-height)] text-sm",
1400
+ lg: "h-[var(--nx-control-height-lg)] text-base"
1109
1401
  }
1110
1402
  },
1111
1403
  defaultVariants: {
@@ -1113,8 +1405,8 @@ var selectTriggerVariants = cva(
1113
1405
  }
1114
1406
  }
1115
1407
  );
1116
- var SelectTrigger = forwardRef(({ className, size, children, ...props }, ref) => {
1117
- return /* @__PURE__ */ jsxs(
1408
+ var SelectTrigger = forwardRef20(({ className, size, children, ...props }, ref) => {
1409
+ return /* @__PURE__ */ jsxs7(
1118
1410
  SelectPrimitive.Trigger,
1119
1411
  {
1120
1412
  ref,
@@ -1123,7 +1415,7 @@ var SelectTrigger = forwardRef(({ className, size, children, ...props }, ref) =>
1123
1415
  ...props,
1124
1416
  children: [
1125
1417
  children,
1126
- /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 opacity-50" }) })
1418
+ /* @__PURE__ */ jsx25(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx25(ChevronDown2, { className: "size-4 opacity-50" }) })
1127
1419
  ]
1128
1420
  }
1129
1421
  );
@@ -1136,20 +1428,20 @@ function SelectContent({
1136
1428
  ...props
1137
1429
  }) {
1138
1430
  const portalContainer = usePortalContainer();
1139
- return /* @__PURE__ */ jsx(SelectPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
1431
+ return /* @__PURE__ */ jsx25(SelectPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs7(
1140
1432
  SelectPrimitive.Content,
1141
1433
  {
1142
1434
  "data-slot": "select-content",
1143
1435
  className: cn(
1144
- "bg-popover text-popover-foreground border border-primary/5 shadow-none rounded-none z-9999 max-h-(--radix-select-content-available-height) min-w-32 overflow-hidden data-[state=open]:animate-zoom-in-95 data-[state=closed]:animate-zoom-out-95 data-[side=bottom]:animate-slide-in-from-top-2 data-[side=left]:animate-slide-in-from-right-2 data-[side=right]:animate-slide-in-from-left-2 data-[side=top]:animate-slide-in-from-bottom-2",
1436
+ "bg-popover text-popover-foreground border border-border shadow-none rounded-lg z-9999 max-h-(--radix-select-content-available-height) min-w-32 overflow-hidden data-[state=open]:animate-zoom-in-95 data-[state=closed]:animate-zoom-out-95 data-[side=bottom]:animate-slide-in-from-top-2 data-[side=left]:animate-slide-in-from-right-2 data-[side=right]:animate-slide-in-from-left-2 data-[side=top]:animate-slide-in-from-bottom-2",
1145
1437
  position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
1146
1438
  className
1147
1439
  ),
1148
1440
  position,
1149
1441
  ...props,
1150
1442
  children: [
1151
- /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
1152
- /* @__PURE__ */ jsx(
1443
+ /* @__PURE__ */ jsx25(SelectScrollUpButton, {}),
1444
+ /* @__PURE__ */ jsx25(
1153
1445
  SelectPrimitive.Viewport,
1154
1446
  {
1155
1447
  className: cn(
@@ -1159,7 +1451,7 @@ function SelectContent({
1159
1451
  children
1160
1452
  }
1161
1453
  ),
1162
- /* @__PURE__ */ jsx(SelectScrollDownButton, {})
1454
+ /* @__PURE__ */ jsx25(SelectScrollDownButton, {})
1163
1455
  ]
1164
1456
  }
1165
1457
  ) });
@@ -1168,7 +1460,7 @@ function SelectLabel({
1168
1460
  className,
1169
1461
  ...props
1170
1462
  }) {
1171
- return /* @__PURE__ */ jsx(
1463
+ return /* @__PURE__ */ jsx25(
1172
1464
  SelectPrimitive.Label,
1173
1465
  {
1174
1466
  "data-slot": "select-label",
@@ -1182,18 +1474,18 @@ function SelectItem({
1182
1474
  children,
1183
1475
  ...props
1184
1476
  }) {
1185
- return /* @__PURE__ */ jsxs(
1477
+ return /* @__PURE__ */ jsxs7(
1186
1478
  SelectPrimitive.Item,
1187
1479
  {
1188
1480
  "data-slot": "select-item",
1189
1481
  className: cn(
1190
- "relative flex w-full cursor-pointer items-center gap-2 rounded-none py-2 pr-8 pl-2 text-sm text-foreground outline-none select-none transition-colors hover-unified focus:bg-primary/5 focus:text-primary data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4",
1482
+ "relative flex w-full cursor-pointer items-center gap-2 rounded-sm py-2 pr-8 pl-2 text-sm text-foreground outline-none select-none transition-colors hover-unified focus:bg-primary/5 focus:text-primary data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4",
1191
1483
  className
1192
1484
  ),
1193
1485
  ...props,
1194
1486
  children: [
1195
- /* @__PURE__ */ jsx("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "size-4" }) }) }),
1196
- /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })
1487
+ /* @__PURE__ */ jsx25("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx25(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx25(Check3, { className: "size-4" }) }) }),
1488
+ /* @__PURE__ */ jsx25(SelectPrimitive.ItemText, { children })
1197
1489
  ]
1198
1490
  }
1199
1491
  );
@@ -1202,7 +1494,7 @@ function SelectSeparator({
1202
1494
  className,
1203
1495
  ...props
1204
1496
  }) {
1205
- return /* @__PURE__ */ jsx(
1497
+ return /* @__PURE__ */ jsx25(
1206
1498
  SelectPrimitive.Separator,
1207
1499
  {
1208
1500
  "data-slot": "select-separator",
@@ -1215,7 +1507,7 @@ function SelectScrollUpButton({
1215
1507
  className,
1216
1508
  ...props
1217
1509
  }) {
1218
- return /* @__PURE__ */ jsx(
1510
+ return /* @__PURE__ */ jsx25(
1219
1511
  SelectPrimitive.ScrollUpButton,
1220
1512
  {
1221
1513
  "data-slot": "select-scroll-up-button",
@@ -1224,7 +1516,7 @@ function SelectScrollUpButton({
1224
1516
  className
1225
1517
  ),
1226
1518
  ...props,
1227
- children: /* @__PURE__ */ jsx(ChevronUp, { className: "size-4" })
1519
+ children: /* @__PURE__ */ jsx25(ChevronUp, { className: "size-4" })
1228
1520
  }
1229
1521
  );
1230
1522
  }
@@ -1232,7 +1524,7 @@ function SelectScrollDownButton({
1232
1524
  className,
1233
1525
  ...props
1234
1526
  }) {
1235
- return /* @__PURE__ */ jsx(
1527
+ return /* @__PURE__ */ jsx25(
1236
1528
  SelectPrimitive.ScrollDownButton,
1237
1529
  {
1238
1530
  "data-slot": "select-scroll-down-button",
@@ -1241,18 +1533,27 @@ function SelectScrollDownButton({
1241
1533
  className
1242
1534
  ),
1243
1535
  ...props,
1244
- children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-4" })
1536
+ children: /* @__PURE__ */ jsx25(ChevronDown2, { className: "size-4" })
1245
1537
  }
1246
1538
  );
1247
1539
  }
1248
- var Sheet = DialogPrimitive.Root;
1249
- var SheetTrigger = DialogPrimitive.Trigger;
1250
- var SheetClose = DialogPrimitive.Close;
1251
- var SheetPortal = DialogPrimitive.Portal;
1252
- var SheetOverlay = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1253
- DialogPrimitive.Overlay,
1540
+
1541
+ // src/components/sheet.tsx
1542
+ import * as DialogPrimitive2 from "@radix-ui/react-dialog";
1543
+ import { cva as cva10 } from "class-variance-authority";
1544
+ import * as React7 from "react";
1545
+ import { jsx as jsx26, jsxs as jsxs8 } from "react/jsx-runtime";
1546
+ var Sheet = DialogPrimitive2.Root;
1547
+ var SheetTrigger = DialogPrimitive2.Trigger;
1548
+ var SheetClose = DialogPrimitive2.Close;
1549
+ var SheetPortal = DialogPrimitive2.Portal;
1550
+ var SheetOverlay = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
1551
+ DialogPrimitive2.Overlay,
1254
1552
  {
1255
1553
  className: cn(
1554
+ // A modal scrim: a black wash is the point, so it stays a literal
1555
+ // rather than a surface token. Painting it from `background` would
1556
+ // make it a white veil in light mode and near-invisible in dark.
1256
1557
  "fixed inset-0 z-50 bg-black/50 backdrop-blur-sm",
1257
1558
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
1258
1559
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
@@ -1262,16 +1563,16 @@ var SheetOverlay = React5.forwardRef(({ className, ...props }, ref) => /* @__PUR
1262
1563
  ref
1263
1564
  }
1264
1565
  ));
1265
- SheetOverlay.displayName = DialogPrimitive.Overlay.displayName;
1266
- var sheetVariants = cva(
1566
+ SheetOverlay.displayName = DialogPrimitive2.Overlay.displayName;
1567
+ var sheetVariants = cva10(
1267
1568
  "fixed z-50 gap-4 bg-background p-6 shadow-lg will-change-transform transition ease-in-out data-[state=closed]:duration-150 data-[state=open]:duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out",
1268
1569
  {
1269
1570
  variants: {
1270
1571
  side: {
1271
- top: "inset-x-0 top-0 border-b border-primary/5 data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
1272
- bottom: "inset-x-0 bottom-0 border-t border-primary/5 data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
1273
- left: "inset-y-0 left-0 h-full w-3/4 border-r border-primary/5 data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
1274
- right: "inset-y-0 right-0 h-full w-3/4 border-l border-primary/5 data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
1572
+ top: "inset-x-0 top-0 border-b border-border data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
1573
+ bottom: "inset-x-0 bottom-0 border-t border-border data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
1574
+ left: "inset-y-0 left-0 h-full w-3/4 border-r border-border data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
1575
+ right: "inset-y-0 right-0 h-full w-3/4 border-l border-border data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
1275
1576
  }
1276
1577
  },
1277
1578
  defaultVariants: {
@@ -1279,12 +1580,12 @@ var sheetVariants = cva(
1279
1580
  }
1280
1581
  }
1281
1582
  );
1282
- var SheetContent = React5.forwardRef(({ side = "right", className, children, ...props }, ref) => {
1583
+ var SheetContent = React7.forwardRef(({ side = "right", className, children, ...props }, ref) => {
1283
1584
  const portalContainer = usePortalContainer();
1284
- return /* @__PURE__ */ jsxs(SheetPortal, { container: portalContainer, children: [
1285
- /* @__PURE__ */ jsx(SheetOverlay, {}),
1286
- /* @__PURE__ */ jsx(
1287
- DialogPrimitive.Content,
1585
+ return /* @__PURE__ */ jsxs8(SheetPortal, { container: portalContainer, children: [
1586
+ /* @__PURE__ */ jsx26(SheetOverlay, {}),
1587
+ /* @__PURE__ */ jsx26(
1588
+ DialogPrimitive2.Content,
1288
1589
  {
1289
1590
  ref,
1290
1591
  "data-slot": "sheet-content",
@@ -1295,11 +1596,11 @@ var SheetContent = React5.forwardRef(({ side = "right", className, children, ...
1295
1596
  )
1296
1597
  ] });
1297
1598
  });
1298
- SheetContent.displayName = DialogPrimitive.Content.displayName;
1599
+ SheetContent.displayName = DialogPrimitive2.Content.displayName;
1299
1600
  var SheetHeader = ({
1300
1601
  className,
1301
1602
  ...props
1302
- }) => /* @__PURE__ */ jsx(
1603
+ }) => /* @__PURE__ */ jsx26(
1303
1604
  "div",
1304
1605
  {
1305
1606
  className: cn(
@@ -1313,7 +1614,7 @@ SheetHeader.displayName = "SheetHeader";
1313
1614
  var SheetFooter = ({
1314
1615
  className,
1315
1616
  ...props
1316
- }) => /* @__PURE__ */ jsx(
1617
+ }) => /* @__PURE__ */ jsx26(
1317
1618
  "div",
1318
1619
  {
1319
1620
  className: cn(
@@ -1324,31 +1625,38 @@ var SheetFooter = ({
1324
1625
  }
1325
1626
  );
1326
1627
  SheetFooter.displayName = "SheetFooter";
1327
- var SheetTitle = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1328
- DialogPrimitive.Title,
1628
+ var SheetTitle = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
1629
+ DialogPrimitive2.Title,
1329
1630
  {
1330
1631
  ref,
1331
1632
  className: cn("text-lg font-semibold text-foreground", className),
1332
1633
  ...props
1333
1634
  }
1334
1635
  ));
1335
- SheetTitle.displayName = DialogPrimitive.Title.displayName;
1336
- var SheetDescription = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1337
- DialogPrimitive.Description,
1636
+ SheetTitle.displayName = DialogPrimitive2.Title.displayName;
1637
+ var SheetDescription = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
1638
+ DialogPrimitive2.Description,
1338
1639
  {
1339
1640
  ref,
1340
1641
  className: cn("text-sm text-muted-foreground", className),
1341
1642
  ...props
1342
1643
  }
1343
1644
  ));
1344
- SheetDescription.displayName = DialogPrimitive.Description.displayName;
1345
- var Command = forwardRef(
1346
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1347
- Command$1,
1645
+ SheetDescription.displayName = DialogPrimitive2.Description.displayName;
1646
+
1647
+ // src/components/command.tsx
1648
+ import * as DialogPrimitive3 from "@radix-ui/react-dialog";
1649
+ import { Command as CommandPrimitive } from "cmdk";
1650
+ import { Search } from "lucide-react";
1651
+ import { forwardRef as forwardRef22 } from "react";
1652
+ import { jsx as jsx27, jsxs as jsxs9 } from "react/jsx-runtime";
1653
+ var Command = forwardRef22(
1654
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1655
+ CommandPrimitive,
1348
1656
  {
1349
1657
  ref,
1350
1658
  className: cn(
1351
- "flex h-full w-full flex-col overflow-hidden rounded-none bg-background text-foreground",
1659
+ "flex h-full w-full flex-col overflow-hidden rounded-lg bg-background text-foreground",
1352
1660
  className
1353
1661
  ),
1354
1662
  ...props
@@ -1356,11 +1664,14 @@ var Command = forwardRef(
1356
1664
  )
1357
1665
  );
1358
1666
  Command.displayName = "Command";
1359
- var CommandDialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1360
- DialogPrimitive.Overlay,
1667
+ var CommandDialogOverlay = forwardRef22(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1668
+ DialogPrimitive3.Overlay,
1361
1669
  {
1362
1670
  ref,
1363
1671
  className: cn(
1672
+ // A modal scrim: a black wash is the point, so it stays a literal
1673
+ // rather than a surface token. Painting it from `background` would
1674
+ // make it a white veil in light mode and near-invisible in dark.
1364
1675
  "fixed inset-0 z-[99] bg-black/80 backdrop-blur-sm",
1365
1676
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
1366
1677
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
@@ -1373,10 +1684,10 @@ var CommandDialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PU
1373
1684
  CommandDialogOverlay.displayName = "CommandDialogOverlay";
1374
1685
  var CommandDialog = ({ children, ...props }) => {
1375
1686
  const portalContainer = usePortalContainer();
1376
- return /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...props, children: /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { container: portalContainer, children: [
1377
- /* @__PURE__ */ jsx(CommandDialogOverlay, {}),
1378
- /* @__PURE__ */ jsx(
1379
- DialogPrimitive.Content,
1687
+ return /* @__PURE__ */ jsx27(DialogPrimitive3.Root, { ...props, children: /* @__PURE__ */ jsxs9(DialogPrimitive3.Portal, { container: portalContainer, children: [
1688
+ /* @__PURE__ */ jsx27(CommandDialogOverlay, {}),
1689
+ /* @__PURE__ */ jsx27(
1690
+ DialogPrimitive3.Content,
1380
1691
  {
1381
1692
  "data-slot": "command-content",
1382
1693
  className: cn(
@@ -1395,7 +1706,7 @@ var CommandDialog = ({ children, ...props }) => {
1395
1706
  "m-4 sm:m-0",
1396
1707
  // 16px margin on mobile, no margin on desktop
1397
1708
  // Visual
1398
- "overflow-hidden rounded-none border border-primary/5 bg-background shadow-xl",
1709
+ "overflow-hidden rounded-lg border border-border bg-background shadow-xl",
1399
1710
  // Animation
1400
1711
  "duration-200",
1401
1712
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
@@ -1403,20 +1714,20 @@ var CommandDialog = ({ children, ...props }) => {
1403
1714
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
1404
1715
  "data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%]"
1405
1716
  ),
1406
- children: /* @__PURE__ */ jsx(Command, { className: "[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:mb-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-3 [&_[cmdk-item]]:py-2 [&_[cmdk-item]_svg]:h-4 [&_[cmdk-item]_svg]:w-4", children })
1717
+ children: /* @__PURE__ */ jsx27(Command, { className: "[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:mb-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-3 [&_[cmdk-item]]:py-2 [&_[cmdk-item]_svg]:h-4 [&_[cmdk-item]_svg]:w-4", children })
1407
1718
  }
1408
1719
  )
1409
1720
  ] }) });
1410
1721
  };
1411
- var CommandInput = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(
1722
+ var CommandInput = forwardRef22(({ className, ...props }, ref) => /* @__PURE__ */ jsxs9(
1412
1723
  "div",
1413
1724
  {
1414
- className: "flex items-center border-b border-primary/5 px-4",
1725
+ className: "flex items-center border-b border-border px-4",
1415
1726
  "cmdk-input-wrapper": "",
1416
1727
  children: [
1417
- /* @__PURE__ */ jsx(Search, { className: "mr-3 h-5 w-5 shrink-0 text-muted-foreground" }),
1418
- /* @__PURE__ */ jsx(
1419
- Command$1.Input,
1728
+ /* @__PURE__ */ jsx27(Search, { className: "mr-3 h-5 w-5 shrink-0 text-muted-foreground" }),
1729
+ /* @__PURE__ */ jsx27(
1730
+ CommandPrimitive.Input,
1420
1731
  {
1421
1732
  ref,
1422
1733
  className: cn(
@@ -1440,8 +1751,8 @@ var CommandInput = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
1440
1751
  }
1441
1752
  ));
1442
1753
  CommandInput.displayName = "CommandInput";
1443
- var CommandList = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1444
- Command$1.List,
1754
+ var CommandList = forwardRef22(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1755
+ CommandPrimitive.List,
1445
1756
  {
1446
1757
  ref,
1447
1758
  className: cn(
@@ -1455,8 +1766,8 @@ var CommandList = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ j
1455
1766
  }
1456
1767
  ));
1457
1768
  CommandList.displayName = "CommandList";
1458
- var CommandEmpty = forwardRef((props, ref) => /* @__PURE__ */ jsx(
1459
- Command$1.Empty,
1769
+ var CommandEmpty = forwardRef22((props, ref) => /* @__PURE__ */ jsx27(
1770
+ CommandPrimitive.Empty,
1460
1771
  {
1461
1772
  ref,
1462
1773
  className: "py-8 px-4 text-center text-sm text-muted-foreground",
@@ -1464,8 +1775,8 @@ var CommandEmpty = forwardRef((props, ref) => /* @__PURE__ */ jsx(
1464
1775
  }
1465
1776
  ));
1466
1777
  CommandEmpty.displayName = "CommandEmpty";
1467
- var CommandGroup = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1468
- Command$1.Group,
1778
+ var CommandGroup = forwardRef22(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1779
+ CommandPrimitive.Group,
1469
1780
  {
1470
1781
  ref,
1471
1782
  className: cn(
@@ -1479,8 +1790,8 @@ var CommandGroup = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
1479
1790
  }
1480
1791
  ));
1481
1792
  CommandGroup.displayName = "CommandGroup";
1482
- var CommandSeparator = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1483
- Command$1.Separator,
1793
+ var CommandSeparator = forwardRef22(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1794
+ CommandPrimitive.Separator,
1484
1795
  {
1485
1796
  ref,
1486
1797
  className: cn("h-px bg-border my-2", className),
@@ -1488,8 +1799,8 @@ var CommandSeparator = forwardRef(({ className, ...props }, ref) => /* @__PURE__
1488
1799
  }
1489
1800
  ));
1490
1801
  CommandSeparator.displayName = "CommandSeparator";
1491
- var CommandItem = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1492
- Command$1.Item,
1802
+ var CommandItem = forwardRef22(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1803
+ CommandPrimitive.Item,
1493
1804
  {
1494
1805
  ref,
1495
1806
  className: cn(
@@ -1501,7 +1812,7 @@ var CommandItem = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ j
1501
1812
  // Spacing
1502
1813
  "px-3 py-2.5",
1503
1814
  // Visual
1504
- "rounded-none text-base sm:text-sm outline-none",
1815
+ "rounded-sm text-base sm:text-sm outline-none",
1505
1816
  // Transitions
1506
1817
  "transition-all duration-200 ease-(--ease-premium)",
1507
1818
  // Hover state - shared dashboard hover treatment
@@ -1517,9 +1828,9 @@ var CommandItem = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ j
1517
1828
  }
1518
1829
  ));
1519
1830
  CommandItem.displayName = "CommandItem";
1520
- var CommandShortcut = forwardRef(
1831
+ var CommandShortcut = forwardRef22(
1521
1832
  ({ className, ...props }, ref) => {
1522
- return /* @__PURE__ */ jsx(
1833
+ return /* @__PURE__ */ jsx27(
1523
1834
  "span",
1524
1835
  {
1525
1836
  ref,
@@ -1530,7 +1841,7 @@ var CommandShortcut = forwardRef(
1530
1841
  "text-xs font-mono",
1531
1842
  // Visual
1532
1843
  "text-muted-foreground bg-primary/5",
1533
- "border border-primary/5 rounded-none",
1844
+ "border border-border rounded-md",
1534
1845
  // Spacing
1535
1846
  "px-1.5 py-0.5",
1536
1847
  className
@@ -1541,7 +1852,13 @@ var CommandShortcut = forwardRef(
1541
1852
  }
1542
1853
  );
1543
1854
  CommandShortcut.displayName = "CommandShortcut";
1544
- var spinnerVariants = cva("animate-spin motion-reduce:animate-none", {
1855
+
1856
+ // src/components/spinner.tsx
1857
+ import { cva as cva11 } from "class-variance-authority";
1858
+ import { Loader2 } from "lucide-react";
1859
+ import { forwardRef as forwardRef23 } from "react";
1860
+ import { jsx as jsx28 } from "react/jsx-runtime";
1861
+ var spinnerVariants = cva11("animate-spin motion-reduce:animate-none", {
1545
1862
  variants: {
1546
1863
  size: {
1547
1864
  sm: "h-4 w-4",
@@ -1553,9 +1870,9 @@ var spinnerVariants = cva("animate-spin motion-reduce:animate-none", {
1553
1870
  size: "md"
1554
1871
  }
1555
1872
  });
1556
- var Spinner = forwardRef(
1873
+ var Spinner = forwardRef23(
1557
1874
  ({ size = "md", className, "aria-label": ariaLabel = "Loading", ...props }, ref) => {
1558
- return /* @__PURE__ */ jsx(
1875
+ return /* @__PURE__ */ jsx28(
1559
1876
  Loader2,
1560
1877
  {
1561
1878
  ref,
@@ -1568,12 +1885,23 @@ var Spinner = forwardRef(
1568
1885
  }
1569
1886
  );
1570
1887
  Spinner.displayName = "Spinner";
1888
+
1889
+ // src/components/toaster.tsx
1890
+ import {
1891
+ CheckCircle2,
1892
+ AlertCircle,
1893
+ AlertTriangle,
1894
+ XCircle,
1895
+ Loader2 as Loader22
1896
+ } from "lucide-react";
1897
+ import { toast, Toaster as Sonner } from "sonner";
1898
+ import { jsx as jsx29 } from "react/jsx-runtime";
1571
1899
  function Toaster({ theme = "system", ...props }) {
1572
- return /* @__PURE__ */ jsx(
1573
- Toaster$1,
1900
+ return /* @__PURE__ */ jsx29(
1901
+ Sonner,
1574
1902
  {
1575
1903
  theme,
1576
- className: "toaster group !bg-transparent !overflow-visible !z-[9999]",
1904
+ className: "toaster group bg-transparent! overflow-visible! z-[9999]!",
1577
1905
  "data-slot": "toaster",
1578
1906
  toastOptions: {
1579
1907
  classNames: {
@@ -1581,23 +1909,27 @@ function Toaster({ theme = "system", ...props }) {
1581
1909
  }
1582
1910
  },
1583
1911
  icons: {
1584
- success: /* @__PURE__ */ jsx(CheckCircle2, { className: "h-4 w-4" }),
1585
- info: /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4" }),
1586
- warning: /* @__PURE__ */ jsx(AlertTriangle, { className: "h-4 w-4" }),
1587
- error: /* @__PURE__ */ jsx(XCircle, { className: "h-4 w-4" }),
1588
- loading: /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" })
1912
+ success: /* @__PURE__ */ jsx29(CheckCircle2, { className: "h-4 w-4" }),
1913
+ info: /* @__PURE__ */ jsx29(AlertCircle, { className: "h-4 w-4" }),
1914
+ warning: /* @__PURE__ */ jsx29(AlertTriangle, { className: "h-4 w-4" }),
1915
+ error: /* @__PURE__ */ jsx29(XCircle, { className: "h-4 w-4" }),
1916
+ loading: /* @__PURE__ */ jsx29(Loader22, { className: "h-4 w-4 animate-spin" })
1589
1917
  },
1590
1918
  style: {
1591
- "--normal-bg": "hsl(var(--popover, 0 0% 100%))",
1592
- "--normal-text": "hsl(var(--popover-foreground, 222.2 84% 4.9%))",
1593
- "--normal-border": "hsl(var(--border, 214.3 31.8% 91.4%))",
1919
+ "--normal-bg": "var(--nx-popover)",
1920
+ "--normal-text": "var(--nx-popover-foreground)",
1921
+ "--normal-border": "var(--nx-border)",
1594
1922
  "--border-radius": "0px"
1595
1923
  },
1596
1924
  ...props
1597
1925
  }
1598
1926
  );
1599
1927
  }
1600
- var Table = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx(
1928
+
1929
+ // src/components/table.tsx
1930
+ import * as React8 from "react";
1931
+ import { jsx as jsx30 } from "react/jsx-runtime";
1932
+ var Table = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx30(
1601
1933
  "table",
1602
1934
  {
1603
1935
  ref,
@@ -1606,9 +1938,16 @@ var Table = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
1606
1938
  }
1607
1939
  ) }));
1608
1940
  Table.displayName = "Table";
1609
- var TableHeader = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("thead", { ref, className: cn("[&_tr] :border-b border-primary/5", className), ...props }));
1941
+ var TableHeader = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1942
+ "thead",
1943
+ {
1944
+ ref,
1945
+ className: cn("[&_tr]:border-b border-border", className),
1946
+ ...props
1947
+ }
1948
+ ));
1610
1949
  TableHeader.displayName = "TableHeader";
1611
- var TableBody = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1950
+ var TableBody = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1612
1951
  "tbody",
1613
1952
  {
1614
1953
  ref,
@@ -1617,28 +1956,31 @@ var TableBody = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
1617
1956
  }
1618
1957
  ));
1619
1958
  TableBody.displayName = "TableBody";
1620
- var TableFooter = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1959
+ var TableFooter = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1621
1960
  "tfoot",
1622
1961
  {
1623
1962
  ref,
1624
- className: cn("border-t border-primary/5 font-medium [&>tr]:last:border-b-0", className),
1963
+ className: cn(
1964
+ "border-t border-border font-medium [&>tr]:last:border-b-0",
1965
+ className
1966
+ ),
1625
1967
  ...props
1626
1968
  }
1627
1969
  ));
1628
1970
  TableFooter.displayName = "TableFooter";
1629
- var TableRow = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1971
+ var TableRow = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1630
1972
  "tr",
1631
1973
  {
1632
1974
  ref,
1633
1975
  className: cn(
1634
- "border-b border-primary/5 transition-colors data-[state=selected]:bg-primary/5",
1976
+ "border-b border-border transition-colors data-[state=selected]:bg-primary/5",
1635
1977
  className
1636
1978
  ),
1637
1979
  ...props
1638
1980
  }
1639
1981
  ));
1640
1982
  TableRow.displayName = "TableRow";
1641
- var TableHead = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1983
+ var TableHead = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1642
1984
  "th",
1643
1985
  {
1644
1986
  ref,
@@ -1650,7 +1992,7 @@ var TableHead = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
1650
1992
  }
1651
1993
  ));
1652
1994
  TableHead.displayName = "TableHead";
1653
- var TableCell = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1995
+ var TableCell = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1654
1996
  "td",
1655
1997
  {
1656
1998
  ref,
@@ -1662,7 +2004,7 @@ var TableCell = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
1662
2004
  }
1663
2005
  ));
1664
2006
  TableCell.displayName = "TableCell";
1665
- var TableCaption = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2007
+ var TableCaption = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1666
2008
  "caption",
1667
2009
  {
1668
2010
  ref,
@@ -1671,6 +2013,10 @@ var TableCaption = React5.forwardRef(({ className, ...props }, ref) => /* @__PUR
1671
2013
  }
1672
2014
  ));
1673
2015
  TableCaption.displayName = "TableCaption";
2016
+
2017
+ // src/components/table-search.tsx
2018
+ import { Search as Search2, Loader2 as Loader23, X as X2 } from "lucide-react";
2019
+ import { jsx as jsx31, jsxs as jsxs10 } from "react/jsx-runtime";
1674
2020
  function TableSearch({
1675
2021
  value,
1676
2022
  onChange,
@@ -1679,9 +2025,9 @@ function TableSearch({
1679
2025
  isLoading = false,
1680
2026
  inputRef
1681
2027
  }) {
1682
- return /* @__PURE__ */ jsxs("div", { className: "relative w-full max-w-lg", children: [
1683
- /* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
1684
- /* @__PURE__ */ jsx(
2028
+ return /* @__PURE__ */ jsxs10("div", { className: "relative w-full max-w-lg", children: [
2029
+ /* @__PURE__ */ jsx31(Search2, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
2030
+ /* @__PURE__ */ jsx31(
1685
2031
  "input",
1686
2032
  {
1687
2033
  ref: inputRef,
@@ -1690,541 +2036,235 @@ function TableSearch({
1690
2036
  value,
1691
2037
  onChange: (e) => onChange(e.target.value),
1692
2038
  "aria-busy": isLoading,
1693
- className: "h-10 w-full rounded-none border border-primary/5 bg-background pl-10 pr-10 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 transition-all"
2039
+ className: "h-10 w-full rounded-md border border-input bg-background pl-10 pr-10 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 transition-all"
1694
2040
  }
1695
2041
  ),
1696
- (value || isLoading) && /* @__PURE__ */ jsxs("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2", children: [
1697
- isLoading && /* @__PURE__ */ jsx(Loader2, { className: "w-3.5 h-3.5 text-primary animate-spin" }),
1698
- value && /* @__PURE__ */ jsx(
2042
+ (value || isLoading) && /* @__PURE__ */ jsxs10("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2", children: [
2043
+ isLoading && /* @__PURE__ */ jsx31(Loader23, { className: "w-3.5 h-3.5 text-primary animate-spin" }),
2044
+ value && /* @__PURE__ */ jsx31(
1699
2045
  "button",
1700
2046
  {
1701
2047
  type: "button",
1702
2048
  onClick: onClear,
1703
- className: "text-muted-foreground/60 hover:text-foreground transition-colors p-0.5 rounded-none hover:bg-primary/5",
2049
+ className: "text-muted-foreground hover:text-foreground transition-colors p-0.5 rounded-md hover:bg-primary/5",
1704
2050
  "aria-label": "Clear search",
1705
- children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5" })
2051
+ children: /* @__PURE__ */ jsx31(X2, { className: "w-3.5 h-3.5" })
1706
2052
  }
1707
2053
  )
1708
2054
  ] })
1709
2055
  ] });
1710
2056
  }
2057
+
2058
+ // src/components/table-states.tsx
2059
+ import { AlertCircle as AlertCircle2, Loader2 as Loader24, FileQuestion } from "lucide-react";
2060
+ import { jsx as jsx32, jsxs as jsxs11 } from "react/jsx-runtime";
1711
2061
  function TableError({
1712
2062
  message = "An error occurred. Please try again."
1713
2063
  }) {
1714
- return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1715
- /* @__PURE__ */ jsx(AlertCircle, { className: "w-4 h-4 shrink-0" }),
1716
- /* @__PURE__ */ jsx("span", { children: message })
2064
+ return /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
2065
+ /* @__PURE__ */ jsx32(AlertCircle2, { className: "w-4 h-4 shrink-0" }),
2066
+ /* @__PURE__ */ jsx32("span", { children: message })
1717
2067
  ] });
1718
2068
  }
1719
2069
  function TableLoading() {
1720
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-4 p-12 text-muted-foreground", children: [
1721
- /* @__PURE__ */ jsx(Loader2, { className: "w-8 h-8 animate-spin text-primary/80" }),
1722
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Loading data..." })
2070
+ return /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center justify-center gap-4 p-12 text-muted-foreground", children: [
2071
+ /* @__PURE__ */ jsx32(Loader24, { className: "w-8 h-8 animate-spin text-primary/80" }),
2072
+ /* @__PURE__ */ jsx32("span", { className: "text-sm font-medium", children: "Loading data..." })
1723
2073
  ] });
1724
2074
  }
1725
2075
  function TableEmpty({ message = "No records found" }) {
1726
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-4 p-16 text-center text-muted-foreground", children: [
1727
- /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-none bg-primary/5", children: /* @__PURE__ */ jsx(FileQuestion, { className: "h-6 w-6" }) }),
1728
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: message })
2076
+ return /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center justify-center gap-4 p-16 text-center text-muted-foreground", children: [
2077
+ /* @__PURE__ */ jsx32("div", { className: "flex h-12 w-12 items-center justify-center rounded-md bg-primary/5", children: /* @__PURE__ */ jsx32(FileQuestion, { className: "h-6 w-6" }) }),
2078
+ /* @__PURE__ */ jsx32("span", { className: "text-sm font-medium", children: message })
1729
2079
  ] });
1730
2080
  }
1731
- function renderPageNumbers(currentPage, totalPages, maxVisiblePages, onPageChange) {
1732
- const getBtnClass = (active) => `flex h-8 w-8 items-center justify-center border-y border-primary/5 border-r border-primary/5 text-xs z-10 -ml-px transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${active ? "!bg-primary !text-primary-foreground !border-primary z-20" : "!bg-background !border-primary/5 hover-muted disabled:opacity-50"}`;
1733
- if (totalPages <= maxVisiblePages) {
1734
- return Array.from({ length: totalPages }).map((_, i) => /* @__PURE__ */ jsx(
1735
- "button",
1736
- {
1737
- onClick: () => onPageChange(i),
1738
- "aria-label": `Go to page ${i + 1}`,
1739
- "aria-current": currentPage === i ? "page" : void 0,
1740
- className: getBtnClass(currentPage === i),
1741
- children: i + 1
1742
- },
1743
- `page-${i}`
1744
- ));
1745
- }
1746
- const pages = [];
1747
- const startPage = Math.max(0, currentPage - Math.floor(maxVisiblePages / 2));
1748
- const endPage = Math.min(totalPages - 1, startPage + maxVisiblePages - 1);
1749
- if (startPage > 0) {
1750
- pages.push(
1751
- /* @__PURE__ */ jsx(
1752
- "button",
1753
- {
1754
- onClick: () => onPageChange(0),
1755
- "aria-label": "Go to page 1",
1756
- className: getBtnClass(currentPage === 0),
1757
- children: "1"
1758
- },
1759
- "page-0"
1760
- )
1761
- );
1762
- if (startPage > 1) {
1763
- pages.push(
1764
- /* @__PURE__ */ jsx(
1765
- "span",
1766
- {
1767
- className: "flex h-8 w-8 items-center justify-center border-y border-primary/5 border-r border-primary/5 !border-primary/5 !bg-background text-muted-foreground text-xs -ml-px",
1768
- "aria-hidden": "true",
1769
- children: "..."
1770
- },
1771
- "ellipsis-start"
1772
- )
1773
- );
1774
- }
1775
- }
1776
- for (let i = startPage; i <= endPage; i++) {
1777
- pages.push(
1778
- /* @__PURE__ */ jsx(
1779
- "button",
1780
- {
1781
- onClick: () => onPageChange(i),
1782
- "aria-label": `Go to page ${i + 1}`,
1783
- "aria-current": currentPage === i ? "page" : void 0,
1784
- className: getBtnClass(currentPage === i),
1785
- children: i + 1
1786
- },
1787
- i
1788
- )
1789
- );
1790
- }
1791
- if (endPage < totalPages - 1) {
1792
- if (endPage < totalPages - 2) {
1793
- pages.push(
1794
- /* @__PURE__ */ jsx(
1795
- "span",
1796
- {
1797
- className: "flex h-8 w-8 items-center justify-center border-y border-primary/5 border-r border-primary/5 !border-primary/5 !bg-background text-muted-foreground text-xs -ml-px",
1798
- "aria-hidden": "true",
1799
- children: "..."
1800
- },
1801
- "ellipsis-end"
1802
- )
1803
- );
1804
- }
1805
- pages.push(
1806
- /* @__PURE__ */ jsx(
1807
- "button",
1808
- {
1809
- onClick: () => onPageChange(totalPages - 1),
1810
- "aria-label": `Go to page ${totalPages}`,
1811
- className: getBtnClass(currentPage === totalPages - 1),
1812
- children: totalPages
1813
- },
1814
- totalPages - 1
1815
- )
1816
- );
1817
- }
1818
- return pages;
1819
- }
1820
- function TablePagination({
1821
- meta,
1822
- onPageChange,
1823
- onPageSizeChange,
1824
- config,
1825
- isLoading = false
1826
- }) {
1827
- const {
1828
- showPageSizeSelector = true,
1829
- pageSizeOptions = [10, 20, 30, 50],
1830
- maxVisiblePages = 5
1831
- } = config || {};
1832
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row w-full items-center justify-between gap-4 text-xs sm:text-sm text-muted-foreground p-4 border-t border-primary/5", children: [
1833
- /* @__PURE__ */ jsxs("div", { className: "whitespace-nowrap order-2 sm:order-1", children: [
1834
- "Showing ",
1835
- (meta.page - 1) * meta.limit + 1,
1836
- "-",
1837
- Math.min(meta.page * meta.limit, meta.total),
1838
- " of ",
1839
- meta.total,
1840
- " entries"
1841
- ] }),
1842
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-4 sm:gap-6 lg:gap-8 order-1 sm:order-2", children: [
1843
- showPageSizeSelector && /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
1844
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap hidden sm:inline-block", children: "Rows per page" }),
1845
- /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1846
- /* @__PURE__ */ jsx(
1847
- "select",
1848
- {
1849
- id: "pageSize",
1850
- value: meta.limit,
1851
- onChange: (e) => {
1852
- const newPageSize = Number(e.target.value);
1853
- onPageSizeChange(newPageSize);
1854
- },
1855
- className: "h-8 w-[70px] appearance-none rounded-none border border-primary/5 bg-background px-2 py-1 text-sm font-medium focus-visible:outline-none focus:ring-1 focus:ring-ring disabled:opacity-50 hover-muted cursor-pointer",
1856
- disabled: isLoading,
1857
- children: pageSizeOptions.map((size) => /* @__PURE__ */ jsx("option", { value: size, children: size }, size))
1858
- }
1859
- ),
1860
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-muted-foreground", children: /* @__PURE__ */ jsx(
1861
- "svg",
1862
- {
1863
- className: "h-3 w-3",
1864
- fill: "none",
1865
- viewBox: "0 0 24 24",
1866
- stroke: "currentColor",
1867
- children: /* @__PURE__ */ jsx(
1868
- "path",
1869
- {
1870
- strokeLinecap: "round",
1871
- strokeLinejoin: "round",
1872
- strokeWidth: 2,
1873
- d: "M19 9l-7 7-7-7"
1874
- }
1875
- )
1876
- }
1877
- ) })
1878
- ] })
1879
- ] }),
1880
- /* @__PURE__ */ jsxs("div", { className: "flex items-center -space-x-px", children: [
1881
- /* @__PURE__ */ jsx(
1882
- "button",
1883
- {
1884
- onClick: () => onPageChange(0),
1885
- disabled: meta.page === 0 || isLoading,
1886
- className: "hidden sm:flex h-8 w-8 items-center justify-center rounded-none border border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1887
- "aria-label": "First page",
1888
- children: /* @__PURE__ */ jsx(ChevronsLeft, { className: "h-4 w-4" })
1889
- }
1890
- ),
1891
- /* @__PURE__ */ jsx(
1892
- "button",
1893
- {
1894
- onClick: () => onPageChange(meta.page - 1),
1895
- disabled: meta.page === 0 || isLoading,
1896
- className: "flex h-8 w-8 items-center justify-center rounded-none sm:rounded-none border border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1897
- "aria-label": "Previous page",
1898
- children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
1899
- }
1900
- ),
1901
- /* @__PURE__ */ jsx("div", { className: "flex", children: renderPageNumbers(
1902
- meta.page,
1903
- meta.totalPages,
1904
- maxVisiblePages,
1905
- onPageChange
1906
- ) }),
1907
- /* @__PURE__ */ jsx(
1908
- "button",
1909
- {
1910
- onClick: () => onPageChange(meta.page + 1),
1911
- disabled: meta.page >= meta.totalPages - 1 || isLoading,
1912
- className: "flex h-8 w-8 items-center justify-center rounded-none sm:rounded-none border-y border-primary/5 border-x border-primary/5 sm :border-r border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1913
- "aria-label": "Next page",
1914
- children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
1915
- }
1916
- ),
1917
- /* @__PURE__ */ jsx(
1918
- "button",
1919
- {
1920
- onClick: () => onPageChange(meta.totalPages - 1),
1921
- disabled: meta.page >= meta.totalPages - 1 || isLoading,
1922
- className: "hidden sm:flex h-8 w-8 items-center justify-center rounded-none border border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1923
- "aria-label": "Last page",
1924
- children: /* @__PURE__ */ jsx(ChevronsRight, { className: "h-4 w-4" })
1925
- }
1926
- )
1927
- ] }),
1928
- /* @__PURE__ */ jsxs("div", { className: "whitespace-nowrap hidden sm:block", children: [
1929
- "Page ",
1930
- meta.page + 1,
1931
- " of ",
1932
- meta.totalPages
1933
- ] })
1934
- ] })
1935
- ] });
1936
- }
1937
- var GrayBar = ({ className }) => /* @__PURE__ */ jsx(Skeleton, { className });
2081
+
2082
+ // src/components/table-skeleton.tsx
2083
+ import { Fragment, jsx as jsx33, jsxs as jsxs12 } from "react/jsx-runtime";
2084
+ var GrayBar = ({ className }) => /* @__PURE__ */ jsx33(Skeleton, { className });
1938
2085
  var TableSkeleton = ({
1939
2086
  columns = 5,
1940
2087
  rowCount = 8,
1941
2088
  hideWrapper = false,
1942
2089
  hideFooter = false
1943
2090
  }) => {
1944
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
1945
- /* @__PURE__ */ jsx("div", { className: "border-0 rounded-none shadow-none", children: /* @__PURE__ */ jsxs(Table, { children: [
1946
- /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsx(TableRow, { children: Array.from({ length: columns }).map((_, colIdx) => /* @__PURE__ */ jsx(TableHead, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-4 rounded-none" }) }) : colIdx === 1 ? /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-[70%] max-w-[180px]" }) : /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-[60%] max-w-[120px]" }) }, `skeleton-header-${colIdx}`)) }) }),
1947
- /* @__PURE__ */ jsx(TableBody, { children: Array.from({ length: rowCount }).map((_, rowIdx) => /* @__PURE__ */ jsx(TableRow, { className: "border-b border-primary/5", children: Array.from({ length: columns }).map((_2, colIdx) => /* @__PURE__ */ jsx(TableCell, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-8 rounded-none" }) }) : colIdx === 1 ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
1948
- /* @__PURE__ */ jsx(Skeleton, { className: "w-9 rounded-none shrink-0" }),
1949
- /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 flex-1", children: [
1950
- /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-[120px]" }),
1951
- /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-[80px]" })
2091
+ const content = /* @__PURE__ */ jsxs12(Fragment, { children: [
2092
+ /* @__PURE__ */ jsx33("div", { className: "border-0 rounded-none shadow-none", children: /* @__PURE__ */ jsxs12(Table, { children: [
2093
+ /* @__PURE__ */ jsx33(TableHeader, { children: /* @__PURE__ */ jsx33(TableRow, { children: Array.from({ length: columns }).map((_, colIdx) => /* @__PURE__ */ jsx33(TableHead, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsx33("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx33(Skeleton, { className: "h-4 w-4 rounded-sm" }) }) : colIdx === 1 ? /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-[70%] max-w-[180px]" }) : /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-[60%] max-w-[120px]" }) }, `skeleton-header-${colIdx}`)) }) }),
2094
+ /* @__PURE__ */ jsx33(TableBody, { children: Array.from({ length: rowCount }).map((_, rowIdx) => /* @__PURE__ */ jsx33(TableRow, { className: "border-b border-border", children: Array.from({ length: columns }).map((_2, colIdx) => /* @__PURE__ */ jsx33(TableCell, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsx33("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx33(Skeleton, { className: "h-8 w-8 rounded-md" }) }) : colIdx === 1 ? /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-3", children: [
2095
+ /* @__PURE__ */ jsx33(Skeleton, { className: "w-9 rounded-md shrink-0" }),
2096
+ /* @__PURE__ */ jsxs12("div", { className: "space-y-1.5 flex-1", children: [
2097
+ /* @__PURE__ */ jsx33(Skeleton, { className: "h-4 w-[120px]" }),
2098
+ /* @__PURE__ */ jsx33(Skeleton, { className: "h-3 w-[80px]" })
1952
2099
  ] })
1953
- ] }) : /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-[60%] max-w-[120px]" }) }, colIdx)) }, rowIdx)) })
2100
+ ] }) : /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-[60%] max-w-[120px]" }) }, colIdx)) }, rowIdx)) })
1954
2101
  ] }) }),
1955
- !hideFooter && /* @__PURE__ */ jsx("div", { className: "table-footer border-t border-primary/5", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-2 py-4 p-4", children: [
1956
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 text-sm", children: /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-[120px]" }) }),
1957
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
1958
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1959
- /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-20" }),
1960
- /* @__PURE__ */ jsx(GrayBar, { className: "h-8 w-[70px]" })
2102
+ !hideFooter && /* @__PURE__ */ jsx33("div", { className: "table-footer border-t border-border", children: /* @__PURE__ */ jsxs12("div", { className: "flex items-center justify-between px-2 py-4 p-4", children: [
2103
+ /* @__PURE__ */ jsx33("div", { className: "flex items-center gap-2 text-sm", children: /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-[120px]" }) }),
2104
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-6", children: [
2105
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
2106
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-20" }),
2107
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-8 w-[70px]" })
1961
2108
  ] }),
1962
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
1963
- /* @__PURE__ */ jsx(GrayBar, { className: "h-8 w-8" }),
1964
- /* @__PURE__ */ jsx(GrayBar, { className: "h-8 w-8" }),
1965
- /* @__PURE__ */ jsx(GrayBar, { className: "h-8 w-8" }),
1966
- /* @__PURE__ */ jsx(GrayBar, { className: "h-8 w-8" }),
1967
- /* @__PURE__ */ jsx(GrayBar, { className: "h-8 w-8" })
2109
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-1", children: [
2110
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-8 w-8" }),
2111
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-8 w-8" }),
2112
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-8 w-8" }),
2113
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-8 w-8" }),
2114
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-8 w-8" })
1968
2115
  ] }),
1969
- /* @__PURE__ */ jsx(GrayBar, { className: "h-4 w-[120px]" })
2116
+ /* @__PURE__ */ jsx33(GrayBar, { className: "h-4 w-[120px]" })
1970
2117
  ] })
1971
2118
  ] }) })
1972
2119
  ] });
1973
2120
  if (hideWrapper) {
1974
2121
  return content;
1975
2122
  }
1976
- return /* @__PURE__ */ jsx("div", { className: "table-wrapper rounded-none border border-primary/5 bg-card overflow-hidden", children: content });
2123
+ return /* @__PURE__ */ jsx33("div", { className: "table-wrapper rounded-md border border-border bg-card overflow-hidden", children: content });
1977
2124
  };
1978
2125
  TableSkeleton.displayName = "TableSkeleton";
1979
- function ResponsiveTableInner({
1980
- data,
1981
- columns,
1982
- onRowClick,
1983
- renderMobileCard,
1984
- className,
1985
- emptyMessage = "No results found.",
1986
- ariaLabel,
1987
- tableWrapperClassName,
1988
- footer
1989
- }, ref) {
1990
- const visibleMobileColumns = React5.useMemo(
1991
- () => columns.filter((col) => !col.hideOnMobile),
1992
- [columns]
1993
- );
1994
- const primaryColumn = React5.useMemo(() => {
1995
- return visibleMobileColumns.find(
1996
- (col) => col.key !== "select" && col.key !== "actions"
1997
- ) || visibleMobileColumns[0];
1998
- }, [visibleMobileColumns]);
1999
- const secondaryColumns = React5.useMemo(
2000
- () => visibleMobileColumns.filter((col) => col.key !== primaryColumn?.key),
2001
- [visibleMobileColumns, primaryColumn]
2002
- );
2003
- React5.useEffect(() => {
2004
- const isDev = typeof globalThis !== "undefined" && globalThis.process && globalThis.process.env?.NODE_ENV === "development";
2005
- if (isDev && visibleMobileColumns.length === 0) {
2006
- console.warn(
2007
- "ResponsiveTable: All columns are hidden on mobile (hideOnMobile: true). Consider showing at least one column for better mobile UX. Users will see empty card borders on mobile devices."
2008
- );
2009
- }
2010
- }, [visibleMobileColumns.length]);
2011
- const handleItemClick = React5.useCallback(
2012
- (item, e) => {
2013
- if (!onRowClick) return;
2014
- if (e) {
2015
- const target = e.target;
2016
- if (target.closest('[role="checkbox"]') || target.closest("button") || target.closest("a") || target.closest('[role^="menuitem"]') || target.closest("[data-actions]")) {
2017
- return;
2018
- }
2019
- }
2020
- onRowClick(item);
2021
- },
2022
- [onRowClick]
2023
- );
2024
- const handleCardKeyDown = React5.useCallback(
2025
- (item) => (e) => {
2026
- if (onRowClick && (e.key === "Enter" || e.key === " ")) {
2027
- e.preventDefault();
2028
- handleItemClick(item, e);
2029
- }
2030
- },
2031
- [handleItemClick, onRowClick]
2032
- );
2033
- if (data.length === 0) {
2034
- return /* @__PURE__ */ jsx(
2035
- "div",
2036
- {
2037
- ref,
2038
- className: cn(
2039
- "p-8 text-center",
2040
- className
2041
- ),
2042
- children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage })
2043
- }
2044
- );
2045
- }
2046
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), children: [
2047
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 md:hidden", children: data.map((item) => {
2048
- const primaryValue = primaryColumn ? String(item[primaryColumn.key]) : String(item.id);
2049
- if (renderMobileCard) {
2050
- return /* @__PURE__ */ jsx(
2051
- "div",
2052
- {
2053
- onClick: (e) => handleItemClick(item, e),
2054
- role: onRowClick ? "button" : void 0,
2055
- tabIndex: onRowClick ? 0 : void 0,
2056
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2057
- className: onRowClick ? "cursor-pointer" : void 0,
2058
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2059
- children: renderMobileCard(item, visibleMobileColumns)
2060
- },
2061
- item.id
2062
- );
2063
- }
2064
- return /* @__PURE__ */ jsxs(
2065
- Card,
2066
- {
2067
- variant: onRowClick ? "interactive" : "default",
2068
- className: cn(
2069
- onRowClick && "cursor-pointer",
2070
- "transition-all duration-150"
2071
- ),
2072
- onClick: (e) => handleItemClick(item, e),
2073
- role: onRowClick ? "button" : void 0,
2074
- tabIndex: onRowClick ? 0 : void 0,
2075
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2076
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2077
- children: [
2078
- primaryColumn ? /* @__PURE__ */ jsx(CardHeader, { className: "pb-3", children: /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: primaryColumn.render ? primaryColumn.render(item[primaryColumn.key], item) : String(item[primaryColumn.key]) }) }) : null,
2079
- secondaryColumns.length > 0 && /* @__PURE__ */ jsx(CardContent, { className: "pb-3", children: /* @__PURE__ */ jsx("dl", { className: "flex flex-col gap-2", children: secondaryColumns.map((column) => /* @__PURE__ */ jsxs(
2080
- "div",
2081
- {
2082
- className: "flex items-start justify-between gap-4 text-sm",
2083
- children: [
2084
- !column.hideLabelOnMobile && /* @__PURE__ */ jsxs("dt", { className: "text-muted-foreground min-w-[80px] shrink-0", children: [
2085
- column.label,
2086
- ":"
2087
- ] }),
2088
- /* @__PURE__ */ jsx(
2089
- "dd",
2090
- {
2091
- className: cn(
2092
- "font-medium flex-1",
2093
- !column.hideLabelOnMobile ? "text-right" : "text-left"
2094
- ),
2095
- children: column.render ? column.render(item[column.key], item) : String(item[column.key])
2096
- }
2097
- )
2098
- ]
2099
- },
2100
- String(column.key)
2101
- )) }) })
2102
- ]
2103
- },
2104
- item.id
2105
- );
2106
- }) }),
2107
- /* @__PURE__ */ jsx(
2108
- "div",
2109
- {
2110
- className: cn(
2111
- "table-wrapper hidden md:block overflow-hidden rounded-none border border-primary/5",
2112
- tableWrapperClassName
2113
- ),
2114
- children: /* @__PURE__ */ jsxs(Table, { "aria-label": ariaLabel || "Data table", children: [
2115
- /* @__PURE__ */ jsx(TableHeader, { className: "bg-[hsl(var(--table-header-bg))]", children: /* @__PURE__ */ jsx(TableRow, { children: columns.map((column) => /* @__PURE__ */ jsx(
2116
- TableHead,
2117
- {
2118
- className: column.headerClassName,
2119
- children: column.label
2120
- },
2121
- String(column.key)
2122
- )) }) }),
2123
- /* @__PURE__ */ jsx(TableBody, { children: data.map((item) => {
2124
- const primaryValue = primaryColumn ? String(item[primaryColumn.key]) : String(item.id);
2125
- return /* @__PURE__ */ jsx(
2126
- TableRow,
2127
- {
2128
- className: cn(
2129
- "hover-unified-table-row",
2130
- onRowClick && "cursor-pointer"
2131
- ),
2132
- onClick: (e) => handleItemClick(item, e),
2133
- role: onRowClick ? "button" : void 0,
2134
- tabIndex: onRowClick ? 0 : void 0,
2135
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2136
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2137
- children: columns.map((column) => /* @__PURE__ */ jsx(
2138
- TableCell,
2139
- {
2140
- className: column.cellClassName,
2141
- children: column.render ? column.render(item[column.key], item) : String(item[column.key])
2142
- },
2143
- String(column.key)
2144
- ))
2145
- },
2146
- item.id
2147
- );
2148
- }) })
2149
- ] })
2150
- }
2151
- ),
2152
- footer && /* @__PURE__ */ jsx("div", { className: "table-footer border-t border-primary/5 bg-[hsl(var(--table-header-bg))]", children: footer })
2153
- ] });
2154
- }
2155
- var ResponsiveTable = React5.forwardRef(ResponsiveTableInner);
2156
-
2157
- // src/tailwind-preset.ts
2158
- var uiPreset = {
2159
- theme: {
2160
- extend: {
2161
- colors: {
2162
- border: "hsl(var(--border))",
2163
- input: "hsl(var(--input))",
2164
- ring: "hsl(var(--ring))",
2165
- background: "hsl(var(--background))",
2166
- foreground: "hsl(var(--foreground))",
2167
- primary: {
2168
- DEFAULT: "hsl(var(--primary))",
2169
- foreground: "hsl(var(--primary-foreground))"
2170
- },
2171
- secondary: {
2172
- DEFAULT: "hsl(var(--secondary))",
2173
- foreground: "hsl(var(--secondary-foreground))"
2174
- },
2175
- destructive: {
2176
- DEFAULT: "hsl(var(--destructive))",
2177
- foreground: "hsl(var(--destructive-foreground))"
2178
- },
2179
- success: {
2180
- DEFAULT: "hsl(var(--success))",
2181
- foreground: "hsl(var(--success-foreground))"
2182
- },
2183
- warning: {
2184
- DEFAULT: "hsl(var(--warning))",
2185
- foreground: "hsl(var(--warning-foreground))"
2186
- },
2187
- muted: {
2188
- DEFAULT: "hsl(var(--muted))",
2189
- foreground: "hsl(var(--muted-foreground))"
2190
- },
2191
- accent: {
2192
- DEFAULT: "hsl(var(--accent))",
2193
- foreground: "hsl(var(--accent-foreground))"
2194
- },
2195
- popover: {
2196
- DEFAULT: "hsl(var(--popover))",
2197
- foreground: "hsl(var(--popover-foreground))"
2198
- },
2199
- card: {
2200
- DEFAULT: "hsl(var(--card))",
2201
- foreground: "hsl(var(--card-foreground))"
2202
- }
2203
- },
2204
- borderRadius: {
2205
- lg: "var(--radius)",
2206
- md: "calc(var(--radius) - 2px)",
2207
- sm: "calc(var(--radius) - 4px)"
2208
- },
2209
- keyframes: {
2210
- "accordion-down": {
2211
- from: { height: "0" },
2212
- to: { height: "var(--radix-accordion-content-height)" }
2213
- },
2214
- "accordion-up": {
2215
- from: { height: "var(--radix-accordion-content-height)" },
2216
- to: { height: "0" }
2217
- }
2218
- },
2219
- animation: {
2220
- "accordion-down": "accordion-down 0.3s cubic-bezier(0.87, 0, 0.13, 1)",
2221
- "accordion-up": "accordion-up 0.3s cubic-bezier(0.87, 0, 0.13, 1)"
2222
- }
2223
- }
2224
- }
2126
+ export {
2127
+ Accordion,
2128
+ AccordionContent,
2129
+ AccordionItem,
2130
+ AccordionTrigger,
2131
+ Alert,
2132
+ AlertDescription,
2133
+ AlertDialog,
2134
+ AlertDialogAction,
2135
+ AlertDialogCancel,
2136
+ AlertDialogContent,
2137
+ AlertDialogDescription,
2138
+ AlertDialogFooter,
2139
+ AlertDialogHeader,
2140
+ AlertDialogOverlay,
2141
+ AlertDialogPortal,
2142
+ AlertDialogTitle,
2143
+ AlertDialogTrigger,
2144
+ AlertTitle,
2145
+ Avatar,
2146
+ AvatarFallback,
2147
+ AvatarImage,
2148
+ Badge,
2149
+ Button,
2150
+ Card,
2151
+ CardAction,
2152
+ CardContent,
2153
+ CardDescription,
2154
+ CardFooter,
2155
+ CardHeader,
2156
+ CardTitle,
2157
+ Checkbox,
2158
+ Collapsible,
2159
+ CollapsibleContent2 as CollapsibleContent,
2160
+ CollapsibleTrigger2 as CollapsibleTrigger,
2161
+ Command,
2162
+ CommandDialog,
2163
+ CommandEmpty,
2164
+ CommandGroup,
2165
+ CommandInput,
2166
+ CommandItem,
2167
+ CommandList,
2168
+ CommandSeparator,
2169
+ CommandShortcut,
2170
+ Dialog,
2171
+ DialogClose,
2172
+ DialogContent,
2173
+ DialogDescription,
2174
+ DialogFooter,
2175
+ DialogHeader,
2176
+ DialogOverlay,
2177
+ DialogPortal,
2178
+ DialogTitle,
2179
+ DialogTrigger,
2180
+ DropdownMenu,
2181
+ DropdownMenuCheckboxItem,
2182
+ DropdownMenuContent,
2183
+ DropdownMenuGroup,
2184
+ DropdownMenuItem,
2185
+ DropdownMenuLabel,
2186
+ DropdownMenuPortal,
2187
+ DropdownMenuRadioGroup,
2188
+ DropdownMenuRadioItem,
2189
+ DropdownMenuSeparator,
2190
+ DropdownMenuShortcut,
2191
+ DropdownMenuSub,
2192
+ DropdownMenuSubContent,
2193
+ DropdownMenuSubTrigger,
2194
+ DropdownMenuTrigger,
2195
+ FormLabelWithTooltip,
2196
+ Grid,
2197
+ Input,
2198
+ Label,
2199
+ Popover,
2200
+ PopoverAnchor,
2201
+ PopoverContent,
2202
+ PopoverTrigger,
2203
+ PortalProvider,
2204
+ Progress,
2205
+ RadioGroup,
2206
+ RadioGroupItem,
2207
+ Select,
2208
+ SelectContent,
2209
+ SelectGroup,
2210
+ SelectItem,
2211
+ SelectLabel,
2212
+ SelectScrollDownButton,
2213
+ SelectScrollUpButton,
2214
+ SelectSeparator,
2215
+ SelectTrigger,
2216
+ SelectValue,
2217
+ Separator,
2218
+ Sheet,
2219
+ SheetClose,
2220
+ SheetContent,
2221
+ SheetDescription,
2222
+ SheetFooter,
2223
+ SheetHeader,
2224
+ SheetOverlay,
2225
+ SheetPortal,
2226
+ SheetTitle,
2227
+ SheetTrigger,
2228
+ Skeleton,
2229
+ Spinner,
2230
+ Stack,
2231
+ Stat,
2232
+ Switch,
2233
+ Table,
2234
+ TableBody,
2235
+ TableCaption,
2236
+ TableCell,
2237
+ TableEmpty,
2238
+ TableError,
2239
+ TableFooter,
2240
+ TableHead,
2241
+ TableHeader,
2242
+ TableLoading,
2243
+ TableRow,
2244
+ TableSearch,
2245
+ TableSkeleton,
2246
+ Tabs,
2247
+ TabsContent,
2248
+ TabsList,
2249
+ TabsTrigger,
2250
+ Textarea,
2251
+ Toaster,
2252
+ Tooltip,
2253
+ TooltipContent,
2254
+ TooltipProvider,
2255
+ TooltipTrigger,
2256
+ alertVariants,
2257
+ avatarVariants,
2258
+ badgeVariants,
2259
+ buttonVariants,
2260
+ cardVariants,
2261
+ dialogContentVariants,
2262
+ inputVariants,
2263
+ progressVariants,
2264
+ selectTriggerVariants,
2265
+ sheetVariants,
2266
+ spinnerVariants,
2267
+ toast,
2268
+ usePortalContainer
2225
2269
  };
2226
- var tailwind_preset_default = uiPreset;
2227
-
2228
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Input, Label, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalProvider, Progress, RadioGroup, RadioGroupItem, ResponsiveTable, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableEmpty, TableError, TableFooter, TableHead, TableHeader, TableLoading, TablePagination, TableRow, TableSearch, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alertVariants, avatarVariants, badgeVariants, buttonVariants, cardVariants, cn, dialogContentVariants, inputVariants, progressVariants, selectTriggerVariants, sheetVariants, spinnerVariants, tailwind_preset_default as uiPreset, usePortalContainer };
2229
- //# sourceMappingURL=index.mjs.map
2230
2270
  //# sourceMappingURL=index.mjs.map