@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.
Files changed (82) hide show
  1. package/README.md +2 -2
  2. package/dist/{chunk-ELL3JM3Z.js → chunk-H6JZQWX3.js} +59 -15
  3. package/dist/chunk-H6JZQWX3.js.map +1 -0
  4. package/dist/index.d.ts +350 -290
  5. package/dist/index.js +490 -436
  6. package/dist/index.js.map +1 -1
  7. package/dist/tokens.css +42 -16
  8. package/dist/tokens.d.ts +33 -8
  9. package/dist/tokens.js +1 -1
  10. package/llms.txt +9 -9
  11. package/package.json +1 -1
  12. package/src/components/accordion.tsx +5 -5
  13. package/src/components/action-panel.tsx +8 -6
  14. package/src/components/activity-feed.tsx +7 -5
  15. package/src/components/alert-dialog.tsx +5 -5
  16. package/src/components/alert.tsx +5 -5
  17. package/src/components/avatar-stack.tsx +3 -3
  18. package/src/components/avatar.tsx +4 -4
  19. package/src/components/badge.tsx +7 -7
  20. package/src/components/breadcrumb.tsx +5 -6
  21. package/src/components/button-group.tsx +7 -4
  22. package/src/components/button.tsx +7 -7
  23. package/src/components/calendar.tsx +10 -10
  24. package/src/components/card-heading.tsx +3 -3
  25. package/src/components/card.tsx +4 -4
  26. package/src/components/chart.tsx +10 -10
  27. package/src/components/checkbox.tsx +2 -2
  28. package/src/components/color-input.tsx +7 -5
  29. package/src/components/color-picker.tsx +8 -6
  30. package/src/components/combobox.tsx +66 -31
  31. package/src/components/command-palette.tsx +13 -11
  32. package/src/components/command.tsx +14 -12
  33. package/src/components/context-menu.tsx +16 -16
  34. package/src/components/data-table.tsx +18 -7
  35. package/src/components/date-picker.tsx +2 -2
  36. package/src/components/description-list.tsx +10 -8
  37. package/src/components/dialog.tsx +4 -4
  38. package/src/components/drawer.tsx +5 -5
  39. package/src/components/dropdown-menu.tsx +16 -16
  40. package/src/components/empty-state.tsx +5 -3
  41. package/src/components/field.tsx +4 -4
  42. package/src/components/grid-list.tsx +17 -13
  43. package/src/components/hover-card.tsx +1 -1
  44. package/src/components/input-group.tsx +10 -10
  45. package/src/components/input-number.tsx +7 -7
  46. package/src/components/input-otp.tsx +3 -3
  47. package/src/components/input.tsx +4 -4
  48. package/src/components/kbd.tsx +1 -1
  49. package/src/components/label.tsx +1 -1
  50. package/src/components/media-object.tsx +2 -0
  51. package/src/components/menubar.tsx +21 -21
  52. package/src/components/native-select.tsx +5 -5
  53. package/src/components/navigation-menu.tsx +10 -10
  54. package/src/components/notification.tsx +13 -11
  55. package/src/components/page-heading.tsx +8 -8
  56. package/src/components/pagination.tsx +1 -1
  57. package/src/components/popover.tsx +1 -1
  58. package/src/components/progress.tsx +1 -1
  59. package/src/components/property-row.tsx +3 -1
  60. package/src/components/radio-card.tsx +10 -8
  61. package/src/components/radio-group.tsx +4 -4
  62. package/src/components/resizable.tsx +3 -3
  63. package/src/components/scroll-area.tsx +1 -1
  64. package/src/components/section-heading.tsx +3 -3
  65. package/src/components/select.tsx +13 -13
  66. package/src/components/separator.tsx +1 -1
  67. package/src/components/sheet.tsx +4 -4
  68. package/src/components/sidebar.tsx +20 -20
  69. package/src/components/skeleton.tsx +1 -1
  70. package/src/components/slider.tsx +2 -2
  71. package/src/components/sonner.tsx +9 -8
  72. package/src/components/stacked-list.tsx +5 -5
  73. package/src/components/stat-card.tsx +9 -7
  74. package/src/components/steps.tsx +16 -14
  75. package/src/components/switch.tsx +2 -2
  76. package/src/components/table.tsx +9 -9
  77. package/src/components/tabs.tsx +2 -2
  78. package/src/components/textarea.tsx +4 -4
  79. package/src/components/toggle.tsx +9 -9
  80. package/src/components/tooltip.tsx +1 -1
  81. package/src/tokens/tokens.ts +36 -9
  82. 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-ground-200 bg-white overflow-hidden",
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-ground-900 px-2 bg-transparent focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none text-right"
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-ground-400 self-center pr-1.5 select-none">
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-ground-100">
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-ground-50 active:bg-ground-100 transition-colors text-ground-500"
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-ground-100" />
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-ground-50 active:bg-ground-100 transition-colors text-ground-500"
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-ground-200 body font-medium text-ground-900",
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-ground-900 duration-1000" />
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-ground-300" />
62
+ <Minus size={14} className="text-muted-foreground" />
63
63
  </div>
