@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
@@ -20,7 +20,7 @@ const ContextMenuContent = React.forwardRef<
20
20
  <ContextMenu.Content
21
21
  ref={ref}
22
22
  className={cn(
23
- "z-50 min-w-[8rem] bg-white rounded-xl shadow-natural p-1",
23
+ "z-50 min-w-[8rem] bg-card rounded-xl shadow-natural p-1",
24
24
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
25
25
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
26
26
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -47,8 +47,8 @@ const ContextMenuItem = React.forwardRef<
47
47
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
48
48
  "body outline-none transition-colors",
49
49
  destructive
50
- ? "text-red-600 focus:bg-red-50 focus:text-red-700"
51
- : "text-ground-700 focus:bg-ground-50 focus:text-ground-900",
50
+ ? "text-destructive focus:bg-destructive/10 focus:text-destructive"
51
+ : "text-muted-foreground focus:bg-muted focus:text-foreground",
52
52
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
53
53
  inset && "pl-8",
54
54
  className,
@@ -66,8 +66,8 @@ const ContextMenuCheckboxItem = React.forwardRef<
66
66
  ref={ref}
67
67
  className={cn(
68
68
  "relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
69
- "body text-ground-700 outline-none transition-colors",
70
- "focus:bg-ground-50 focus:text-ground-900",
69
+ "body text-muted-foreground outline-none transition-colors",
70
+ "focus:bg-muted focus:text-foreground",
71
71
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
72
72
  className,
73
73
  )}
@@ -75,7 +75,7 @@ const ContextMenuCheckboxItem = React.forwardRef<
75
75
  >
76
76
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
77
77
  <ContextMenu.ItemIndicator>
78
- <Check size={13} className="text-ground-900" />
78
+ <Check size={13} className="text-foreground" />
79
79
  </ContextMenu.ItemIndicator>
80
80
  </span>
81
81
  {children}
@@ -91,8 +91,8 @@ const ContextMenuRadioItem = React.forwardRef<
91
91
  ref={ref}
92
92
  className={cn(
93
93
  "relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
94
- "body text-ground-700 outline-none transition-colors",
95
- "focus:bg-ground-50 focus:text-ground-900",
94
+ "body text-muted-foreground outline-none transition-colors",
95
+ "focus:bg-muted focus:text-foreground",
96
96
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
97
97
  className,
98
98
  )}
@@ -100,7 +100,7 @@ const ContextMenuRadioItem = React.forwardRef<
100
100
  >
101
101
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
102
102
  <ContextMenu.ItemIndicator>
103
- <Circle size={8} className="fill-ground-900 text-ground-900" />
103
+ <Circle size={8} className="fill-foreground text-foreground" />
104
104
  </ContextMenu.ItemIndicator>
105
105
  </span>
106
106
  {children}
@@ -116,7 +116,7 @@ const ContextMenuLabel = React.forwardRef<
116
116
  >(({ className, inset, ...props }, ref) => (
117
117
  <ContextMenu.Label
118
118
  ref={ref}
119
- className={cn("px-2.5 py-1 label text-ground-400", inset && "pl-8", className)}
119
+ className={cn("px-2.5 py-1 label text-muted-foreground", inset && "pl-8", className)}
120
120
  {...props}
121
121
  />
122
122
  ));
@@ -128,7 +128,7 @@ const ContextMenuSeparator = React.forwardRef<
128
128
  >(({ className, ...props }, ref) => (
129
129
  <ContextMenu.Separator
130
130
  ref={ref}
131
- className={cn("mx-1 my-1 h-px bg-ground-100", className)}
131
+ className={cn("mx-1 my-1 h-px bg-muted", className)}
132
132
  {...props}
133
133
  />
134
134
  ));
@@ -144,15 +144,15 @@ const ContextMenuSubTrigger = React.forwardRef<
144
144
  ref={ref}
145
145
  className={cn(
146
146
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
147
- "body text-ground-700 outline-none transition-colors",
148
- "focus:bg-ground-50 focus:text-ground-900 data-[state=open]:bg-ground-50",
147
+ "body text-muted-foreground outline-none transition-colors",
148
+ "focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
149
149
  inset && "pl-8",
150
150
  className,
151
151
  )}
152
152
  {...props}
153
153
  >
154
154
  {children}
155
- <ChevronRight size={14} className="ml-auto text-ground-400" />
155
+ <ChevronRight size={14} className="ml-auto text-muted-foreground" />
156
156
  </ContextMenu.SubTrigger>
157
157
  ));
