@hilum/ui 3.1.2 → 3.2.0

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 +220 -147
  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 +1 -1
  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
@@ -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"]}