@hilum/ui 3.1.2 → 3.2.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.
Files changed (61) hide show
  1. package/dist/{chunk-5JX2YKJM.js → chunk-MAHPAP65.js} +65 -11
  2. package/dist/chunk-MAHPAP65.js.map +1 -0
  3. package/dist/icons.d.ts +1 -1
  4. package/dist/icons.js +1 -1
  5. package/dist/index.js +224 -150
  6. package/dist/index.js.map +1 -1
  7. package/dist/tokens.css +10 -0
  8. package/dist/tokens.d.ts +9 -0
  9. package/dist/tokens.js +1 -1
  10. package/package.json +1 -1
  11. package/src/components/account-menu.tsx +3 -10
  12. package/src/components/action-panel.tsx +10 -7
  13. package/src/components/alert-dialog.tsx +10 -6
  14. package/src/components/alert.tsx +6 -2
  15. package/src/components/avatar-stack.tsx +6 -1
  16. package/src/components/avatar.tsx +4 -1
  17. package/src/components/breadcrumb.tsx +6 -1
  18. package/src/components/button-group.tsx +6 -5
  19. package/src/components/button.tsx +9 -7
  20. package/src/components/calendar.tsx +6 -5
  21. package/src/components/card-heading.tsx +4 -2
  22. package/src/components/card.tsx +2 -2
  23. package/src/components/carousel.tsx +2 -2
  24. package/src/components/checkbox.tsx +2 -1
  25. package/src/components/color-picker.tsx +4 -4
  26. package/src/components/combobox.tsx +17 -7
  27. package/src/components/command-palette.tsx +4 -2
  28. package/src/components/command.tsx +4 -2
  29. package/src/components/context-menu.tsx +4 -4
  30. package/src/components/data-table.tsx +7 -4
  31. package/src/components/description-list.tsx +4 -2
  32. package/src/components/dialog.tsx +7 -3
  33. package/src/components/dropdown-menu.tsx +4 -4
  34. package/src/components/empty-state.tsx +4 -2
  35. package/src/components/field.tsx +11 -3
  36. package/src/components/grid-list.tsx +3 -3
  37. package/src/components/input-group.tsx +1 -1
  38. package/src/components/input-number.tsx +4 -1
  39. package/src/components/input-otp.tsx +1 -1
  40. package/src/components/input.tsx +1 -1
  41. package/src/components/menubar.tsx +7 -11
  42. package/src/components/native-select.tsx +1 -1
  43. package/src/components/navigation-menu.tsx +3 -3
  44. package/src/components/notification.tsx +6 -4
  45. package/src/components/page-heading.tsx +4 -2
  46. package/src/components/pagination.tsx +2 -2
  47. package/src/components/progress.tsx +1 -1
  48. package/src/components/radio-card.tsx +7 -6
  49. package/src/components/radio-group.tsx +2 -1
  50. package/src/components/section-heading.tsx +4 -2
  51. package/src/components/select.tsx +2 -2
  52. package/src/components/sheet.tsx +8 -4
  53. package/src/components/sidebar.tsx +8 -8
  54. package/src/components/slider.tsx +1 -1
  55. package/src/components/stat-card.tsx +2 -2
  56. package/src/components/steps.tsx +13 -11
  57. package/src/components/switch.tsx +4 -4
  58. package/src/components/toggle.tsx +5 -5
  59. package/src/icons.ts +4 -0
  60. package/src/tokens/tokens.ts +65 -10
  61. package/dist/chunk-5JX2YKJM.js.map +0 -1
@@ -40,7 +40,9 @@ function Command({ className, children, onSelect, ...props }: CommandProps) {
40
40
  }, []);
41
41
 
42
42
  return (
43
- <CommandCtx.Provider value={{ query, setQuery, ...(onSelect !== undefined && { onSelect }), reportVisible }}>
43
+ <CommandCtx.Provider
44
+ value={{ query, setQuery, ...(onSelect !== undefined && { onSelect }), reportVisible }}
45
+ >
44
46
  <CommandVisibleCtx.Provider value={visibleCount}>
45
47
  <div
46
48
  className={cn(
@@ -196,7 +198,7 @@ const CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(
196
198
  data-cmd-item
197
199
  tabIndex={disabled ? undefined : 0}
198
200
  className={cn(
199
- "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5 mx-1",
201
+ "relative mx-1 flex min-h-10 cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2",
200
202
  "body text-muted-foreground outline-none transition-colors",
201
203
  "hover:bg-muted hover:text-foreground",
202
204
  "focus:bg-muted focus:text-foreground",
@@ -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-1.5",
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 py-1.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 py-1.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-1.5",
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 colSpan={columns.length} className="h-24 text-center text-muted-foreground">
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 && <p className="mt-1 caption text-muted-foreground">{description}</p>}
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-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">
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 ref={ref} className={cn("body text-muted-foreground", className)} {...props} />
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-1.5",
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 py-1.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 py-1.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-1.5",
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 && <p className="body max-w-xs text-muted-foreground">{description}</p>}
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 ? (
@@ -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 && <span className="ml-0.5 text-destructive" aria-hidden="true">*</span>}
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">{error}</p>
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">{hint}</p>
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-9 w-full border bg-card body text-foreground placeholder:text-muted-foreground",
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"
@@ -101,7 +101,10 @@ const InputNumber = React.forwardRef<HTMLInputElement, InputNumberProps>(
101
101
  {...rest}
102
102
  />
103
103
  {unit && (
104
- <span aria-hidden className="caption-xs text-muted-foreground self-center pr-1.5 select-none">
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-all",
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
  )}
@@ -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-9 w-full rounded-md border border-border bg-card px-3 py-1",
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-9 items-center gap-0.5 rounded-lg border border-border bg-card px-1",
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-1.5",
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 py-1.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 py-1.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-1.5",
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-9 w-full appearance-none rounded-lg border border-border bg-card pl-3 pr-8",
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-9 w-max items-center justify-center gap-1 rounded-md px-3 py-2",
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-9 w-max items-center justify-center gap-1 rounded-md px-3 py-2",
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 && <p className="mt-0.5 body text-muted-foreground">{description}</p>}
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 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30"
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 && <p className="mt-1.5 body text-muted-foreground max-w-2xl">{description}</p>}
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-8 rounded-md body",
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-8 items-center justify-center text-muted-foreground", className)}
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-all"
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-all",
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">{option.description}</p>
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 && <p className="mt-1 body text-muted-foreground">{description}</p>}
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-9 w-full items-center justify-between rounded-xl bg-card px-3 py-2",
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-1.5",
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",
@@ -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-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">
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 ref={ref} className={cn("body text-muted-foreground", className)} {...props} />
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