@hilum/ui 0.1.1 → 0.1.3

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 (92) hide show
  1. package/README.md +23 -4
  2. package/dist/chunk-J2QQDUF4.js +204 -0
  3. package/dist/chunk-J2QQDUF4.js.map +1 -0
  4. package/dist/create-theme.d.ts +27 -0
  5. package/dist/create-theme.js +172 -0
  6. package/dist/create-theme.js.map +1 -0
  7. package/dist/index.d.ts +21 -8
  8. package/dist/index.js +393 -381
  9. package/dist/index.js.map +1 -1
  10. package/dist/tokens.css +59 -50
  11. package/dist/tokens.d.ts +46 -38
  12. package/dist/tokens.js +1 -191
  13. package/dist/tokens.js.map +1 -1
  14. package/llms.txt +1514 -0
  15. package/package.json +11 -7
  16. package/src/components/accordion.tsx +5 -5
  17. package/src/components/action-panel.tsx +6 -6
  18. package/src/components/activity-feed.tsx +4 -4
  19. package/src/components/alert-dialog.tsx +3 -3
  20. package/src/components/alert.tsx +4 -4
  21. package/src/components/avatar-stack.tsx +2 -2
  22. package/src/components/avatar.tsx +2 -2
  23. package/src/components/badge.tsx +6 -5
  24. package/src/components/breadcrumb.tsx +5 -5
  25. package/src/components/button-group.tsx +4 -4
  26. package/src/components/button.tsx +6 -5
  27. package/src/components/calendar.tsx +7 -7
  28. package/src/components/card-heading.tsx +3 -3
  29. package/src/components/card.tsx +3 -3
  30. package/src/components/chart.tsx +11 -11
  31. package/src/components/checkbox.tsx +1 -1
  32. package/src/components/color-input.tsx +7 -7
  33. package/src/components/color-picker.tsx +5 -5
  34. package/src/components/combobox.tsx +10 -10
  35. package/src/components/command-palette.tsx +11 -11
  36. package/src/components/command.tsx +13 -13
  37. package/src/components/context-menu.tsx +15 -16
  38. package/src/components/data-table.tsx +6 -6
  39. package/src/components/date-picker.tsx +9 -4
  40. package/src/components/description-list.tsx +8 -8
  41. package/src/components/dialog.tsx +3 -3
  42. package/src/components/drawer.tsx +5 -5
  43. package/src/components/dropdown-menu.tsx +15 -16
  44. package/src/components/empty-state.tsx +3 -3
  45. package/src/components/field.tsx +13 -6
  46. package/src/components/grid-list.tsx +12 -12
  47. package/src/components/hover-card.tsx +1 -1
  48. package/src/components/input-group.tsx +8 -8
  49. package/src/components/input-number.tsx +7 -7
  50. package/src/components/input-otp.tsx +3 -3
  51. package/src/components/input.tsx +5 -4
  52. package/src/components/kbd.tsx +1 -1
  53. package/src/components/label.tsx +1 -1
  54. package/src/components/menubar.tsx +21 -22
  55. package/src/components/native-select.tsx +4 -4
  56. package/src/components/navigation-menu.tsx +10 -10
  57. package/src/components/notification.tsx +10 -10
  58. package/src/components/page-heading.tsx +8 -8
  59. package/src/components/pagination.tsx +1 -1
  60. package/src/components/progress.tsx +1 -1
  61. package/src/components/property-row.tsx +1 -1
  62. package/src/components/radio-card.tsx +6 -6
  63. package/src/components/radio-group.tsx +3 -3
  64. package/src/components/resizable.tsx +3 -3
  65. package/src/components/scroll-area.tsx +1 -1
  66. package/src/components/section-heading.tsx +3 -3
  67. package/src/components/select.tsx +11 -11
  68. package/src/components/separator.tsx +1 -1
  69. package/src/components/sheet.tsx +3 -3
  70. package/src/components/sidebar.tsx +19 -19
  71. package/src/components/skeleton.tsx +1 -1
  72. package/src/components/slider.tsx +1 -1
  73. package/src/components/sonner.tsx +5 -5
  74. package/src/components/stacked-list.tsx +4 -4
  75. package/src/components/stat-card.tsx +6 -6
  76. package/src/components/steps.tsx +13 -12
  77. package/src/components/switch.tsx +1 -1
  78. package/src/components/table.tsx +9 -9
  79. package/src/components/tabs.tsx +2 -2
  80. package/src/components/textarea.tsx +4 -4
  81. package/src/components/toggle.tsx +8 -8
  82. package/src/components/tooltip.tsx +1 -1
  83. package/src/index.ts +3 -2
  84. package/src/tokens/tokens.ts +54 -40
  85. package/src/components/__tests__/data.test.tsx +0 -180
  86. package/src/components/__tests__/disclosure.test.tsx +0 -198
  87. package/src/components/__tests__/display.test.tsx +0 -262
  88. package/src/components/__tests__/feedback.test.tsx +0 -138
  89. package/src/components/__tests__/form.test.tsx +0 -297
  90. package/src/components/__tests__/layout.test.tsx +0 -388
  91. package/src/components/__tests__/overlay.test.tsx +0 -90
  92. package/src/components/__tests__/primitives.test.tsx +0 -248
