@hilum/ui 3.1.1 → 3.2.0
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/{chunk-5JX2YKJM.js → chunk-MAHPAP65.js} +65 -11
- package/dist/chunk-MAHPAP65.js.map +1 -0
- package/dist/icons.d.ts +1 -1
- package/dist/icons.js +1 -1
- package/dist/index.js +222 -149
- package/dist/index.js.map +1 -1
- package/dist/tokens.css +10 -0
- package/dist/tokens.d.ts +9 -0
- package/dist/tokens.js +1 -1
- package/package.json +1 -1
- package/src/components/account-menu.tsx +3 -10
- package/src/components/action-panel.tsx +10 -7
- package/src/components/alert-dialog.tsx +10 -6
- package/src/components/alert.tsx +6 -2
- package/src/components/avatar-stack.tsx +6 -1
- package/src/components/avatar.tsx +4 -1
- package/src/components/breadcrumb.tsx +6 -1
- package/src/components/button-group.tsx +1 -1
- package/src/components/button.tsx +9 -7
- package/src/components/calendar.tsx +6 -5
- package/src/components/card-heading.tsx +4 -2
- package/src/components/card.tsx +2 -2
- package/src/components/carousel.tsx +2 -2
- package/src/components/checkbox.tsx +2 -1
- package/src/components/color-picker.tsx +4 -4
- package/src/components/combobox.tsx +17 -7
- package/src/components/command-palette.tsx +4 -2
- package/src/components/command.tsx +4 -2
- package/src/components/context-menu.tsx +4 -4
- package/src/components/data-table.tsx +7 -4
- package/src/components/description-list.tsx +4 -2
- package/src/components/dialog.tsx +7 -3
- package/src/components/dropdown-menu.tsx +4 -4
- package/src/components/empty-state.tsx +4 -2
- package/src/components/field.tsx +11 -3
- package/src/components/grid-list.tsx +3 -3
- package/src/components/input-group.tsx +3 -3
- package/src/components/input-number.tsx +4 -1
- package/src/components/input-otp.tsx +1 -1
- package/src/components/input.tsx +1 -1
- package/src/components/menubar.tsx +7 -11
- package/src/components/native-select.tsx +1 -1
- package/src/components/navigation-menu.tsx +3 -3
- package/src/components/notification.tsx +6 -4
- package/src/components/page-heading.tsx +4 -2
- package/src/components/pagination.tsx +2 -2
- package/src/components/progress.tsx +1 -1
- package/src/components/radio-card.tsx +7 -6
- package/src/components/radio-group.tsx +2 -1
- package/src/components/section-heading.tsx +4 -2
- package/src/components/select.tsx +2 -2
- package/src/components/sheet.tsx +8 -4
- package/src/components/sidebar.tsx +8 -8
- package/src/components/slider.tsx +1 -1
- package/src/components/stat-card.tsx +2 -2
- package/src/components/steps.tsx +13 -11
- package/src/components/switch.tsx +4 -4
- package/src/components/toggle.tsx +5 -5
- package/src/icons.ts +4 -0
- package/src/tokens/tokens.ts +65 -10
- package/dist/chunk-5JX2YKJM.js.map +0 -1
|
@@ -44,7 +44,7 @@ const ContextMenuItem = React.forwardRef<
|
|
|
44
44
|
<ContextMenu.Item
|
|
45
45
|
ref={ref}
|
|
46
46
|
className={cn(
|
|
47
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-
|
|
47
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
|
|
48
48
|
"body outline-none transition-colors",
|
|
49
49
|
destructive
|
|
50
50
|
? "text-destructive focus:bg-destructive/10 focus:text-destructive"
|
|
@@ -65,7 +65,7 @@ const ContextMenuCheckboxItem = React.forwardRef<
|
|
|
65
65
|
<ContextMenu.CheckboxItem
|
|
66
66
|
ref={ref}
|
|
67
67
|
className={cn(
|
|
68
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5
|
|
68
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md py-2 pl-8 pr-2.5",
|
|
69
69
|
"body text-muted-foreground outline-none transition-colors",
|
|
70
70
|
"focus:bg-muted focus:text-foreground",
|
|
71
71
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -90,7 +90,7 @@ const ContextMenuRadioItem = React.forwardRef<
|
|
|
90
90
|
<ContextMenu.RadioItem
|
|
91
91
|
ref={ref}
|
|
92
92
|
className={cn(
|
|
93
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5
|
|
93
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md py-2 pl-8 pr-2.5",
|
|
94
94
|
"body text-muted-foreground outline-none transition-colors",
|
|
95
95
|
"focus:bg-muted focus:text-foreground",
|
|
96
96
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -143,7 +143,7 @@ const ContextMenuSubTrigger = React.forwardRef<
|
|
|
143
143
|
<ContextMenu.SubTrigger
|
|
144
144
|
ref={ref}
|
|
145
145
|
className={cn(
|
|
146
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-
|
|
146
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
|
|
147
147
|
"body text-muted-foreground outline-none transition-colors",
|
|
148
148
|
"focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
|
|
149
149
|
inset && "pl-8",
|
|
@@ -82,7 +82,7 @@ function DataTable<TData>({
|
|
|
82
82
|
{header.isPlaceholder ? null : header.column.getCanSort() ? (
|
|
83
83
|
<button
|
|
84
84
|
className={cn(
|
|
85
|
-
"flex items-center gap-1 transition-colors hover:text-muted-foreground",
|
|
85
|
+
"flex min-h-10 items-center gap-1 transition-colors hover:text-muted-foreground",
|
|
86
86
|
header.column.getIsSorted() && "text-foreground",
|
|
87
87
|
)}
|
|
88
88
|
onClick={header.column.getToggleSortingHandler()}
|
|
@@ -117,7 +117,10 @@ function DataTable<TData>({
|
|
|
117
117
|
))
|
|
118
118
|
) : (
|
|
119
119
|
<TableRow>
|
|
120
|
-
<TableCell
|
|
120
|
+
<TableCell
|
|
121
|
+
colSpan={columns.length}
|
|
122
|
+
className="h-24 text-center text-muted-foreground"
|
|
123
|
+
>
|
|
121
124
|
No results.
|
|
122
125
|
</TableCell>
|
|
123
126
|
</TableRow>
|
|
@@ -126,12 +129,12 @@ function DataTable<TData>({
|
|
|
126
129
|
</Table>
|
|
127
130
|
{showPagination && (
|
|
128
131
|
<div className="flex items-center justify-between">
|
|
129
|
-
<p className="caption text-muted-foreground">
|
|
132
|
+
<p className="caption tabular-nums text-muted-foreground">
|
|
130
133
|
{table.getFilteredRowModel().rows.length} result
|
|
131
134
|
{table.getFilteredRowModel().rows.length !== 1 ? "s" : ""}
|
|
132
135
|
</p>
|
|
133
136
|
<div className="flex items-center gap-2">
|
|
134
|
-
<span className="caption text-muted-foreground">
|
|
137
|
+
<span className="caption tabular-nums text-muted-foreground">
|
|
135
138
|
Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
|
|
136
139
|
</span>
|
|
137
140
|
<Button
|
|
@@ -28,8 +28,10 @@ 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-foreground">{title}</p>}
|
|
32
|
-
{description &&
|
|
31
|
+
{title && <p className="body font-semibold text-balance text-foreground">{title}</p>}
|
|
32
|
+
{description && (
|
|
33
|
+
<p className="mt-1 caption text-pretty text-muted-foreground">{description}</p>
|
|
34
|
+
)}
|
|
33
35
|
</div>
|
|
34
36
|
)}
|
|
35
37
|
|
|
@@ -45,7 +45,7 @@ const DialogContent = React.forwardRef<
|
|
|
45
45
|
{...props}
|
|
46
46
|
>
|
|
47
47
|
{children}
|
|
48
|
-
<Dialog.Close className="absolute right-
|
|
48
|
+
<Dialog.Close className="absolute right-3 top-3 flex size-10 items-center justify-center rounded-md text-muted-foreground opacity-70 transition-[opacity,scale] hover:opacity-100 active:scale-[0.96] focus:outline-none focus:ring-2 focus:ring-ground-900/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-foreground", className)}
|
|
73
|
+
className={cn("body-lg font-semibold text-balance text-foreground", className)}
|
|
74
74
|
{...props}
|
|
75
75
|
/>
|
|
76
76
|
));
|
|
@@ -80,7 +80,11 @@ 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
|
|
83
|
+
<Dialog.Description
|
|
84
|
+
ref={ref}
|
|
85
|
+
className={cn("body text-pretty text-muted-foreground", className)}
|
|
86
|
+
{...props}
|
|
87
|
+
/>
|
|
84
88
|
));
|
|
85
89
|
DialogDescription.displayName = "DialogDescription";
|
|
86
90
|
|
|
@@ -45,7 +45,7 @@ const DropdownMenuItem = React.forwardRef<
|
|
|
45
45
|
<DropdownMenu.Item
|
|
46
46
|
ref={ref}
|
|
47
47
|
className={cn(
|
|
48
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-
|
|
48
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
|
|
49
49
|
"body outline-none transition-colors",
|
|
50
50
|
destructive
|
|
51
51
|
? "text-destructive focus:bg-destructive/10 focus:text-destructive"
|
|
@@ -66,7 +66,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
|
|
|
66
66
|
<DropdownMenu.CheckboxItem
|
|
67
67
|
ref={ref}
|
|
68
68
|
className={cn(
|
|
69
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5
|
|
69
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md py-2 pl-8 pr-2.5",
|
|
70
70
|
"body text-muted-foreground outline-none transition-colors",
|
|
71
71
|
"focus:bg-muted focus:text-foreground",
|
|
72
72
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -91,7 +91,7 @@ const DropdownMenuRadioItem = React.forwardRef<
|
|
|
91
91
|
<DropdownMenu.RadioItem
|
|
92
92
|
ref={ref}
|
|
93
93
|
className={cn(
|
|
94
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5
|
|
94
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md py-2 pl-8 pr-2.5",
|
|
95
95
|
"body text-muted-foreground outline-none transition-colors",
|
|
96
96
|
"focus:bg-muted focus:text-foreground",
|
|
97
97
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -144,7 +144,7 @@ const DropdownMenuSubTrigger = React.forwardRef<
|
|
|
144
144
|
<DropdownMenu.SubTrigger
|
|
145
145
|
ref={ref}
|
|
146
146
|
className={cn(
|
|
147
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-
|
|
147
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
|
|
148
148
|
"body text-muted-foreground outline-none transition-colors",
|
|
149
149
|
"focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
|
|
150
150
|
inset && "pl-8",
|
|
@@ -23,8 +23,10 @@ function EmptyState({ icon, title, description, action, className }: EmptyStateP
|
|
|
23
23
|
</div>
|
|
24
24
|
)}
|
|
25
25
|
<div className="flex flex-col gap-1.5">
|
|
26
|
-
<p className="body font-semibold text-foreground">{title}</p>
|
|
27
|
-
{description &&
|
|
26
|
+
<p className="body text-balance font-semibold text-foreground">{title}</p>
|
|
27
|
+
{description && (
|
|
28
|
+
<p className="body max-w-xs text-pretty text-muted-foreground">{description}</p>
|
|
29
|
+
)}
|
|
28
30
|
</div>
|
|
29
31
|
{action &&
|
|
30
32
|
(action.href ? (
|
package/src/components/field.tsx
CHANGED
|
@@ -34,15 +34,23 @@ 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 &&
|
|
37
|
+
{required && (
|
|
38
|
+
<span className="ml-0.5 text-destructive" aria-hidden="true">
|
|
39
|
+
*
|
|
40
|
+
</span>
|
|
41
|
+
)}
|
|
38
42
|
</Label>
|
|
39
43
|
{cornerHint && <span className="caption text-muted-foreground">{cornerHint}</span>}
|
|
40
44
|
</div>
|
|
41
45
|
{children}
|
|
42
46
|
{error ? (
|
|
43
|
-
<p id={descriptionId} role="alert" className="caption text-destructive">
|
|
47
|
+
<p id={descriptionId} role="alert" className="caption text-destructive">
|
|
48
|
+
{error}
|
|
49
|
+
</p>
|
|
44
50
|
) : hint ? (
|
|
45
|
-
<p id={descriptionId} className="caption text-muted-foreground">
|
|
51
|
+
<p id={descriptionId} className="caption text-muted-foreground">
|
|
52
|
+
{hint}
|
|
53
|
+
</p>
|
|
46
54
|
) : null}
|
|
47
55
|
</div>
|
|
48
56
|
);
|
|
@@ -64,8 +64,8 @@ function GridListCard({
|
|
|
64
64
|
)}
|
|
65
65
|
>
|
|
66
66
|
{accent && <div className="mb-2">{accent}</div>}
|
|
67
|
-
<p className="body font-semibold text-foreground">{title}</p>
|
|
68
|
-
{description && <p className="caption text-muted-foreground">{description}</p>}
|
|
67
|
+
<p className="body font-semibold text-foreground text-balance">{title}</p>
|
|
68
|
+
{description && <p className="caption text-muted-foreground text-pretty">{description}</p>}
|
|
69
69
|
{(meta || trailing) && (
|
|
70
70
|
<div className="mt-auto flex items-center justify-between pt-3">
|
|
71
71
|
{meta && <span className="caption text-muted-foreground">{meta}</span>}
|
|
@@ -132,7 +132,7 @@ function GridListAccentCard({
|
|
|
132
132
|
</div>
|
|
133
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-foreground truncate">{title}</p>
|
|
135
|
+
<p className="body font-semibold text-foreground truncate text-balance">{title}</p>
|
|
136
136
|
{meta && <p className="caption text-muted-foreground">{meta}</p>}
|
|
137
137
|
</div>
|
|
138
138
|
{trailing && <div className="shrink-0 pl-2">{trailing}</div>}
|
|
@@ -39,7 +39,7 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
39
39
|
const hasTrailing = trailingAddon || hasInsetTrailing || trailingButton;
|
|
40
40
|
|
|
41
41
|
const baseInput = cn(
|
|
42
|
-
"flex h-
|
|
42
|
+
"flex h-10 w-full border bg-card body text-foreground placeholder:text-muted-foreground",
|
|
43
43
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:disabled:cursor-not-allowed disabled:opacity-50",
|
|
44
44
|
error
|
|
45
45
|
? "border-destructive focus-visible:ring-destructive/20 focus-visible:border-destructive"
|
|
@@ -99,7 +99,7 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
99
99
|
: hasInsetTrailing
|
|
100
100
|
? cn(radius, "pl-3 pr-9")
|
|
101
101
|
: cn(radius, "px-3"),
|
|
102
|
-
trailingAction && "pr-
|
|
102
|
+
trailingAction && "pr-16",
|
|
103
103
|
className,
|
|
104
104
|
)}
|
|
105
105
|
{...props}
|
|
@@ -118,7 +118,7 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
|
|
|
118
118
|
{trailingAction && (
|
|
119
119
|
<div
|
|
120
120
|
className={cn(
|
|
121
|
-
"absolute
|
|
121
|
+
"absolute right-2 top-1/2 flex -translate-y-1/2 items-center",
|
|
122
122
|
trailingActionClassName,
|
|
123
123
|
)}
|
|
124
124
|
>
|
|
@@ -101,7 +101,10 @@ const InputNumber = React.forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
101
101
|
{...rest}
|
|
102
102
|
/>
|
|
103
103
|
{unit && (
|
|
104
|
-
<span
|
|
104
|
+
<span
|
|
105
|
+
aria-hidden
|
|
106
|
+
className="caption-xs text-muted-foreground self-center pr-1.5 select-none"
|
|
107
|
+
>
|
|
105
108
|
{unit}
|
|
106
109
|
</span>
|
|
107
110
|
)}
|
|
@@ -39,7 +39,7 @@ const InputOTPSlot = React.forwardRef<
|
|
|
39
39
|
"relative flex h-12 w-11 items-center justify-center",
|
|
40
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
|
-
"transition-
|
|
42
|
+
"transition-[border-color,box-shadow]",
|
|
43
43
|
isActive && "z-10 ring-2 ring-brand-primary/40 border-brand-primary",
|
|
44
44
|
className,
|
|
45
45
|
)}
|
package/src/components/input.tsx
CHANGED
|
@@ -7,7 +7,7 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
|
7
7
|
type={type}
|
|
8
8
|
data-slot="input"
|
|
9
9
|
className={cn(
|
|
10
|
-
"flex h-
|
|
10
|
+
"flex h-10 w-full rounded-md border border-border bg-card px-3 py-1",
|
|
11
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",
|
|
@@ -12,7 +12,7 @@ const MenubarRoot = React.forwardRef<
|
|
|
12
12
|
<Menubar.Root
|
|
13
13
|
ref={ref}
|
|
14
14
|
className={cn(
|
|
15
|
-
"flex h-
|
|
15
|
+
"flex min-h-10 items-center gap-0.5 rounded-lg border border-border bg-card px-1",
|
|
16
16
|
className,
|
|
17
17
|
)}
|
|
18
18
|
{...props}
|
|
@@ -35,7 +35,7 @@ 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-muted-foreground select-none outline-none",
|
|
38
|
+
"flex min-h-8 cursor-default items-center rounded-md px-3 py-1 body font-medium text-muted-foreground select-none outline-none",
|
|
39
39
|
"hover:bg-muted",
|
|
40
40
|
"data-[state=open]:bg-muted data-[state=open]:text-foreground",
|
|
41
41
|
"focus:bg-muted",
|
|
@@ -80,7 +80,7 @@ const MenubarItem = React.forwardRef<
|
|
|
80
80
|
<Menubar.Item
|
|
81
81
|
ref={ref}
|
|
82
82
|
className={cn(
|
|
83
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-
|
|
83
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
|
|
84
84
|
"body text-muted-foreground outline-none transition-colors",
|
|
85
85
|
"focus:bg-muted focus:text-foreground",
|
|
86
86
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -99,7 +99,7 @@ const MenubarCheckboxItem = React.forwardRef<
|
|
|
99
99
|
<Menubar.CheckboxItem
|
|
100
100
|
ref={ref}
|
|
101
101
|
className={cn(
|
|
102
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5
|
|
102
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md py-2 pl-8 pr-2.5",
|
|
103
103
|
"body text-muted-foreground outline-none transition-colors",
|
|
104
104
|
"focus:bg-muted focus:text-foreground",
|
|
105
105
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -124,7 +124,7 @@ const MenubarRadioItem = React.forwardRef<
|
|
|
124
124
|
<Menubar.RadioItem
|
|
125
125
|
ref={ref}
|
|
126
126
|
className={cn(
|
|
127
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5
|
|
127
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md py-2 pl-8 pr-2.5",
|
|
128
128
|
"body text-muted-foreground outline-none transition-colors",
|
|
129
129
|
"focus:bg-muted focus:text-foreground",
|
|
130
130
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
@@ -160,11 +160,7 @@ const MenubarSeparator = React.forwardRef<
|
|
|
160
160
|
React.ComponentRef<typeof Menubar.Separator>,
|
|
161
161
|
React.ComponentPropsWithoutRef<typeof Menubar.Separator>
|
|
162
162
|
>(({ className, ...props }, ref) => (
|
|
163
|
-
<Menubar.Separator
|
|
164
|
-
ref={ref}
|
|
165
|
-
className={cn("mx-1 my-1 h-px bg-muted", className)}
|
|
166
|
-
{...props}
|
|
167
|
-
/>
|
|
163
|
+
<Menubar.Separator ref={ref} className={cn("mx-1 my-1 h-px bg-muted", className)} {...props} />
|
|
168
164
|
));
|
|
169
165
|
MenubarSeparator.displayName = "MenubarSeparator";
|
|
170
166
|
|
|
@@ -177,7 +173,7 @@ const MenubarSubTrigger = React.forwardRef<
|
|
|
177
173
|
<Menubar.SubTrigger
|
|
178
174
|
ref={ref}
|
|
179
175
|
className={cn(
|
|
180
|
-
"relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-
|
|
176
|
+
"relative flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
|
|
181
177
|
"body text-muted-foreground outline-none transition-colors",
|
|
182
178
|
"focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
|
|
183
179
|
inset && "pl-8",
|
|
@@ -10,7 +10,7 @@ const NativeSelect = React.forwardRef<
|
|
|
10
10
|
<select
|
|
11
11
|
ref={ref}
|
|
12
12
|
className={cn(
|
|
13
|
-
"peer h-
|
|
13
|
+
"peer h-10 w-full appearance-none rounded-lg border border-border bg-card pl-3 pr-8",
|
|
14
14
|
"body text-foreground",
|
|
15
15
|
"focus:outline-none focus:ring-2 focus:ring-ring/30 focus:border-border",
|
|
16
16
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
@@ -40,7 +40,7 @@ const NavigationMenuTrigger = React.forwardRef<
|
|
|
40
40
|
<NavigationMenu.Trigger
|
|
41
41
|
ref={ref}
|
|
42
42
|
className={cn(
|
|
43
|
-
"group inline-flex h-
|
|
43
|
+
"group inline-flex h-10 w-max items-center justify-center gap-1 rounded-md px-3 py-2",
|
|
44
44
|
"body font-medium text-muted-foreground",
|
|
45
45
|
"hover:bg-muted hover:text-foreground",
|
|
46
46
|
"data-[active]:bg-muted data-[state=open]:bg-muted",
|
|
@@ -86,7 +86,7 @@ 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-muted-foreground",
|
|
89
|
+
"block min-h-10 select-none rounded-md px-3 py-2 body text-muted-foreground",
|
|
90
90
|
"hover:bg-muted hover:text-foreground",
|
|
91
91
|
"outline-none transition-colors",
|
|
92
92
|
className,
|
|
@@ -137,7 +137,7 @@ NavigationMenuIndicator.displayName = "NavigationMenuIndicator";
|
|
|
137
137
|
|
|
138
138
|
function navigationMenuTriggerStyle() {
|
|
139
139
|
return cn(
|
|
140
|
-
"group inline-flex h-
|
|
140
|
+
"group inline-flex h-10 w-max items-center justify-center gap-1 rounded-md px-3 py-2",
|
|
141
141
|
"body font-medium text-muted-foreground",
|
|
142
142
|
"hover:bg-muted hover:text-foreground",
|
|
143
143
|
"data-[active]:bg-muted data-[state=open]:bg-muted",
|
|
@@ -62,8 +62,10 @@ function Notification({
|
|
|
62
62
|
|
|
63
63
|
{/* Body */}
|
|
64
64
|
<div className="min-w-0 flex-1">
|
|
65
|
-
<p className="body font-semibold text-foreground">{title}</p>
|
|
66
|
-
{description &&
|
|
65
|
+
<p className="body font-semibold text-foreground text-balance">{title}</p>
|
|
66
|
+
{description && (
|
|
67
|
+
<p className="mt-0.5 body text-muted-foreground text-pretty">{description}</p>
|
|
68
|
+
)}
|
|
67
69
|
|
|
68
70
|
{/* Actions */}
|
|
69
71
|
{actions && actions.length > 0 && (
|
|
@@ -74,7 +76,7 @@ function Notification({
|
|
|
74
76
|
type="button"
|
|
75
77
|
onClick={action.onClick}
|
|
76
78
|
className={cn(
|
|
77
|
-
"body font-semibold transition-colors",
|
|
79
|
+
"min-h-10 body font-semibold transition-colors",
|
|
78
80
|
action.variant === "ghost"
|
|
79
81
|
? "text-muted-foreground hover:text-muted-foreground"
|
|
80
82
|
: "text-foreground hover:text-muted-foreground",
|
|
@@ -93,7 +95,7 @@ function Notification({
|
|
|
93
95
|
<button
|
|
94
96
|
type="button"
|
|
95
97
|
onClick={onClose}
|
|
96
|
-
className="rounded-md text-muted-foreground hover:text-muted-foreground
|
|
98
|
+
className="flex size-10 items-center justify-center rounded-md text-muted-foreground transition-[color,scale] hover:text-muted-foreground active:scale-[0.96] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30"
|
|
97
99
|
>
|
|
98
100
|
<span className="sr-only">Close</span>
|
|
99
101
|
<X size={16} />
|
|
@@ -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-foreground truncate">{title}</h1>
|
|
71
|
+
<h1 className="display text-balance text-foreground truncate">{title}</h1>
|
|
72
72
|
{badge &&
|
|
73
73
|
(typeof badge === "string" ? (
|
|
74
74
|
<Badge variant="secondary">{badge}</Badge>
|
|
@@ -76,7 +76,9 @@ function PageHeading({
|
|
|
76
76
|
<Badge variant={badge.variant ?? "secondary"}>{badge.label}</Badge>
|
|
77
77
|
))}
|
|
78
78
|
</div>
|
|
79
|
-
{description &&
|
|
79
|
+
{description && (
|
|
80
|
+
<p className="mt-1.5 body max-w-2xl text-pretty text-muted-foreground">{description}</p>
|
|
81
|
+
)}
|
|
80
82
|
|
|
81
83
|
{/* Meta */}
|
|
82
84
|
{meta && meta.length > 0 && (
|
|
@@ -32,7 +32,7 @@ const PaginationLink = ({ className, isActive, ...props }: PaginationLinkProps)
|
|
|
32
32
|
aria-current={isActive ? "page" : undefined}
|
|
33
33
|
className={cn(
|
|
34
34
|
buttonVariants({ variant: isActive ? "default" : "ghost", size: "icon" }),
|
|
35
|
-
"size-
|
|
35
|
+
"size-10 rounded-md body",
|
|
36
36
|
className,
|
|
37
37
|
)}
|
|
38
38
|
{...props}
|
|
@@ -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-
|
|
73
|
+
className={cn("flex size-10 items-center justify-center text-muted-foreground", className)}
|
|
74
74
|
{...props}
|
|
75
75
|
>
|
|
76
76
|
<MoreHorizontal size={14} />
|
|
@@ -13,7 +13,7 @@ const ProgressRoot = React.forwardRef<
|
|
|
13
13
|
{...props}
|
|
14
14
|
>
|
|
15
15
|
<Progress.Indicator
|
|
16
|
-
className="h-full w-full flex-1 bg-brand-primary transition-
|
|
16
|
+
className="h-full w-full flex-1 bg-brand-primary transition-transform"
|
|
17
17
|
style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}
|
|
18
18
|
/>
|
|
19
19
|
</Progress.Root>
|
|
@@ -42,7 +42,8 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
42
42
|
disabled={option.disabled}
|
|
43
43
|
onClick={() => !option.disabled && onValueChange?.(option.value)}
|
|
44
44
|
className={cn(
|
|
45
|
-
"relative flex cursor-pointer flex-col gap-1 rounded-xl border p-4 text-left transition-
|
|
45
|
+
"relative flex cursor-pointer flex-col gap-1 rounded-xl border p-4 text-left transition-[background-color,border-color,box-shadow,opacity,scale]",
|
|
46
|
+
"active:scale-[0.96]",
|
|
46
47
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30",
|
|
47
48
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
48
49
|
isSelected
|
|
@@ -63,22 +64,22 @@ function RadioCards({ options, value, onValueChange, columns = 3, className }: R
|
|
|
63
64
|
{option.icon && <div className="mb-2 text-muted-foreground">{option.icon}</div>}
|
|
64
65
|
<p
|
|
65
66
|
className={cn(
|
|
66
|
-
"body font-semibold",
|
|
67
|
+
"body font-semibold text-pretty",
|
|
67
68
|
isSelected ? "text-foreground" : "text-muted-foreground",
|
|
68
69
|
)}
|
|
69
70
|
>
|
|
70
71
|
{option.label}
|
|
71
72
|
</p>
|
|
72
73
|
{option.description && (
|
|
73
|
-
<p className="mt-0.5 caption text-muted-foreground">
|
|
74
|
+
<p className="mt-0.5 caption text-pretty text-muted-foreground">
|
|
75
|
+
{option.description}
|
|
76
|
+
</p>
|
|
74
77
|
)}
|
|
75
78
|
</div>
|
|
76
79
|
<div
|
|
77
80
|
className={cn(
|
|
78
81
|
"flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors",
|
|
79
|
-
isSelected
|
|
80
|
-
? "border-brand-primary bg-brand-primary"
|
|
81
|
-
: "border-border bg-card",
|
|
82
|
+
isSelected ? "border-brand-primary bg-brand-primary" : "border-border bg-card",
|
|
82
83
|
)}
|
|
83
84
|
>
|
|
84
85
|
{isSelected && <Check size={10} className="text-background" strokeWidth={3} />}
|
|
@@ -19,7 +19,8 @@ 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-border text-foreground",
|
|
22
|
+
"relative aspect-square size-4 rounded-full border border-border text-foreground",
|
|
23
|
+
"after:absolute after:left-1/2 after:top-1/2 after:size-10 after:-translate-x-1/2 after:-translate-y-1/2",
|
|
23
24
|
"shadow-none transition-colors",
|
|
24
25
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring/20",
|
|
25
26
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
@@ -33,8 +33,10 @@ function SectionHeading({
|
|
|
33
33
|
)}
|
|
34
34
|
>
|
|
35
35
|
<div className="min-w-0 flex-1">
|
|
36
|
-
<h2 className="heading text-foreground truncate">{title}</h2>
|
|
37
|
-
{description &&
|
|
36
|
+
<h2 className="heading text-balance text-foreground truncate">{title}</h2>
|
|
37
|
+
{description && (
|
|
38
|
+
<p className="mt-1 body text-pretty text-muted-foreground">{description}</p>
|
|
39
|
+
)}
|
|
38
40
|
</div>
|
|
39
41
|
|
|
40
42
|
{actions && actions.length > 0 && (
|
|
@@ -16,7 +16,7 @@ const SelectTrigger = React.forwardRef<
|
|
|
16
16
|
<Select.Trigger
|
|
17
17
|
ref={ref}
|
|
18
18
|
className={cn(
|
|
19
|
-
"flex h-
|
|
19
|
+
"flex h-10 w-full items-center justify-between rounded-xl bg-card px-3 py-2",
|
|
20
20
|
"body text-foreground shadow-natural",
|
|
21
21
|
"focus:outline-none focus:ring-2 focus:ring-ring/20",
|
|
22
22
|
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
@@ -80,7 +80,7 @@ const SelectItem = React.forwardRef<
|
|
|
80
80
|
<Select.Item
|
|
81
81
|
ref={ref}
|
|
82
82
|
className={cn(
|
|
83
|
-
"relative flex w-full cursor-default select-none items-center rounded-md px-2.5 py-
|
|
83
|
+
"relative flex min-h-10 w-full cursor-default select-none items-center rounded-md px-2.5 py-2",
|
|
84
84
|
"body text-muted-foreground outline-none",
|
|
85
85
|
"focus:bg-muted focus:text-foreground",
|
|
86
86
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
package/src/components/sheet.tsx
CHANGED
|
@@ -31,7 +31,7 @@ const sheetContentVariants = cva(
|
|
|
31
31
|
[
|
|
32
32
|
"fixed z-50 bg-card shadow-elevated p-6",
|
|
33
33
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
34
|
-
"transition ease-in-out duration-300",
|
|
34
|
+
"transition-transform ease-in-out duration-300",
|
|
35
35
|
],
|
|
36
36
|
{
|
|
37
37
|
variants: {
|
|
@@ -65,7 +65,7 @@ const SheetContent = React.forwardRef<React.ComponentRef<typeof Dialog.Content>,
|
|
|
65
65
|
{...props}
|
|
66
66
|
>
|
|
67
67
|
{children}
|
|
68
|
-
<Dialog.Close className="absolute right-
|
|
68
|
+
<Dialog.Close className="absolute right-3 top-3 flex size-10 items-center justify-center rounded-md text-muted-foreground opacity-70 transition-[opacity,scale] hover:opacity-100 active:scale-[0.96] focus:outline-none focus:ring-2 focus:ring-ground-900/20">
|
|
69
69
|
<X size={16} />
|
|
70
70
|
<span className="sr-only">Close</span>
|
|
71
71
|
</Dialog.Close>
|
|
@@ -91,7 +91,7 @@ const SheetTitle = React.forwardRef<
|
|
|
91
91
|
>(({ className, ...props }, ref) => (
|
|
92
92
|
<Dialog.Title
|
|
93
93
|
ref={ref}
|
|
94
|
-
className={cn("body-lg font-semibold text-foreground", className)}
|
|
94
|
+
className={cn("body-lg font-semibold text-balance text-foreground", className)}
|
|
95
95
|
{...props}
|
|
96
96
|
/>
|
|
97
97
|
));
|
|
@@ -101,7 +101,11 @@ const SheetDescription = React.forwardRef<
|
|
|
101
101
|
React.ComponentRef<typeof Dialog.Description>,
|
|
102
102
|
React.ComponentPropsWithoutRef<typeof Dialog.Description>
|
|
103
103
|
>(({ className, ...props }, ref) => (
|
|
104
|
-
<Dialog.Description
|
|
104
|
+
<Dialog.Description
|
|
105
|
+
ref={ref}
|
|
106
|
+
className={cn("body text-pretty text-muted-foreground", className)}
|
|
107
|
+
{...props}
|
|
108
|
+
/>
|
|
105
109
|
));
|
|
106
110
|
SheetDescription.displayName = "SheetDescription";
|
|
107
111
|
|