@hilum/ui 1.0.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/{chunk-ELL3JM3Z.js → chunk-H6JZQWX3.js} +59 -15
- package/dist/chunk-H6JZQWX3.js.map +1 -0
- package/dist/index.d.ts +350 -290
- package/dist/index.js +490 -436
- package/dist/index.js.map +1 -1
- package/dist/tokens.css +42 -16
- package/dist/tokens.d.ts +33 -8
- package/dist/tokens.js +1 -1
- package/llms.txt +9 -9
- package/package.json +1 -1
- package/src/components/accordion.tsx +5 -5
- package/src/components/action-panel.tsx +8 -6
- package/src/components/activity-feed.tsx +7 -5
- package/src/components/alert-dialog.tsx +5 -5
- package/src/components/alert.tsx +5 -5
- package/src/components/avatar-stack.tsx +3 -3
- package/src/components/avatar.tsx +4 -4
- package/src/components/badge.tsx +7 -7
- package/src/components/breadcrumb.tsx +5 -6
- package/src/components/button-group.tsx +7 -4
- package/src/components/button.tsx +7 -7
- package/src/components/calendar.tsx +10 -10
- package/src/components/card-heading.tsx +3 -3
- package/src/components/card.tsx +4 -4
- package/src/components/chart.tsx +10 -10
- package/src/components/checkbox.tsx +2 -2
- package/src/components/color-input.tsx +7 -5
- package/src/components/color-picker.tsx +8 -6
- package/src/components/combobox.tsx +66 -31
- package/src/components/command-palette.tsx +13 -11
- package/src/components/command.tsx +14 -12
- package/src/components/context-menu.tsx +16 -16
- package/src/components/data-table.tsx +18 -7
- package/src/components/date-picker.tsx +2 -2
- package/src/components/description-list.tsx +10 -8
- package/src/components/dialog.tsx +4 -4
- package/src/components/drawer.tsx +5 -5
- package/src/components/dropdown-menu.tsx +16 -16
- package/src/components/empty-state.tsx +5 -3
- package/src/components/field.tsx +4 -4
- package/src/components/grid-list.tsx +17 -13
- package/src/components/hover-card.tsx +1 -1
- package/src/components/input-group.tsx +10 -10
- package/src/components/input-number.tsx +7 -7
- package/src/components/input-otp.tsx +3 -3
- package/src/components/input.tsx +4 -4
- package/src/components/kbd.tsx +1 -1
- package/src/components/label.tsx +1 -1
- package/src/components/media-object.tsx +2 -0
- package/src/components/menubar.tsx +21 -21
- package/src/components/native-select.tsx +5 -5
- package/src/components/navigation-menu.tsx +10 -10
- package/src/components/notification.tsx +13 -11
- package/src/components/page-heading.tsx +8 -8
- package/src/components/pagination.tsx +1 -1
- package/src/components/popover.tsx +1 -1
- package/src/components/progress.tsx +1 -1
- package/src/components/property-row.tsx +3 -1
- package/src/components/radio-card.tsx +10 -8
- package/src/components/radio-group.tsx +4 -4
- package/src/components/resizable.tsx +3 -3
- package/src/components/scroll-area.tsx +1 -1
- package/src/components/section-heading.tsx +3 -3
- package/src/components/select.tsx +13 -13
- package/src/components/separator.tsx +1 -1
- package/src/components/sheet.tsx +4 -4
- package/src/components/sidebar.tsx +20 -20
- package/src/components/skeleton.tsx +1 -1
- package/src/components/slider.tsx +2 -2
- package/src/components/sonner.tsx +9 -8
- package/src/components/stacked-list.tsx +5 -5
- package/src/components/stat-card.tsx +9 -7
- package/src/components/steps.tsx +16 -14
- package/src/components/switch.tsx +2 -2
- package/src/components/table.tsx +9 -9
- package/src/components/tabs.tsx +2 -2
- package/src/components/textarea.tsx +4 -4
- package/src/components/toggle.tsx +9 -9
- package/src/components/tooltip.tsx +1 -1
- package/src/tokens/tokens.ts +36 -9
- package/dist/chunk-ELL3JM3Z.js.map +0 -1
|
@@ -20,7 +20,7 @@ const ContextMenuContent = React.forwardRef<
|
|
|
20
20
|
<ContextMenu.Content
|
|
21
21
|
ref={ref}
|
|
22
22
|
className={cn(
|
|
23
|
-
"z-50 min-w-[8rem] bg-
|
|
23
|
+
"z-50 min-w-[8rem] bg-card rounded-xl shadow-natural p-1",
|
|
24
24
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
25
25
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
26
26
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -47,8 +47,8 @@ const ContextMenuItem = React.forwardRef<
|
|
|
47
47
|
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
|
|
48
48
|
"body outline-none transition-colors",
|
|
49
49
|
destructive
|
|
50
|
-
? "text-
|
|
51
|
-
: "text-
|
|
50
|
+
? "text-destructive focus:bg-destructive/10 focus:text-destructive"
|
|
51
|
+
: "text-muted-foreground focus:bg-muted focus:text-foreground",
|
|
52
52
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
53
53
|
inset && "pl-8",
|
|
54
54
|
className,
|
|
@@ -66,8 +66,8 @@ const ContextMenuCheckboxItem = React.forwardRef<
|
|
|
66
66
|
ref={ref}
|
|
67
67
|
className={cn(
|
|
68
68
|
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
|
|
69
|
-
"body text-
|
|
70
|
-
"focus:bg-
|
|
69
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
70
|
+
"focus:bg-muted focus:text-foreground",
|
|
71
71
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
72
72
|
className,
|
|
73
73
|
)}
|
|
@@ -75,7 +75,7 @@ const ContextMenuCheckboxItem = React.forwardRef<
|
|
|
75
75
|
>
|
|
76
76
|
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
77
77
|
<ContextMenu.ItemIndicator>
|
|
78
|
-
<Check size={13} className="text-
|
|
78
|
+
<Check size={13} className="text-foreground" />
|
|
79
79
|
</ContextMenu.ItemIndicator>
|
|
80
80
|
</span>
|
|
81
81
|
{children}
|
|
@@ -91,8 +91,8 @@ const ContextMenuRadioItem = React.forwardRef<
|
|
|
91
91
|
ref={ref}
|
|
92
92
|
className={cn(
|
|
93
93
|
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
|
|
94
|
-
"body text-
|
|
95
|
-
"focus:bg-
|
|
94
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
95
|
+
"focus:bg-muted focus:text-foreground",
|
|
96
96
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
97
97
|
className,
|
|
98
98
|
)}
|
|
@@ -100,7 +100,7 @@ const ContextMenuRadioItem = React.forwardRef<
|
|
|
100
100
|
>
|
|
101
101
|
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
102
102
|
<ContextMenu.ItemIndicator>
|
|
103
|
-
<Circle size={8} className="fill-
|
|
103
|
+
<Circle size={8} className="fill-foreground text-foreground" />
|
|
104
104
|
</ContextMenu.ItemIndicator>
|
|
105
105
|
</span>
|
|
106
106
|
{children}
|
|
@@ -116,7 +116,7 @@ const ContextMenuLabel = React.forwardRef<
|
|
|
116
116
|
>(({ className, inset, ...props }, ref) => (
|
|
117
117
|
<ContextMenu.Label
|
|
118
118
|
ref={ref}
|
|
119
|
-
className={cn("px-2.5 py-1 label text-
|
|
119
|
+
className={cn("px-2.5 py-1 label text-muted-foreground", inset && "pl-8", className)}
|
|
120
120
|
{...props}
|
|
121
121
|
/>
|
|
122
122
|
));
|
|
@@ -128,7 +128,7 @@ const ContextMenuSeparator = React.forwardRef<
|
|
|
128
128
|
>(({ className, ...props }, ref) => (
|
|
129
129
|
<ContextMenu.Separator
|
|
130
130
|
ref={ref}
|
|
131
|
-
className={cn("mx-1 my-1 h-px bg-
|
|
131
|
+
className={cn("mx-1 my-1 h-px bg-muted", className)}
|
|
132
132
|
{...props}
|
|
133
133
|
/>
|
|
134
134
|
));
|
|
@@ -144,15 +144,15 @@ const ContextMenuSubTrigger = React.forwardRef<
|
|
|
144
144
|
ref={ref}
|
|
145
145
|
className={cn(
|
|
146
146
|
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
|
|
147
|
-
"body text-
|
|
148
|
-
"focus:bg-
|
|
147
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
148
|
+
"focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
|
|
149
149
|
inset && "pl-8",
|
|
150
150
|
className,
|
|
151
151
|
)}
|
|
152
152
|
{...props}
|
|
153
153
|
>
|
|
154
154
|
{children}
|
|
155
|
-
<ChevronRight size={14} className="ml-auto text-
|
|
155
|
+
<ChevronRight size={14} className="ml-auto text-muted-foreground" />
|
|
156
156
|
</ContextMenu.SubTrigger>
|
|
157
157
|
));
|
|
158
158
|
ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
|
|
@@ -164,7 +164,7 @@ const ContextMenuSubContent = React.forwardRef<
|
|
|
164
164
|
<ContextMenu.SubContent
|
|
165
165
|
ref={ref}
|
|
166
166
|
className={cn(
|
|
167
|
-
"z-50 min-w-[8rem] bg-
|
|
167
|
+
"z-50 min-w-[8rem] bg-card rounded-xl border border-border shadow-natural p-1",
|
|
168
168
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
169
169
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
170
170
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -177,7 +177,7 @@ const ContextMenuSubContent = React.forwardRef<
|
|
|
177
177
|
ContextMenuSubContent.displayName = "ContextMenuSubContent";
|
|
178
178
|
|
|
179
179
|
function ContextMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
|
|
180
|
-
return <span className={cn("ml-auto caption text-
|
|
180
|
+
return <span className={cn("ml-auto caption text-muted-foreground", className)} {...props} />;
|
|
181
181
|
}
|
|
182
182
|
ContextMenuShortcut.displayName = "ContextMenuShortcut";
|
|
183
183
|
|
|
@@ -67,12 +67,23 @@ function DataTable<TData>({
|
|
|
67
67
|
{table.getHeaderGroups().map((headerGroup) => (
|
|
68
68
|
<TableRow key={headerGroup.id}>
|
|
69
69
|
{headerGroup.headers.map((header) => (
|
|
70
|
-
<TableHead
|
|
70
|
+
<TableHead
|
|
71
|
+
key={header.id}
|
|
72
|
+
aria-sort={
|
|
73
|
+
header.column.getCanSort()
|
|
74
|
+
? header.column.getIsSorted() === "asc"
|
|
75
|
+
? "ascending"
|
|
76
|
+
: header.column.getIsSorted() === "desc"
|
|
77
|
+
? "descending"
|
|
78
|
+
: "none"
|
|
79
|
+
: undefined
|
|
80
|
+
}
|
|
81
|
+
>
|
|
71
82
|
{header.isPlaceholder ? null : header.column.getCanSort() ? (
|
|
72
83
|
<button
|
|
73
84
|
className={cn(
|
|
74
|
-
"flex items-center gap-1 transition-colors hover:text-
|
|
75
|
-
header.column.getIsSorted() && "text-
|
|
85
|
+
"flex items-center gap-1 transition-colors hover:text-muted-foreground",
|
|
86
|
+
header.column.getIsSorted() && "text-foreground",
|
|
76
87
|
)}
|
|
77
88
|
onClick={header.column.getToggleSortingHandler()}
|
|
78
89
|
>
|
|
@@ -82,7 +93,7 @@ function DataTable<TData>({
|
|
|
82
93
|
) : header.column.getIsSorted() === "desc" ? (
|
|
83
94
|
<ChevronDown size={12} className="text-brand-primary" />
|
|
84
95
|
) : (
|
|
85
|
-
<ChevronsUpDown size={12} className="text-
|
|
96
|
+
<ChevronsUpDown size={12} className="text-muted-foreground" />
|
|
86
97
|
)}
|
|
87
98
|
</button>
|
|
88
99
|
) : (
|
|
@@ -106,7 +117,7 @@ function DataTable<TData>({
|
|
|
106
117
|
))
|
|
107
118
|
) : (
|
|
108
119
|
<TableRow>
|
|
109
|
-
<TableCell colSpan={columns.length} className="h-24 text-center text-
|
|
120
|
+
<TableCell colSpan={columns.length} className="h-24 text-center text-muted-foreground">
|
|
110
121
|
No results.
|
|
111
122
|
</TableCell>
|
|
112
123
|
</TableRow>
|
|
@@ -115,12 +126,12 @@ function DataTable<TData>({
|
|
|
115
126
|
</Table>
|
|
116
127
|
{showPagination && (
|
|
117
128
|
<div className="flex items-center justify-between">
|
|
118
|
-
<p className="caption text-
|
|
129
|
+
<p className="caption text-muted-foreground">
|
|
119
130
|
{table.getFilteredRowModel().rows.length} result
|
|
120
131
|
{table.getFilteredRowModel().rows.length !== 1 ? "s" : ""}
|
|
121
132
|
</p>
|
|
122
133
|
<div className="flex items-center gap-2">
|
|
123
|
-
<span className="caption text-
|
|
134
|
+
<span className="caption text-muted-foreground">
|
|
124
135
|
Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
|
|
125
136
|
</span>
|
|
126
137
|
<Button
|
|
@@ -36,12 +36,12 @@ function DatePicker({
|
|
|
36
36
|
variant="outline"
|
|
37
37
|
className={cn(
|
|
38
38
|
"w-[240px] justify-start gap-2 text-left font-normal",
|
|
39
|
-
!value && "text-
|
|
39
|
+
!value && "text-muted-foreground",
|
|
40
40
|
className,
|
|
41
41
|
)}
|
|
42
42
|
disabled={disabled}
|
|
43
43
|
>
|
|
44
|
-
<CalendarIcon size={14} className="text-
|
|
44
|
+
<CalendarIcon size={14} className="text-muted-foreground shrink-0" />
|
|
45
45
|
{value ? formatDate(value) : <span>{placeholder}</span>}
|
|
46
46
|
</Button>
|
|
47
47
|
</PopoverTrigger>
|
|
@@ -28,12 +28,12 @@ function DescriptionList({
|
|
|
28
28
|
<div className={className}>
|
|
29
29
|
{(title || description) && (
|
|
30
30
|
<div className="mb-4">
|
|
31
|
-
{title && <p className="body font-semibold text-
|
|
32
|
-
{description && <p className="mt-1 caption text-
|
|
31
|
+
{title && <p className="body font-semibold text-foreground">{title}</p>}
|
|
32
|
+
{description && <p className="mt-1 caption text-muted-foreground">{description}</p>}
|
|
33
33
|
</div>
|
|
34
34
|
)}
|
|
35
35
|
|
|
36
|
-
<dl className={cn("border-t border-
|
|
36
|
+
<dl className={cn("border-t border-border", columns === 2 && "sm:grid sm:grid-cols-2")}>
|
|
37
37
|
{items.map((item, i) => (
|
|
38
38
|
<div
|
|
39
39
|
key={i}
|
|
@@ -41,15 +41,15 @@ function DescriptionList({
|
|
|
41
41
|
"py-3.5",
|
|
42
42
|
columns === 1
|
|
43
43
|
? "grid grid-cols-3 gap-4 items-baseline"
|
|
44
|
-
: "flex flex-col gap-1 border-b border-
|
|
45
|
-
columns === 1 && i !== items.length - 1 && "border-b border-
|
|
46
|
-
striped && i % 2 === 0 && "bg-
|
|
44
|
+
: "flex flex-col gap-1 border-b border-border",
|
|
45
|
+
columns === 1 && i !== items.length - 1 && "border-b border-border",
|
|
46
|
+
striped && i % 2 === 0 && "bg-muted -mx-4 px-4 rounded",
|
|
47
47
|
)}
|
|
48
48
|
>
|
|
49
|
-
<dt className="caption font-semibold text-
|
|
49
|
+
<dt className="caption font-semibold text-muted-foreground uppercase tracking-wide">
|
|
50
50
|
{item.term}
|
|
51
51
|
</dt>
|
|
52
|
-
<dd className={cn("body text-
|
|
52
|
+
<dd className={cn("body text-foreground", columns === 1 ? "col-span-2" : "")}>
|
|
53
53
|
{item.action ? (
|
|
54
54
|
<div className="flex items-center justify-between gap-4">
|
|
55
55
|
<span>{item.details}</span>
|
|
@@ -66,5 +66,7 @@ function DescriptionList({
|
|
|
66
66
|
);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
DescriptionList.displayName = "DescriptionList";
|
|
70
|
+
|
|
69
71
|
export { DescriptionList };
|
|
70
72
|
export type { DescriptionItem };
|
|
@@ -36,7 +36,7 @@ const DialogContent = React.forwardRef<
|
|
|
36
36
|
ref={ref}
|
|
37
37
|
className={cn(
|
|
38
38
|
"fixed left-[50%] top-[50%] z-50 translate-x-[-50%] translate-y-[-50%]",
|
|
39
|
-
"w-full max-w-lg bg-
|
|
39
|
+
"w-full max-w-lg bg-card rounded-2xl shadow-elevated p-6",
|
|
40
40
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
41
41
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
42
42
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -45,7 +45,7 @@ const DialogContent = React.forwardRef<
|
|
|
45
45
|
{...props}
|
|
46
46
|
>
|
|
47
47
|
{children}
|
|
48
|
-
<Dialog.Close className="absolute right-4 top-4 rounded-md p-1 text-
|
|
48
|
+
<Dialog.Close className="absolute right-4 top-4 rounded-md p-1 text-muted-foreground opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring/20">
|
|
49
49
|
<X size={16} />
|
|
50
50
|
<span className="sr-only">Close</span>
|
|
51
51
|
</Dialog.Close>
|
|
@@ -70,7 +70,7 @@ const DialogTitle = React.forwardRef<
|
|
|
70
70
|
>(({ className, ...props }, ref) => (
|
|
71
71
|
<Dialog.Title
|
|
72
72
|
ref={ref}
|
|
73
|
-
className={cn("body-lg font-semibold text-
|
|
73
|
+
className={cn("body-lg font-semibold text-foreground", className)}
|
|
74
74
|
{...props}
|
|
75
75
|
/>
|
|
76
76
|
));
|
|
@@ -80,7 +80,7 @@ const DialogDescription = React.forwardRef<
|
|
|
80
80
|
React.ComponentRef<typeof Dialog.Description>,
|
|
81
81
|
React.ComponentPropsWithoutRef<typeof Dialog.Description>
|
|
82
82
|
>(({ className, ...props }, ref) => (
|
|
83
|
-
<Dialog.Description ref={ref} className={cn("body text-
|
|
83
|
+
<Dialog.Description ref={ref} className={cn("body text-muted-foreground", className)} {...props} />
|
|
84
84
|
));
|
|
85
85
|
DialogDescription.displayName = "DialogDescription";
|
|
86
86
|
|
|
@@ -15,7 +15,7 @@ const DrawerOverlay = React.forwardRef<
|
|
|
15
15
|
>(({ className, ...props }, ref) => (
|
|
16
16
|
<DrawerPrimitive.Overlay
|
|
17
17
|
ref={ref}
|
|
18
|
-
className={cn("fixed inset-0 z-50 bg-
|
|
18
|
+
className={cn("fixed inset-0 z-50 bg-foreground/40 backdrop-blur-[1px]", className)}
|
|
19
19
|
{...props}
|
|
20
20
|
/>
|
|
21
21
|
));
|
|
@@ -30,12 +30,12 @@ const DrawerContent = React.forwardRef<
|
|
|
30
30
|
<DrawerPrimitive.Content
|
|
31
31
|
ref={ref}
|
|
32
32
|
className={cn(
|
|
33
|
-
"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border border-
|
|
33
|
+
"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border border-border bg-card",
|
|
34
34
|
className,
|
|
35
35
|
)}
|
|
36
36
|
{...props}
|
|
37
37
|
>
|
|
38
|
-
<div className="mx-auto mt-4 h-1 w-12 rounded-full bg-
|
|
38
|
+
<div className="mx-auto mt-4 h-1 w-12 rounded-full bg-muted" />
|
|
39
39
|
{children}
|
|
40
40
|
</DrawerPrimitive.Content>
|
|
41
41
|
</DrawerPortal>
|
|
@@ -58,7 +58,7 @@ const DrawerTitle = React.forwardRef<
|
|
|
58
58
|
>(({ className, ...props }, ref) => (
|
|
59
59
|
<DrawerPrimitive.Title
|
|
60
60
|
ref={ref}
|
|
61
|
-
className={cn("subheading text-
|
|
61
|
+
className={cn("subheading text-foreground", className)}
|
|
62
62
|
{...props}
|
|
63
63
|
/>
|
|
64
64
|
));
|
|
@@ -70,7 +70,7 @@ const DrawerDescription = React.forwardRef<
|
|
|
70
70
|
>(({ className, ...props }, ref) => (
|
|
71
71
|
<DrawerPrimitive.Description
|
|
72
72
|
ref={ref}
|
|
73
|
-
className={cn("body text-
|
|
73
|
+
className={cn("body text-muted-foreground", className)}
|
|
74
74
|
{...props}
|
|
75
75
|
/>
|
|
76
76
|
));
|
|
@@ -21,7 +21,7 @@ const DropdownMenuContent = React.forwardRef<
|
|
|
21
21
|
ref={ref}
|
|
22
22
|
sideOffset={sideOffset}
|
|
23
23
|
className={cn(
|
|
24
|
-
"z-50 min-w-[8rem] bg-
|
|
24
|
+
"z-50 min-w-[8rem] bg-card rounded-xl shadow-natural p-1",
|
|
25
25
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
26
26
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
27
27
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -48,8 +48,8 @@ const DropdownMenuItem = React.forwardRef<
|
|
|
48
48
|
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
|
|
49
49
|
"body outline-none transition-colors",
|
|
50
50
|
destructive
|
|
51
|
-
? "text-
|
|
52
|
-
: "text-
|
|
51
|
+
? "text-destructive focus:bg-destructive/10 focus:text-destructive"
|
|
52
|
+
: "text-muted-foreground focus:bg-muted focus:text-foreground",
|
|
53
53
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
54
54
|
inset && "pl-8",
|
|
55
55
|
className,
|
|
@@ -67,8 +67,8 @@ const DropdownMenuCheckboxItem = React.forwardRef<
|
|
|
67
67
|
ref={ref}
|
|
68
68
|
className={cn(
|
|
69
69
|
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
|
|
70
|
-
"body text-
|
|
71
|
-
"focus:bg-
|
|
70
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
71
|
+
"focus:bg-muted focus:text-foreground",
|
|
72
72
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
73
73
|
className,
|
|
74
74
|
)}
|
|
@@ -76,7 +76,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
|
|
|
76
76
|
>
|
|
77
77
|
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
78
78
|
<DropdownMenu.ItemIndicator>
|
|
79
|
-
<Check size={13} className="text-
|
|
79
|
+
<Check size={13} className="text-foreground" />
|
|
80
80
|
</DropdownMenu.ItemIndicator>
|
|
81
81
|
</span>
|
|
82
82
|
{children}
|
|
@@ -92,8 +92,8 @@ const DropdownMenuRadioItem = React.forwardRef<
|
|
|
92
92
|
ref={ref}
|
|
93
93
|
className={cn(
|
|
94
94
|
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
|
|
95
|
-
"body text-
|
|
96
|
-
"focus:bg-
|
|
95
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
96
|
+
"focus:bg-muted focus:text-foreground",
|
|
97
97
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
98
98
|
className,
|
|
99
99
|
)}
|
|
@@ -101,7 +101,7 @@ const DropdownMenuRadioItem = React.forwardRef<
|
|
|
101
101
|
>
|
|
102
102
|
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
103
103
|
<DropdownMenu.ItemIndicator>
|
|
104
|
-
<Circle size={8} className="fill-
|
|
104
|
+
<Circle size={8} className="fill-foreground text-foreground" />
|
|
105
105
|
</DropdownMenu.ItemIndicator>
|
|
106
106
|
</span>
|
|
107
107
|
{children}
|
|
@@ -117,7 +117,7 @@ const DropdownMenuLabel = React.forwardRef<
|
|
|
117
117
|
>(({ className, inset, ...props }, ref) => (
|
|
118
118
|
<DropdownMenu.Label
|
|
119
119
|
ref={ref}
|
|
120
|
-
className={cn("px-2.5 py-1 label text-
|
|
120
|
+
className={cn("px-2.5 py-1 label text-muted-foreground", inset && "pl-8", className)}
|
|
121
121
|
{...props}
|
|
122
122
|
/>
|
|
123
123
|
));
|
|
@@ -129,7 +129,7 @@ const DropdownMenuSeparator = React.forwardRef<
|
|
|
129
129
|
>(({ className, ...props }, ref) => (
|
|
130
130
|
<DropdownMenu.Separator
|
|
131
131
|
ref={ref}
|
|
132
|
-
className={cn("mx-1 my-1 h-px bg-
|
|
132
|
+
className={cn("mx-1 my-1 h-px bg-muted", className)}
|
|
133
133
|
{...props}
|
|
134
134
|
/>
|
|
135
135
|
));
|
|
@@ -145,15 +145,15 @@ const DropdownMenuSubTrigger = React.forwardRef<
|
|
|
145
145
|
ref={ref}
|
|
146
146
|
className={cn(
|
|
147
147
|
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
|
|
148
|
-
"body text-
|
|
149
|
-
"focus:bg-
|
|
148
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
149
|
+
"focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
|
|
150
150
|
inset && "pl-8",
|
|
151
151
|
className,
|
|
152
152
|
)}
|
|
153
153
|
{...props}
|
|
154
154
|
>
|
|
155
155
|
{children}
|
|
156
|
-
<ChevronRight size={14} className="ml-auto text-
|
|
156
|
+
<ChevronRight size={14} className="ml-auto text-muted-foreground" />
|
|
157
157
|
</DropdownMenu.SubTrigger>
|
|
158
158
|
));
|
|
159
159
|
DropdownMenuSubTrigger.displayName = "DropdownMenuSubTrigger";
|
|
@@ -165,7 +165,7 @@ const DropdownMenuSubContent = React.forwardRef<
|
|
|
165
165
|
<DropdownMenu.SubContent
|
|
166
166
|
ref={ref}
|
|
167
167
|
className={cn(
|
|
168
|
-
"z-50 min-w-[8rem] bg-
|
|
168
|
+
"z-50 min-w-[8rem] bg-card rounded-xl border border-border shadow-natural p-1",
|
|
169
169
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
170
170
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
171
171
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -178,7 +178,7 @@ const DropdownMenuSubContent = React.forwardRef<
|
|
|
178
178
|
DropdownMenuSubContent.displayName = "DropdownMenuSubContent";
|
|
179
179
|
|
|
180
180
|
function DropdownMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
|
|
181
|
-
return <span className={cn("ml-auto caption text-
|
|
181
|
+
return <span className={cn("ml-auto caption text-muted-foreground", className)} {...props} />;
|
|
182
182
|
}
|
|
183
183
|
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
|
|
184
184
|
|
|
@@ -18,13 +18,13 @@ function EmptyState({ icon, title, description, action, className }: EmptyStateP
|
|
|
18
18
|
return (
|
|
19
19
|
<div className={cn("flex flex-col items-center gap-4 px-6 py-14 text-center", className)}>
|
|
20
20
|
{icon && (
|
|
21
|
-
<div className="flex size-12 items-center justify-center rounded-xl bg-brand-secondary/20 text-
|
|
21
|
+
<div className="flex size-12 items-center justify-center rounded-xl bg-brand-secondary/20 text-muted-foreground">
|
|
22
22
|
{icon}
|
|
23
23
|
</div>
|
|
24
24
|
)}
|
|
25
25
|
<div className="flex flex-col gap-1.5">
|
|
26
|
-
<p className="body font-semibold text-
|
|
27
|
-
{description && <p className="body max-w-xs text-
|
|
26
|
+
<p className="body font-semibold text-foreground">{title}</p>
|
|
27
|
+
{description && <p className="body max-w-xs text-muted-foreground">{description}</p>}
|
|
28
28
|
</div>
|
|
29
29
|
{action &&
|
|
30
30
|
(action.href ? (
|
|
@@ -40,4 +40,6 @@ function EmptyState({ icon, title, description, action, className }: EmptyStateP
|
|
|
40
40
|
);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
EmptyState.displayName = "EmptyState";
|
|
44
|
+
|
|
43
45
|
export { EmptyState };
|
package/src/components/field.tsx
CHANGED
|
@@ -34,15 +34,15 @@ function Field({
|
|
|
34
34
|
<div className="flex items-center justify-between gap-2">
|
|
35
35
|
<Label htmlFor={htmlFor} aria-required={required}>
|
|
36
36
|
{label}
|
|
37
|
-
{required && <span className="ml-0.5 text-
|
|
37
|
+
{required && <span className="ml-0.5 text-destructive" aria-hidden="true">*</span>}
|
|
38
38
|
</Label>
|
|
39
|
-
{cornerHint && <span className="caption text-
|
|
39
|
+
{cornerHint && <span className="caption text-muted-foreground">{cornerHint}</span>}
|
|
40
40
|
</div>
|
|
41
41
|
{children}
|
|
42
42
|
{error ? (
|
|
43
|
-
<p id={descriptionId} role="alert" className="caption text-
|
|
43
|
+
<p id={descriptionId} role="alert" className="caption text-destructive">{error}</p>
|
|
44
44
|
) : hint ? (
|
|
45
|
-
<p id={descriptionId} className="caption text-
|
|
45
|
+
<p id={descriptionId} className="caption text-muted-foreground">{hint}</p>
|
|
46
46
|
) : null}
|
|
47
47
|
</div>
|
|
48
48
|
);
|
|
@@ -58,18 +58,18 @@ function GridListCard({
|
|
|
58
58
|
const inner = (
|
|
59
59
|
<div
|
|
60
60
|
className={cn(
|
|
61
|
-
"flex h-full flex-col gap-1 rounded-xl border border-
|
|
61
|
+
"flex h-full flex-col gap-1 rounded-xl border border-border bg-card p-4 shadow-natural transition-shadow",
|
|
62
62
|
href && "hover:shadow-elevated",
|
|
63
63
|
className,
|
|
64
64
|
)}
|
|
65
65
|
>
|
|
66
66
|
{accent && <div className="mb-2">{accent}</div>}
|
|
67
|
-
<p className="body font-semibold text-
|
|
68
|
-
{description && <p className="caption text-
|
|
67
|
+
<p className="body font-semibold text-foreground">{title}</p>
|
|
68
|
+
{description && <p className="caption text-muted-foreground">{description}</p>}
|
|
69
69
|
{(meta || trailing) && (
|
|
70
70
|
<div className="mt-auto flex items-center justify-between pt-3">
|
|
71
|
-
{meta && <span className="caption text-
|
|
72
|
-
{trailing && <span className="caption text-
|
|
71
|
+
{meta && <span className="caption text-muted-foreground">{meta}</span>}
|
|
72
|
+
{trailing && <span className="caption text-muted-foreground">{trailing}</span>}
|
|
73
73
|
</div>
|
|
74
74
|
)}
|
|
75
75
|
</div>
|
|
@@ -80,7 +80,7 @@ function GridListCard({
|
|
|
80
80
|
{href ? (
|
|
81
81
|
<a
|
|
82
82
|
href={href}
|
|
83
|
-
className="block h-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
83
|
+
className="block h-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 rounded-xl"
|
|
84
84
|
>
|
|
85
85
|
{inner}
|
|
86
86
|
</a>
|
|
@@ -109,7 +109,7 @@ function GridListAccentCard({
|
|
|
109
109
|
title,
|
|
110
110
|
meta,
|
|
111
111
|
href,
|
|
112
|
-
accentClass = "bg-
|
|
112
|
+
accentClass = "bg-foreground",
|
|
113
113
|
initials,
|
|
114
114
|
trailing,
|
|
115
115
|
className,
|
|
@@ -117,23 +117,23 @@ function GridListAccentCard({
|
|
|
117
117
|
const inner = (
|
|
118
118
|
<div
|
|
119
119
|
className={cn(
|
|
120
|
-
"flex overflow-hidden rounded-xl border border-
|
|
120
|
+
"flex overflow-hidden rounded-xl border border-border bg-card shadow-natural transition-shadow",
|
|
121
121
|
href && "hover:shadow-elevated",
|
|
122
122
|
className,
|
|
123
123
|
)}
|
|
124
124
|
>
|
|
125
125
|
<div
|
|
126
126
|
className={cn(
|
|
127
|
-
"flex w-14 shrink-0 items-center justify-center body font-semibold text-
|
|
127
|
+
"flex w-14 shrink-0 items-center justify-center body font-semibold text-background",
|
|
128
128
|
accentClass,
|
|
129
129
|
)}
|
|
130
130
|
>
|
|
131
131
|
{initials}
|
|
132
132
|
</div>
|
|
133
|
-
<div className="flex flex-1 items-center justify-between truncate border-l border-
|
|
133
|
+
<div className="flex flex-1 items-center justify-between truncate border-l border-border px-4 py-3">
|
|
134
134
|
<div className="min-w-0">
|
|
135
|
-
<p className="body font-semibold text-
|
|
136
|
-
{meta && <p className="caption text-
|
|
135
|
+
<p className="body font-semibold text-foreground truncate">{title}</p>
|
|
136
|
+
{meta && <p className="caption text-muted-foreground">{meta}</p>}
|
|
137
137
|
</div>
|
|
138
138
|
{trailing && <div className="shrink-0 pl-2">{trailing}</div>}
|
|
139
139
|
</div>
|
|
@@ -145,7 +145,7 @@ function GridListAccentCard({
|
|
|
145
145
|
{href ? (
|
|
146
146
|
<a
|
|
147
147
|
href={href}
|
|
148
|
-
className="block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
148
|
+
className="block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 rounded-xl"
|
|
149
149
|
>
|
|
150
150
|
{inner}
|
|
151
151
|
</a>
|
|
@@ -156,4 +156,8 @@ function GridListAccentCard({
|
|
|
156
156
|
);
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
+
GridList.displayName = "GridList";
|
|
160
|
+
GridListCard.displayName = "GridListCard";
|
|
161
|
+
GridListAccentCard.displayName = "GridListAccentCard";
|
|
162
|
+
|
|
159
163
|
export { GridList, GridListCard, GridListAccentCard };
|
|
@@ -17,7 +17,7 @@ const HoverCardContent = React.forwardRef<
|
|
|
17
17
|
align={align}
|
|
18
18
|
sideOffset={sideOffset}
|
|
19
19
|
className={cn(
|
|
20
|
-
"z-50 w-64 rounded-xl border border-
|
|
20
|
+
"z-50 w-64 rounded-xl border border-border bg-card p-4 shadow-elevated outline-none",
|
|
21
21
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
22
22
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
23
23
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -34,11 +34,11 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
34
34
|
const hasTrailing = trailingAddon || trailingIcon || trailingButton || error;
|
|
35
35
|
|
|
36
36
|
const baseInput = cn(
|
|
37
|
-
"flex h-9 w-full border bg-
|
|
37
|
+
"flex h-9 w-full border bg-card body text-foreground placeholder:text-muted-foreground",
|
|
38
38
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:disabled:cursor-not-allowed disabled:opacity-50",
|
|
39
39
|
error
|
|
40
|
-
? "border-
|
|
41
|
-
: "border-
|
|
40
|
+
? "border-destructive focus-visible:ring-destructive/20 focus-visible:border-destructive"
|
|
41
|
+
: "border-border focus-visible:ring-brand-primary/20 focus-visible:border-brand-primary",
|
|
42
42
|
);
|
|
43
43
|
|
|
44
44
|
if (!hasLeading && !hasTrailing) {
|
|
@@ -51,8 +51,8 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
51
51
|
{leadingAddon && (
|
|
52
52
|
<span
|
|
53
53
|
className={cn(
|
|
54
|
-
"inline-flex items-center border border-r-0 bg-
|
|
55
|
-
error ? "border-
|
|
54
|
+
"inline-flex items-center border border-r-0 bg-muted px-3 body text-muted-foreground select-none",
|
|
55
|
+
error ? "border-destructive" : "border-border",
|
|
56
56
|
pill ? "rounded-l-full" : "rounded-l-lg",
|
|
57
57
|
)}
|
|
58
58
|
>
|
|
@@ -63,7 +63,7 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
63
63
|
{/* Relative wrapper for icon-only inputs */}
|
|
64
64
|
<div className="relative flex-1">
|
|
65
65
|
{leadingIcon && (
|
|
66
|
-
<div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-
|
|
66
|
+
<div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-muted-foreground">
|
|
67
67
|
{leadingIcon}
|
|
68
68
|
</div>
|
|
69
69
|
)}
|
|
@@ -102,9 +102,9 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
102
102
|
{(trailingIcon || error) && (
|
|
103
103
|
<div className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3">
|
|
104
104
|
{error ? (
|
|
105
|
-
<AlertCircle size={15} className="text-
|
|
105
|
+
<AlertCircle size={15} className="text-destructive" />
|
|
106
106
|
) : (
|
|
107
|
-
<span className="text-
|
|
107
|
+
<span className="text-muted-foreground">{trailingIcon}</span>
|
|
108
108
|
)}
|
|
109
109
|
</div>
|
|
110
110
|
)}
|
|
@@ -114,8 +114,8 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
114
114
|
{trailingAddon && (
|
|
115
115
|
<span
|
|
116
116
|
className={cn(
|
|
117
|
-
"inline-flex items-center border border-l-0 bg-
|
|
118
|
-
error ? "border-
|
|
117
|
+
"inline-flex items-center border border-l-0 bg-muted px-3 body text-muted-foreground select-none",
|
|
118
|
+
error ? "border-destructive" : "border-border",
|
|
119
119
|
pill ? "rounded-r-full" : "rounded-r-lg",
|
|
120
120
|
)}
|
|
121
121
|
>
|