@nextlyhq/ui 0.0.2-alpha.33 → 0.0.2-alpha.35

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.cjs CHANGED
@@ -73,13 +73,13 @@ var buttonVariants = classVarianceAuthority.cva(
73
73
  link: "text-primary border border-transparent underline-offset-4 hover:underline"
74
74
  },
75
75
  size: {
76
- default: "h-10 px-6 py-2",
77
- sm: "h-9 px-4 text-[13px]",
78
- md: "h-10 px-6 text-sm",
79
- lg: "h-11 px-8 text-base",
80
- icon: "h-10 w-10 p-0",
81
- "icon-sm": "h-9 w-9 p-0",
82
- "icon-lg": "h-11 w-11 p-0"
76
+ default: "h-[var(--nx-control-height)] px-6 py-2",
77
+ sm: "h-[var(--nx-control-height-md)] px-4 text-[13px]",
78
+ md: "h-[var(--nx-control-height)] px-6 text-sm",
79
+ lg: "h-[var(--nx-control-height-lg)] px-8 text-base",
80
+ icon: "h-[var(--nx-control-height)] w-[var(--nx-control-height)] p-0",
81
+ "icon-sm": "h-[var(--nx-control-height-md)] w-[var(--nx-control-height-md)] p-0",
82
+ "icon-lg": "h-[var(--nx-control-height-lg)] w-[var(--nx-control-height-lg)] p-0"
83
83
  }
84
84
  },
