@nextlyhq/ui 0.0.2-alpha.34 → 0.0.2-alpha.37

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
@@ -6,8 +6,8 @@ import { clsx } from 'clsx';
6
6
  import { twMerge } from 'tailwind-merge';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import { Root as Root$2 } from '@radix-ui/react-label';
9
- import { Info, Minus, Check, ChevronDown, X, ChevronRight, Circle, Search, Loader2, ChevronUp, XCircle, AlertTriangle, AlertCircle, CheckCircle2, FileQuestion, ChevronsLeft, ChevronLeft, ChevronsRight } from 'lucide-react';
10
- import { Content, Provider, Root, Trigger } from '@radix-ui/react-tooltip';
9
+ import { Info, Minus, Check, ChevronDown, X, ChevronRight, Circle, Search, Loader2, ChevronUp, XCircle, AlertTriangle, AlertCircle, CheckCircle2, FileQuestion } from 'lucide-react';
10
+ import { Portal, Content, Provider, Root, Trigger } from '@radix-ui/react-tooltip';
11
11
  import * as SeparatorPrimitive from '@radix-ui/react-separator';
12
12
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
13
13
  import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
@@ -36,20 +36,26 @@ var buttonVariants = cva(
36
36
  variant: {
37
37
  default: "bg-primary text-primary-foreground border border-transparent hover:opacity-90",
38
38
  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",
39
+ // Solid fill uses the emphasis token so white on-color text stays AA in
40
+ // dark mode (the base token is the readable text color, too light here).
41
+ // Hover darkens to a deeper shade instead of opacity-90, which would
42
+ // composite the fill toward the page and drop white text under 4.5:1.
43
+ destructive: "bg-destructive-solid text-destructive-foreground border border-transparent hover:bg-destructive-700",
44
+ // border-border (not a faint primary alpha) so the outline is a visible
45
+ // boundary at the 3:1 UI minimum.
46
+ outline: "border border-border text-foreground hover-unified bg-background",
47
+ secondary: "bg-background border border-border text-foreground hover:bg-primary/5",
42
48
  ghost: "text-foreground border border-transparent hover-unified",
43
49
  link: "text-primary border border-transparent underline-offset-4 hover:underline"
44
50
  },
45
51
  size: {
46
- default: "h-[var(--control-height)] px-6 py-2",
47
- sm: "h-[var(--control-height-md)] px-4 text-[13px]",
48
- md: "h-[var(--control-height)] px-6 text-sm",
49
- lg: "h-[var(--control-height-lg)] px-8 text-base",
50
- icon: "h-[var(--control-height)] w-[var(--control-height)] p-0",
51
- "icon-sm": "h-[var(--control-height-md)] w-[var(--control-height-md)] p-0",
52
- "icon-lg": "h-[var(--control-height-lg)] w-[var(--control-height-lg)] p-0"
52
+ default: "h-[var(--nx-control-height)] px-6 py-2",
53
+ sm: "h-[var(--nx-control-height-md)] px-4 text-[13px]",
54
+ md: "h-[var(--nx-control-height)] px-6 text-sm",
55
+ lg: "h-[var(--nx-control-height-lg)] px-8 text-base",
56
+ icon: "h-[var(--nx-control-height)] w-[var(--nx-control-height)] p-0",
57
+ "icon-sm": "h-[var(--nx-control-height-md)] w-[var(--nx-control-height-md)] p-0",
58
+ "icon-lg": "h-[var(--nx-control-height-lg)] w-[var(--nx-control-height-lg)] p-0"
53
59
  }
54
60
  },
