@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
|
@@ -81,7 +81,7 @@ const InputNumber = React.forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
81
81
|
return (
|
|
82
82
|
<div
|
|
83
83
|
className={cn(
|
|
84
|
-
"inline-flex h-8 items-stretch rounded-md border border-
|
|
84
|
+
"inline-flex h-8 items-stretch rounded-md border border-border bg-card overflow-hidden",
|
|
85
85
|
"focus-within:ring-2 focus-within:ring-brand-primary/20 focus-within:border-brand-primary",
|
|
86
86
|
disabled && "opacity-50 pointer-events-none",
|
|
87
87
|
className,
|
|
@@ -97,34 +97,34 @@ const InputNumber = React.forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
97
97
|
onBlur={(e) => commit(e.target.value)}
|
|
98
98
|
onKeyDown={onKeyDown}
|
|
99
99
|
disabled={disabled}
|
|
100
|
-
className="w-full caption text-
|
|
100
|
+
className="w-full caption text-foreground px-2 bg-transparent focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none text-right"
|
|
101
101
|
{...rest}
|
|
102
102
|
/>
|
|
103
103
|
{unit && (
|
|
104
|
-
<span aria-hidden className="caption-xs text-
|
|
104
|
+
<span aria-hidden className="caption-xs text-muted-foreground self-center pr-1.5 select-none">
|
|
105
105
|
{unit}
|
|
106
106
|
</span>
|
|
107
107
|
)}
|
|
108
108
|
{!hideSteppers && (
|
|
109
|
-
<div className="flex flex-col border-l border-
|
|
109
|
+
<div className="flex flex-col border-l border-border">
|
|
110
110
|
<button
|
|
111
111
|
type="button"
|
|
112
112
|
tabIndex={-1}
|
|
113
113
|
onClick={() => bump(step)}
|
|
114
114
|
aria-label="Increment"
|
|
115
|
-
className="flex-1 px-1 hover:bg-
|
|
115
|
+
className="flex-1 px-1 hover:bg-muted active:bg-muted transition-colors text-muted-foreground"
|
|
116
116
|
>
|
|
117
117
|
<svg viewBox="0 0 8 5" width="8" height="5" fill="currentColor">
|
|
118
118
|
<path d="M0 5 L4 0 L8 5 Z" />
|
|
119
119
|
</svg>
|
|
120
120
|
</button>
|
|
121
|
-
<div className="border-t border-
|
|
121
|
+
<div className="border-t border-border" />
|
|
122
122
|
<button
|
|
123
123
|
type="button"
|
|
124
124
|
tabIndex={-1}
|
|
125
125
|
onClick={() => bump(-step)}
|
|
126
126
|
aria-label="Decrement"
|
|
127
|
-
className="flex-1 px-1 hover:bg-
|
|
127
|
+
className="flex-1 px-1 hover:bg-muted active:bg-muted transition-colors text-muted-foreground"
|
|
128
128
|
>
|
|
129
129
|
<svg viewBox="0 0 8 5" width="8" height="5" fill="currentColor">
|
|
130
130
|
<path d="M0 0 L4 5 L8 0 Z" />
|
|
@@ -37,7 +37,7 @@ const InputOTPSlot = React.forwardRef<
|
|
|
37
37
|
ref={ref}
|
|
38
38
|
className={cn(
|
|
39
39
|
"relative flex h-12 w-11 items-center justify-center",
|
|
40
|
-
"border-y border-r border-
|
|
40
|
+
"border-y border-r border-border body font-medium text-foreground",
|
|
41
41
|
"first:rounded-l-xl first:border-l last:rounded-r-xl",
|
|
42
42
|
"transition-all",
|
|
43
43
|
isActive && "z-10 ring-2 ring-brand-primary/40 border-brand-primary",
|
|
@@ -48,7 +48,7 @@ const InputOTPSlot = React.forwardRef<
|
|
|
48
48
|
{char}
|
|
49
49
|
{hasFakeCaret && (
|
|
50
50
|
<div className="pointer-events-none absolute inset-0 flex items-center justify-center">
|
|
51
|
-
<div className="h-5 w-px animate-caret-blink bg-
|
|
51
|
+
<div className="h-5 w-px animate-caret-blink bg-foreground duration-1000" />
|
|
52
52
|
</div>
|
|
53
53
|
)}
|
|
54
54
|
</div>
|
|
@@ -59,7 +59,7 @@ InputOTPSlot.displayName = "InputOTPSlot";
|
|
|
59
59
|
const InputOTPSeparator = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
60
60
|
({ ...props }, ref) => (
|
|
61
61
|
<div ref={ref} role="separator" {...props}>
|
|
62
|
-
<Minus size={14} className="text-
|
|
62
|
+
<Minus size={14} className="text-muted-foreground" />
|
|
63
63
|
</div>
|
|
64
64
|
),
|
|
65
65
|
);
|
package/src/components/input.tsx
CHANGED
|
@@ -7,12 +7,12 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
|
7
7
|
type={type}
|
|
8
8
|
data-slot="input"
|
|
9
9
|
className={cn(
|
|
10
|
-
"flex h-9 w-full rounded-md border border-
|
|
11
|
-
"body text-
|
|
10
|
+
"flex h-9 w-full rounded-md border border-border bg-card px-3 py-1",
|
|
11
|
+
"body text-foreground placeholder:text-muted-foreground",
|
|
12
12
|
"transition-colors duration-150",
|
|
13
13
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/20 focus-visible:border-brand-primary",
|
|
14
|
-
"disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-
|
|
15
|
-
"file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-
|
|
14
|
+
"disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-muted",
|
|
15
|
+
"file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground",
|
|
16
16
|
className,
|
|
17
17
|
)}
|
|
18
18
|
{...props}
|
package/src/components/kbd.tsx
CHANGED
|
@@ -6,7 +6,7 @@ const Kbd = React.forwardRef<HTMLElement, React.ComponentProps<"kbd">>(
|
|
|
6
6
|
<kbd
|
|
7
7
|
ref={ref}
|
|
8
8
|
className={cn(
|
|
9
|
-
"inline-flex h-5 min-w-5 items-center justify-center rounded border border-
|
|
9
|
+
"inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1.5 font-mono caption-xs font-medium text-muted-foreground",
|
|
10
10
|
className,
|
|
11
11
|
)}
|
|
12
12
|
{...props}
|
package/src/components/label.tsx
CHANGED
|
@@ -11,7 +11,7 @@ const Label = React.forwardRef<
|
|
|
11
11
|
<LabelPrimitive.Root
|
|
12
12
|
ref={ref}
|
|
13
13
|
className={cn(
|
|
14
|
-
"body font-medium leading-none text-
|
|
14
|
+
"body font-medium leading-none text-muted-foreground",
|
|
15
15
|
"peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
16
16
|
className,
|
|
17
17
|
)}
|
|
@@ -12,7 +12,7 @@ const MenubarRoot = React.forwardRef<
|
|
|
12
12
|
<Menubar.Root
|
|
13
13
|
ref={ref}
|
|
14
14
|
className={cn(
|
|
15
|
-
"flex h-9 items-center gap-0.5 rounded-lg border border-
|
|
15
|
+
"flex h-9 items-center gap-0.5 rounded-lg border border-border bg-card px-1",
|
|
16
16
|
className,
|
|
17
17
|
)}
|
|
18
18
|
{...props}
|
|
@@ -35,10 +35,10 @@ const MenubarTrigger = React.forwardRef<
|
|
|
35
35
|
<Menubar.Trigger
|
|
36
36
|
ref={ref}
|
|
37
37
|
className={cn(
|
|
38
|
-
"flex cursor-default items-center rounded-md px-3 py-1 body font-medium text-
|
|
39
|
-
"hover:bg-
|
|
40
|
-
"data-[state=open]:bg-
|
|
41
|
-
"focus:bg-
|
|
38
|
+
"flex cursor-default items-center rounded-md px-3 py-1 body font-medium text-muted-foreground select-none outline-none",
|
|
39
|
+
"hover:bg-muted",
|
|
40
|
+
"data-[state=open]:bg-muted data-[state=open]:text-foreground",
|
|
41
|
+
"focus:bg-muted",
|
|
42
42
|
className,
|
|
43
43
|
)}
|
|
44
44
|
{...props}
|
|
@@ -57,7 +57,7 @@ const MenubarContent = React.forwardRef<
|
|
|
57
57
|
alignOffset={alignOffset}
|
|
58
58
|
sideOffset={sideOffset}
|
|
59
59
|
className={cn(
|
|
60
|
-
"z-50 min-w-[12rem] bg-
|
|
60
|
+
"z-50 min-w-[12rem] bg-card rounded-xl shadow-natural p-1",
|
|
61
61
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
62
62
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
63
63
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -81,8 +81,8 @@ const MenubarItem = React.forwardRef<
|
|
|
81
81
|
ref={ref}
|
|
82
82
|
className={cn(
|
|
83
83
|
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
|
|
84
|
-
"body text-
|
|
85
|
-
"focus:bg-
|
|
84
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
85
|
+
"focus:bg-muted focus:text-foreground",
|
|
86
86
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
87
87
|
inset && "pl-8",
|
|
88
88
|
className,
|
|
@@ -100,8 +100,8 @@ const MenubarCheckboxItem = React.forwardRef<
|
|
|
100
100
|
ref={ref}
|
|
101
101
|
className={cn(
|
|
102
102
|
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
|
|
103
|
-
"body text-
|
|
104
|
-
"focus:bg-
|
|
103
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
104
|
+
"focus:bg-muted focus:text-foreground",
|
|
105
105
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
106
106
|
className,
|
|
107
107
|
)}
|
|
@@ -109,7 +109,7 @@ const MenubarCheckboxItem = React.forwardRef<
|
|
|
109
109
|
>
|
|
110
110
|
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
111
111
|
<Menubar.ItemIndicator>
|
|
112
|
-
<Check size={13} className="text-
|
|
112
|
+
<Check size={13} className="text-foreground" />
|
|
113
113
|
</Menubar.ItemIndicator>
|
|
114
114
|
</span>
|
|
115
115
|
{children}
|
|
@@ -125,8 +125,8 @@ const MenubarRadioItem = React.forwardRef<
|
|
|
125
125
|
ref={ref}
|
|
126
126
|
className={cn(
|
|
127
127
|
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
|
|
128
|
-
"body text-
|
|
129
|
-
"focus:bg-
|
|
128
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
129
|
+
"focus:bg-muted focus:text-foreground",
|
|
130
130
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
131
131
|
className,
|
|
132
132
|
)}
|
|
@@ -134,7 +134,7 @@ const MenubarRadioItem = React.forwardRef<
|
|
|
134
134
|
>
|
|
135
135
|
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
136
136
|
<Menubar.ItemIndicator>
|
|
137
|
-
<Circle size={8} className="fill-
|
|
137
|
+
<Circle size={8} className="fill-foreground text-foreground" />
|
|
138
138
|
</Menubar.ItemIndicator>
|
|
139
139
|
</span>
|
|
140
140
|
{children}
|
|
@@ -150,7 +150,7 @@ const MenubarLabel = React.forwardRef<
|
|
|
150
150
|
>(({ className, inset, ...props }, ref) => (
|
|
151
151
|
<Menubar.Label
|
|
152
152
|
ref={ref}
|
|
153
|
-
className={cn("px-2.5 py-1 label text-
|
|
153
|
+
className={cn("px-2.5 py-1 label text-muted-foreground", inset && "pl-8", className)}
|
|
154
154
|
{...props}
|
|
155
155
|
/>
|
|
156
156
|
));
|
|
@@ -162,7 +162,7 @@ const MenubarSeparator = React.forwardRef<
|
|
|
162
162
|
>(({ className, ...props }, ref) => (
|
|
163
163
|
<Menubar.Separator
|
|
164
164
|
ref={ref}
|
|
165
|
-
className={cn("mx-1 my-1 h-px bg-
|
|
165
|
+
className={cn("mx-1 my-1 h-px bg-muted", className)}
|
|
166
166
|
{...props}
|
|
167
167
|
/>
|
|
168
168
|
));
|
|
@@ -178,15 +178,15 @@ const MenubarSubTrigger = React.forwardRef<
|
|
|
178
178
|
ref={ref}
|
|
179
179
|
className={cn(
|
|
180
180
|
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
|
|
181
|
-
"body text-
|
|
182
|
-
"focus:bg-
|
|
181
|
+
"body text-muted-foreground outline-none transition-colors",
|
|
182
|
+
"focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
|
|
183
183
|
inset && "pl-8",
|
|
184
184
|
className,
|
|
185
185
|
)}
|
|
186
186
|
{...props}
|
|
187
187
|
>
|
|
188
188
|
{children}
|
|
189
|
-
<ChevronRight size={14} className="ml-auto text-
|
|
189
|
+
<ChevronRight size={14} className="ml-auto text-muted-foreground" />
|
|
190
190
|
</Menubar.SubTrigger>
|
|
191
191
|
));
|
|
192
192
|
MenubarSubTrigger.displayName = "MenubarSubTrigger";
|
|
@@ -198,7 +198,7 @@ const MenubarSubContent = React.forwardRef<
|
|
|
198
198
|
<Menubar.SubContent
|
|
199
199
|
ref={ref}
|
|
200
200
|
className={cn(
|
|
201
|
-
"z-50 min-w-[8rem] bg-
|
|
201
|
+
"z-50 min-w-[8rem] bg-card rounded-xl border border-border shadow-natural p-1",
|
|
202
202
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
203
203
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
204
204
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -211,7 +211,7 @@ const MenubarSubContent = React.forwardRef<
|
|
|
211
211
|
MenubarSubContent.displayName = "MenubarSubContent";
|
|
212
212
|
|
|
213
213
|
function MenubarShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
|
|
214
|
-
return <span className={cn("ml-auto caption text-
|
|
214
|
+
return <span className={cn("ml-auto caption text-muted-foreground", className)} {...props} />;
|
|
215
215
|
}
|
|
216
216
|
MenubarShortcut.displayName = "MenubarShortcut";
|
|
217
217
|
|
|
@@ -10,11 +10,11 @@ const NativeSelect = React.forwardRef<
|
|
|
10
10
|
<select
|
|
11
11
|
ref={ref}
|
|
12
12
|
className={cn(
|
|
13
|
-
"peer h-9 w-full appearance-none rounded-lg border border-
|
|
14
|
-
"body text-
|
|
15
|
-
"focus:outline-none focus:ring-2 focus:ring-
|
|
13
|
+
"peer h-9 w-full appearance-none rounded-lg border border-border bg-card pl-3 pr-8",
|
|
14
|
+
"body text-foreground",
|
|
15
|
+
"focus:outline-none focus:ring-2 focus:ring-ring/30 focus:border-border",
|
|
16
16
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
17
|
-
"aria-[invalid=true]:border-
|
|
17
|
+
"aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:ring-destructive/20",
|
|
18
18
|
className,
|
|
19
19
|
)}
|
|
20
20
|
{...props}
|
|
@@ -23,7 +23,7 @@ const NativeSelect = React.forwardRef<
|
|
|
23
23
|
</select>
|
|
24
24
|
<ChevronDown
|
|
25
25
|
size={14}
|
|
26
|
-
className="pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-
|
|
26
|
+
className="pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground peer-disabled:opacity-50"
|
|
27
27
|
/>
|
|
28
28
|
</div>
|
|
29
29
|
));
|
|
@@ -41,9 +41,9 @@ const NavigationMenuTrigger = React.forwardRef<
|
|
|
41
41
|
ref={ref}
|
|
42
42
|
className={cn(
|
|
43
43
|
"group inline-flex h-9 w-max items-center justify-center gap-1 rounded-md px-3 py-2",
|
|
44
|
-
"body font-medium text-
|
|
45
|
-
"hover:bg-
|
|
46
|
-
"data-[active]:bg-
|
|
44
|
+
"body font-medium text-muted-foreground",
|
|
45
|
+
"hover:bg-muted hover:text-foreground",
|
|
46
|
+
"data-[active]:bg-muted data-[state=open]:bg-muted",
|
|
47
47
|
"outline-none transition-colors",
|
|
48
48
|
className,
|
|
49
49
|
)}
|
|
@@ -86,8 +86,8 @@ const NavigationMenuLink = React.forwardRef<
|
|
|
86
86
|
<NavigationMenu.Link
|
|
87
87
|
ref={ref}
|
|
88
88
|
className={cn(
|
|
89
|
-
"block select-none rounded-md px-3 py-2 body text-
|
|
90
|
-
"hover:bg-
|
|
89
|
+
"block select-none rounded-md px-3 py-2 body text-muted-foreground",
|
|
90
|
+
"hover:bg-muted hover:text-foreground",
|
|
91
91
|
"outline-none transition-colors",
|
|
92
92
|
className,
|
|
93
93
|
)}
|
|
@@ -104,7 +104,7 @@ const NavigationMenuViewport = React.forwardRef<
|
|
|
104
104
|
<NavigationMenu.Viewport
|
|
105
105
|
ref={ref}
|
|
106
106
|
className={cn(
|
|
107
|
-
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-xl border border-
|
|
107
|
+
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-xl border border-border bg-card shadow-elevated",
|
|
108
108
|
"md:w-[var(--radix-navigation-menu-viewport-width)]",
|
|
109
109
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
110
110
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90",
|
|
@@ -130,7 +130,7 @@ const NavigationMenuIndicator = React.forwardRef<
|
|
|
130
130
|
)}
|
|
131
131
|
{...props}
|
|
132
132
|
>
|
|
133
|
-
<div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-
|
|
133
|
+
<div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-muted shadow-elevated" />
|
|
134
134
|
</NavigationMenu.Indicator>
|
|
135
135
|
));
|
|
136
136
|
NavigationMenuIndicator.displayName = "NavigationMenuIndicator";
|
|
@@ -138,9 +138,9 @@ NavigationMenuIndicator.displayName = "NavigationMenuIndicator";
|
|
|
138
138
|
function navigationMenuTriggerStyle() {
|
|
139
139
|
return cn(
|
|
140
140
|
"group inline-flex h-9 w-max items-center justify-center gap-1 rounded-md px-3 py-2",
|
|
141
|
-
"body font-medium text-
|
|
142
|
-
"hover:bg-
|
|
143
|
-
"data-[active]:bg-
|
|
141
|
+
"body font-medium text-muted-foreground",
|
|
142
|
+
"hover:bg-muted hover:text-foreground",
|
|
143
|
+
"data-[active]:bg-muted data-[state=open]:bg-muted",
|
|
144
144
|
"outline-none transition-colors",
|
|
145
145
|
);
|
|
146
146
|
}
|
|
@@ -19,17 +19,17 @@ interface NotificationProps {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const variantConfig = {
|
|
22
|
-
default: { icon: null, iconClass: "text-
|
|
22
|
+
default: { icon: null, iconClass: "text-muted-foreground" },
|
|
23
23
|
success: {
|
|
24
24
|
icon: CheckCircle,
|
|
25
|
-
iconClass: "bg-brand-secondary/25 text-
|
|
25
|
+
iconClass: "bg-brand-secondary/25 text-muted-foreground rounded-full p-1",
|
|
26
26
|
},
|
|
27
|
-
error: { icon: AlertCircle, iconClass: "text-
|
|
27
|
+
error: { icon: AlertCircle, iconClass: "text-destructive" },
|
|
28
28
|
warning: {
|
|
29
29
|
icon: AlertTriangle,
|
|
30
|
-
iconClass: "bg-brand-secondary/80 text-
|
|
30
|
+
iconClass: "bg-brand-secondary/80 text-muted-foreground rounded-full p-1",
|
|
31
31
|
},
|
|
32
|
-
info: { icon: Info, iconClass: "text-
|
|
32
|
+
info: { icon: Info, iconClass: "text-muted-foreground" },
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
function Notification({
|
|
@@ -49,7 +49,7 @@ function Notification({
|
|
|
49
49
|
return (
|
|
50
50
|
<div
|
|
51
51
|
className={cn(
|
|
52
|
-
"pointer-events-auto w-full max-w-sm overflow-hidden rounded-xl border border-
|
|
52
|
+
"pointer-events-auto w-full max-w-sm overflow-hidden rounded-xl border border-border bg-card shadow-elevated",
|
|
53
53
|
className,
|
|
54
54
|
)}
|
|
55
55
|
>
|
|
@@ -62,8 +62,8 @@ function Notification({
|
|
|
62
62
|
|
|
63
63
|
{/* Body */}
|
|
64
64
|
<div className="min-w-0 flex-1">
|
|
65
|
-
<p className="body font-semibold text-
|
|
66
|
-
{description && <p className="mt-0.5 body text-
|
|
65
|
+
<p className="body font-semibold text-foreground">{title}</p>
|
|
66
|
+
{description && <p className="mt-0.5 body text-muted-foreground">{description}</p>}
|
|
67
67
|
|
|
68
68
|
{/* Actions */}
|
|
69
69
|
{actions && actions.length > 0 && (
|
|
@@ -76,8 +76,8 @@ function Notification({
|
|
|
76
76
|
className={cn(
|
|
77
77
|
"body font-semibold transition-colors",
|
|
78
78
|
action.variant === "ghost"
|
|
79
|
-
? "text-
|
|
80
|
-
: "text-
|
|
79
|
+
? "text-muted-foreground hover:text-muted-foreground"
|
|
80
|
+
: "text-foreground hover:text-muted-foreground",
|
|
81
81
|
)}
|
|
82
82
|
>
|
|
83
83
|
{action.label}
|
|
@@ -93,7 +93,7 @@ function Notification({
|
|
|
93
93
|
<button
|
|
94
94
|
type="button"
|
|
95
95
|
onClick={onClose}
|
|
96
|
-
className="rounded-md text-
|
|
96
|
+
className="rounded-md text-muted-foreground hover:text-muted-foreground transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30"
|
|
97
97
|
>
|
|
98
98
|
<span className="sr-only">Close</span>
|
|
99
99
|
<X size={16} />
|
|
@@ -106,4 +106,6 @@ function Notification({
|
|
|
106
106
|
);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
+
Notification.displayName = "Notification";
|
|
110
|
+
|
|
109
111
|
export { Notification };
|
|
@@ -42,22 +42,22 @@ function PageHeading({
|
|
|
42
42
|
className,
|
|
43
43
|
}: PageHeadingProps) {
|
|
44
44
|
return (
|
|
45
|
-
<div className={cn("border-b border-
|
|
45
|
+
<div className={cn("border-b border-border pb-6", className)}>
|
|
46
46
|
{/* Breadcrumbs */}
|
|
47
47
|
{breadcrumbs && breadcrumbs.length > 0 && (
|
|
48
48
|
<nav className="mb-3 flex items-center gap-1.5" aria-label="Breadcrumb">
|
|
49
49
|
{breadcrumbs.map((crumb, i) => (
|
|
50
50
|
<React.Fragment key={i}>
|
|
51
|
-
{i > 0 && <ChevronRight size={12} className="text-
|
|
51
|
+
{i > 0 && <ChevronRight size={12} className="text-muted-foreground shrink-0" />}
|
|
52
52
|
{crumb.href ? (
|
|
53
53
|
<a
|
|
54
54
|
href={crumb.href}
|
|
55
|
-
className="caption text-
|
|
55
|
+
className="caption text-muted-foreground hover:text-muted-foreground transition-colors"
|
|
56
56
|
>
|
|
57
57
|
{crumb.label}
|
|
58
58
|
</a>
|
|
59
59
|
) : (
|
|
60
|
-
<span className="caption font-semibold text-
|
|
60
|
+
<span className="caption font-semibold text-muted-foreground">{crumb.label}</span>
|
|
61
61
|
)}
|
|
62
62
|
</React.Fragment>
|
|
63
63
|
))}
|
|
@@ -68,7 +68,7 @@ function PageHeading({
|
|
|
68
68
|
<div className="flex flex-wrap items-start justify-between gap-4">
|
|
69
69
|
<div className="min-w-0 flex-1">
|
|
70
70
|
<div className="flex items-center gap-3">
|
|
71
|
-
<h1 className="display text-
|
|
71
|
+
<h1 className="display text-foreground truncate">{title}</h1>
|
|
72
72
|
{badge &&
|
|
73
73
|
(typeof badge === "string" ? (
|
|
74
74
|
<Badge variant="secondary">{badge}</Badge>
|
|
@@ -76,14 +76,14 @@ function PageHeading({
|
|
|
76
76
|
<Badge variant={badge.variant ?? "secondary"}>{badge.label}</Badge>
|
|
77
77
|
))}
|
|
78
78
|
</div>
|
|
79
|
-
{description && <p className="mt-1.5 body text-
|
|
79
|
+
{description && <p className="mt-1.5 body text-muted-foreground max-w-2xl">{description}</p>}
|
|
80
80
|
|
|
81
81
|
{/* Meta */}
|
|
82
82
|
{meta && meta.length > 0 && (
|
|
83
83
|
<div className="mt-3 flex flex-wrap items-center gap-4">
|
|
84
84
|
{meta.map((m, i) => (
|
|
85
|
-
<div key={i} className="flex items-center gap-1.5 caption text-
|
|
86
|
-
{m.icon && <span className="text-
|
|
85
|
+
<div key={i} className="flex items-center gap-1.5 caption text-muted-foreground">
|
|
86
|
+
{m.icon && <span className="text-muted-foreground">{m.icon}</span>}
|
|
87
87
|
<span>{m.text}</span>
|
|
88
88
|
</div>
|
|
89
89
|
))}
|
|
@@ -70,7 +70,7 @@ PaginationNext.displayName = "PaginationNext";
|
|
|
70
70
|
const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<"span">) => (
|
|
71
71
|
<span
|
|
72
72
|
aria-hidden
|
|
73
|
-
className={cn("flex size-8 items-center justify-center text-
|
|
73
|
+
className={cn("flex size-8 items-center justify-center text-muted-foreground", className)}
|
|
74
74
|
{...props}
|
|
75
75
|
>
|
|
76
76
|
<MoreHorizontal size={14} />
|
|
@@ -18,7 +18,7 @@ const PopoverContent = React.forwardRef<
|
|
|
18
18
|
align={align}
|
|
19
19
|
sideOffset={sideOffset}
|
|
20
20
|
className={cn(
|
|
21
|
-
"z-50 w-72 rounded-xl bg-
|
|
21
|
+
"z-50 w-72 rounded-xl bg-card p-4 shadow-natural outline-none",
|
|
22
22
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
23
23
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
24
24
|
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
@@ -8,7 +8,7 @@ const ProgressRoot = React.forwardRef<
|
|
|
8
8
|
>(({ className, value, ...props }, ref) => (
|
|
9
9
|
<Progress.Root
|
|
10
10
|
ref={ref}
|
|
11
|
-
className={cn("relative h-2 w-full overflow-hidden rounded-full bg-
|
|
11
|
+
className={cn("relative h-2 w-full overflow-hidden rounded-full bg-muted", className)}
|
|
12
12
|
value={value}
|
|
13
13
|
{...props}
|
|
14
14
|
>
|
|
@@ -41,7 +41,7 @@ function PropertyRow({
|
|
|
41
41
|
>
|
|
42
42
|
{label !== undefined && (
|
|
43
43
|
<div
|
|
44
|
-
className="caption text-
|
|
44
|
+
className="caption text-muted-foreground shrink-0 select-none"
|
|
45
45
|
style={{ width: typeof labelWidth === "number" ? `${labelWidth}px` : labelWidth }}
|
|
46
46
|
>
|
|
47
47
|
{label}
|
|
@@ -52,5 +52,7 @@ function PropertyRow({
|
|
|
52
52
|
);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
PropertyRow.displayName = "PropertyRow";
|
|
56
|
+
|
|
55
57
|
export { PropertyRow };
|
|
56
58
|
export type { PropertyRowProps };
|
|
@@ -46,8 +46,8 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
46
46
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30",
|
|
47
47
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
48
48
|
isSelected
|
|
49
|
-
? "border-brand-primary bg-
|
|
50
|
-
: "border-
|
|
49
|
+
? "border-brand-primary bg-card shadow-natural"
|
|
50
|
+
: "border-border bg-card hover:border-border",
|
|
51
51
|
)}
|
|
52
52
|
>
|
|
53
53
|
{/* Selected ring overlay */}
|
|
@@ -60,17 +60,17 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
60
60
|
|
|
61
61
|
<div className="flex items-start justify-between gap-2">
|
|
62
62
|
<div className="min-w-0 flex-1">
|
|
63
|
-
{option.icon && <div className="mb-2 text-
|
|
63
|
+
{option.icon && <div className="mb-2 text-muted-foreground">{option.icon}</div>}
|
|
64
64
|
<p
|
|
65
65
|
className={cn(
|
|
66
66
|
"body font-semibold",
|
|
67
|
-
isSelected ? "text-
|
|
67
|
+
isSelected ? "text-foreground" : "text-muted-foreground",
|
|
68
68
|
)}
|
|
69
69
|
>
|
|
70
70
|
{option.label}
|
|
71
71
|
</p>
|
|
72
72
|
{option.description && (
|
|
73
|
-
<p className="mt-0.5 caption text-
|
|
73
|
+
<p className="mt-0.5 caption text-muted-foreground">{option.description}</p>
|
|
74
74
|
)}
|
|
75
75
|
</div>
|
|
76
76
|
<div
|
|
@@ -78,10 +78,10 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
78
78
|
"flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors",
|
|
79
79
|
isSelected
|
|
80
80
|
? "border-brand-primary bg-brand-primary"
|
|
81
|
-
: "border-
|
|
81
|
+
: "border-border bg-card",
|
|
82
82
|
)}
|
|
83
83
|
>
|
|
84
|
-
{isSelected && <Check size={10} className="text-
|
|
84
|
+
{isSelected && <Check size={10} className="text-background" strokeWidth={3} />}
|
|
85
85
|
</div>
|
|
86
86
|
</div>
|
|
87
87
|
|
|
@@ -89,7 +89,7 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
89
89
|
<p
|
|
90
90
|
className={cn(
|
|
91
91
|
"caption font-semibold mt-2",
|
|
92
|
-
isSelected ? "text-
|
|
92
|
+
isSelected ? "text-foreground" : "text-muted-foreground",
|
|
93
93
|
)}
|
|
94
94
|
>
|
|
95
95
|
{option.meta}
|
|
@@ -102,4 +102,6 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
102
102
|
);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
RadioCards.displayName = "RadioCards";
|
|
106
|
+
|
|
105
107
|
export { RadioCards };
|
|
@@ -19,17 +19,17 @@ const RadioGroupItem = React.forwardRef<
|
|
|
19
19
|
<RadioGroup.Item
|
|
20
20
|
ref={ref}
|
|
21
21
|
className={cn(
|
|
22
|
-
"aspect-square size-4 rounded-full border border-
|
|
22
|
+
"aspect-square size-4 rounded-full border border-border text-foreground",
|
|
23
23
|
"shadow-none transition-colors",
|
|
24
|
-
"focus:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
24
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring/20",
|
|
25
25
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
26
|
-
"data-[state=checked]:bg-
|
|
26
|
+
"data-[state=checked]:bg-foreground data-[state=checked]:border-foreground",
|
|
27
27
|
className,
|
|
28
28
|
)}
|
|
29
29
|
{...props}
|
|
30
30
|
>
|
|
31
31
|
<RadioGroup.Indicator className="flex items-center justify-center">
|
|
32
|
-
<div className="size-2 rounded-full bg-
|
|
32
|
+
<div className="size-2 rounded-full bg-card" />
|
|
33
33
|
</RadioGroup.Indicator>
|
|
34
34
|
</RadioGroup.Item>
|
|
35
35
|
));
|
|
@@ -46,7 +46,7 @@ function ResizableHandle({ className, withHandle = true, ...props }: ResizableHa
|
|
|
46
46
|
return (
|
|
47
47
|
<Separator
|
|
48
48
|
className={cn(
|
|
49
|
-
"relative flex shrink-0 items-center justify-center bg-
|
|
49
|
+
"relative flex shrink-0 items-center justify-center bg-muted",
|
|
50
50
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-brand-primary/50",
|
|
51
51
|
// Horizontal (default): vertical bar
|
|
52
52
|
"[&:not([aria-orientation=vertical])]:h-full [&:not([aria-orientation=vertical])]:w-px",
|
|
@@ -62,8 +62,8 @@ function ResizableHandle({ className, withHandle = true, ...props }: ResizableHa
|
|
|
62
62
|
{...props}
|
|
63
63
|
>
|
|
64
64
|
{withHandle && (
|
|
65
|
-
<div className="z-10 flex h-5 w-3 items-center justify-center rounded-sm border border-
|
|
66
|
-
<GripVertical size={10} className="text-
|
|
65
|
+
<div className="z-10 flex h-5 w-3 items-center justify-center rounded-sm border border-border bg-card shadow-natural">
|
|
66
|
+
<GripVertical size={10} className="text-muted-foreground" />
|
|
67
67
|
</div>
|
|
68
68
|
)}
|
|
69
69
|
</Separator>
|
|
@@ -34,7 +34,7 @@ const ScrollAreaScrollbar = React.forwardRef<
|
|
|
34
34
|
)}
|
|
35
35
|
{...props}
|
|
36
36
|
>
|
|
37
|
-
<ScrollArea.Thumb className="relative flex-1 rounded-full bg-
|
|
37
|
+
<ScrollArea.Thumb className="relative flex-1 rounded-full bg-muted hover:bg-muted transition-colors" />
|
|
38
38
|
</ScrollArea.Scrollbar>
|
|
39
39
|
));
|
|
40
40
|
ScrollAreaScrollbar.displayName = "ScrollAreaScrollbar";
|