64
64
  ),
65
65
  );
@@ -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-ground-200 bg-white px-3 py-1",
11
- "body text-ground-900 placeholder:text-ground-400",
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-ground-50",
15
- "file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-ground-900",
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}
@@ -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-ground-200 bg-ground-50 px-1.5 font-mono caption-xs font-medium text-ground-500",
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}
@@ -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-ground-700",
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
  )}
@@ -46,4 +46,6 @@ function MediaObject({
46
46
  );
47
47
  }
48
48
 
49
+ MediaObject.displayName = "MediaObject";
50
+
49
51
  export { MediaObject };
@@ -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-ground-100 bg-white px-1",
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-ground-700 select-none outline-none",
39
- "hover:bg-ground-50",
40
- "data-[state=open]:bg-ground-100 data-[state=open]:text-ground-900",
41
- "focus:bg-ground-50",
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-white rounded-xl shadow-natural p-1",
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-ground-700 outline-none transition-colors",
85
- "focus:bg-ground-50 focus:text-ground-900",
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-ground-700 outline-none transition-colors",
104
- "focus:bg-ground-50 focus:text-ground-900",
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-ground-900" />
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-ground-700 outline-none transition-colors",
129
- "focus:bg-ground-50 focus:text-ground-900",
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-ground-900 text-ground-900" />
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-ground-400", inset && "pl-8", className)}
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-ground-100", className)}
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-ground-700 outline-none transition-colors",
182
- "focus:bg-ground-50 focus:text-ground-900 data-[state=open]:bg-ground-50",
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-ground-400" />
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-white rounded-xl border border-ground-100 shadow-natural p-1",
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-ground-400", className)} {...props} />;
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-ground-200 bg-white pl-3 pr-8",
14
- "body text-ground-900",
15
- "focus:outline-none focus:ring-2 focus:ring-ground-400/30 focus:border-ground-400",
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-red-500 aria-[invalid=true]:focus:ring-red-500/20",
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-ground-400 peer-disabled:opacity-50"
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-ground-700",
45
- "hover:bg-ground-100 hover:text-ground-900",
46
- "data-[active]:bg-ground-100 data-[state=open]:bg-ground-100",
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-ground-700",
90
- "hover:bg-ground-50 hover:text-ground-900",
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-ground-100 bg-white shadow-elevated",
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-ground-100 shadow-elevated" />
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-ground-700",
142
- "hover:bg-ground-100 hover:text-ground-900",
143
- "data-[active]:bg-ground-100 data-[state=open]:bg-ground-100",
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-ground-400" },
22
+ default: { icon: null, iconClass: "text-muted-foreground" },
23
23
  success: {
24
24
  icon: CheckCircle,
25
- iconClass: "bg-brand-secondary/25 text-ground-700 rounded-full p-1",
25
+ iconClass: "bg-brand-secondary/25 text-muted-foreground rounded-full p-1",
26
26
  },
27
- error: { icon: AlertCircle, iconClass: "text-red-500" },
27
+ error: { icon: AlertCircle, iconClass: "text-destructive" },
28
28
  warning: {
29
29
  icon: AlertTriangle,
30
- iconClass: "bg-brand-secondary/80 text-ground-700 rounded-full p-1",
30
+ iconClass: "bg-brand-secondary/80 text-muted-foreground rounded-full p-1",
31
31
  },
32
- info: { icon: Info, iconClass: "text-ground-400" },
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-ground-100 bg-white shadow-elevated",
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-ground-900">{title}</p>
66
- {description && <p className="mt-0.5 body text-ground-500">{description}</p>}
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-ground-400 hover:text-ground-700"
80
- : "text-ground-900 hover:text-ground-600",
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-ground-400 hover:text-ground-600 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ground-400/40"
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-ground-100 pb-6", className)}>
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-ground-300 shrink-0" />}
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-ground-400 hover:text-ground-700 transition-colors"
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-ground-700">{crumb.label}</span>
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-ground-900 truncate">{title}</h1>
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-ground-400 max-w-2xl">{description}</p>}
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-ground-400">
86
- {m.icon && <span className="text-ground-400">{m.icon}</span>}
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-ground-400", className)}
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-white p-4 shadow-natural outline-none",
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-ground-100", className)}
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-ground-500 shrink-0 select-none"
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-white shadow-natural"
50
- : "border-ground-200 bg-white hover:border-ground-400",
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-ground-500">{option.icon}</div>}
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-ground-900" : "text-ground-800",
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-ground-400">{option.description}</p>
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-ground-300 bg-white",
81
+ : "border-border bg-card",
82
82
  )}
83
83
  >
84
- {isSelected && <Check size={10} className="text-white" strokeWidth={3} />}
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-ground-900" : "text-ground-400",
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-ground-300 text-ground-900",
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-ground-900/20",
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-ground-900 data-[state=checked]:border-ground-900",
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-white" />
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-ground-100",
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-ground-100 bg-white shadow-natural">
66
- <GripVertical size={10} className="text-ground-400" />
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-ground-200 hover:bg-ground-300 transition-colors" />
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";