55
61
  defaultVariants: {
@@ -90,9 +96,9 @@ var inputVariants = cva(
90
96
  {
91
97
  variants: {
92
98
  size: {
93
- sm: "h-[var(--control-height-sm)] px-2.5 py-2 text-sm",
94
- default: "h-[var(--control-height)] px-3 py-2.5 text-sm",
95
- lg: "h-[var(--control-height-lg)] px-4 py-3 text-base"
99
+ sm: "h-[var(--nx-control-height-sm)] px-2.5 py-2 text-sm",
100
+ default: "h-[var(--nx-control-height)] px-3 py-2.5 text-sm",
101
+ lg: "h-[var(--nx-control-height-lg)] px-4 py-3 text-base"
96
102
  }
97
103
  },
98
104
  defaultVariants: {
@@ -121,7 +127,9 @@ var Textarea = forwardRef(({ className, ...props }, ref) => {
121
127
  {
122
128
  "data-slot": "textarea",
123
129
  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",
130
+ // hover:border-primary (full strength) keeps the hover boundary more
131
+ // visible than the resting border-input, not a fainter alpha of it.
132
+ "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 disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 resize-y",
125
133
  "aria-invalid:border-destructive aria-invalid:focus:border-destructive!",
126
134
  className
127
135
  ),
@@ -144,22 +152,41 @@ function Label({ className, ...props }) {
144
152
  }
145
153
  );
146
154
  }
155
+ var PortalContext = createContext({ container: null });
156
+ function PortalProvider({ container, children }) {
157
+ return /* @__PURE__ */ jsx(PortalContext.Provider, { value: { container }, children });
158
+ }
159
+ function usePortalContainer() {
160
+ const { container } = useContext(PortalContext);
161
+ return container ?? void 0;
162
+ }
147
163
  var TooltipProvider = Provider;
148
164
  var Tooltip = Root;
149
165
  var TooltipTrigger = Trigger;
150
- var TooltipContent = forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
151
- Content,
152
- {
153
- ref,
154
- sideOffset,
155
- "data-slot": "tooltip-content",
156
- className: cn(
157
- "z-50 overflow-hidden rounded-none 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",
158
- className
159
- ),
160
- ...props
161
- }
162
- ));
166
+ var TooltipContent = forwardRef(({ className, sideOffset = 4, ...props }, ref) => {
167
+ const portalContainer = usePortalContainer();
168
+ return (
169
+ // Portalled for the same reason as every other overlay here, plus one
170
+ // specific to the tooltip: the positioner measures against the nearest
171
+ // containing block, and it counts `container-type` as one while the
172
+ // browser does not. Left inline under a `@container` element, the content
173
+ // is offset by that element's own position. Portalling lifts it out of any
174
+ // such ancestor, so the two agree again.
175
+ /* @__PURE__ */ jsx(Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
176
+ Content,
177
+ {
178
+ ref,
179
+ sideOffset,
180
+ "data-slot": "tooltip-content",
181
+ className: cn(
182
+ "z-50 overflow-hidden rounded-none 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",
183
+ className
184
+ ),
185
+ ...props
186
+ }
187
+ ) })
188
+ );
189
+ });
163
190
  TooltipContent.displayName = Content.displayName;
