@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.cjs +190 -462
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +53 -146
- package/dist/index.d.ts +53 -146
- package/dist/index.mjs +190 -463
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme.css +327 -179
- package/package.json +11 -8
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
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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) =>
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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-
|
|
218
|
-
warning: "bg-
|
|
219
|
-
destructive: "bg-
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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-
|
|
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
|
-
//
|
|
517
|
-
//
|
|
518
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|