158
158
  ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
@@ -164,7 +164,7 @@ const ContextMenuSubContent = React.forwardRef<
164
164
  <ContextMenu.SubContent
165
165
  ref={ref}
166
166
  className={cn(
167
- "z-50 min-w-[8rem] bg-white rounded-xl border border-ground-100 shadow-natural p-1",
167
+ "z-50 min-w-[8rem] bg-card rounded-xl border border-border shadow-natural p-1",
168
168
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
169
169
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
170
170
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -177,7 +177,7 @@ const ContextMenuSubContent = React.forwardRef<
177
177
  ContextMenuSubContent.displayName = "ContextMenuSubContent";
178
178
 
179
179
  function ContextMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
180
- return <span className={cn("ml-auto caption text-ground-400", className)} {...props} />;
180
+ return <span className={cn("ml-auto caption text-muted-foreground", className)} {...props} />;
181
181
  }
182
182
  ContextMenuShortcut.displayName = "ContextMenuShortcut";
183
183
 
@@ -67,12 +67,23 @@ function DataTable<TData>({
67
67
  {table.getHeaderGroups().map((headerGroup) => (
68
68
  <TableRow key={headerGroup.id}>
69
69
  {headerGroup.headers.map((header) => (
70
- <TableHead key={header.id}>
70
+ <TableHead
71
+ key={header.id}
72
+ aria-sort={
73
+ header.column.getCanSort()
74
+ ? header.column.getIsSorted() === "asc"
75
+ ? "ascending"
76
+ : header.column.getIsSorted() === "desc"
77
+ ? "descending"
78
+ : "none"
79
+ : undefined
80
+ }
81
+ >
71
82
  {header.isPlaceholder ? null : header.column.getCanSort() ? (
72
83
  <button
73
84
  className={cn(
74
- "flex items-center gap-1 transition-colors hover:text-ground-700",
75
- header.column.getIsSorted() && "text-ground-900",
85
+ "flex items-center gap-1 transition-colors hover:text-muted-foreground",
86
+ header.column.getIsSorted() && "text-foreground",
76
87
  )}
77
88
  onClick={header.column.getToggleSortingHandler()}
78
89
  >
@@ -82,7 +93,7 @@ function DataTable<TData>({
82
93
  ) : header.column.getIsSorted() === "desc" ? (
83
94
  <ChevronDown size={12} className="text-brand-primary" />
84
95
  ) : (
85
- <ChevronsUpDown size={12} className="text-ground-300" />
96
+ <ChevronsUpDown size={12} className="text-muted-foreground" />
86
97
  )}
87
98
  </button>
88
99
  ) : (
@@ -106,7 +117,7 @@ function DataTable<TData>({
106
117
  ))
107
118
  ) : (
108
119
  <TableRow>
109
- <TableCell colSpan={columns.length} className="h-24 text-center text-ground-400">
120
+ <TableCell colSpan={columns.length} className="h-24 text-center text-muted-foreground">
110
121
  No results.
111
122
  </TableCell>
112
123
  </TableRow>
@@ -115,12 +126,12 @@ function DataTable<TData>({
115
126
  </Table>
116
127
  {showPagination && (
117
128
  <div className="flex items-center justify-between">
118
- <p className="caption text-ground-400">
129
+ <p className="caption text-muted-foreground">
119
130
  {table.getFilteredRowModel().rows.length} result
120
131
  {table.getFilteredRowModel().rows.length !== 1 ? "s" : ""}
121
132
  </p>
122
133
  <div className="flex items-center gap-2">
123
- <span className="caption text-ground-400">
134
+ <span className="caption text-muted-foreground">
124
135
  Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
125
136
  </span>
126
137
  <Button
@@ -36,12 +36,12 @@ function DatePicker({
36
36
  variant="outline"
37
37
  className={cn(
38
38
  "w-[240px] justify-start gap-2 text-left font-normal",
39
- !value && "text-ground-400",
39
+ !value && "text-muted-foreground",
40
40
  className,
41
41
  )}
42
42
  disabled={disabled}
43
43
  >
44
- <CalendarIcon size={14} className="text-ground-400 shrink-0" />
44
+ <CalendarIcon size={14} className="text-muted-foreground shrink-0" />
45
45
  {value ? formatDate(value) : <span>{placeholder}</span>}
46
46
  </Button>
47
47
  </PopoverTrigger>
@@ -28,12 +28,12 @@ function DescriptionList({
28
28
  <div className={className}>
29
29
  {(title || description) && (
30
30
  <div className="mb-4">
31
- {title && <p className="body font-semibold text-ground-900">{title}</p>}
32
- {description && <p className="mt-1 caption text-ground-400">{description}</p>}
31
+ {title && <p className="body font-semibold text-foreground">{title}</p>}
32
+ {description && <p className="mt-1 caption text-muted-foreground">{description}</p>}
33
33
  </div>
34
34
  )}
35
35
 
36
- <dl className={cn("border-t border-ground-100", columns === 2 && "sm:grid sm:grid-cols-2")}>
36
+ <dl className={cn("border-t border-border", columns === 2 && "sm:grid sm:grid-cols-2")}>
37
37
  {items.map((item, i) => (
38
38
  <div
39
39
  key={i}
@@ -41,15 +41,15 @@ function DescriptionList({
41
41
  "py-3.5",
42
42
  columns === 1
43
43
  ? "grid grid-cols-3 gap-4 items-baseline"
44
- : "flex flex-col gap-1 border-b border-ground-100",
45
- columns === 1 && i !== items.length - 1 && "border-b border-ground-100",
46
- striped && i % 2 === 0 && "bg-ground-50 -mx-4 px-4 rounded",
44
+ : "flex flex-col gap-1 border-b border-border",
45
+ columns === 1 && i !== items.length - 1 && "border-b border-border",
46
+ striped && i % 2 === 0 && "bg-muted -mx-4 px-4 rounded",
47
47
  )}
48
48
  >
49
- <dt className="caption font-semibold text-ground-500 uppercase tracking-wide">
49
+ <dt className="caption font-semibold text-muted-foreground uppercase tracking-wide">
50
50
  {item.term}
51
51
  </dt>
52
- <dd className={cn("body text-ground-900", columns === 1 ? "col-span-2" : "")}>
52
+ <dd className={cn("body text-foreground", columns === 1 ? "col-span-2" : "")}>
53
53
  {item.action ? (
54
54
  <div className="flex items-center justify-between gap-4">
55
55
  <span>{item.details}</span>
@@ -66,5 +66,7 @@ function DescriptionList({
66
66
  );
67
67
  }
68
68
 
69
+ DescriptionList.displayName = "DescriptionList";
70
+
69
71
  export { DescriptionList };
70
72
  export type { DescriptionItem };
@@ -36,7 +36,7 @@ const DialogContent = React.forwardRef<
36
36
  ref={ref}
37
37
  className={cn(
38
38
  "fixed left-[50%] top-[50%] z-50 translate-x-[-50%] translate-y-[-50%]",
39
- "w-full max-w-lg bg-white rounded-2xl shadow-elevated p-6",
39
+ "w-full max-w-lg bg-card rounded-2xl shadow-elevated p-6",
40
40
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
41
41
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
42
42
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -45,7 +45,7 @@ const DialogContent = React.forwardRef<
45
45
  {...props}
46
46
  >
47
47
  {children}
48
- <Dialog.Close className="absolute right-4 top-4 rounded-md p-1 text-ground-400 opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ground-900/20">
48
+ <Dialog.Close className="absolute right-4 top-4 rounded-md p-1 text-muted-foreground opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring/20">
49
49
  <X size={16} />
50
50
  <span className="sr-only">Close</span>
51
51
  </Dialog.Close>
@@ -70,7 +70,7 @@ const DialogTitle = React.forwardRef<
70
70
  >(({ className, ...props }, ref) => (
71
71
  <Dialog.Title
72
72
  ref={ref}
73
- className={cn("body-lg font-semibold text-ground-900", className)}
73
+ className={cn("body-lg font-semibold text-foreground", className)}
74
74
  {...props}
75
75
  />
76
76
  ));
@@ -80,7 +80,7 @@ const DialogDescription = React.forwardRef<
80
80
  React.ComponentRef<typeof Dialog.Description>,
81
81
  React.ComponentPropsWithoutRef<typeof Dialog.Description>
82
82
  >(({ className, ...props }, ref) => (
83
- <Dialog.Description ref={ref} className={cn("body text-ground-500", className)} {...props} />
83
+ <Dialog.Description ref={ref} className={cn("body text-muted-foreground", className)} {...props} />
84
84
  ));
85
85
  DialogDescription.displayName = "DialogDescription";
86
86
 
@@ -15,7 +15,7 @@ const DrawerOverlay = React.forwardRef<
15
15
  >(({ className, ...props }, ref) => (
16
16
  <DrawerPrimitive.Overlay
17
17
  ref={ref}
18
- className={cn("fixed inset-0 z-50 bg-ground-950/40 backdrop-blur-[1px]", className)}
18
+ className={cn("fixed inset-0 z-50 bg-foreground/40 backdrop-blur-[1px]", className)}
19
19
  {...props}
20
20
  />
21
21
  ));
@@ -30,12 +30,12 @@ const DrawerContent = React.forwardRef<
30
30
  <DrawerPrimitive.Content
31
31
  ref={ref}
32
32
  className={cn(
33
- "fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border border-ground-100 bg-white",
33
+ "fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border border-border bg-card",
34
34
  className,
35
35
  )}
36
36
  {...props}
37
37
  >
38
- <div className="mx-auto mt-4 h-1 w-12 rounded-full bg-ground-200" />
38
+ <div className="mx-auto mt-4 h-1 w-12 rounded-full bg-muted" />
39
39
  {children}
40
40
  </DrawerPrimitive.Content>
41
41
  </DrawerPortal>
@@ -58,7 +58,7 @@ const DrawerTitle = React.forwardRef<
58
58
  >(({ className, ...props }, ref) => (
59
59
  <DrawerPrimitive.Title
60
60
  ref={ref}
61
- className={cn("subheading text-ground-900", className)}
61
+ className={cn("subheading text-foreground", className)}
62
62
  {...props}
63
63
  />
64
64
  ));
@@ -70,7 +70,7 @@ const DrawerDescription = React.forwardRef<
70
70
  >(({ className, ...props }, ref) => (
71
71
  <DrawerPrimitive.Description
72
72
  ref={ref}
73
- className={cn("body text-ground-500", className)}
73
+ className={cn("body text-muted-foreground", className)}
74
74
  {...props}
75
75
  />
76
76
  ));
@@ -21,7 +21,7 @@ const DropdownMenuContent = React.forwardRef<
21
21
  ref={ref}
22
22
  sideOffset={sideOffset}
23
23
  className={cn(
24
- "z-50 min-w-[8rem] bg-white rounded-xl shadow-natural p-1",
24
+ "z-50 min-w-[8rem] bg-card rounded-xl shadow-natural p-1",
25
25
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
26
26
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
27
27
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -48,8 +48,8 @@ const DropdownMenuItem = React.forwardRef<
48
48
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
49
49
  "body outline-none transition-colors",
50
50
  destructive
51
- ? "text-red-600 focus:bg-red-50 focus:text-red-700"
52
- : "text-ground-700 focus:bg-ground-50 focus:text-ground-900",
51
+ ? "text-destructive focus:bg-destructive/10 focus:text-destructive"
52
+ : "text-muted-foreground focus:bg-muted focus:text-foreground",
53
53
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
54
54
  inset && "pl-8",
55
55
  className,
@@ -67,8 +67,8 @@ const DropdownMenuCheckboxItem = React.forwardRef<
67
67
  ref={ref}
68
68
  className={cn(
69
69
  "relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
70
- "body text-ground-700 outline-none transition-colors",
71
- "focus:bg-ground-50 focus:text-ground-900",
70
+ "body text-muted-foreground outline-none transition-colors",
71
+ "focus:bg-muted focus:text-foreground",
72
72
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
73
73
  className,
74
74
  )}
@@ -76,7 +76,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
76
76
  >
77
77
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
78
78
  <DropdownMenu.ItemIndicator>
79
- <Check size={13} className="text-ground-900" />
79
+ <Check size={13} className="text-foreground" />
80
80
  </DropdownMenu.ItemIndicator>
81
81
  </span>
82
82
  {children}
@@ -92,8 +92,8 @@ const DropdownMenuRadioItem = React.forwardRef<
92
92
  ref={ref}
93
93
  className={cn(
94
94
  "relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
95
- "body text-ground-700 outline-none transition-colors",
96
- "focus:bg-ground-50 focus:text-ground-900",
95
+ "body text-muted-foreground outline-none transition-colors",
96
+ "focus:bg-muted focus:text-foreground",
97
97
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
98
98
  className,
99
99
  )}
@@ -101,7 +101,7 @@ const DropdownMenuRadioItem = React.forwardRef<
101
101
  >
102
102
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
103
103
  <DropdownMenu.ItemIndicator>
104
- <Circle size={8} className="fill-ground-900 text-ground-900" />
104
+ <Circle size={8} className="fill-foreground text-foreground" />
105
105
  </DropdownMenu.ItemIndicator>
106
106
  </span>
107
107
  {children}
@@ -117,7 +117,7 @@ const DropdownMenuLabel = React.forwardRef<
117
117
  >(({ className, inset, ...props }, ref) => (
118
118
  <DropdownMenu.Label
119
119
  ref={ref}
120
- className={cn("px-2.5 py-1 label text-ground-400", inset && "pl-8", className)}
120
+ className={cn("px-2.5 py-1 label text-muted-foreground", inset && "pl-8", className)}
121
121
  {...props}
122
122
  />
123
123
  ));
@@ -129,7 +129,7 @@ const DropdownMenuSeparator = React.forwardRef<
129
129
  >(({ className, ...props }, ref) => (
130
130
  <DropdownMenu.Separator
131
131
  ref={ref}
132
- className={cn("mx-1 my-1 h-px bg-ground-100", className)}
132
+ className={cn("mx-1 my-1 h-px bg-muted", className)}
133
133
  {...props}
134
134
  />
135
135
  ));
@@ -145,15 +145,15 @@ const DropdownMenuSubTrigger = React.forwardRef<
145
145
  ref={ref}
146
146
  className={cn(
147
147
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
148
- "body text-ground-700 outline-none transition-colors",
149
- "focus:bg-ground-50 focus:text-ground-900 data-[state=open]:bg-ground-50",
148
+ "body text-muted-foreground outline-none transition-colors",
149
+ "focus:bg-muted focus:text-foreground data-[state=open]:bg-muted",
150
150
  inset && "pl-8",
151
151
  className,
152
152
  )}
153
153
  {...props}
154
154
  >
155
155
  {children}
156
- <ChevronRight size={14} className="ml-auto text-ground-400" />
156
+ <ChevronRight size={14} className="ml-auto text-muted-foreground" />
157
157
  </DropdownMenu.SubTrigger>
158
158
  ));
159
159
  DropdownMenuSubTrigger.displayName = "DropdownMenuSubTrigger";
@@ -165,7 +165,7 @@ const DropdownMenuSubContent = React.forwardRef<
165
165
  <DropdownMenu.SubContent
166
166
  ref={ref}
167
167
  className={cn(
168
- "z-50 min-w-[8rem] bg-white rounded-xl border border-ground-100 shadow-natural p-1",
168
+ "z-50 min-w-[8rem] bg-card rounded-xl border border-border shadow-natural p-1",
169
169
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
170
170
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
171
171
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -178,7 +178,7 @@ const DropdownMenuSubContent = React.forwardRef<
178
178
  DropdownMenuSubContent.displayName = "DropdownMenuSubContent";
179
179
 
180
180
  function DropdownMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
181
- return <span className={cn("ml-auto caption text-ground-400", className)} {...props} />;
181
+ return <span className={cn("ml-auto caption text-muted-foreground", className)} {...props} />;
182
182
  }
183
183
  DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
184
184
 
@@ -18,13 +18,13 @@ function EmptyState({ icon, title, description, action, className }: EmptyStateP
18
18
  return (
19
19
  <div className={cn("flex flex-col items-center gap-4 px-6 py-14 text-center", className)}>
20
20
  {icon && (
21
- <div className="flex size-12 items-center justify-center rounded-xl bg-brand-secondary/20 text-ground-700">
21
+ <div className="flex size-12 items-center justify-center rounded-xl bg-brand-secondary/20 text-muted-foreground">
22
22
  {icon}
23
23
  </div>
24
24
  )}
25
25
  <div className="flex flex-col gap-1.5">
26
- <p className="body font-semibold text-ground-900">{title}</p>
27
- {description && <p className="body max-w-xs text-ground-400">{description}</p>}
26
+ <p className="body font-semibold text-foreground">{title}</p>
27
+ {description && <p className="body max-w-xs text-muted-foreground">{description}</p>}
28
28
  </div>
29
29
  {action &&
30
30
  (action.href ? (
@@ -40,4 +40,6 @@ function EmptyState({ icon, title, description, action, className }: EmptyStateP
40
40
  );
41
41
  }
42
42
 
43
+ EmptyState.displayName = "EmptyState";
44
+
43
45
  export { EmptyState };
@@ -34,15 +34,15 @@ function Field({
34
34
  <div className="flex items-center justify-between gap-2">
35
35
  <Label htmlFor={htmlFor} aria-required={required}>
36
36
  {label}
37
- {required && <span className="ml-0.5 text-red-600" aria-hidden="true">*</span>}
37
+ {required && <span className="ml-0.5 text-destructive" aria-hidden="true">*</span>}
38
38
  </Label>
39
- {cornerHint && <span className="caption text-ground-400">{cornerHint}</span>}
39
+ {cornerHint && <span className="caption text-muted-foreground">{cornerHint}</span>}
40
40
  </div>
41
41
  {children}
42
42
  {error ? (
43
- <p id={descriptionId} role="alert" className="caption text-red-600">{error}</p>
43
+ <p id={descriptionId} role="alert" className="caption text-destructive">{error}</p>
44
44
  ) : hint ? (
45
- <p id={descriptionId} className="caption text-ground-400">{hint}</p>
45
+ <p id={descriptionId} className="caption text-muted-foreground">{hint}</p>
46
46
  ) : null}
47
47
  </div>
48
48
  );
@@ -58,18 +58,18 @@ function GridListCard({
58
58
  const inner = (
59
59
  <div
60
60
  className={cn(
61
- "flex h-full flex-col gap-1 rounded-xl border border-ground-100 bg-white p-4 shadow-natural transition-shadow",
61
+ "flex h-full flex-col gap-1 rounded-xl border border-border bg-card p-4 shadow-natural transition-shadow",
62
62
  href && "hover:shadow-elevated",
63
63
  className,
64
64
  )}
65
65
  >
66
66
  {accent && <div className="mb-2">{accent}</div>}
67
- <p className="body font-semibold text-ground-900">{title}</p>
68
- {description && <p className="caption text-ground-400">{description}</p>}
67
+ <p className="body font-semibold text-foreground">{title}</p>
68
+ {description && <p className="caption text-muted-foreground">{description}</p>}
69
69
  {(meta || trailing) && (
70
70
  <div className="mt-auto flex items-center justify-between pt-3">
71
- {meta && <span className="caption text-ground-400">{meta}</span>}
72
- {trailing && <span className="caption text-ground-400">{trailing}</span>}
71
+ {meta && <span className="caption text-muted-foreground">{meta}</span>}
72
+ {trailing && <span className="caption text-muted-foreground">{trailing}</span>}
73
73
  </div>
74
74
  )}
75
75
  </div>
@@ -80,7 +80,7 @@ function GridListCard({
80
80
  {href ? (
81
81
  <a
82
82
  href={href}
83
- className="block h-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ground-400/40 rounded-xl"
83
+ className="block h-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 rounded-xl"
84
84
  >
85
85
  {inner}
86
86
  </a>
@@ -109,7 +109,7 @@ function GridListAccentCard({
109
109
  title,
110
110
  meta,
111
111
  href,
112
- accentClass = "bg-ground-900",
112
+ accentClass = "bg-foreground",
113
113
  initials,
114
114
  trailing,
115
115
  className,
@@ -117,23 +117,23 @@ function GridListAccentCard({
117
117
  const inner = (
118
118
  <div
119
119
  className={cn(
120
- "flex overflow-hidden rounded-xl border border-ground-100 bg-white shadow-natural transition-shadow",
120
+ "flex overflow-hidden rounded-xl border border-border bg-card shadow-natural transition-shadow",
121
121
  href && "hover:shadow-elevated",
122
122
  className,
123
123
  )}
124
124
  >
125
125
  <div
126
126
  className={cn(
127
- "flex w-14 shrink-0 items-center justify-center body font-semibold text-white",
127
+ "flex w-14 shrink-0 items-center justify-center body font-semibold text-background",
128
128
  accentClass,
129
129
  )}
130
130
  >
131
131
  {initials}
132
132
  </div>
133
- <div className="flex flex-1 items-center justify-between truncate border-l border-ground-100 px-4 py-3">
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-ground-900 truncate">{title}</p>
136
- {meta && <p className="caption text-ground-400">{meta}</p>}
135
+ <p className="body font-semibold text-foreground truncate">{title}</p>
136
+ {meta && <p className="caption text-muted-foreground">{meta}</p>}
137
137
  </div>
138
138
  {trailing && <div className="shrink-0 pl-2">{trailing}</div>}
139
139
  </div>
@@ -145,7 +145,7 @@ function GridListAccentCard({
145
145
  {href ? (
146
146
  <a
147
147
  href={href}
148
- className="block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ground-400/40 rounded-xl"
148
+ className="block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 rounded-xl"
149
149
  >
150
150
  {inner}
151
151
  </a>
@@ -156,4 +156,8 @@ function GridListAccentCard({
156
156
  );
157
157
  }
158
158
 
159
+ GridList.displayName = "GridList";
160
+ GridListCard.displayName = "GridListCard";
161
+ GridListAccentCard.displayName = "GridListAccentCard";
162
+
159
163
  export { GridList, GridListCard, GridListAccentCard };
@@ -17,7 +17,7 @@ const HoverCardContent = React.forwardRef<
17
17
  align={align}
18
18
  sideOffset={sideOffset}
19
19
  className={cn(
20
- "z-50 w-64 rounded-xl border border-ground-100 bg-white p-4 shadow-elevated outline-none",
20
+ "z-50 w-64 rounded-xl border border-border bg-card p-4 shadow-elevated outline-none",
21
21
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
22
22
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
23
23
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -34,11 +34,11 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
34
34
  const hasTrailing = trailingAddon || trailingIcon || trailingButton || error;
35
35
 
36
36
  const baseInput = cn(
37
- "flex h-9 w-full border bg-white body text-ground-900 placeholder:text-ground-400",
37
+ "flex h-9 w-full border bg-card body text-foreground placeholder:text-muted-foreground",
38
38
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:disabled:cursor-not-allowed disabled:opacity-50",
39
39
  error
40
- ? "border-red-400 focus-visible:ring-red-200 focus-visible:border-red-500"
41
- : "border-ground-200 focus-visible:ring-brand-primary/20 focus-visible:border-brand-primary",
40
+ ? "border-destructive focus-visible:ring-destructive/20 focus-visible:border-destructive"
41
+ : "border-border focus-visible:ring-brand-primary/20 focus-visible:border-brand-primary",
42
42
  );
43
43
 
44
44
  if (!hasLeading && !hasTrailing) {
@@ -51,8 +51,8 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
51
51
  {leadingAddon && (
52
52
  <span
53
53
  className={cn(
54
- "inline-flex items-center border border-r-0 bg-ground-50 px-3 body text-ground-500 select-none",
55
- error ? "border-red-400" : "border-ground-200",
54
+ "inline-flex items-center border border-r-0 bg-muted px-3 body text-muted-foreground select-none",
55
+ error ? "border-destructive" : "border-border",
56
56
  pill ? "rounded-l-full" : "rounded-l-lg",
57
57
  )}
58
58
  >
@@ -63,7 +63,7 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
63
63
  {/* Relative wrapper for icon-only inputs */}
64
64
  <div className="relative flex-1">
65
65
  {leadingIcon && (
66
- <div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-ground-400">
66
+ <div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-muted-foreground">
67
67
  {leadingIcon}
68
68
  </div>
69
69
  )}
@@ -102,9 +102,9 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
102
102
  {(trailingIcon || error) && (
103
103
  <div className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3">
104
104
  {error ? (
105
- <AlertCircle size={15} className="text-red-500" />
105
+ <AlertCircle size={15} className="text-destructive" />
106
106
  ) : (
107
- <span className="text-ground-400">{trailingIcon}</span>
107
+ <span className="text-muted-foreground">{trailingIcon}</span>
108
108
  )}
109
109
  </div>
110
110
  )}
@@ -114,8 +114,8 @@ const InputGroup = React.forwardRef<HTMLInputElement, InputGroupProps>(
114
114
  {trailingAddon && (
115
115
  <span
116
116
  className={cn(
117
- "inline-flex items-center border border-l-0 bg-ground-50 px-3 body text-ground-500 select-none",
118
- error ? "border-red-400" : "border-ground-200",
117
+ "inline-flex items-center border border-l-0 bg-muted px-3 body text-muted-foreground select-none",
118
+ error ? "border-destructive" : "border-border",
119
119
  pill ? "rounded-r-full" : "rounded-r-lg",
120
120
  )}
121
121
  >