164
191
  var FormLabelWithTooltip = React6.forwardRef(
165
192
  ({
@@ -214,9 +241,9 @@ var badgeVariants = cva(
214
241
  // which was nearly invisible on dark backgrounds).
215
242
  default: "bg-muted text-foreground",
216
243
  primary: "bg-primary/10 text-primary dark:bg-primary/20",
217
- success: "bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-100",
218
- warning: "bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-100",
219
- destructive: "bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-100",
244
+ success: "bg-success-100 text-success-700 dark:bg-success-900 dark:text-success-100",
245
+ warning: "bg-warning-100 text-warning-700 dark:bg-warning-900 dark:text-warning-100",
246
+ destructive: "bg-destructive-100 text-destructive-700 dark:bg-destructive-900 dark:text-destructive-100",
220
247
  outline: "border border-border! bg-transparent text-foreground dark:text-muted-foreground dark:border-border!"
221
248
  }
222
249
  },
@@ -355,15 +382,71 @@ var CardFooter = forwardRef(
355
382
  }
356
383
  );
357
384
  CardFooter.displayName = "CardFooter";
385
+ var GAP = {
386
+ 0: "gap-0",
387
+ 1: "gap-1",
388
+ 2: "gap-2",
389
+ 3: "gap-3",
390
+ 4: "gap-4",
391
+ 6: "gap-6",
392
+ 8: "gap-8"
393
+ };
394
+ var COLS = {
395
+ 1: "grid-cols-1",
396
+ 2: "grid-cols-2",
397
+ 3: "grid-cols-3",
398
+ 4: "grid-cols-4",
399
+ 6: "grid-cols-6"
400
+ };
401
+ var Stack = forwardRef(
402
+ ({ direction = "col", gap = 4, className, ...props }, ref) => /* @__PURE__ */ jsx(
403
+ "div",
404
+ {
405
+ ref,
406
+ className: cn(
407
+ "flex",
408
+ direction === "col" ? "flex-col" : "flex-row",
409
+ GAP[gap],
410
+ className
411
+ ),
412
+ ...props
413
+ }
414
+ )
415
+ );
416
+ Stack.displayName = "Stack";
417
+ var Grid = forwardRef(
418
+ ({ cols = 2, gap = 4, className, ...props }, ref) => /* @__PURE__ */ jsx(
419
+ "div",
420
+ {
421
+ ref,
422
+ className: cn("grid", COLS[cols], GAP[gap], className),
423
+ ...props
424
+ }
425
+ )
426
+ );
427
+ Grid.displayName = "Grid";
428
+ var Stat = forwardRef(
429
+ ({ label, value, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
430
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: label }),
431
+ /* @__PURE__ */ jsx("span", { className: "text-2xl font-semibold text-foreground", children: value })
432
+ ] })
433
+ );
434
+ Stat.displayName = "Stat";
358
435
  var alertVariants = cva(
359
436
  "relative flex items-start gap-3 rounded-none border border-border p-4 text-sm transition-colors duration-150",
360
437
  {
361
438
  variants: {
362
439
  variant: {
363
- info: "border-border bg-primary/5 text-primary dark:border-primary/30 dark:bg-primary/5 dark:text-primary-foreground/90",
364
- success: "border-green-200 bg-green-50 text-green-900 border-l-4 border-l-success dark:border-green-900 dark:bg-green-950 dark:text-green-100",
365
- warning: "border-amber-200 bg-amber-50 text-amber-900 border-l-4 border-l-warning dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100",
366
- destructive: "border-red-200 bg-red-50 text-red-900 border-l-4 border-l-destructive dark:border-red-900 dark:bg-red-950 dark:text-red-100"
440
+ // text-primary is mode-correct (dark ink on light in light mode, light
441
+ // ink on dark in dark mode); the previous dark text override rendered
442
+ // dark slate on the dark tint at about 1:1.
443
+ info: "bg-primary/5 text-primary",
444
+ // dark:border-l-* re-asserts the strong base accent on the left after
445
+ // the dark:border-*-900 all-sides rule, so the meaningful accent stays
446
+ // visible in dark mode instead of collapsing to the faint -900 shade.
447
+ 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",
448
+ 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",
449
+ 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"
367
450
  }
368
451
  },
369
452
  defaultVariants: {
@@ -459,7 +542,7 @@ var progressVariants = cva("h-full rounded-none transition-all", {
459
542
  variants: {
460
543
  variant: {
461
544
  default: "bg-primary-500",
462
- success: "bg-green-500",
545
+ success: "bg-success-500",
463
546
  error: "bg-destructive"
464
547
  }
465
548
  },
@@ -513,11 +596,9 @@ var Checkbox = forwardRef(({ className, indeterminate, ...props }, ref) => /* @_
513
596
  ref,
514
597
  "data-slot": "checkbox",
515
598
  className: cn(
516
- // Unchecked outline uses primary/40 (clearly visible, monochrome) instead of
517
- // primary/5, which rendered at ~5% opacity and was effectively invisible.
518
- // Checked and indeterminate share the filled appearance; declaring both
519
- // here keeps the control self-sufficient without host overrides.
520
- "peer h-4 w-4 shrink-0 rounded-none border border-primary/40 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 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground data-[state=indeterminate]:border-primary transition-all duration-200",
599
+ // Resting border uses border-input (a visible 3:1 boundary); the checked
600
+ // state switches to border-primary below, keeping the two states distinct.
601
+ "peer relative h-4 w-4 shrink-0 rounded-none 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",
521
602
  className
522
603
  ),
523
604
  ...props,
@@ -552,7 +633,9 @@ var RadioGroupItem = forwardRef(({ className, ...props }, ref) => {
552
633
  className: cn(
553
634
  // Unchecked outline uses primary/40 (clearly visible) instead of primary/5
554
635
  // (~5% opacity, effectively invisible); hover strengthens above the resting state.
555
- "peer h-4 w-4 shrink-0 rounded-none border border-primary/40 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]",
636
+ // Resting border uses border-input (a visible 3:1 boundary); the checked
637
+ // state switches to border-primary below, keeping the two states distinct.
638
+ "peer h-4 w-4 shrink-0 rounded-none 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]",
556
639
  className
557
640
  ),
558
641
  ...props,
@@ -735,7 +818,7 @@ var TabsTrigger = forwardRef(
735
818
  ref,
736
819
  "data-slot": "tabs-trigger",
737
820
  className: cn(
738
- "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",
821
+ "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",
739
822
  className
740
823
  ),
741
824
  ...props
@@ -750,7 +833,7 @@ var TabsContent = forwardRef(
750
833
  ref,
751
834
  "data-slot": "tabs-content",
752
835
  className: cn(
753
- "mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/20 focus-visible:ring-offset-2",
836
+ "mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
754
837
  className
755
838
  ),
756
839
  ...props
@@ -758,14 +841,6 @@ var TabsContent = forwardRef(
758
841
  )
759
842
  );
760
843
  TabsContent.displayName = Content$1.displayName;
761
- var PortalContext = createContext({ container: null });
762
- function PortalProvider({ container, children }) {
763
- return /* @__PURE__ */ jsx(PortalContext.Provider, { value: { container }, children });
764
- }
765
- function usePortalContainer() {
766
- const { container } = useContext(PortalContext);
767
- return container ?? void 0;
768
- }
769
844
  var Popover = PopoverPrimitive.Root;
770
845
  var PopoverTrigger = PopoverPrimitive.Trigger;
771
846
  var PopoverAnchor = PopoverPrimitive.Anchor;
@@ -1013,12 +1088,14 @@ var DropdownMenuGroup = DropdownMenuPrimitive.Group;
1013
1088
  var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
1014
1089
  var DropdownMenuSub = DropdownMenuPrimitive.Sub;
1015
1090
  var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
1091
+ var menuItemBase = "cursor-pointer transition-colors data-[highlighted]:bg-muted data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
1016
1092
  var DropdownMenuSubTrigger = React6.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1017
1093
  DropdownMenuPrimitive.SubTrigger,
1018
1094
  {
1019
1095
  ref,
1020
1096
  className: cn(
1021
- "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",
1097
+ "flex select-none items-center gap-2 rounded-none 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",
1098
+ menuItemBase,
1022
1099
  inset && "pl-8",
1023
1100
  className
1024
1101
  ),
@@ -1063,7 +1140,8 @@ var DropdownMenuItem = React6.forwardRef(({ className, inset, ...props }, ref) =
1063
1140
  {
1064
1141
  ref,
1065
1142
  className: cn(
1066
- "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",
1143
+ "relative flex select-none items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
1144
+ menuItemBase,
1067
1145
  inset && "pl-8",
1068
1146
  className
1069
1147
  ),
@@ -1076,7 +1154,8 @@ var DropdownMenuCheckboxItem = React6.forwardRef(({ className, children, checked
1076
1154
  {
1077
1155
  ref,
1078
1156
  className: cn(
1079
- "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",
1157
+ "relative flex select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none",
1158
+ menuItemBase,
1080
1159
  className
1081
1160
  ),
1082
1161
  checked,
@@ -1093,7 +1172,8 @@ var DropdownMenuRadioItem = React6.forwardRef(({ className, children, ...props }
1093
1172
  {
1094
1173
  ref,
1095
1174
  className: cn(
1096
- "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",
1175
+ "relative flex select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none",
1176
+ menuItemBase,
1097
1177
  className
1098
1178
  ),
1099
1179
  ...props,
@@ -1151,13 +1231,15 @@ function SelectValue({
1151
1231
  return /* @__PURE__ */ jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
1152
1232
  }
1153
1233
  var selectTriggerVariants = cva(
1154
- "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",
1234
+ // hover:border-primary (full strength) keeps the hover boundary more visible
1235
+ // than the resting border-input, not a fainter alpha of it.
1236
+ "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 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",
1155
1237
  {
1156
1238
  variants: {
1157
1239
  size: {
1158
- sm: "h-[var(--control-height-sm)] text-sm",
1159
- default: "h-[var(--control-height)] text-sm",
1160
- lg: "h-[var(--control-height-lg)] text-base"
1240
+ sm: "h-[var(--nx-control-height-sm)] text-sm",
1241
+ default: "h-[var(--nx-control-height)] text-sm",
1242
+ lg: "h-[var(--nx-control-height-lg)] text-base"
1161
1243
  }
1162
1244
  },
1163
1245
  defaultVariants: {
@@ -1640,9 +1722,9 @@ function Toaster({ theme = "system", ...props }) {
1640
1722
  loading: /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" })
1641
1723
  },
1642
1724
  style: {
1643
- "--normal-bg": "var(--popover)",
1644
- "--normal-text": "var(--popover-foreground)",
1645
- "--normal-border": "var(--border)",
1725
+ "--normal-bg": "var(--nx-popover)",
1726
+ "--normal-text": "var(--nx-popover-foreground)",
1727
+ "--normal-border": "var(--nx-border)",
1646
1728
  "--border-radius": "0px"
1647
1729
  },
1648
1730
  ...props
@@ -1762,7 +1844,7 @@ function TableSearch({
1762
1844
  {
1763
1845
  type: "button",
1764
1846
  onClick: onClear,
1765
- className: "text-muted-foreground/60 hover:text-foreground transition-colors p-0.5 rounded-none hover:bg-primary/5",
1847
+ className: "text-muted-foreground hover:text-foreground transition-colors p-0.5 rounded-none hover:bg-primary/5",
1766
1848
  "aria-label": "Clear search",
1767
1849
  children: /* @__PURE__ */ jsx(X, { className: "w-3.5 h-3.5" })
1768
1850
  }
@@ -1790,213 +1872,6 @@ function TableEmpty({ message = "No records found" }) {
1790
1872
  /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: message })
1791
1873
  ] });
1792
1874
  }
1793
- function renderPageNumbers(currentPage, totalPages, maxVisiblePages, onPageChange) {
1794
- const getBtnClass = (active) => `flex h-8 w-8 items-center justify-center border-y border-border border-r border-border 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-border! hover-muted disabled:opacity-50"}`;
1795
- if (totalPages <= maxVisiblePages) {
1796
- return Array.from({ length: totalPages }).map((_, i) => /* @__PURE__ */ jsx(
1797
- "button",
1798
- {
1799
- onClick: () => onPageChange(i),
1800
- "aria-label": `Go to page ${i + 1}`,
1801
- "aria-current": currentPage === i ? "page" : void 0,
1802
- className: getBtnClass(currentPage === i),
1803
- children: i + 1
1804
- },
1805
- `page-${i}`
1806
- ));
1807
- }
1808
- const pages = [];
1809
- const startPage = Math.max(0, currentPage - Math.floor(maxVisiblePages / 2));
1810
- const endPage = Math.min(totalPages - 1, startPage + maxVisiblePages - 1);
1811
- if (startPage > 0) {
1812
- pages.push(
1813
- /* @__PURE__ */ jsx(
1814
- "button",
1815
- {
1816
- onClick: () => onPageChange(0),
1817
- "aria-label": "Go to page 1",
1818
- className: getBtnClass(currentPage === 0),
1819
- children: "1"
1820
- },
1821
- "page-0"
1822
- )
1823
- );
1824
- if (startPage > 1) {
1825
- pages.push(
1826
- /* @__PURE__ */ jsx(
1827
- "span",
1828
- {
1829
- className: "flex h-8 w-8 items-center justify-center border-y border-border border-r border-border border-border! bg-background! text-muted-foreground text-xs -ml-px",
1830
- "aria-hidden": "true",
1831
- children: "..."
1832
- },
1833
- "ellipsis-start"
1834
- )
1835
- );
1836
- }
1837
- }
1838
- for (let i = startPage; i <= endPage; i++) {
1839
- pages.push(
1840
- /* @__PURE__ */ jsx(
1841
- "button",
1842
- {
1843
- onClick: () => onPageChange(i),
1844
- "aria-label": `Go to page ${i + 1}`,
1845
- "aria-current": currentPage === i ? "page" : void 0,
1846
- className: getBtnClass(currentPage === i),
1847
- children: i + 1
1848
- },
1849
- i
1850
- )
1851
- );
1852
- }
1853
- if (endPage < totalPages - 1) {
1854
- if (endPage < totalPages - 2) {
1855
- pages.push(
1856
- /* @__PURE__ */ jsx(
1857
- "span",
1858
- {
1859
- className: "flex h-8 w-8 items-center justify-center border-y border-border border-r border-border border-border! bg-background! text-muted-foreground text-xs -ml-px",
1860
- "aria-hidden": "true",
1861
- children: "..."
1862
- },
1863
- "ellipsis-end"
1864
- )
1865
- );
1866
- }
1867
- pages.push(
1868
- /* @__PURE__ */ jsx(
1869
- "button",
1870
- {
1871
- onClick: () => onPageChange(totalPages - 1),
1872
- "aria-label": `Go to page ${totalPages}`,
1873
- className: getBtnClass(currentPage === totalPages - 1),
1874
- children: totalPages
1875
- },
1876
- totalPages - 1
1877
- )
1878
- );
1879
- }
1880
- return pages;
1881
- }
1882
- function TablePagination({
1883
- meta,
1884
- onPageChange,
1885
- onPageSizeChange,
1886
- config,
1887
- isLoading = false
1888
- }) {
1889
- const {
1890
- showPageSizeSelector = true,
1891
- pageSizeOptions = [10, 20, 30, 50],
1892
- maxVisiblePages = 5
1893
- } = config || {};
1894
- const pageIndex = meta.page - 1;
1895
- 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-border", children: [
1896
- /* @__PURE__ */ jsxs("div", { className: "whitespace-nowrap order-2 sm:order-1", children: [
1897
- "Showing ",
1898
- (meta.page - 1) * meta.limit + 1,
1899
- "-",
1900
- Math.min(meta.page * meta.limit, meta.total),
1901
- " of ",
1902
- meta.total,
1903
- " entries"
1904
- ] }),
1905
- /* @__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: [
1906
- showPageSizeSelector && /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
1907
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap hidden sm:inline-block", children: "Rows per page" }),
1908
- /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1909
- /* @__PURE__ */ jsx(
1910
- "select",
1911
- {
1912
- id: "pageSize",
1913
- value: meta.limit,
1914
- onChange: (e) => {
1915
- const newPageSize = Number(e.target.value);
1916
- onPageSizeChange(newPageSize);
1917
- },
1918
- className: "h-8 w-[70px] appearance-none rounded-none border border-border 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",
1919
- disabled: isLoading,
1920
- children: pageSizeOptions.map((size) => /* @__PURE__ */ jsx("option", { value: size, children: size }, size))
1921
- }
1922
- ),
1923
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-muted-foreground", children: /* @__PURE__ */ jsx(
1924
- "svg",
1925
- {
1926
- className: "h-3 w-3",
1927
- fill: "none",
1928
- viewBox: "0 0 24 24",
1929
- stroke: "currentColor",
1930
- children: /* @__PURE__ */ jsx(
1931
- "path",
1932
- {
1933
- strokeLinecap: "round",
1934
- strokeLinejoin: "round",
1935
- strokeWidth: 2,
1936
- d: "M19 9l-7 7-7-7"
1937
- }
1938
- )
1939
- }
1940
- ) })
1941
- ] })
1942
- ] }),
1943
- /* @__PURE__ */ jsxs("div", { className: "flex items-center -space-x-px", children: [
1944
- /* @__PURE__ */ jsx(
1945
- "button",
1946
- {
1947
- onClick: () => onPageChange(0),
1948
- disabled: pageIndex === 0 || isLoading,
1949
- className: "hidden sm:flex h-8 w-8 items-center justify-center rounded-none border border-border bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1950
- "aria-label": "First page",
1951
- children: /* @__PURE__ */ jsx(ChevronsLeft, { className: "h-4 w-4" })
1952
- }
1953
- ),
1954
- /* @__PURE__ */ jsx(
1955
- "button",
1956
- {
1957
- onClick: () => onPageChange(pageIndex - 1),
1958
- disabled: pageIndex === 0 || isLoading,
1959
- className: "flex h-8 w-8 items-center justify-center rounded-none sm:rounded-none border border-border bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1960
- "aria-label": "Previous page",
1961
- children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
1962
- }
1963
- ),
1964
- /* @__PURE__ */ jsx("div", { className: "flex", children: renderPageNumbers(
1965
- pageIndex,
1966
- meta.totalPages,
1967
- maxVisiblePages,
1968
- onPageChange
1969
- ) }),
1970
- /* @__PURE__ */ jsx(
1971
- "button",
1972
- {
1973
- onClick: () => onPageChange(pageIndex + 1),
1974
- disabled: pageIndex >= meta.totalPages - 1 || isLoading,
1975
- className: "flex h-8 w-8 items-center justify-center rounded-none sm:rounded-none border-y border-border border-x border-border sm:border-r border-border bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1976
- "aria-label": "Next page",
1977
- children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
1978
- }
1979
- ),
1980
- /* @__PURE__ */ jsx(
1981
- "button",
1982
- {
1983
- onClick: () => onPageChange(meta.totalPages - 1),
1984
- disabled: pageIndex >= meta.totalPages - 1 || isLoading,
1985
- className: "hidden sm:flex h-8 w-8 items-center justify-center rounded-none border border-border bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10",
1986
- "aria-label": "Last page",
1987
- children: /* @__PURE__ */ jsx(ChevronsRight, { className: "h-4 w-4" })
1988
- }
1989
- )
1990
- ] }),
1991
- /* @__PURE__ */ jsxs("div", { className: "whitespace-nowrap hidden sm:block", children: [
1992
- "Page ",
1993
- meta.page,
1994
- " of ",
1995
- meta.totalPages
1996
- ] })
1997
- ] })
1998
- ] });
1999
- }
2000
1875
  var GrayBar = ({ className }) => /* @__PURE__ */ jsx(Skeleton, { className });
2001
1876
  var TableSkeleton = ({
2002
1877
  columns = 5,
@@ -2039,219 +1914,71 @@ var TableSkeleton = ({
2039
1914
  return /* @__PURE__ */ jsx("div", { className: "table-wrapper rounded-none border border-border bg-card overflow-hidden", children: content });
2040
1915
  };
2041
1916
  TableSkeleton.displayName = "TableSkeleton";
2042
- function ResponsiveTableInner({
2043
- data,
2044
- columns,
2045
- onRowClick,
2046
- renderMobileCard,
2047
- className,
2048
- emptyMessage = "No results found.",
2049
- ariaLabel,
2050
- tableWrapperClassName,
2051
- footer
2052
- }, ref) {
2053
- const visibleMobileColumns = React6.useMemo(
2054
- () => columns.filter((col) => !col.hideOnMobile),
2055
- [columns]
2056
- );
2057
- const primaryColumn = React6.useMemo(() => {
2058
- return visibleMobileColumns.find(
2059
- (col) => col.key !== "select" && col.key !== "actions"
2060
- ) || visibleMobileColumns[0];
2061
- }, [visibleMobileColumns]);
2062
- const secondaryColumns = React6.useMemo(
2063
- () => visibleMobileColumns.filter((col) => col.key !== primaryColumn?.key),
2064
- [visibleMobileColumns, primaryColumn]
2065
- );
2066
- React6.useEffect(() => {
2067
- const isDev = typeof globalThis !== "undefined" && globalThis.process && globalThis.process.env?.NODE_ENV === "development";
2068
- if (isDev && visibleMobileColumns.length === 0) {
2069
- console.warn(
2070
- "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."
2071
- );
2072
- }
2073
- }, [visibleMobileColumns.length]);
2074
- const handleItemClick = React6.useCallback(
2075
- (item, e) => {
2076
- if (!onRowClick) return;
2077
- if (e) {
2078
- const target = e.target;
2079
- if (target.closest('[role="checkbox"]') || target.closest("button") || target.closest("a") || target.closest('[role^="menuitem"]') || target.closest("[data-actions]")) {
2080
- return;
2081
- }
2082
- }
2083
- onRowClick(item);
2084
- },
2085
- [onRowClick]
2086
- );
2087
- const handleCardKeyDown = React6.useCallback(
2088
- (item) => (e) => {
2089
- if (onRowClick && (e.key === "Enter" || e.key === " ")) {
2090
- e.preventDefault();
2091
- handleItemClick(item, e);
2092
- }
2093
- },
2094
- [handleItemClick, onRowClick]
2095
- );
2096
- if (data.length === 0) {
2097
- return /* @__PURE__ */ jsx("div", { ref, className: cn("p-8 text-center", className), children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage }) });
2098
- }
2099
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), children: [
2100
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 md:hidden", children: data.map((item) => {
2101
- const primaryValue = primaryColumn ? String(item[primaryColumn.key]) : String(item.id);
2102
- if (renderMobileCard) {
2103
- return /* @__PURE__ */ jsx(
2104
- "div",
2105
- {
2106
- onClick: (e) => handleItemClick(item, e),
2107
- role: onRowClick ? "button" : void 0,
2108
- tabIndex: onRowClick ? 0 : void 0,
2109
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2110
- className: onRowClick ? "cursor-pointer" : void 0,
2111
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2112
- children: renderMobileCard(item, visibleMobileColumns)
2113
- },
2114
- item.id
2115
- );
2116
- }
2117
- return /* @__PURE__ */ jsxs(
2118
- Card,
2119
- {
2120
- variant: onRowClick ? "interactive" : "default",
2121
- className: cn(
2122
- onRowClick && "cursor-pointer",
2123
- "transition-all duration-150"
2124
- ),
2125
- onClick: (e) => handleItemClick(item, e),
2126
- role: onRowClick ? "button" : void 0,
2127
- tabIndex: onRowClick ? 0 : void 0,
2128
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2129
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2130
- children: [
2131
- 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,
2132
- 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(
2133
- "div",
2134
- {
2135
- className: "flex items-start justify-between gap-4 text-sm",
2136
- children: [
2137
- !column.hideLabelOnMobile && /* @__PURE__ */ jsxs("dt", { className: "text-muted-foreground min-w-[80px] shrink-0", children: [
2138
- column.label,
2139
- ":"
2140
- ] }),
2141
- /* @__PURE__ */ jsx(
2142
- "dd",
2143
- {
2144
- className: cn(
2145
- "font-medium flex-1",
2146
- !column.hideLabelOnMobile ? "text-right" : "text-left"
2147
- ),
2148
- children: column.render ? column.render(item[column.key], item) : String(item[column.key])
2149
- }
2150
- )
2151
- ]
2152
- },
2153
- String(column.key)
2154
- )) }) })
2155
- ]
2156
- },
2157
- item.id
2158
- );
2159
- }) }),
2160
- /* @__PURE__ */ jsx(
2161
- "div",
2162
- {
2163
- className: cn(
2164
- "table-wrapper hidden md:block overflow-hidden rounded-none border border-border",
2165
- tableWrapperClassName
2166
- ),
2167
- children: /* @__PURE__ */ jsxs(Table, { "aria-label": ariaLabel || "Data table", children: [
2168
- /* @__PURE__ */ jsx(TableHeader, { className: "bg-[var(--table-header-bg)]", children: /* @__PURE__ */ jsx(TableRow, { children: columns.map((column) => /* @__PURE__ */ jsx(
2169
- TableHead,
2170
- {
2171
- className: column.headerClassName,
2172
- children: column.label
2173
- },
2174
- String(column.key)
2175
- )) }) }),
2176
- /* @__PURE__ */ jsx(TableBody, { children: data.map((item) => {
2177
- const primaryValue = primaryColumn ? String(item[primaryColumn.key]) : String(item.id);
2178
- return /* @__PURE__ */ jsx(
2179
- TableRow,
2180
- {
2181
- className: cn(
2182
- "hover-unified-table-row",
2183
- onRowClick && "cursor-pointer"
2184
- ),
2185
- onClick: (e) => handleItemClick(item, e),
2186
- role: onRowClick ? "button" : void 0,
2187
- tabIndex: onRowClick ? 0 : void 0,
2188
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2189
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2190
- children: columns.map((column) => /* @__PURE__ */ jsx(
2191
- TableCell,
2192
- {
2193
- className: column.cellClassName,
2194
- children: column.render ? column.render(item[column.key], item) : String(item[column.key])
2195
- },
2196
- String(column.key)
2197
- ))
2198
- },
2199
- item.id
2200
- );
2201
- }) })
2202
- ] })
2203
- }
2204
- ),
2205
- footer && /* @__PURE__ */ jsx("div", { className: "table-footer border-t border-border bg-[var(--table-header-bg)]", children: footer })
2206
- ] });
2207
- }
2208
- var ResponsiveTable = React6.forwardRef(ResponsiveTableInner);
2209
1917
 
