@hilum/ui 3.1.2 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/{chunk-5JX2YKJM.js → chunk-MAHPAP65.js} +65 -11
  2. package/dist/chunk-MAHPAP65.js.map +1 -0
  3. package/dist/icons.d.ts +1 -1
  4. package/dist/icons.js +1 -1
  5. package/dist/index.js +224 -150
  6. package/dist/index.js.map +1 -1
  7. package/dist/tokens.css +10 -0
  8. package/dist/tokens.d.ts +9 -0
  9. package/dist/tokens.js +1 -1
  10. package/package.json +1 -1
  11. package/src/components/account-menu.tsx +3 -10
  12. package/src/components/action-panel.tsx +10 -7
  13. package/src/components/alert-dialog.tsx +10 -6
  14. package/src/components/alert.tsx +6 -2
  15. package/src/components/avatar-stack.tsx +6 -1
  16. package/src/components/avatar.tsx +4 -1
  17. package/src/components/breadcrumb.tsx +6 -1
  18. package/src/components/button-group.tsx +6 -5
  19. package/src/components/button.tsx +9 -7
  20. package/src/components/calendar.tsx +6 -5
  21. package/src/components/card-heading.tsx +4 -2
  22. package/src/components/card.tsx +2 -2
  23. package/src/components/carousel.tsx +2 -2
  24. package/src/components/checkbox.tsx +2 -1
  25. package/src/components/color-picker.tsx +4 -4
  26. package/src/components/combobox.tsx +17 -7
  27. package/src/components/command-palette.tsx +4 -2
  28. package/src/components/command.tsx +4 -2
  29. package/src/components/context-menu.tsx +4 -4
  30. package/src/components/data-table.tsx +7 -4
  31. package/src/components/description-list.tsx +4 -2
  32. package/src/components/dialog.tsx +7 -3
  33. package/src/components/dropdown-menu.tsx +4 -4
  34. package/src/components/empty-state.tsx +4 -2
  35. package/src/components/field.tsx +11 -3
  36. package/src/components/grid-list.tsx +3 -3
  37. package/src/components/input-group.tsx +1 -1
  38. package/src/components/input-number.tsx +4 -1
  39. package/src/components/input-otp.tsx +1 -1
  40. package/src/components/input.tsx +1 -1
  41. package/src/components/menubar.tsx +7 -11
  42. package/src/components/native-select.tsx +1 -1
  43. package/src/components/navigation-menu.tsx +3 -3
  44. package/src/components/notification.tsx +6 -4
  45. package/src/components/page-heading.tsx +4 -2
  46. package/src/components/pagination.tsx +2 -2
  47. package/src/components/progress.tsx +1 -1
  48. package/src/components/radio-card.tsx +7 -6
  49. package/src/components/radio-group.tsx +2 -1
  50. package/src/components/section-heading.tsx +4 -2
  51. package/src/components/select.tsx +2 -2
  52. package/src/components/sheet.tsx +8 -4
  53. package/src/components/sidebar.tsx +8 -8
  54. package/src/components/slider.tsx +1 -1
  55. package/src/components/stat-card.tsx +2 -2
  56. package/src/components/steps.tsx +13 -11
  57. package/src/components/switch.tsx +4 -4
  58. package/src/components/toggle.tsx +5 -5
  59. package/src/icons.ts +4 -0
  60. package/src/tokens/tokens.ts +65 -10
  61. package/dist/chunk-5JX2YKJM.js.map +0 -1
@@ -198,8 +198,8 @@ function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<t
198
198
  <Button
199
199
  data-sidebar="trigger"
200
200
  variant="ghost"