@@ -77,7 +77,7 @@ function Combobox({
77
77
  {/* Trigger */}
78
78
  <div className="relative flex items-center">
79
79
  {selectedOption?.avatar && !open && (
80
- <div className="pointer-events-none absolute left-2.5 flex size-5 items-center justify-center rounded-full bg-taupe-200 caption-xs font-semibold text-taupe-700 shrink-0">
80
+ <div className="pointer-events-none absolute left-2.5 flex size-5 items-center justify-center rounded-full bg-ground-200 caption-xs font-semibold text-ground-700 shrink-0">
81
81
  {selectedOption.avatar}
82
82
  </div>
83
83
  )}
@@ -93,9 +93,9 @@ function Combobox({
93
93
  role="combobox"
94
94
  aria-expanded={open}
95
95
  className={cn(
96
- "flex h-9 w-full rounded-lg border border-taupe-200 bg-white pr-8 body text-taupe-900",
97
- "placeholder:text-taupe-400",
98
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-taupe-400/30 focus-visible:border-taupe-400",
96
+ "flex h-9 w-full rounded-lg border border-ground-200 bg-white pr-8 body text-ground-900",
97
+ "placeholder:text-ground-400",
98
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ground-400/30 focus-visible:border-ground-400",
99
99
  "disabled:cursor-not-allowed disabled:opacity-50",
100
100
  selectedOption?.avatar && !open
101
101
  ? "pl-8"
@@ -117,7 +117,7 @@ function Combobox({
117
117
  <button
118
118
  type="button"
119
119
  tabIndex={-1}
120
- className="absolute inset-y-0 right-0 flex items-center px-2 text-taupe-400 hover:text-taupe-700 transition-colors"
120
+ className="absolute inset-y-0 right-0 flex items-center px-2 text-ground-400 hover:text-ground-700 transition-colors"
121
121
  onClick={() => {
122
122
  if (open) {
123
123
  setOpen(false);
@@ -134,10 +134,10 @@ function Combobox({
134
134
 
135
135
  {/* Dropdown */}
136
136
  {open && (
137
- <div className="absolute z-50 mt-1 w-full overflow-hidden rounded-lg border border-taupe-200 bg-white shadow-elevated">
137
+ <div className="absolute z-50 mt-1 w-full overflow-hidden rounded-lg border border-ground-200 bg-white shadow-elevated">
138
138
  <ul role="listbox" className="max-h-60 overflow-auto py-1">
139
139
  {filtered.length === 0 ? (
140
- <li className="px-3 py-2 body text-taupe-400">{emptyText}</li>
140
+ <li className="px-3 py-2 body text-ground-400">{emptyText}</li>
141
141
  ) : (
142
142
  filtered.map((option) => {
143
143
  const isSelected = option.value === value;
@@ -150,7 +150,7 @@ function Combobox({
150
150
  "flex cursor-pointer select-none items-center gap-2.5 px-3 py-2 body transition-colors",
151
151
  isSelected
152
152
  ? "bg-brand-primary text-white"
153
- : "text-taupe-900 hover:bg-taupe-50",
153
+ : "text-ground-900 hover:bg-ground-50",
154
154
  )}
155
155
  onMouseDown={(e) => e.preventDefault()}
156
156
  onClick={() => {
@@ -164,7 +164,7 @@ function Combobox({
164
164
  <div
165
165
  className={cn(
166
166
  "flex size-6 shrink-0 items-center justify-center rounded-full caption-xs font-semibold",
167
- isSelected ? "bg-white/20 text-white" : "bg-taupe-200 text-taupe-700",
167
+ isSelected ? "bg-white/20 text-white" : "bg-ground-200 text-ground-700",
168
168
  )}
169
169
  >
170
170
  {option.avatar}
@@ -185,7 +185,7 @@ function Combobox({
185
185
  <p
186
186
  className={cn(
187
187
  "caption truncate",
188
- isSelected ? "text-white/70" : "text-taupe-400",
188
+ isSelected ? "text-white/70" : "text-ground-400",
189
189
  )}
190
190
  >
191
191
  {option.description}
@@ -73,12 +73,12 @@ function CommandPalette({
73
73
  <Dialog open={open} onOpenChange={(v) => !v && onClose()}>
74
74
  <DialogContent className="gap-0 overflow-hidden p-0 sm:max-w-xl">
75
75
  {/* Search input */}
76
- <div className="flex items-center gap-3 border-b border-taupe-100 px-4">
77
- <Search size={16} className="shrink-0 text-taupe-400" />
76
+ <div className="flex items-center gap-3 border-b border-ground-100 px-4">
77
+ <Search size={16} className="shrink-0 text-ground-400" />
78
78
  <input
79
79
  ref={inputRef}
80
80
  type="text"
81
- className="h-12 flex-1 bg-transparent body text-taupe-900 placeholder:text-taupe-400 focus:outline-none"
81
+ className="h-12 flex-1 bg-transparent body text-ground-900 placeholder:text-ground-400 focus:outline-none"
82
82
  placeholder={placeholder}
83
83
  value={query}
84
84
  onChange={(e) => setQuery(e.target.value)}
@@ -88,7 +88,7 @@ function CommandPalette({
88
88
  }}
89
89
  />
90
90
  <kbd className="hidden items-center gap-0.5 sm:flex">
91
- <span className="caption-xs font-medium text-taupe-400 rounded border border-taupe-200 px-1.5 py-0.5">
91
+ <span className="caption-xs font-medium text-ground-400 rounded border border-ground-200 px-1.5 py-0.5">
92
92
  esc
93
93
  </span>
94
94
  </kbd>
@@ -97,31 +97,31 @@ function CommandPalette({
97
97
  {/* Results */}
98
98
  <div className="max-h-80 overflow-y-auto">
99
99
  {filtered.length === 0 ? (
100
- <p className="px-4 py-8 text-center body text-taupe-400">{emptyText}</p>
100
+ <p className="px-4 py-8 text-center body text-ground-400">{emptyText}</p>
101
101
  ) : (
102
102
  <ul role="list" className="py-2">
103
103
  {categories.map((cat) => (
104
104
  <li key={cat}>
105
- {cat && <p className="label px-4 py-2 text-taupe-400">{cat}</p>}
105
+ {cat && <p className="label px-4 py-2 text-ground-400">{cat}</p>}
106
106
  {grouped[cat].map((item, i) => (
107
107
  <button
108
108
  key={item.id ?? i}
109
109
  type="button"
110
- className="flex w-full items-center gap-3 px-4 py-2.5 body text-left transition-colors hover:bg-taupe-50 focus-visible:bg-taupe-50 focus-visible:outline-none"
110
+ className="flex w-full items-center gap-3 px-4 py-2.5 body text-left transition-colors hover:bg-ground-50 focus-visible:bg-ground-50 focus-visible:outline-none"
111
111
  onClick={() => handleSelect(item)}
112
112
  >
113
113
  {item.icon && (
114
- <span className="flex size-8 shrink-0 items-center justify-center rounded-lg border border-taupe-200 bg-white text-taupe-500">
114
+ <span className="flex size-8 shrink-0 items-center justify-center rounded-lg border border-ground-200 bg-white text-ground-500">
115
115
  {item.icon}
116
116
  </span>
117
117
  )}
118
118
  <div className="min-w-0 flex-1">
119
- <p className="font-medium text-taupe-900 truncate">{item.label}</p>
119
+ <p className="font-medium text-ground-900 truncate">{item.label}</p>
120
120
  {item.description && (
121
- <p className="caption text-taupe-400 truncate">{item.description}</p>
121
+ <p className="caption text-ground-400 truncate">{item.description}</p>
122
122
  )}
123
123
  </div>
124
- <ArrowRight size={13} className="shrink-0 text-taupe-300" />
124
+ <ArrowRight size={13} className="shrink-0 text-ground-300" />
125
125
  </button>
126
126
  ))}
127
127
  </li>
@@ -40,11 +40,11 @@ function Command({ className, children, onSelect, ...props }: CommandProps) {
40
40
  }, []);
41
41
 
42
42
  return (
43
- <CommandCtx.Provider value={{ query, setQuery, onSelect, reportVisible }}>
43
+ <CommandCtx.Provider value={{ query, setQuery, ...(onSelect !== undefined && { onSelect }), reportVisible }}>
44
44
  <CommandVisibleCtx.Provider value={visibleCount}>
45
45
  <div
46
46
  className={cn(
47
- "flex flex-col overflow-hidden rounded-xl border border-taupe-200 bg-white",
47
+ "flex flex-col overflow-hidden rounded-xl border border-ground-200 bg-white",
48
48
  className,
49
49
  )}
50
50
  {...props}
@@ -62,8 +62,8 @@ const CommandInput = React.forwardRef<
62
62
  >(({ className, ...props }, ref) => {
63
63
  const { query, setQuery } = React.useContext(CommandCtx);
64
64
  return (
65
- <div className="flex items-center gap-2 border-b border-taupe-100 px-3">
66
- <Search size={14} className="shrink-0 text-taupe-400" />
65
+ <div className="flex items-center gap-2 border-b border-ground-100 px-3">
66
+ <Search size={14} className="shrink-0 text-ground-400" />
67
67
  <input
68
68
  ref={ref}
69
69
  type="text"
@@ -71,8 +71,8 @@ const CommandInput = React.forwardRef<
71
71
  autoCorrect="off"
72
72
  spellCheck={false}
73
73
  className={cn(
74
- "flex h-10 w-full bg-transparent body text-taupe-900",
75
- "placeholder:text-taupe-400 focus:outline-none",
74
+ "flex h-10 w-full bg-transparent body text-ground-900",
75
+ "placeholder:text-ground-400 focus:outline-none",
76
76
  className,
77
77
  )}
78
78
  value={query}
@@ -135,7 +135,7 @@ const CommandEmpty = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLD
135
135
  return (
136
136
  <div
137
137
  ref={ref}
138
- className={cn("py-6 text-center caption text-taupe-400", className)}
138
+ className={cn("py-6 text-center caption text-ground-400", className)}
139
139
  {...props}
140
140
  >
141
141
  {children}
@@ -152,7 +152,7 @@ interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {
152
152
  const CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(
153
153
  ({ className, heading, children, ...props }, ref) => (
154
154
  <div ref={ref} role="group" className={cn("py-1", className)} {...props}>
155
- {heading && <p className="px-3 pb-1 pt-0.5 label text-taupe-400">{heading}</p>}
155
+ {heading && <p className="px-3 pb-1 pt-0.5 label text-ground-400">{heading}</p>}
156
156
  {children}
157
157
  </div>
158
158
  ),
@@ -197,9 +197,9 @@ const CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(
197
197
  tabIndex={disabled ? undefined : 0}
198
198
  className={cn(
199
199
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5 mx-1",
200
- "body text-taupe-700 outline-none transition-colors",
201
- "hover:bg-taupe-50 hover:text-taupe-900",
202
- "focus:bg-taupe-50 focus:text-taupe-900",
200
+ "body text-ground-700 outline-none transition-colors",
201
+ "hover:bg-ground-50 hover:text-ground-900",
202
+ "focus:bg-ground-50 focus:text-ground-900",
203
203
  disabled && "pointer-events-none opacity-40",
204
204
  className,
205
205
  )}
@@ -221,7 +221,7 @@ CommandItem.displayName = "CommandItem";
221
221
 
222
222
  const CommandSeparator = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
223
223
  ({ className, ...props }, ref) => (
224
- <div ref={ref} className={cn("my-1 h-px bg-taupe-100", className)} {...props} />
224
+ <div ref={ref} className={cn("my-1 h-px bg-ground-100", className)} {...props} />
225
225
  ),
226
226
  );
227
227
  CommandSeparator.displayName = "CommandSeparator";
@@ -229,7 +229,7 @@ CommandSeparator.displayName = "CommandSeparator";
229
229
  function CommandShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
230
230
  return (
231
231
  <span
232
- className={cn("ml-auto caption text-taupe-300 tracking-widest font-medium", className)}
232
+ className={cn("ml-auto caption text-ground-300 tracking-widest font-medium", className)}
233
233
  {...props}
234
234
  />
235
235
  );
@@ -48,7 +48,7 @@ const ContextMenuItem = React.forwardRef<
48
48
  "body outline-none transition-colors",
49
49
  destructive
50
50
  ? "text-red-600 focus:bg-red-50 focus:text-red-700"
51
- : "text-taupe-700 focus:bg-taupe-50 focus:text-taupe-900",
51
+ : "text-ground-700 focus:bg-ground-50 focus:text-ground-900",
52
52
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
53
53
  inset && "pl-8",
54
54
  className,
@@ -61,22 +61,21 @@ ContextMenuItem.displayName = "ContextMenuItem";
61
61
  const ContextMenuCheckboxItem = React.forwardRef<
62
62
  React.ComponentRef<typeof ContextMenu.CheckboxItem>,
63
63
  React.ComponentPropsWithoutRef<typeof ContextMenu.CheckboxItem>
64
- >(({ className, children, checked, ...props }, ref) => (
64
+ >(({ className, children, ...props }, ref) => (
65
65
  <ContextMenu.CheckboxItem
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-taupe-700 outline-none transition-colors",
70
- "focus:bg-taupe-50 focus:text-taupe-900",
69
+ "body text-ground-700 outline-none transition-colors",
70
+ "focus:bg-ground-50 focus:text-ground-900",
71
71
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
72
72
  className,
73
73
  )}
74
- checked={checked}
75
74
  {...props}
76
75
  >
77
76
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
78
77
  <ContextMenu.ItemIndicator>
79
- <Check size={13} className="text-taupe-900" />
78
+ <Check size={13} className="text-ground-900" />
80
79
  </ContextMenu.ItemIndicator>
81
80
  </span>
82
81
  {children}
@@ -92,8 +91,8 @@ const ContextMenuRadioItem = React.forwardRef<
92
91
  ref={ref}
93
92
  className={cn(
94
93
  "relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
95
- "body text-taupe-700 outline-none transition-colors",
96
- "focus:bg-taupe-50 focus:text-taupe-900",
94
+ "body text-ground-700 outline-none transition-colors",
95
+ "focus:bg-ground-50 focus:text-ground-900",
97
96
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
98
97
  className,
99
98
  )}
@@ -101,7 +100,7 @@ const ContextMenuRadioItem = React.forwardRef<
101
100
  >
102
101
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
103
102
  <ContextMenu.ItemIndicator>
104
- <Circle size={8} className="fill-taupe-900 text-taupe-900" />
103
+ <Circle size={8} className="fill-ground-900 text-ground-900" />
105
104
  </ContextMenu.ItemIndicator>
106
105
  </span>
107
106
  {children}
@@ -117,7 +116,7 @@ const ContextMenuLabel = React.forwardRef<
117
116
  >(({ className, inset, ...props }, ref) => (
118
117
  <ContextMenu.Label
119
118
  ref={ref}
120
- className={cn("px-2.5 py-1 label text-taupe-400", inset && "pl-8", className)}
119
+ className={cn("px-2.5 py-1 label text-ground-400", inset && "pl-8", className)}
121
120
  {...props}
122
121
  />
123
122
  ));
@@ -129,7 +128,7 @@ const ContextMenuSeparator = React.forwardRef<
129
128
  >(({ className, ...props }, ref) => (
130
129
  <ContextMenu.Separator
131
130
  ref={ref}
132
- className={cn("mx-1 my-1 h-px bg-taupe-100", className)}
131
+ className={cn("mx-1 my-1 h-px bg-ground-100", className)}
133
132
  {...props}
134
133
  />
135
134
  ));
@@ -145,15 +144,15 @@ const ContextMenuSubTrigger = React.forwardRef<
145
144
  ref={ref}
146
145
  className={cn(
147
146
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
148
- "body text-taupe-700 outline-none transition-colors",
149
- "focus:bg-taupe-50 focus:text-taupe-900 data-[state=open]:bg-taupe-50",
147
+ "body text-ground-700 outline-none transition-colors",
148
+ "focus:bg-ground-50 focus:text-ground-900 data-[state=open]:bg-ground-50",
150
149
  inset && "pl-8",
151
150
  className,
152
151
  )}
153
152
  {...props}
154
153
  >
155
154
  {children}
156
- <ChevronRight size={14} className="ml-auto text-taupe-400" />
155
+ <ChevronRight size={14} className="ml-auto text-ground-400" />
157
156
  </ContextMenu.SubTrigger>
158
157
  ));
159
158
  ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
@@ -165,7 +164,7 @@ const ContextMenuSubContent = React.forwardRef<
165
164
  <ContextMenu.SubContent
166
165
  ref={ref}
167
166
  className={cn(
168
- "z-50 min-w-[8rem] bg-white rounded-xl border border-taupe-100 shadow-natural p-1",
167
+ "z-50 min-w-[8rem] bg-white rounded-xl border border-ground-100 shadow-natural p-1",
169
168
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
170
169
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
171
170
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -178,7 +177,7 @@ const ContextMenuSubContent = React.forwardRef<
178
177
  ContextMenuSubContent.displayName = "ContextMenuSubContent";
179
178
 
180
179
  function ContextMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
181
- return <span className={cn("ml-auto caption text-taupe-400", className)} {...props} />;
180
+ return <span className={cn("ml-auto caption text-ground-400", className)} {...props} />;
182
181
  }
183
182
  ContextMenuShortcut.displayName = "ContextMenuShortcut";
184
183
 
@@ -71,8 +71,8 @@ function DataTable<TData>({
71
71
  {header.isPlaceholder ? null : header.column.getCanSort() ? (
72
72
  <button
73
73
  className={cn(
74
- "flex items-center gap-1 transition-colors hover:text-taupe-700",
75
- header.column.getIsSorted() && "text-taupe-900",
74
+ "flex items-center gap-1 transition-colors hover:text-ground-700",
75
+ header.column.getIsSorted() && "text-ground-900",
76
76
  )}
77
77
  onClick={header.column.getToggleSortingHandler()}
78
78
  >
@@ -82,7 +82,7 @@ function DataTable<TData>({
82
82
  ) : header.column.getIsSorted() === "desc" ? (
83
83
  <ChevronDown size={12} className="text-brand-primary" />
84
84
  ) : (
85
- <ChevronsUpDown size={12} className="text-taupe-300" />
85
+ <ChevronsUpDown size={12} className="text-ground-300" />
86
86
  )}
87
87
  </button>
88
88
  ) : (
@@ -106,7 +106,7 @@ function DataTable<TData>({
106
106
  ))
107
107
  ) : (
108
108
  <TableRow>
109
- <TableCell colSpan={columns.length} className="h-24 text-center text-taupe-400">
109
+ <TableCell colSpan={columns.length} className="h-24 text-center text-ground-400">
110
110
  No results.
111
111
  </TableCell>
112
112
  </TableRow>
@@ -115,12 +115,12 @@ function DataTable<TData>({
115
115
  </Table>
116
116
  {showPagination && (
117
117
  <div className="flex items-center justify-between">
118
- <p className="caption text-taupe-400">
118
+ <p className="caption text-ground-400">
119
119
  {table.getFilteredRowModel().rows.length} result
120
120
  {table.getFilteredRowModel().rows.length !== 1 ? "s" : ""}
121
121
  </p>
122
122
  <div className="flex items-center gap-2">
123
- <span className="caption text-taupe-400">
123
+ <span className="caption text-ground-400">
124
124
  Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
125
125
  </span>
126
126
  <Button
@@ -15,7 +15,7 @@ const formatDate = (date: Date) =>
15
15
  });
16
16
 
17
17
  interface DatePickerProps {
18
- value?: Date;
18
+ value?: Date | undefined;
19
19
  onChange?: (date: Date | undefined) => void;
20
20
  placeholder?: string;
21
21
  disabled?: boolean;
@@ -36,17 +36,22 @@ 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-taupe-400",
39
+ !value && "text-ground-400",
40
40
  className,
41
41
  )}
42
42
  disabled={disabled}
43
43
  >
44
- <CalendarIcon size={14} className="text-taupe-400 shrink-0" />
44
+ <CalendarIcon size={14} className="text-ground-400 shrink-0" />
45
45
  {value ? formatDate(value) : <span>{placeholder}</span>}
46
46
  </Button>
47
47
  </PopoverTrigger>
48
48
  <PopoverContent className="w-auto p-0 shadow-elevated" align="start">
49
- <Calendar mode="single" selected={value} onSelect={onChange} autoFocus />
49
+ <Calendar
50
+ mode="single"
51
+ {...(value !== undefined && { selected: value })}
52
+ {...(onChange !== undefined && { onSelect: onChange })}
53
+ autoFocus
54
+ />
50
55
  </PopoverContent>
51
56
  </Popover>
52
57
  );
@@ -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-taupe-900">{title}</p>}
32
- {description && <p className="mt-1 caption text-taupe-400">{description}</p>}
31
+ {title && <p className="body font-semibold text-ground-900">{title}</p>}
32
+ {description && <p className="mt-1 caption text-ground-400">{description}</p>}
33
33
  </div>
34
34
  )}
35
35
 
36
- <dl className={cn("border-t border-taupe-100", columns === 2 && "sm:grid sm:grid-cols-2")}>
36
+ <dl className={cn("border-t border-ground-100", 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-taupe-100",
45
- columns === 1 && i !== items.length - 1 && "border-b border-taupe-100",
46
- striped && i % 2 === 0 && "bg-taupe-50 -mx-4 px-4 rounded",
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",
47
47
  )}
48
48
  >
49
- <dt className="caption font-semibold text-taupe-500 uppercase tracking-wide">
49
+ <dt className="caption font-semibold text-ground-500 uppercase tracking-wide">
50
50
  {item.term}
51
51
  </dt>
52
- <dd className={cn("body text-taupe-900", columns === 1 ? "col-span-2" : "")}>
52
+ <dd className={cn("body text-ground-900", 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>
@@ -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-taupe-400 opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-taupe-900/20">
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">
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-taupe-900", className)}
73
+ className={cn("body-lg font-semibold text-ground-900", 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-taupe-500", className)} {...props} />
83
+ <Dialog.Description ref={ref} className={cn("body text-ground-500", 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-taupe-950/40 backdrop-blur-[1px]", className)}
18
+ className={cn("fixed inset-0 z-50 bg-ground-950/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-taupe-100 bg-white",
33
+ "fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border border-ground-100 bg-white",
34
34
  className,
35
35
  )}
36
36
  {...props}
37
37
  >
38
- <div className="mx-auto mt-4 h-1 w-12 rounded-full bg-taupe-200" />
38
+ <div className="mx-auto mt-4 h-1 w-12 rounded-full bg-ground-200" />
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-taupe-900", className)}
61
+ className={cn("subheading text-ground-900", 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-taupe-500", className)}
73
+ className={cn("body text-ground-500", className)}
74
74
  {...props}
75
75
  />
76
76
  ));
@@ -49,7 +49,7 @@ const DropdownMenuItem = React.forwardRef<
49
49
  "body outline-none transition-colors",
50
50
  destructive
51
51
  ? "text-red-600 focus:bg-red-50 focus:text-red-700"
52
- : "text-taupe-700 focus:bg-taupe-50 focus:text-taupe-900",
52
+ : "text-ground-700 focus:bg-ground-50 focus:text-ground-900",
53
53
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
54
54
  inset && "pl-8",
55
55
  className,
@@ -62,22 +62,21 @@ DropdownMenuItem.displayName = "DropdownMenuItem";
62
62
  const DropdownMenuCheckboxItem = React.forwardRef<
63
63
  React.ComponentRef<typeof DropdownMenu.CheckboxItem>,
64
64
  React.ComponentPropsWithoutRef<typeof DropdownMenu.CheckboxItem>
65
- >(({ className, children, checked, ...props }, ref) => (
65
+ >(({ className, children, ...props }, ref) => (
66
66
  <DropdownMenu.CheckboxItem
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-taupe-700 outline-none transition-colors",
71
- "focus:bg-taupe-50 focus:text-taupe-900",
70
+ "body text-ground-700 outline-none transition-colors",
71
+ "focus:bg-ground-50 focus:text-ground-900",
72
72
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
73
73
  className,
74
74
  )}
75
- checked={checked}
76
75
  {...props}
77
76
  >
78
77
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
79
78
  <DropdownMenu.ItemIndicator>
80
- <Check size={13} className="text-taupe-900" />
79
+ <Check size={13} className="text-ground-900" />
81
80
  </DropdownMenu.ItemIndicator>
82
81
  </span>
83
82
  {children}
@@ -93,8 +92,8 @@ const DropdownMenuRadioItem = React.forwardRef<
93
92
  ref={ref}
94
93
  className={cn(
95
94
  "relative flex cursor-default select-none items-center gap-2 rounded-md pl-8 pr-2.5 py-1.5",
96
- "body text-taupe-700 outline-none transition-colors",
97
- "focus:bg-taupe-50 focus:text-taupe-900",
95
+ "body text-ground-700 outline-none transition-colors",
96
+ "focus:bg-ground-50 focus:text-ground-900",
98
97
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
99
98
  className,
100
99
  )}
@@ -102,7 +101,7 @@ const DropdownMenuRadioItem = React.forwardRef<
102
101
  >
103
102
  <span className="absolute left-2 flex size-3.5 items-center justify-center">
104
103
  <DropdownMenu.ItemIndicator>
105
- <Circle size={8} className="fill-taupe-900 text-taupe-900" />
104
+ <Circle size={8} className="fill-ground-900 text-ground-900" />
106
105
  </DropdownMenu.ItemIndicator>
107
106
  </span>
108
107
  {children}
@@ -118,7 +117,7 @@ const DropdownMenuLabel = React.forwardRef<
118
117
  >(({ className, inset, ...props }, ref) => (
119
118
  <DropdownMenu.Label
120
119
  ref={ref}
121
- className={cn("px-2.5 py-1 label text-taupe-400", inset && "pl-8", className)}
120
+ className={cn("px-2.5 py-1 label text-ground-400", inset && "pl-8", className)}
122
121
  {...props}
123
122
  />
124
123
  ));
@@ -130,7 +129,7 @@ const DropdownMenuSeparator = React.forwardRef<
130
129
  >(({ className, ...props }, ref) => (
131
130
  <DropdownMenu.Separator
132
131
  ref={ref}
133
- className={cn("mx-1 my-1 h-px bg-taupe-100", className)}
132
+ className={cn("mx-1 my-1 h-px bg-ground-100", className)}
134
133
  {...props}
135
134
  />
136
135
  ));
@@ -146,15 +145,15 @@ const DropdownMenuSubTrigger = React.forwardRef<
146
145
  ref={ref}
147
146
  className={cn(
148
147
  "relative flex cursor-default select-none items-center gap-2 rounded-md px-2.5 py-1.5",
149
- "body text-taupe-700 outline-none transition-colors",
150
- "focus:bg-taupe-50 focus:text-taupe-900 data-[state=open]:bg-taupe-50",
148
+ "body text-ground-700 outline-none transition-colors",
149
+ "focus:bg-ground-50 focus:text-ground-900 data-[state=open]:bg-ground-50",
151
150
  inset && "pl-8",
152
151
  className,
153
152
  )}
154
153
  {...props}
155
154
  >
156
155
  {children}
157
- <ChevronRight size={14} className="ml-auto text-taupe-400" />
156
+ <ChevronRight size={14} className="ml-auto text-ground-400" />
158
157
  </DropdownMenu.SubTrigger>
159
158
  ));
160
159
  DropdownMenuSubTrigger.displayName = "DropdownMenuSubTrigger";
@@ -166,7 +165,7 @@ const DropdownMenuSubContent = React.forwardRef<
166
165
  <DropdownMenu.SubContent
167
166
  ref={ref}
168
167
  className={cn(
169
- "z-50 min-w-[8rem] bg-white rounded-xl border border-taupe-100 shadow-natural p-1",
168
+ "z-50 min-w-[8rem] bg-white rounded-xl border border-ground-100 shadow-natural p-1",
170
169
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
171
170
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
172
171
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -179,7 +178,7 @@ const DropdownMenuSubContent = React.forwardRef<
179
178
  DropdownMenuSubContent.displayName = "DropdownMenuSubContent";
180
179
 
181
180
  function DropdownMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {
182
- return <span className={cn("ml-auto caption text-taupe-400", className)} {...props} />;
181
+ return <span className={cn("ml-auto caption text-ground-400", className)} {...props} />;
183
182
  }
184
183
  DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
185
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-taupe-700">
21
+ <div className="flex size-12 items-center justify-center rounded-xl bg-brand-secondary/20 text-ground-700">
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-taupe-900">{title}</p>
27
- {description && <p className="body max-w-xs text-taupe-400">{description}</p>}
26
+ <p className="body font-semibold text-ground-900">{title}</p>
27
+ {description && <p className="body max-w-xs text-ground-400">{description}</p>}
28
28
  </div>
29
29
  {action &&
30
30
  (action.href ? (