2210
1918
  // src/tailwind-preset.ts
1919
+ var statusScale = (base) => ({
1920
+ 50: `color-mix(in srgb, var(${base}), white 95%)`,
1921
+ 100: `color-mix(in srgb, var(${base}), white 90%)`,
1922
+ 200: `color-mix(in srgb, var(${base}), white 70%)`,
1923
+ 300: `color-mix(in srgb, var(${base}), white 50%)`,
1924
+ 400: `color-mix(in srgb, var(${base}), white 30%)`,
1925
+ 500: `var(${base})`,
1926
+ 600: `color-mix(in srgb, var(${base}), black 10%)`,
1927
+ 700: `color-mix(in srgb, var(${base}), black 30%)`,
1928
+ 800: `color-mix(in srgb, var(${base}), black 50%)`,
1929
+ 900: `color-mix(in srgb, var(${base}), black 70%)`,
1930
+ 950: `color-mix(in srgb, var(${base}), black 85%)`
1931
+ });
2211
1932
  var uiPreset = {
2212
1933
  theme: {
2213
1934
  extend: {
2214
1935
  colors: {
2215
- border: "var(--border)",
2216
- input: "var(--input)",
2217
- ring: "var(--ring)",
2218
- background: "var(--background)",
2219
- foreground: "var(--foreground)",
1936
+ border: "var(--nx-border)",
1937
+ input: "var(--nx-input)",
1938
+ ring: "var(--nx-ring)",
1939
+ background: "var(--nx-background)",
1940
+ foreground: "var(--nx-foreground)",
2220
1941
  primary: {
2221
- DEFAULT: "var(--primary)",
2222
- foreground: "var(--primary-foreground)"
1942
+ DEFAULT: "var(--nx-primary)",
1943
+ foreground: "var(--nx-primary-foreground)"
2223
1944
  },
2224
1945
  secondary: {
2225
- DEFAULT: "var(--secondary)",
2226
- foreground: "var(--secondary-foreground)"
1946
+ DEFAULT: "var(--nx-secondary)",
1947
+ foreground: "var(--nx-secondary-foreground)"
2227
1948
  },
2228
1949
  destructive: {
2229
- DEFAULT: "var(--destructive)",
2230
- foreground: "var(--destructive-foreground)"
1950
+ DEFAULT: "var(--nx-destructive)",
1951
+ // Saturated fill for solid buttons, distinct from the text-tuned base.
1952
+ solid: "var(--nx-destructive-solid)",
1953
+ foreground: "var(--nx-destructive-foreground)",
1954
+ ...statusScale("--nx-destructive")
2231
1955
  },
2232
1956
  success: {
2233
- DEFAULT: "var(--success)",
2234
- foreground: "var(--success-foreground)"
1957
+ DEFAULT: "var(--nx-success)",
1958
+ solid: "var(--nx-success-solid)",
1959
+ foreground: "var(--nx-success-foreground)",
1960
+ ...statusScale("--nx-success")
2235
1961
  },
2236
1962
  warning: {
2237
- DEFAULT: "var(--warning)",
2238
- foreground: "var(--warning-foreground)"
1963
+ DEFAULT: "var(--nx-warning)",
1964
+ foreground: "var(--nx-warning-foreground)",
1965
+ ...statusScale("--nx-warning")
2239
1966
  },
2240
1967
  muted: {
2241
- DEFAULT: "var(--muted)",
2242
- foreground: "var(--muted-foreground)"
1968
+ DEFAULT: "var(--nx-muted)",
1969
+ foreground: "var(--nx-muted-foreground)"
2243
1970
  },
2244
1971
  accent: {
2245
- DEFAULT: "var(--accent)",
2246
- foreground: "var(--accent-foreground)"
1972
+ DEFAULT: "var(--nx-accent)",
1973
+ foreground: "var(--nx-accent-foreground)"
2247
1974
  },
2248
1975
  popover: {
2249
- DEFAULT: "var(--popover)",
2250
- foreground: "var(--popover-foreground)"
1976
+ DEFAULT: "var(--nx-popover)",
1977
+ foreground: "var(--nx-popover-foreground)"
2251
1978
  },
2252
1979
  card: {
2253
- DEFAULT: "var(--card)",
2254
- foreground: "var(--card-foreground)"
1980
+ DEFAULT: "var(--nx-card)",
1981
+ foreground: "var(--nx-card-foreground)"
2255
1982
  }
2256
1983
  },
2257
1984
  borderRadius: {
@@ -2278,6 +2005,6 @@ var uiPreset = {
2278
2005
  };
2279
2006
  var tailwind_preset_default = uiPreset;
2280
2007
 
2281
- 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, FormLabelWithTooltip, 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 };
2008
+ 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, FormLabelWithTooltip, Grid, Input, Label, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalProvider, Progress, RadioGroup, RadioGroupItem, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Spinner, Stack, Stat, Switch, Table, TableBody, TableCaption, TableCell, TableEmpty, TableError, TableFooter, TableHead, TableHeader, TableLoading, 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 };
2282
2009
  //# sourceMappingURL=index.mjs.map
2283
2010
  //# sourceMappingURL=index.mjs.map