201
- size="sm"
202
- className={cn("h-7 w-7", className)}
201
+ size="icon"
202
+ className={className}
203
203
  onClick={(e) => {
204
204
  onClick?.(e);
205
205
  toggleSidebar();
@@ -227,7 +227,7 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
227
227
  onClick={toggleSidebar}
228
228
  title="Toggle sidebar"
229
229
  className={cn(
230
- "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 cursor-col-resize transition-all ease-linear",
230
+ "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 cursor-col-resize transition-[left,right,width] ease-linear",
231
231
  "after:absolute after:inset-y-0 after:left-1/2 after:w-[2px]",
232
232
  "hover:after:bg-brand-primary/30",
233
233
  "group-data-[side=left]:-right-4 group-data-[side=right]:left-0",
@@ -353,7 +353,7 @@ function SidebarGroupAction({
353
353
  <Comp
354
354
  data-sidebar="group-action"
355
355
  className={cn(
356
- "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center",
356
+ "absolute right-2 top-2 flex size-8 items-center justify-center",
357
357
  "rounded-md text-muted-foreground hover:bg-muted hover:text-foreground",
358
358
  "outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30",
359
359
  className,
@@ -412,7 +412,7 @@ function SidebarMenuButton({
412
412
  data-size={size}
413
413
  className={cn(
414
414
  // Base
415
- "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 body-sm text-left",
415
+ "peer/menu-button flex min-h-10 w-full items-center gap-2 overflow-hidden rounded-md p-2 body-sm text-left",
416
416
  "outline-none ring-ring",
417
417
  "transition-[width,height,padding] duration-150",
418
418
  "hover:bg-muted hover:text-foreground",
@@ -430,7 +430,7 @@ function SidebarMenuButton({
430
430
  ],
431
431
  // Collapsed state
432
432
  "group-data-[state=collapsed]/sidebar-wrapper:justify-center",
433
- "group-data-[state=collapsed]/sidebar-wrapper:size-9",
433
+ "group-data-[state=collapsed]/sidebar-wrapper:size-10",
434
434
  "group-data-[state=collapsed]/sidebar-wrapper:p-0",
435
435
  className,
436
436
  )}
@@ -481,7 +481,7 @@ function SidebarMenuAction({
481
481
  <Comp
482
482
  data-sidebar="menu-action"
483
483
  className={cn(
484
- "absolute right-1 top-1/2 -translate-y-1/2 flex aspect-square w-5 items-center justify-center",
484
+ "absolute right-1 top-1/2 flex size-8 -translate-y-1/2 items-center justify-center",
485
485
  "rounded-md text-muted-foreground hover:bg-muted hover:text-foreground",
486
486
  "outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30",
487
487
  showOnHover && [
@@ -590,7 +590,7 @@ function SidebarMenuSubButton({
590
590
  data-sidebar="menu-sub-button"
591
591
  data-active={isActive}
592
592
  className={cn(
593
- "flex h-7 min-w-0 items-center gap-2 overflow-hidden rounded-md px-2",
593
+ "flex min-h-8 min-w-0 items-center gap-2 overflow-hidden rounded-md px-2",
594
594
  "body text-muted-foreground outline-none",
595
595
  "transition-colors duration-150",
596
596
  "hover:text-foreground hover:bg-muted",
@@ -16,7 +16,7 @@ const SliderRoot = React.forwardRef<
16
16
  <Slider.Track className="relative h-1.5 w-full grow overflow-hidden rounded-full bg-muted">
17
17
  <Slider.Range className="absolute h-full bg-brand-primary" />
18
18
  </Slider.Track>
19
- <Slider.Thumb className="block size-4 rounded-full border-2 border-brand-primary bg-card shadow-natural transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30 disabled:pointer-events-none disabled:opacity-50" />
19
+ <Slider.Thumb className="relative block size-4 rounded-full border-2 border-brand-primary bg-card shadow-natural transition-colors after:absolute after:left-1/2 after:top-1/2 after:size-10 after:-translate-x-1/2 after:-translate-y-1/2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30 disabled:pointer-events-none disabled:opacity-50" />
20
20
  </Slider.Root>
21
21
  ));
22
22
  SliderRoot.displayName = "Slider";
@@ -36,14 +36,14 @@ function StatCard({ label, value, trend, icon, className }: StatCardProps) {
36
36
  </div>
37
37
  )}
38
38
  </div>
39
- <p className="heading-xl mt-2 text-foreground">{value}</p>
39
+ <p className="heading-xl mt-2 tabular-nums text-foreground">{value}</p>
40
40
  {trend &&
41
41
  (() => {
42
42
  const Icon = TrendIcon[trend.direction];
43
43
  return (
44
44
  <div className={cn("mt-2 flex items-center gap-1", trendColor[trend.direction])}>
45
45
  <Icon size={12} />
46
- <span className="caption font-medium">{trend.value}</span>
46
+ <span className="caption tabular-nums font-medium">{trend.value}</span>
47
47
  </div>
48
48
  );
49
49
  })()}
@@ -29,7 +29,7 @@ function CirclesSteps({ steps, className }: { steps: Step[]; className?: string
29
29
  <li key={step.id ?? i} className={cn("relative", !isLast && "flex-1")}>
30
30
  {/* Connector line */}
31
31
  {!isLast && (
32
- <div className="absolute top-4 left-8 -right-px h-0.5" aria-hidden="true">
32
+ <div className="absolute left-10 right-0 top-5 h-0.5" aria-hidden="true">
33
33
  <div
34
34
  className={cn(
35
35
  "h-full",
@@ -47,7 +47,7 @@ function CirclesSteps({ steps, className }: { steps: Step[]; className?: string
47
47
  {/* Circle */}
48
48
  <span
49
49
  className={cn(
50
- "relative z-10 flex size-8 items-center justify-center rounded-full transition-colors",
50
+ "relative z-10 flex size-10 items-center justify-center rounded-full transition-colors",
51
51
  step.status === "complete" &&
52
52
  "bg-brand-primary group-hover:bg-brand-primary/80",
53
53
  step.status === "current" && "border-2 border-brand-primary bg-card",
@@ -58,9 +58,9 @@ function CirclesSteps({ steps, className }: { steps: Step[]; className?: string
58
58
  {step.status === "complete" ? (
59
59
  <Check size={14} className="text-background" strokeWidth={2.5} />
60
60
  ) : step.status === "current" ? (
61
- <span className="size-2.5 rounded-full bg-brand-primary" />
61
+ <span className="size-3 rounded-full bg-brand-primary" />
62
62
  ) : (
63
- <span className="size-2.5 rounded-full bg-transparent group-hover:bg-muted" />
63
+ <span className="size-3 rounded-full bg-transparent group-hover:bg-muted" />
64
64
  )}
65
65
  </span>
66
66
 
@@ -75,7 +75,9 @@ function CirclesSteps({ steps, className }: { steps: Step[]; className?: string
75
75
  {step.name}
76
76
  </span>
77
77
  {step.description && (
78
- <span className="caption text-muted-foreground">{step.description}</span>
78
+ <span className="caption text-pretty text-muted-foreground">
79
+ {step.description}
80
+ </span>
79
81
  )}
80
82
  </span>
81
83
  </a>
@@ -93,7 +95,7 @@ function BulletsSteps({ steps, className }: { steps: Step[]; className?: string
93
95
 
94
96
  return (
95
97
  <nav className={cn("flex items-center gap-4", className)} aria-label="Progress">
96
- <p className="body font-medium text-muted-foreground">
98
+ <p className="body font-medium tabular-nums text-muted-foreground">
97
99
  Step {currentIdx + 1} of {steps.length}
98
100
  </p>
99
101
  <ol role="list" className="flex items-center gap-2">
@@ -102,11 +104,11 @@ function BulletsSteps({ steps, className }: { steps: Step[]; className?: string
102
104
  <a
103
105
  href={step.href ?? "#"}
104
106
  onClick={!step.href ? (e) => e.preventDefault() : undefined}
105
- className="block"
107
+ className="relative flex size-10 items-center justify-center"
106
108
  >
107
109
  {step.status === "complete" ? (
108
110
  <span
109
- className="block size-2.5 rounded-full bg-brand-primary hover:bg-brand-primary/80 transition-colors"
111
+ className="block size-2.5 rounded-full bg-brand-primary transition-colors hover:bg-brand-primary/80"
110
112
  aria-label={`${step.name}: completed`}
111
113
  />
112
114
  ) : step.status === "current" ? (
@@ -120,7 +122,7 @@ function BulletsSteps({ steps, className }: { steps: Step[]; className?: string
120
122
  </span>
121
123
  ) : (
122
124
  <span
123
- className="block size-2.5 rounded-full bg-muted hover:bg-muted transition-colors"
125
+ className="block size-2.5 rounded-full bg-muted transition-colors hover:bg-muted"
124
126
  aria-label={`${step.name}: upcoming`}
125
127
  />
126
128
  )}
@@ -143,7 +145,7 @@ function ProgressSteps({ steps, className }: { steps: Step[]; className?: string
143
145
  {/* Bar */}
144
146
  <div className="h-1.5 w-full overflow-hidden rounded-full bg-muted">
145
147
  <div
146
- className="h-full rounded-full bg-brand-primary transition-all duration-500"
148
+ className="h-full rounded-full bg-brand-primary transition-[width] duration-500"
147
149
  style={{ width: `${progress}%` }}
148
150
  />
149
151
  </div>
@@ -155,7 +157,7 @@ function ProgressSteps({ steps, className }: { steps: Step[]; className?: string
155
157
  <div
156
158
  key={step.id ?? i}
157
159
  className={cn(
158
- "caption font-medium",
160
+ "caption font-medium text-pretty",
159
161
  i === 0 ? "text-left" : isLast ? "text-right" : "text-center",
160
162
  step.status === "upcoming" ? "text-muted-foreground" : "text-foreground",
161
163
  )}
@@ -11,8 +11,8 @@ const SwitchRoot = React.forwardRef<
11
11
  <Switch.Root
12
12
  ref={ref}
13
13
  className={cn(
14
- "peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full",
15
- "border-2 border-transparent transition-colors",
14
+ "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full",
15
+ "border-2 border-transparent transition-[background-color,border-color,box-shadow] duration-150",
16
16
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-primary/30",
17
17
  "disabled:cursor-not-allowed disabled:opacity-50",
18
18
  "data-[state=unchecked]:bg-muted data-[state=checked]:bg-brand-primary",
@@ -22,8 +22,8 @@ const SwitchRoot = React.forwardRef<
22
22
  >
23
23
  <Switch.Thumb
24
24
  className={cn(
25
- "pointer-events-none block size-4 rounded-full bg-card shadow-natural",
26
- "transition-transform data-[state=unchecked]:translate-x-0 data-[state=checked]:translate-x-4",
25
+ "pointer-events-none block size-5 rounded-full bg-card shadow-natural",
26
+ "transition-transform data-[state=unchecked]:translate-x-0 data-[state=checked]:translate-x-5",
27
27
  )}
28
28
  />
29
29
  </Switch.Root>
@@ -9,7 +9,7 @@ const toggleVariants = cva(
9
9
  [
10
10
  "inline-flex shrink-0 items-center justify-center gap-2",
11
11
  "body font-medium whitespace-nowrap rounded-md",
12
- "transition-all duration-150 outline-none",
12
+ "transition-[background-color,border-color,box-shadow,color,opacity,scale] duration-150 outline-none active:scale-[0.96]",
13
13
  "focus-visible:ring-2 focus-visible:ring-brand-primary/30 focus-visible:ring-offset-1",
14
14
  "disabled:pointer-events-none disabled:opacity-50",
15
15
  "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
@@ -35,11 +35,11 @@ const toggleVariants = cva(
35
35
  },
36
36
  size: {
37
37
  sm: "h-8 gap-1.5 px-3",
38
- default: "h-9 px-3",
39
- lg: "h-10 px-4",
40
- icon: "size-9",
38
+ default: "h-10 px-3",
39
+ lg: "h-11 px-4",
40
+ icon: "size-10",
41
41
  "icon-sm": "size-8",
42
- "icon-lg": "size-10",
42
+ "icon-lg": "size-11",
43
43
  },
44
44
  },
45
45
  defaultVariants: {
package/src/icons.ts CHANGED
@@ -26,8 +26,10 @@ export {
26
26
  ArrowDownRight,
27
27
  MoreHorizontal,
28
28
  MoreVertical,
29
+ GripVertical,
29
30
  // Status
30
31
  Check,
32
+ BadgeCheck,
31
33
  AlertCircle,
32
34
  AlertTriangle,
33
35
  Info,
@@ -83,6 +85,7 @@ export {
83
85
  Clock,
84
86
  File,
85
87
  FileText,
88
+ Database,
86
89
  Folder,
87
90
  FolderOpen,
88
91
  Image,
@@ -118,6 +121,7 @@ export {
118
121
  ShieldCheck,
119
122
  // Money / commerce
120
123
  CreditCard,
124
+ Package,
121
125
  ShoppingCart,
122
126
  ShoppingBag,
123
127
  Wallet,
@@ -162,21 +162,76 @@ export const tokens = {
162
162
 
163
163
  fontFamily: {
164
164
  sans: 'Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
165
- display: 'Gabarito, Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
165
+ display:
166
+ 'Gabarito, Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
166
167
  mono: 'ui-monospace, "SFMono-Regular", "Menlo", "Consolas", monospace',
167
168
  },
168
169
 
169
170
  /** Type scale utilities — emitted as Tailwind v4 `@utility` blocks. */
170
171
  typeScale: {
171
- "display-xl": { family: "display", size: "3rem", weight: 400, lineHeight: "1.15" },
172
- display: { family: "display", size: "2.25rem", weight: 400, lineHeight: "1.15" },
173
- "heading-xl": { family: "display", size: "1.875rem", weight: 400, lineHeight: "1.2" },
174
- heading: { family: "display", size: "1.5rem", weight: 400, lineHeight: "1.2" },
175
- subheading: { family: "display", size: "1.25rem", weight: 400, lineHeight: "1.4" },
176
- "body-lg": { family: "sans", size: "1rem", weight: 400, lineHeight: "1.625" },
177
- body: { family: "sans", size: "0.875rem", weight: 400, lineHeight: "1.625" },
178
- "body-sm": { family: "sans", size: "0.75rem", weight: 500, lineHeight: "1.625" },
179
- caption: { family: "sans", size: "0.75rem", weight: 400, lineHeight: "1.625" },
172
+ "display-xl": {
173
+ family: "display",
174
+ size: "3rem",
175
+ weight: 400,
176
+ lineHeight: "1.15",
177
+ textWrap: "balance",
178
+ },
179
+ display: {
180
+ family: "display",
181
+ size: "2.25rem",
182
+ weight: 400,
183
+ lineHeight: "1.15",
184
+ textWrap: "balance",
185
+ },
186
+ "heading-xl": {
187
+ family: "display",
188
+ size: "1.875rem",
189
+ weight: 400,
190
+ lineHeight: "1.2",
191
+ textWrap: "balance",
192
+ },
193
+ heading: {
194
+ family: "display",
195
+ size: "1.5rem",
196
+ weight: 400,
197
+ lineHeight: "1.2",
198
+ textWrap: "balance",
199
+ },
200
+ subheading: {
201
+ family: "display",
202
+ size: "1.25rem",
203
+ weight: 400,
204
+ lineHeight: "1.4",
205
+ textWrap: "balance",
206
+ },
207
+ "body-lg": {
208
+ family: "sans",
209
+ size: "1rem",
210
+ weight: 400,
211
+ lineHeight: "1.625",
212
+ textWrap: "pretty",
213
+ },
214
+ body: {
215
+ family: "sans",
216
+ size: "0.875rem",
217
+ weight: 400,
218
+ lineHeight: "1.625",
219
+ textWrap: "pretty",
220
+ },
221
+ "body-sm": {
222
+ family: "sans",
223
+ size: "0.75rem",
224
+ weight: 500,
225
+ lineHeight: "1.625",
226
+ textWrap: "pretty",
227
+ },
228
+ caption: {
229
+ family: "sans",
230
+ size: "0.75rem",
231
+ weight: 400,
232
+ lineHeight: "1.625",
233
+ textWrap: "pretty",
234
+ },
180
235
  "caption-xs": { family: "sans", size: "0.625rem", weight: 400, lineHeight: "1.625" },
181
236
 
182
237
  /* --- "Eyebrow" family — uppercase tracked label used above headlines, --- *
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tokens/tokens.ts"],"names":[],"mappings":"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","file":"chunk-5JX2YKJM.js","sourcesContent":["// @hilum/ui/tokens — JS-first design tokens (D6).\n//\n// This module is the single source of truth for the Hilum visual identity.\n// A build step (scripts/build-tokens.mjs) reads the compiled output of this\n// file and emits dist/tokens.css for consumers to `@import`.\n//\n// Brand model: D8 — base palette is fixed here. Per-product overrides are\n// applied at runtime via createTheme() in @hilum/ui/create-theme.\n// Color modes: D7 — light + dark, both auto (`prefers-color-scheme`) and\n// explicit via `[data-theme]`.\n//\n// Core brand colors:\n// brand.primary #C100F1 — vivid purple — purple-500 on the scale below\n// brand.secondary #FFF5BF — pale lemon — butter-200 on the scale below\n//\n// ground — neutral spine for text, borders, and structure (values: Tailwind neutral)\n\nexport const tokens = {\n /* ============================================================== *\n * PALETTE — concrete colors *\n * ============================================================== */\n\n ground: {\n 50: \"#fafafa\",\n 100: \"#f5f5f5\",\n 200: \"#e5e5e5\",\n 300: \"#d4d4d4\",\n 400: \"#a3a3a3\",\n 500: \"#737373\",\n 600: \"#525252\",\n 700: \"#404040\",\n 800: \"#262626\",\n 900: \"#171717\",\n 950: \"#0a0a0a\",\n },\n\n // Pale lemon — anchor: butter-200 = #FFF5BF\n butter: {\n 50: \"#ffffe8\",\n 100: \"#fffad0\",\n 200: \"#fff5bf\",\n 300: \"#fde870\",\n 400: \"#f6d42a\",\n 500: \"#dab010\",\n 600: \"#a88008\",\n 700: \"#7c5c04\",\n 800: \"#543e02\",\n 900: \"#382801\",\n 950: \"#221600\",\n },\n\n // Vivid purple — anchor: purple-500 = #C100F1 (brand.primary)\n purple: {\n 50: \"#fdf0ff\",\n 100: \"#f5d6ff\",\n 200: \"#e8a8ff\",\n 300: \"#d870f9\",\n 400: \"#c840f6\",\n 500: \"#c100f1\",\n 600: \"#9c00c0\",\n 700: \"#740092\",\n 800: \"#4e0062\",\n 900: \"#330040\",\n 950: \"#200028\",\n },\n\n // Legacy functional colors — used by components not yet migrated to the new palette.\n brand: {\n primary: \"#C100F1\", // purple-500\n secondary: \"#FFF5BF\", // butter-200\n },\n\n destructive: \"#dc2626\", // red-600\n\n /* ============================================================== *\n * SEMANTIC — what components reference *\n * ============================================================== */\n\n semantic: {\n light: {\n background: \"#ffffff\",\n foreground: \"#171717\", // ground-900\n card: \"#ffffff\",\n cardForeground: \"#171717\",\n surface: \"#fafafa\", // ground-50\n surfaceForeground: \"#262626\", // ground-800\n border: \"#f5f5f5\", // ground-100\n input: \"#f5f5f5\",\n muted: \"#fafafa\",\n mutedForeground: \"#737373\", // ground-500\n accent: \"#fdf0ff\", // purple-50\n accentForeground: \"#740092\", // purple-700\n primary: \"#c100f1\", // purple-500 = brand.primary\n primaryForeground: \"#ffffff\",\n secondary: \"#fafafa\", // ground-50\n secondaryForeground: \"#404040\", // ground-700\n destructive: \"#dc2626\",\n destructiveForeground: \"#ffffff\",\n success: \"#CDEA19\", // lime — functional semantic only\n successForeground: \"#171717\",\n warning: \"#fff5bf\", // butter-200 = brand.secondary\n warningForeground: \"#171717\", // ground-900\n ring: \"#c100f1\", // purple-500 = brand.primary\n },\n // Mid — a neutral medium-gray theme (from the Pappery designer \"mid\" palette,\n // mapped onto the ground scale). Sits between light and dark.\n mid: {\n background: \"#737373\", // ground-500 — main surface (designer panel)\n foreground: \"#fafafa\", // ground-50\n card: \"#525252\", // ground-600 — elevated items (designer item-bg)\n cardForeground: \"#fafafa\",\n surface: \"#525252\", // ground-600 (designer canvas/pane)\n surfaceForeground: \"#fafafa\",\n border: \"#a3a3a3\", // ground-400 (designer border — lighter so it reads on the gray)\n input: \"#404040\", // ground-700 (designer input-bg)\n muted: \"#525252\", // ground-600\n mutedForeground: \"#e5e5e5\", // ground-200 (designer text-secondary)\n accent: \"#404040\", // ground-700 (designer item-hover-bg)\n accentForeground: \"#fafafa\",\n primary: \"#c100f1\", // brand stays consistent across themes\n primaryForeground: \"#ffffff\",\n secondary: \"#525252\", // ground-600\n secondaryForeground: \"#fafafa\",\n destructive: \"#ef4444\", // red-500\n destructiveForeground: \"#ffffff\",\n success: \"#CDEA19\", // lime — functional semantic only\n successForeground: \"#171717\",\n warning: \"#fff5bf\", // butter-200\n warningForeground: \"#171717\",\n ring: \"#c100f1\",\n },\n dark: {\n background: \"#171717\", // ground-900 — designer canvas (deepest)\n foreground: \"#fafafa\", // ground-50\n card: \"#262626\", // ground-800 — designer panel-bg (elevated over bg)\n cardForeground: \"#fafafa\",\n surface: \"#1a1a1a\", // designer item-hover depth\n surfaceForeground: \"#f5f5f5\",\n border: \"#404040\", // ground-700 — designer border (reads on the dark)\n input: \"#262626\", // ground-800\n muted: \"#262626\", // ground-800\n mutedForeground: \"#a3a3a3\", // ground-400\n accent: \"#404040\", // ground-700 — neutral elevated/hover (designer item-hover)\n accentForeground: \"#fafafa\",\n primary: \"#c100f1\", // purple-500 — brand stays consistent (D8)\n primaryForeground: \"#ffffff\",\n secondary: \"#262626\", // ground-800\n secondaryForeground: \"#f5f5f5\",\n destructive: \"#ef4444\", // red-500 (slightly lighter for dark)\n destructiveForeground: \"#ffffff\",\n success: \"#CDEA19\", // lime — functional semantic only\n successForeground: \"#0a0a0a\",\n warning: \"#221600\", // butter-950 surface\n warningForeground: \"#fffad0\", // butter-100\n ring: \"#c100f1\", // purple-500 = brand.primary\n },\n },\n\n /* ============================================================== *\n * TYPOGRAPHY *\n * ============================================================== */\n\n fontFamily: {\n sans: 'Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n display: 'Gabarito, Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n mono: 'ui-monospace, \"SFMono-Regular\", \"Menlo\", \"Consolas\", monospace',\n },\n\n /** Type scale utilities — emitted as Tailwind v4 `@utility` blocks. */\n typeScale: {\n \"display-xl\": { family: \"display\", size: \"3rem\", weight: 400, lineHeight: \"1.15\" },\n display: { family: \"display\", size: \"2.25rem\", weight: 400, lineHeight: \"1.15\" },\n \"heading-xl\": { family: \"display\", size: \"1.875rem\", weight: 400, lineHeight: \"1.2\" },\n heading: { family: \"display\", size: \"1.5rem\", weight: 400, lineHeight: \"1.2\" },\n subheading: { family: \"display\", size: \"1.25rem\", weight: 400, lineHeight: \"1.4\" },\n \"body-lg\": { family: \"sans\", size: \"1rem\", weight: 400, lineHeight: \"1.625\" },\n body: { family: \"sans\", size: \"0.875rem\", weight: 400, lineHeight: \"1.625\" },\n \"body-sm\": { family: \"sans\", size: \"0.75rem\", weight: 500, lineHeight: \"1.625\" },\n caption: { family: \"sans\", size: \"0.75rem\", weight: 400, lineHeight: \"1.625\" },\n \"caption-xs\": { family: \"sans\", size: \"0.625rem\", weight: 400, lineHeight: \"1.625\" },\n\n /* --- \"Eyebrow\" family — uppercase tracked label used above headlines, --- *\n * on badges, and on section markers. `eyebrow` is the canonical name; *\n * `overline` (Material parlance), `kicker` (editorial parlance) and *\n * `label` (legacy) are aliases of the same scale so consumers can pick *\n * whichever vocabulary reads best in their context. `eyebrow-sm` is *\n * the compact variant for badge-sized chips and tiny status pills. */\n eyebrow: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n \"eyebrow-sm\": {\n family: \"sans\",\n size: \"0.625rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n overline: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n kicker: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n label: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n },\n\n /* ============================================================== *\n * GEOMETRY *\n * ============================================================== */\n\n radius: {\n base: \"0.5rem\",\n sm: \"calc(0.5rem - 4px)\",\n md: \"calc(0.5rem - 2px)\",\n lg: \"calc(0.5rem + 2px)\",\n xl: \"calc(0.5rem + 4px)\",\n full: \"9999px\",\n },\n\n /* ============================================================== *\n * Z-INDEX — semantic layering scale *\n * ============================================================== */\n\n zIndex: {\n dropdown: 40,\n sticky: 50,\n fixed: 60,\n modal: 100,\n popover: 110,\n tooltip: 120,\n },\n\n shadow: {\n natural:\n \"0 0px 0px 1px rgba(0, 0, 0, 0.06), 0 1px 1px -0.5px rgba(0, 0, 0, 0.06), 0 3px 3px -1.5px rgba(0, 0, 0, 0.06)\",\n elevated:\n \"0 0px 0px 1px rgba(0, 0, 0, 0.06), 0 1px 1px -0.5px rgba(0, 0, 0, 0.06), 0 3px 3px -1.5px rgba(0, 0, 0, 0.06), 0 6px 6px -3px rgba(0, 0, 0, 0.06), 0 12px 12px -6px rgba(0, 0, 0, 0.04), 0 24px 24px -12px rgba(0, 0, 0, 0.04), 0 24px 24px 2px rgba(0, 0, 0, 0.1)\",\n },\n\n /* ============================================================== *\n * ANIMATION *\n * ============================================================== */\n\n animation: {\n \"accordion-down\": \"accordion-down 0.2s ease-out\",\n \"accordion-up\": \"accordion-up 0.2s ease-out\",\n \"caret-blink\": \"caret-blink 1.25s ease-out infinite\",\n },\n} as const;\n\nexport type Tokens = typeof tokens;\nexport type SemanticTokens = typeof tokens.semantic.light;\n"]}