85
85
  defaultVariants: {
@@ -116,13 +116,13 @@ var Button = React6.forwardRef(
116
116
  );
117
117
  Button.displayName = "Button";
118
118
  var inputVariants = classVarianceAuthority.cva(
119
- "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",
119
+ "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!",
120
120
  {
121
121
  variants: {
122
122
  size: {
123
- sm: "h-8 px-2.5 py-2 text-sm",
124
- default: "h-10 px-3 py-2.5 text-sm",
125
- lg: "h-11 px-4 py-3 text-base"
123
+ sm: "h-[var(--nx-control-height-sm)] px-2.5 py-2 text-sm",
124
+ default: "h-[var(--nx-control-height)] px-3 py-2.5 text-sm",
125
+ lg: "h-[var(--nx-control-height-lg)] px-4 py-3 text-base"
126
126
  }
127
127
  },
128
128
  defaultVariants: {
@@ -151,8 +151,8 @@ var Textarea = React6.forwardRef(({ className, ...props }, ref) => {
151
151
  {
152
152
  "data-slot": "textarea",
153
153
  className: cn(
154
- "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",
155
- "aria-invalid:border-destructive aria-invalid:focus:!border-destructive",
154
+ "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",
155
+ "aria-invalid:border-destructive aria-invalid:focus:border-destructive!",
156
156
  className
157
157
  ),
158
158
  ref,
@@ -174,22 +174,41 @@ function Label({ className, ...props }) {
174
174
  }
175
175
  );
176
176
  }
177
+ var PortalContext = React6.createContext({ container: null });
178
+ function PortalProvider({ container, children }) {
179
+ return /* @__PURE__ */ jsxRuntime.jsx(PortalContext.Provider, { value: { container }, children });
180
+ }
181
+ function usePortalContainer() {
182
+ const { container } = React6.useContext(PortalContext);
183
+ return container ?? void 0;
184
+ }
177
185
  var TooltipProvider = reactTooltip.Provider;
178
186
  var Tooltip = reactTooltip.Root;
179
187
  var TooltipTrigger = reactTooltip.Trigger;
180
- var TooltipContent = React6.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
181
- reactTooltip.Content,
182
- {
183
- ref,
184
- sideOffset,
185
- "data-slot": "tooltip-content",
186
- className: cn(
187
- "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",
188
- className
189
- ),
190
- ...props
191
- }
192
- ));
188
+ var TooltipContent = React6.forwardRef(({ className, sideOffset = 4, ...props }, ref) => {
189
+ const portalContainer = usePortalContainer();
190
+ return (
191
+ // Portalled for the same reason as every other overlay here, plus one
192
+ // specific to the tooltip: the positioner measures against the nearest
193
+ // containing block, and it counts `container-type` as one while the
194
+ // browser does not. Left inline under a `@container` element, the content
195
+ // is offset by that element's own position. Portalling lifts it out of any
196
+ // such ancestor, so the two agree again.
197
+ /* @__PURE__ */ jsxRuntime.jsx(reactTooltip.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
198
+ reactTooltip.Content,
199
+ {
200
+ ref,
201
+ sideOffset,
202
+ "data-slot": "tooltip-content",
203
+ className: cn(
204
+ "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",
205
+ className
206
+ ),
207
+ ...props
208
+ }
209
+ ) })
210
+ );
211
+ });
193
212
  TooltipContent.displayName = reactTooltip.Content.displayName;
194
213
  var FormLabelWithTooltip = React6__namespace.forwardRef(
195
214
  ({
@@ -224,7 +243,7 @@ var FormLabelWithTooltip = React6__namespace.forwardRef(
224
243
  {
225
244
  side: "right",
226
245
  className: cn(
227
- "max-w-[250px] text-[12px] break-words relative z-[100] shadow-md border border-primary/5 bg-black text-white dark:bg-zinc-800 dark:text-zinc-50 px-3 py-2 rounded-none",
246
+ "max-w-[250px] text-[12px] break-words relative z-[100] shadow-md border border-border bg-primary text-primary-foreground px-3 py-2 rounded-none",
228
247
  tooltipClassName
229
248
  ),
230
249
  children: description
@@ -240,12 +259,14 @@ var badgeVariants = classVarianceAuthority.cva(
240
259
  {
241
260
  variants: {
242
261
  variant: {
243
- default: "bg-primary/5 text-slate-900 dark:bg-slate-800 dark:text-slate-100",
244
- primary: "bg-primary/5 text-primary dark:bg-primary/20 dark:text-primary-foreground/90",
245
- success: "bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-100",
246
- warning: "bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-100",
247
- destructive: "bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-100",
248
- outline: "border !border-primary/5 bg-transparent text-slate-700 dark:text-slate-300 dark:!border-primary/5"
262
+ // Clear, legible chip in both modes (was bg-primary/5 at ~5% opacity,
263
+ // which was nearly invisible on dark backgrounds).
264
+ default: "bg-muted text-foreground",
265
+ primary: "bg-primary/10 text-primary dark:bg-primary/20",
266
+ success: "bg-success-100 text-success-700 dark:bg-success-900 dark:text-success-100",
267
+ warning: "bg-warning-100 text-warning-700 dark:bg-warning-900 dark:text-warning-100",
268
+ destructive: "bg-destructive-100 text-destructive-700 dark:bg-destructive-900 dark:text-destructive-100",
269
+ outline: "border border-border! bg-transparent text-foreground dark:text-muted-foreground dark:border-border!"
249
270
  }
250
271
  },
251
272
  defaultVariants: {
@@ -264,7 +285,7 @@ function Badge({ className, variant = "default", ...props }) {
264
285
  );
265
286
  }
266
287
  var cardVariants = classVarianceAuthority.cva(
267
- "bg-card text-foreground rounded-none border border-primary/5 transition-all duration-200",
288
+ "bg-card text-foreground rounded-none border border-border transition-all duration-200",
268
289
  {
269
290
  variants: {
270
291
  variant: {
@@ -301,7 +322,7 @@ var CardHeader = React6.forwardRef(
301
322
  "data-slot": "card-header",
302
323
  className: cn(
303
324
  "flex flex-col p-4",
304
- !noBorder && "border-b border-primary/5",
325
+ !noBorder && "border-b border-border",
305
326
  className
306
327
  ),
307
328
  ...props
@@ -374,7 +395,7 @@ var CardFooter = React6.forwardRef(
374
395
  ref,
375
396
  "data-slot": "card-footer",
376
397
  className: cn(
377
- "flex items-center px-6 py-4 border-t border-primary/5 bg-primary/5",
398
+ "flex items-center px-6 py-4 border-t border-border bg-primary/5",
378
399
  className
379
400
  ),
380
401
  ...props
@@ -384,14 +405,14 @@ var CardFooter = React6.forwardRef(
384
405
  );
385
406
  CardFooter.displayName = "CardFooter";
386
407
  var alertVariants = classVarianceAuthority.cva(
387
- "relative flex items-start gap-3 rounded-none border border-primary/5 p-4 text-sm transition-colors duration-150",
408
+ "relative flex items-start gap-3 rounded-none border border-border p-4 text-sm transition-colors duration-150",
388
409
  {
389
410
  variants: {
390
411
  variant: {
391
- info: "border-primary/5 bg-primary/5 text-primary dark:border-primary/30 dark:bg-primary/5 dark:text-primary-foreground/90",
392
- success: "border-green-200 bg-green-50 text-green-900 dark:border-green-900 dark:bg-green-950 dark:text-green-100",
393
- warning: "border-amber-200 bg-amber-50 text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100",
394
- destructive: "border-red-200 bg-red-50 text-red-900 dark:border-red-900 dark:bg-red-950 dark:text-red-100"
412
+ info: "border-border bg-primary/5 text-primary dark:border-primary/30 dark:bg-primary/5 dark:text-primary-foreground/90",
413
+ success: "border-success-200 bg-success-50 text-success-900 border-l-4 border-l-success dark:border-success-900 dark:bg-success-950 dark:text-success-100",
414
+ warning: "border-warning-200 bg-warning-50 text-warning-900 border-l-4 border-l-warning dark:border-warning-900 dark:bg-warning-950 dark:text-warning-100",
415
+ destructive: "border-destructive-200 bg-destructive-50 text-destructive-900 border-l-4 border-l-destructive dark:border-destructive-900 dark:bg-destructive-950 dark:text-destructive-100"
395
416
  }
396
417
  },
397
418
  defaultVariants: {
@@ -487,7 +508,7 @@ var progressVariants = classVarianceAuthority.cva("h-full rounded-none transitio
487
508
  variants: {
488
509
  variant: {
489
510
  default: "bg-primary-500",
490
- success: "bg-green-500",
511
+ success: "bg-success-500",
491
512
  error: "bg-destructive"
492
513
  }
493
514
  },
@@ -541,7 +562,22 @@ var Checkbox = React6.forwardRef(({ className, indeterminate, ...props }, ref) =
541
562
  ref,
542
563
  "data-slot": "checkbox",
543
564
  className: cn(
544
- "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",
565
+ // Unchecked outline uses primary/50: measured 3.95:1 on the light row and
566
+ // 5.32:1 on the dark one. WCAG 1.4.11 asks 3:1 of a control's boundary and
567
+ // the earlier values did not reach it — primary/40 came out at 2.85, close
568
+ // enough to look deliberate and still short. Callers must not override the
569
+ // border: passing `border-border` puts the divider token here, which
570
+ // measured 1.35:1 and 1.14:1, and a divider is meant to go unnoticed.
571
+ // Checked and indeterminate share the filled appearance; declaring both
572
+ // here keeps the control self-sufficient without host overrides.
573
+ //
574
+ // The box stays 16px and the target does not: `before` stretches an
575
+ // invisible 24px square from the centre, which is WCAG 2.5.8's floor.
576
+ // The exemption for a bare browser checkbox does not cover a styled one,
577
+ // and this is styled. Growing the box instead would make every dense
578
+ // table heavier for a rule about pointers, so the box and the thing you
579
+ // can hit are allowed to differ.
580
+ "peer relative h-4 w-4 shrink-0 rounded-none border border-primary/50 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",
545
581
  className
546
582
  ),
547
583
  ...props,
@@ -574,7 +610,9 @@ var RadioGroupItem = React6.forwardRef(({ className, ...props }, ref) => {
574
610
  ref,
575
611
  "data-slot": "radio-group-item",
576
612
  className: cn(
577
- "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]",
613
+ // Unchecked outline uses primary/40 (clearly visible) instead of primary/5
614
+ // (~5% opacity, effectively invisible); hover strengthens above the resting state.
615
+ "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]",
578
616
  className
579
617
  ),
580
618
  ...props,
@@ -589,9 +627,9 @@ function Switch({ className, ...props }) {
589
627
  {
590
628
  "data-slot": "switch",
591
629
  className: cn(
592
- "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",
593
- "data-[state=checked]:bg-primary data-[state=checked]:!border-primary",
594
- "data-[state=unchecked]:bg-input data-[state=unchecked]:border-primary/5 dark:data-[state=unchecked]:bg-input/80",
630
+ "peer inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-none 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",
631
+ "data-[state=checked]:bg-primary data-[state=checked]:border-primary!",
632
+ "data-[state=unchecked]:bg-input data-[state=unchecked]:border-border dark:data-[state=unchecked]:bg-input/80",
595
633
  className
596
634
  ),
597
635
  ...props,
@@ -636,7 +674,7 @@ var AccordionTrigger = React6.forwardRef(
636
674
  ...props,
637
675
  children: [
638
676
  children,
639
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-150" })
677
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-150 will-change-transform" })
640
678
  ]
641
679
  }
642
680
  ) })
@@ -648,7 +686,7 @@ var AccordionContent = React6.forwardRef(
648
686
  {
649
687
  ref,
650
688
  "data-slot": "accordion-content",
651
- className: "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
689
+ 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",
652
690
  ...props,
653
691
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pb-4 pt-0", className), children })
654
692
  }
@@ -757,7 +795,7 @@ var TabsTrigger = React6.forwardRef(
757
795
  ref,
758
796
  "data-slot": "tabs-trigger",
759
797
  className: cn(
760
- "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",
798
+ "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",
761
799
  className
762
800
  ),
763
801
  ...props
@@ -780,14 +818,6 @@ var TabsContent = React6.forwardRef(
780
818
  )
781
819
  );
782
820
  TabsContent.displayName = reactTabs.Content.displayName;
783
- var PortalContext = React6.createContext({ container: null });
784
- function PortalProvider({ container, children }) {
785
- return /* @__PURE__ */ jsxRuntime.jsx(PortalContext.Provider, { value: { container }, children });
786
- }
787
- function usePortalContainer() {
788
- const { container } = React6.useContext(PortalContext);
789
- return container ?? void 0;
790
- }
791
821
  var Popover = PopoverPrimitive__namespace.Root;
792
822
  var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
793
823
  var PopoverAnchor = PopoverPrimitive__namespace.Anchor;
@@ -801,7 +831,7 @@ var PopoverContent = React6__namespace.forwardRef(({ className, align = "center"
801
831
  sideOffset,
802
832
  "data-slot": "popover-content",
803
833
  className: cn(
804
- "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]",
834
+ "z-[100] w-72 rounded-none 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]",
805
835
  className
806
836
  ),
807
837
  ...props
@@ -850,7 +880,7 @@ var DialogContent = React6.forwardRef(({ className, children, size, ...props },
850
880
  ref,
851
881
  "data-slot": "dialog-content",
852
882
  className: cn(
853
- "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%]",
883
+ "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-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%]",
854
884
  dialogContentVariants({ size }),
855
885
  className
856
886
  ),
@@ -947,7 +977,7 @@ var AlertDialogContent = React6.forwardRef(({ className, ...props }, ref) => {
947
977
  {
948
978
  ref,
949
979
  className: cn(
950
- "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%]",
980
+ "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-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%]",
951
981
  className
952
982
  ),
953
983
  ...props
@@ -1035,12 +1065,14 @@ var DropdownMenuGroup = DropdownMenuPrimitive__namespace.Group;
1035
1065
  var DropdownMenuPortal = DropdownMenuPrimitive__namespace.Portal;
1036
1066
  var DropdownMenuSub = DropdownMenuPrimitive__namespace.Sub;
1037
1067
  var DropdownMenuRadioGroup = DropdownMenuPrimitive__namespace.RadioGroup;
1068
+ var menuItemBase = "cursor-pointer transition-colors data-[highlighted]:bg-muted data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
1038
1069
  var DropdownMenuSubTrigger = React6__namespace.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1039
1070
  DropdownMenuPrimitive__namespace.SubTrigger,
1040
1071
  {
1041
1072
  ref,
1042
1073
  className: cn(
1043
- "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",
1074
+ "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",
1075
+ menuItemBase,
1044
1076
  inset && "pl-8",
1045
1077
  className
1046
1078
  ),
@@ -1057,7 +1089,7 @@ var DropdownMenuSubContent = React6__namespace.forwardRef(({ className, ...props
1057
1089
  {
1058
1090
  ref,
1059
1091
  className: cn(
1060
- "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]",
1092
+ "z-50 min-w-[8rem] overflow-hidden rounded-none 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]",
1061
1093
  className
1062
1094
  ),
1063
1095
  ...props
@@ -1072,7 +1104,7 @@ var DropdownMenuContent = React6__namespace.forwardRef(({ className, sideOffset
1072
1104
  ref,
1073
1105
  sideOffset,
1074
1106
  className: cn(
1075
- "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]",
1107
+ "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-none 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]",
1076
1108
  className
1077
1109
  ),
1078
1110
  ...props
@@ -1085,7 +1117,8 @@ var DropdownMenuItem = React6__namespace.forwardRef(({ className, inset, ...prop
1085
1117
  {
1086
1118
  ref,
1087
1119
  className: cn(
1088
- "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",
1120
+ "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",
1121
+ menuItemBase,
1089
1122
  inset && "pl-8",
1090
1123
  className
1091
1124
  ),
@@ -1098,7 +1131,8 @@ var DropdownMenuCheckboxItem = React6__namespace.forwardRef(({ className, childr
1098
1131
  {
1099
1132
  ref,
1100
1133
  className: cn(
1101
- "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",
1134
+ "relative flex select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none",
1135
+ menuItemBase,
1102
1136
  className
1103
1137
  ),
1104
1138
  checked,
@@ -1115,7 +1149,8 @@ var DropdownMenuRadioItem = React6__namespace.forwardRef(({ className, children,
1115
1149
  {
1116
1150
  ref,
1117
1151
  className: cn(
1118
- "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",
1152
+ "relative flex select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none",
1153
+ menuItemBase,
1119
1154
  className
1120
1155
  ),
1121
1156
  ...props,
@@ -1173,13 +1208,13 @@ function SelectValue({
1173
1208
  return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Value, { "data-slot": "select-value", ...props });
1174
1209
  }
1175
1210
  var selectTriggerVariants = classVarianceAuthority.cva(
1176
- "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",
1211
+ "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",
1177
1212
  {
1178
1213
  variants: {
1179
1214
  size: {
1180
- sm: "h-8 text-sm",
1181
- default: "h-10 text-sm",
1182
- lg: "h-11 text-base"
1215
+ sm: "h-[var(--nx-control-height-sm)] text-sm",
1216
+ default: "h-[var(--nx-control-height)] text-sm",
1217
+ lg: "h-[var(--nx-control-height-lg)] text-base"
1183
1218
  }
1184
1219
  },
1185
1220
  defaultVariants: {
@@ -1215,7 +1250,7 @@ function SelectContent({
1215
1250
  {
1216
1251
  "data-slot": "select-content",
1217
1252
  className: cn(
1218
- "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",
1253
+ "bg-popover text-popover-foreground border border-border 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",
1219
1254
  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",
1220
1255
  className
1221
1256
  ),
@@ -1342,10 +1377,10 @@ var sheetVariants = classVarianceAuthority.cva(
1342
1377
  {
1343
1378
  variants: {
1344
1379
  side: {
1345
- 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",
1346
- 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",
1347
- 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",
1348
- 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"
1380
+ top: "inset-x-0 top-0 border-b border-border data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
1381
+ bottom: "inset-x-0 bottom-0 border-t border-border data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
1382
+ 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",
1383
+ 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"
1349
1384
  }
1350
1385
  },
1351
1386
  defaultVariants: {
@@ -1469,7 +1504,7 @@ var CommandDialog = ({ children, ...props }) => {
1469
1504
  "m-4 sm:m-0",
1470
1505
  // 16px margin on mobile, no margin on desktop
1471
1506
  // Visual
1472
- "overflow-hidden rounded-none border border-primary/5 bg-background shadow-xl",
1507
+ "overflow-hidden rounded-none border border-border bg-background shadow-xl",
1473
1508
  // Animation
1474
1509
  "duration-200",
1475
1510
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
@@ -1485,7 +1520,7 @@ var CommandDialog = ({ children, ...props }) => {
1485
1520
  var CommandInput = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1486
1521
  "div",
1487
1522
  {
1488
- className: "flex items-center border-b border-primary/5 px-4",
1523
+ className: "flex items-center border-b border-border px-4",
1489
1524
  "cmdk-input-wrapper": "",
1490
1525
  children: [
1491
1526
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "mr-3 h-5 w-5 shrink-0 text-muted-foreground" }),
@@ -1604,7 +1639,7 @@ var CommandShortcut = React6.forwardRef(
1604
1639
  "text-xs font-mono",
1605
1640
  // Visual
1606
1641
  "text-muted-foreground bg-primary/5",
1607
- "border border-primary/5 rounded-none",
1642
+ "border border-border rounded-none",
1608
1643
  // Spacing
1609
1644
  "px-1.5 py-0.5",
1610
1645
  className
@@ -1647,7 +1682,7 @@ function Toaster({ theme = "system", ...props }) {
1647
1682
  sonner.Toaster,
1648
1683
  {
1649
1684
  theme,
1650
- className: "toaster group !bg-transparent !overflow-visible !z-[9999]",
1685
+ className: "toaster group bg-transparent! overflow-visible! z-[9999]!",
1651
1686
  "data-slot": "toaster",
1652
1687
  toastOptions: {
1653
1688
  classNames: {
@@ -1662,9 +1697,9 @@ function Toaster({ theme = "system", ...props }) {
1662
1697
  loading: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin" })
1663
1698
  },
1664
1699
  style: {
1665
- "--normal-bg": "hsl(var(--popover, 0 0% 100%))",
1666
- "--normal-text": "hsl(var(--popover-foreground, 222.2 84% 4.9%))",
1667
- "--normal-border": "hsl(var(--border, 214.3 31.8% 91.4%))",
1700
+ "--normal-bg": "var(--nx-popover)",
1701
+ "--normal-text": "var(--nx-popover-foreground)",
1702
+ "--normal-border": "var(--nx-border)",
1668
1703
  "--border-radius": "0px"
1669
1704
  },
1670
1705
  ...props
@@ -1680,7 +1715,14 @@ var Table = React6__namespace.forwardRef(({ className, ...props }, ref) => /* @_
1680
1715
  }
1681
1716
  ) }));
1682
1717
  Table.displayName = "Table";
1683
- var TableHeader = React6__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("thead", { ref, className: cn("[&_tr] :border-b border-primary/5", className), ...props }));
1718
+ var TableHeader = React6__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1719
+ "thead",
1720
+ {
1721
+ ref,
1722
+ className: cn("[&_tr]:border-b border-border", className),
1723
+ ...props
1724
+ }
1725
+ ));
1684
1726
  TableHeader.displayName = "TableHeader";
1685
1727
  var TableBody = React6__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1686
1728
  "tbody",
@@ -1695,7 +1737,10 @@ var TableFooter = React6__namespace.forwardRef(({ className, ...props }, ref) =>
1695
1737
  "tfoot",
1696
1738
  {
1697
1739
  ref,
1698
- className: cn("border-t border-primary/5 font-medium [&>tr]:last:border-b-0", className),
1740
+ className: cn(
1741
+ "border-t border-border font-medium [&>tr]:last:border-b-0",
1742
+ className
1743
+ ),
1699
1744
  ...props
1700
1745
  }
1701
1746
  ));
@@ -1705,7 +1750,7 @@ var TableRow = React6__namespace.forwardRef(({ className, ...props }, ref) => /*
1705
1750
  {
1706
1751
  ref,
1707
1752
  className: cn(
1708
- "border-b border-primary/5 transition-colors data-[state=selected]:bg-primary/5",
1753
+ "border-b border-border transition-colors data-[state=selected]:bg-primary/5",
1709
1754
  className
1710
1755
  ),
1711
1756
  ...props
@@ -1764,7 +1809,7 @@ function TableSearch({
1764
1809
  value,
1765
1810
  onChange: (e) => onChange(e.target.value),
1766
1811
  "aria-busy": isLoading,
1767
- 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"
1812
+ className: "h-10 w-full rounded-none border border-border 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"
1768
1813
  }
1769
1814
  ),
1770
1815
  (value || isLoading) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2", children: [
@@ -1802,212 +1847,6 @@ function TableEmpty({ message = "No records found" }) {
1802
1847
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: message })
1803
1848
  ] });
1804
1849
  }
1805
- function renderPageNumbers(currentPage, totalPages, maxVisiblePages, onPageChange) {
1806
- 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"}`;
1807
- if (totalPages <= maxVisiblePages) {
1808
- return Array.from({ length: totalPages }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
1809
- "button",
1810
- {
1811
- onClick: () => onPageChange(i),
1812
- "aria-label": `Go to page ${i + 1}`,
1813
- "aria-current": currentPage === i ? "page" : void 0,
1814
- className: getBtnClass(currentPage === i),
1815
- children: i + 1
1816
- },
1817
- `page-${i}`
1818
- ));
1819
- }
1820
- const pages = [];
1821
- const startPage = Math.max(0, currentPage - Math.floor(maxVisiblePages / 2));
1822
- const endPage = Math.min(totalPages - 1, startPage + maxVisiblePages - 1);
1823
- if (startPage > 0) {
1824
- pages.push(
1825
- /* @__PURE__ */ jsxRuntime.jsx(
1826
- "button",
1827
- {
1828
- onClick: () => onPageChange(0),
1829
- "aria-label": "Go to page 1",
1830
- className: getBtnClass(currentPage === 0),
1831
- children: "1"
1832
- },
1833
- "page-0"
1834
- )
1835
- );
1836
- if (startPage > 1) {
1837
- pages.push(
1838
- /* @__PURE__ */ jsxRuntime.jsx(
1839
- "span",
1840
- {
1841
- 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",
1842
- "aria-hidden": "true",
1843
- children: "..."
1844
- },
1845
- "ellipsis-start"
1846
- )
1847
- );
1848
- }
1849
- }
1850
- for (let i = startPage; i <= endPage; i++) {
1851
- pages.push(
1852
- /* @__PURE__ */ jsxRuntime.jsx(
1853
- "button",
1854
- {
1855
- onClick: () => onPageChange(i),
1856
- "aria-label": `Go to page ${i + 1}`,
1857
- "aria-current": currentPage === i ? "page" : void 0,
1858
- className: getBtnClass(currentPage === i),
1859
- children: i + 1
1860
- },
1861
- i
1862
- )
1863
- );
1864
- }
1865
- if (endPage < totalPages - 1) {
1866
- if (endPage < totalPages - 2) {
1867
- pages.push(
1868
- /* @__PURE__ */ jsxRuntime.jsx(
1869
- "span",
1870
- {
1871
- 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",
1872
- "aria-hidden": "true",
1873
- children: "..."
1874
- },
1875
- "ellipsis-end"
1876
- )
1877
- );
1878
- }
1879
- pages.push(
1880
- /* @__PURE__ */ jsxRuntime.jsx(
1881
- "button",
1882
- {
1883
- onClick: () => onPageChange(totalPages - 1),
1884
- "aria-label": `Go to page ${totalPages}`,
1885
- className: getBtnClass(currentPage === totalPages - 1),
1886
- children: totalPages
1887
- },
1888
- totalPages - 1
1889
- )
1890
- );
1891
- }
1892
- return pages;
1893
- }
1894
- function TablePagination({
1895
- meta,
1896
- onPageChange,
1897
- onPageSizeChange,
1898
- config,
1899
- isLoading = false
1900
- }) {
1901
- const {
1902
- showPageSizeSelector = true,
1903
- pageSizeOptions = [10, 20, 30, 50],
1904
- maxVisiblePages = 5
1905
- } = config || {};
1906
- return /* @__PURE__ */ jsxRuntime.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: [
1907
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "whitespace-nowrap order-2 sm:order-1", children: [
1908
- "Showing ",
1909
- (meta.page - 1) * meta.limit + 1,
1910
- "-",
1911
- Math.min(meta.page * meta.limit, meta.total),
1912
- " of ",
1913
- meta.total,
1914
- " entries"
1915
- ] }),
1916
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-center gap-4 sm:gap-6 lg:gap-8 order-1 sm:order-2", children: [
1917
- showPageSizeSelector && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
1918
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap hidden sm:inline-block", children: "Rows per page" }),
1919
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
1920
- /* @__PURE__ */ jsxRuntime.jsx(
1921
- "select",
1922
- {
1923
- id: "pageSize",
1924
- value: meta.limit,
1925
- onChange: (e) => {
1926
- const newPageSize = Number(e.target.value);
1927
- onPageSizeChange(newPageSize);
1928
- },
1929
- 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",
1930
- disabled: isLoading,
1931
- children: pageSizeOptions.map((size) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: size, children: size }, size))
1932
- }
1933
- ),
1934
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(
1935
- "svg",
1936
- {
1937
- className: "h-3 w-3",
1938
- fill: "none",
1939
- viewBox: "0 0 24 24",
1940
- stroke: "currentColor",
1941
- children: /* @__PURE__ */ jsxRuntime.jsx(
1942
- "path",
1943
- {
1944
- strokeLinecap: "round",
1945
- strokeLinejoin: "round",
1946
- strokeWidth: 2,
1947
- d: "M19 9l-7 7-7-7"
1948
- }
1949
- )
1950
- }
1951
- ) })
1952
- ] })
1953
- ] }),
1954
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center -space-x-px", children: [
1955
- /* @__PURE__ */ jsxRuntime.jsx(
1956
- "button",
1957
- {
1958
- onClick: () => onPageChange(0),
1959
- disabled: meta.page === 0 || isLoading,
1960
- 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",
1961
- "aria-label": "First page",
1962
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsLeft, { className: "h-4 w-4" })
1963
- }
1964
- ),
1965
- /* @__PURE__ */ jsxRuntime.jsx(
1966
- "button",
1967
- {
1968
- onClick: () => onPageChange(meta.page - 1),
1969
- disabled: meta.page === 0 || isLoading,
1970
- 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",
1971
- "aria-label": "Previous page",
1972
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
1973
- }
1974
- ),
1975
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex", children: renderPageNumbers(
1976
- meta.page,
1977
- meta.totalPages,
1978
- maxVisiblePages,
1979
- onPageChange
1980
- ) }),
1981
- /* @__PURE__ */ jsxRuntime.jsx(
1982
- "button",
1983
- {
1984
- onClick: () => onPageChange(meta.page + 1),
1985
- disabled: meta.page >= meta.totalPages - 1 || isLoading,
1986
- 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",
1987
- "aria-label": "Next page",
1988
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
1989
- }
1990
- ),
1991
- /* @__PURE__ */ jsxRuntime.jsx(
1992
- "button",
1993
- {
1994
- onClick: () => onPageChange(meta.totalPages - 1),
1995
- disabled: meta.page >= meta.totalPages - 1 || isLoading,
1996
- 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",
1997
- "aria-label": "Last page",
1998
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsRight, { className: "h-4 w-4" })
1999
- }
2000
- )
2001
- ] }),
2002
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "whitespace-nowrap hidden sm:block", children: [
2003
- "Page ",
2004
- meta.page + 1,
2005
- " of ",
2006
- meta.totalPages
2007
- ] })
2008
- ] })
2009
- ] });
2010
- }
2011
1850
  var GrayBar = ({ className }) => /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className });
2012
1851
  var TableSkeleton = ({
2013
1852
  columns = 5,
@@ -2018,7 +1857,7 @@ var TableSkeleton = ({
2018
1857
  const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2019
1858
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-0 rounded-none shadow-none", children: /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
2020
1859
  /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: Array.from({ length: columns }).map((_, colIdx) => /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-4 w-4 rounded-none" }) }) : colIdx === 1 ? /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-[70%] max-w-[180px]" }) : /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-[60%] max-w-[120px]" }) }, `skeleton-header-${colIdx}`)) }) }),
2021
- /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: Array.from({ length: rowCount }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsx(TableRow, { className: "border-b border-primary/5", children: Array.from({ length: columns }).map((_2, colIdx) => /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-8 w-8 rounded-none" }) }) : colIdx === 1 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
1860
+ /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: Array.from({ length: rowCount }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsx(TableRow, { className: "border-b border-border", children: Array.from({ length: columns }).map((_2, colIdx) => /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "py-3", children: colIdx === 0 ? /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-4" }) : colIdx === columns - 1 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-8 w-8 rounded-none" }) }) : colIdx === 1 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
2022
1861
  /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "w-9 rounded-none shrink-0" }),
2023
1862
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 flex-1", children: [
2024
1863
  /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-4 w-[120px]" }),
@@ -2026,7 +1865,7 @@ var TableSkeleton = ({
2026
1865
  ] })
2027
1866
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-[60%] max-w-[120px]" }) }, colIdx)) }, rowIdx)) })
2028
1867
  ] }) }),
2029
- !hideFooter && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-footer border-t border-primary/5", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-2 py-4 p-4", children: [
1868
+ !hideFooter && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-footer border-t border-border", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-2 py-4 p-4", children: [
2030
1869
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 text-sm", children: /* @__PURE__ */ jsxRuntime.jsx(GrayBar, { className: "h-4 w-[120px]" }) }),
2031
1870
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-6", children: [
2032
1871
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
@@ -2047,232 +1886,55 @@ var TableSkeleton = ({
2047
1886
  if (hideWrapper) {
2048
1887
  return content;
2049
1888
  }
2050
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-wrapper rounded-none border border-primary/5 bg-card overflow-hidden", children: content });
1889
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-wrapper rounded-none border border-border bg-card overflow-hidden", children: content });
2051
1890
  };
2052
1891
  TableSkeleton.displayName = "TableSkeleton";
2053
- function ResponsiveTableInner({
2054
- data,
2055
- columns,
2056
- onRowClick,
2057
- renderMobileCard,
2058
- className,
2059
- emptyMessage = "No results found.",
2060
- ariaLabel,
2061
- tableWrapperClassName,
2062
- footer
2063
- }, ref) {
2064
- const visibleMobileColumns = React6__namespace.useMemo(
2065
- () => columns.filter((col) => !col.hideOnMobile),
2066
- [columns]
2067
- );
2068
- const primaryColumn = React6__namespace.useMemo(() => {
2069
- return visibleMobileColumns.find(
2070
- (col) => col.key !== "select" && col.key !== "actions"
2071
- ) || visibleMobileColumns[0];
2072
- }, [visibleMobileColumns]);
2073
- const secondaryColumns = React6__namespace.useMemo(
2074
- () => visibleMobileColumns.filter((col) => col.key !== primaryColumn?.key),
2075
- [visibleMobileColumns, primaryColumn]
2076
- );
2077
- React6__namespace.useEffect(() => {
2078
- const isDev = typeof globalThis !== "undefined" && globalThis.process && globalThis.process.env?.NODE_ENV === "development";
2079
- if (isDev && visibleMobileColumns.length === 0) {
2080
- console.warn(
2081
- "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."
2082
- );
2083
- }
2084
- }, [visibleMobileColumns.length]);
2085
- const handleItemClick = React6__namespace.useCallback(
2086
- (item, e) => {
2087
- if (!onRowClick) return;
2088
- if (e) {
2089
- const target = e.target;
2090
- if (target.closest('[role="checkbox"]') || target.closest("button") || target.closest("a") || target.closest('[role^="menuitem"]') || target.closest("[data-actions]")) {
2091
- return;
2092
- }
2093
- }
2094
- onRowClick(item);
2095
- },
2096
- [onRowClick]
2097
- );
2098
- const handleCardKeyDown = React6__namespace.useCallback(
2099
- (item) => (e) => {
2100
- if (onRowClick && (e.key === "Enter" || e.key === " ")) {
2101
- e.preventDefault();
2102
- handleItemClick(item, e);
2103
- }
2104
- },
2105
- [handleItemClick, onRowClick]
2106
- );
2107
- if (data.length === 0) {
2108
- return /* @__PURE__ */ jsxRuntime.jsx(
2109
- "div",
2110
- {
2111
- ref,
2112
- className: cn(
2113
- "p-8 text-center",
2114
- className
2115
- ),
2116
- children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage })
2117
- }
2118
- );
2119
- }
2120
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn("w-full", className), children: [
2121
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-4 md:hidden", children: data.map((item) => {
2122
- const primaryValue = primaryColumn ? String(item[primaryColumn.key]) : String(item.id);
2123
- if (renderMobileCard) {
2124
- return /* @__PURE__ */ jsxRuntime.jsx(
2125
- "div",
2126
- {
2127
- onClick: (e) => handleItemClick(item, e),
2128
- role: onRowClick ? "button" : void 0,
2129
- tabIndex: onRowClick ? 0 : void 0,
2130
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2131
- className: onRowClick ? "cursor-pointer" : void 0,
2132
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2133
- children: renderMobileCard(item, visibleMobileColumns)
2134
- },
2135
- item.id
2136
- );
2137
- }
2138
- return /* @__PURE__ */ jsxRuntime.jsxs(
2139
- Card,
2140
- {
2141
- variant: onRowClick ? "interactive" : "default",
2142
- className: cn(
2143
- onRowClick && "cursor-pointer",
2144
- "transition-all duration-150"
2145
- ),
2146
- onClick: (e) => handleItemClick(item, e),
2147
- role: onRowClick ? "button" : void 0,
2148
- tabIndex: onRowClick ? 0 : void 0,
2149
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2150
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2151
- children: [
2152
- primaryColumn ? /* @__PURE__ */ jsxRuntime.jsx(CardHeader, { className: "pb-3", children: /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { className: "text-base", children: primaryColumn.render ? primaryColumn.render(item[primaryColumn.key], item) : String(item[primaryColumn.key]) }) }) : null,
2153
- secondaryColumns.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: "pb-3", children: /* @__PURE__ */ jsxRuntime.jsx("dl", { className: "flex flex-col gap-2", children: secondaryColumns.map((column) => /* @__PURE__ */ jsxRuntime.jsxs(
2154
- "div",
2155
- {
2156
- className: "flex items-start justify-between gap-4 text-sm",
2157
- children: [
2158
- !column.hideLabelOnMobile && /* @__PURE__ */ jsxRuntime.jsxs("dt", { className: "text-muted-foreground min-w-[80px] shrink-0", children: [
2159
- column.label,
2160
- ":"
2161
- ] }),
2162
- /* @__PURE__ */ jsxRuntime.jsx(
2163
- "dd",
2164
- {
2165
- className: cn(
2166
- "font-medium flex-1",
2167
- !column.hideLabelOnMobile ? "text-right" : "text-left"
2168
- ),
2169
- children: column.render ? column.render(item[column.key], item) : String(item[column.key])
2170
- }
2171
- )
2172
- ]
2173
- },
2174
- String(column.key)
2175
- )) }) })
2176
- ]
2177
- },
2178
- item.id
2179
- );
2180
- }) }),
2181
- /* @__PURE__ */ jsxRuntime.jsx(
2182
- "div",
2183
- {
2184
- className: cn(
2185
- "table-wrapper hidden md:block overflow-hidden rounded-none border border-primary/5",
2186
- tableWrapperClassName
2187
- ),
2188
- children: /* @__PURE__ */ jsxRuntime.jsxs(Table, { "aria-label": ariaLabel || "Data table", children: [
2189
- /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { className: "bg-[hsl(var(--table-header-bg))]", children: /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx(
2190
- TableHead,
2191
- {
2192
- className: column.headerClassName,
2193
- children: column.label
2194
- },
2195
- String(column.key)
2196
- )) }) }),
2197
- /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: data.map((item) => {
2198
- const primaryValue = primaryColumn ? String(item[primaryColumn.key]) : String(item.id);
2199
- return /* @__PURE__ */ jsxRuntime.jsx(
2200
- TableRow,
2201
- {
2202
- className: cn(
2203
- "hover-unified-table-row",
2204
- onRowClick && "cursor-pointer"
2205
- ),
2206
- onClick: (e) => handleItemClick(item, e),
2207
- role: onRowClick ? "button" : void 0,
2208
- tabIndex: onRowClick ? 0 : void 0,
2209
- onKeyDown: onRowClick ? handleCardKeyDown(item) : void 0,
2210
- "aria-label": onRowClick ? `View details for ${primaryValue}` : void 0,
2211
- children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx(
2212
- TableCell,
2213
- {
2214
- className: column.cellClassName,
2215
- children: column.render ? column.render(item[column.key], item) : String(item[column.key])
2216
- },
2217
- String(column.key)
2218
- ))
2219
- },
2220
- item.id
2221
- );
2222
- }) })
2223
- ] })
2224
- }
2225
- ),
2226
- footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-footer border-t border-primary/5 bg-[hsl(var(--table-header-bg))]", children: footer })
2227
- ] });
2228
- }
2229
- var ResponsiveTable = React6__namespace.forwardRef(ResponsiveTableInner);
2230
1892
 
2231
1893
  // src/tailwind-preset.ts
2232
1894
  var uiPreset = {
2233
1895
  theme: {
2234
1896
  extend: {
2235
1897
  colors: {
2236
- border: "hsl(var(--border))",
2237
- input: "hsl(var(--input))",
2238
- ring: "hsl(var(--ring))",
2239
- background: "hsl(var(--background))",
2240
- foreground: "hsl(var(--foreground))",
1898
+ border: "var(--nx-border)",
1899
+ input: "var(--nx-input)",
1900
+ ring: "var(--nx-ring)",
1901
+ background: "var(--nx-background)",
1902
+ foreground: "var(--nx-foreground)",
2241
1903
  primary: {
2242
- DEFAULT: "hsl(var(--primary))",
2243
- foreground: "hsl(var(--primary-foreground))"
1904
+ DEFAULT: "var(--nx-primary)",
1905
+ foreground: "var(--nx-primary-foreground)"
2244
1906
  },
2245
1907
  secondary: {
2246
- DEFAULT: "hsl(var(--secondary))",
2247
- foreground: "hsl(var(--secondary-foreground))"
1908
+ DEFAULT: "var(--nx-secondary)",
1909
+ foreground: "var(--nx-secondary-foreground)"
2248
1910
  },
2249
1911
  destructive: {
2250
- DEFAULT: "hsl(var(--destructive))",
2251
- foreground: "hsl(var(--destructive-foreground))"
1912
+ DEFAULT: "var(--nx-destructive)",
1913
+ foreground: "var(--nx-destructive-foreground)"
2252
1914
  },
2253
1915
  success: {
2254
- DEFAULT: "hsl(var(--success))",
2255
- foreground: "hsl(var(--success-foreground))"
1916
+ DEFAULT: "var(--nx-success)",
1917
+ foreground: "var(--nx-success-foreground)"
2256
1918
  },
2257
1919
  warning: {
2258
- DEFAULT: "hsl(var(--warning))",
2259
- foreground: "hsl(var(--warning-foreground))"
1920
+ DEFAULT: "var(--nx-warning)",
1921
+ foreground: "var(--nx-warning-foreground)"
2260
1922
  },
2261
1923
  muted: {
2262
- DEFAULT: "hsl(var(--muted))",
2263
- foreground: "hsl(var(--muted-foreground))"
1924
+ DEFAULT: "var(--nx-muted)",
1925
+ foreground: "var(--nx-muted-foreground)"
2264
1926
  },
2265
1927
  accent: {
2266
- DEFAULT: "hsl(var(--accent))",
2267
- foreground: "hsl(var(--accent-foreground))"
1928
+ DEFAULT: "var(--nx-accent)",
1929
+ foreground: "var(--nx-accent-foreground)"
2268
1930
  },
2269
1931
  popover: {
2270
- DEFAULT: "hsl(var(--popover))",
2271
- foreground: "hsl(var(--popover-foreground))"
1932
+ DEFAULT: "var(--nx-popover)",
1933
+ foreground: "var(--nx-popover-foreground)"
2272
1934
  },
2273
1935
  card: {
2274
- DEFAULT: "hsl(var(--card))",
2275
- foreground: "hsl(var(--card-foreground))"
1936
+ DEFAULT: "var(--nx-card)",
1937
+ foreground: "var(--nx-card-foreground)"
2276
1938
  }
2277
1939
  },
2278
1940
  borderRadius: {
@@ -2382,7 +2044,6 @@ exports.PortalProvider = PortalProvider;
2382
2044
  exports.Progress = Progress;
2383
2045
  exports.RadioGroup = RadioGroup;
2384
2046
  exports.RadioGroupItem = RadioGroupItem;
2385
- exports.ResponsiveTable = ResponsiveTable;
2386
2047
  exports.Select = Select;
2387
2048
  exports.SelectContent = SelectContent;
2388
2049
  exports.SelectGroup = SelectGroup;
@@ -2417,7 +2078,6 @@ exports.TableFooter = TableFooter;
2417
2078
  exports.TableHead = TableHead;
2418
2079
  exports.TableHeader = TableHeader;
2419
2080
  exports.TableLoading = TableLoading;
2420
- exports.TablePagination = TablePagination;
2421
2081
  exports.TableRow = TableRow;
2422
2082
  exports.TableSearch = TableSearch;
2423
2083
  exports.TableSkeleton = TableSkeleton;