@hilum/ui 3.8.5 → 3.10.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 (90) hide show
  1. package/README.md +32 -1
  2. package/dist/{chunk-RI6QJR2L.js → chunk-R576DV2A.js} +120 -14
  3. package/dist/chunk-R576DV2A.js.map +1 -0
  4. package/dist/create-theme.js +2 -1
  5. package/dist/create-theme.js.map +1 -1
  6. package/dist/index.d.ts +733 -68
  7. package/dist/index.js +3097 -1619
  8. package/dist/index.js.map +1 -1
  9. package/dist/tokens.css +163 -19
  10. package/dist/tokens.d.ts +69 -5
  11. package/dist/tokens.js +1 -1
  12. package/llms.txt +11 -4
  13. package/package.json +11 -10
  14. package/src/components/accordion.tsx +2 -2
  15. package/src/components/account-menu.tsx +1 -1
  16. package/src/components/alert-dialog.tsx +107 -0
  17. package/src/components/ask-user-questions.tsx +24 -18
  18. package/src/components/badge.tsx +36 -3
  19. package/src/components/breadcrumb.tsx +4 -2
  20. package/src/components/button-group.tsx +1 -1
  21. package/src/components/button.tsx +31 -23
  22. package/src/components/calendar.tsx +1 -1
  23. package/src/components/card.tsx +4 -2
  24. package/src/components/checkbox-card.tsx +1 -1
  25. package/src/components/checkbox-group.tsx +2 -1
  26. package/src/components/code-block.tsx +99 -0
  27. package/src/components/color-input.tsx +9 -6
  28. package/src/components/color-picker.tsx +38 -26
  29. package/src/components/combobox.tsx +59 -12
  30. package/src/components/command-palette.tsx +150 -42
  31. package/src/components/command.tsx +5 -3
  32. package/src/components/context-menu.tsx +18 -15
  33. package/src/components/contextual-save-bar.tsx +156 -0
  34. package/src/components/data-table.tsx +34 -5
  35. package/src/components/date-picker.tsx +275 -28
  36. package/src/components/date-text.tsx +90 -0
  37. package/src/components/dropdown-menu.tsx +11 -8
  38. package/src/components/dropdown.tsx +6 -3
  39. package/src/components/empty-state.tsx +85 -20
  40. package/src/components/file-dropzone.tsx +2 -1
  41. package/src/components/file-thumbnail.tsx +84 -20
  42. package/src/components/filter-bar.tsx +91 -0
  43. package/src/components/grid-list.tsx +2 -2
  44. package/src/components/help-tooltip.tsx +1 -1
  45. package/src/components/input-copy.tsx +1 -1
  46. package/src/components/input-group.tsx +1 -1
  47. package/src/components/input-message.tsx +5 -4
  48. package/src/components/input-number.tsx +103 -11
  49. package/src/components/input.tsx +5 -3
  50. package/src/components/label.tsx +1 -0
  51. package/src/components/media-asset-card.tsx +1 -1
  52. package/src/components/menu-item.tsx +37 -3
  53. package/src/components/menubar.tsx +21 -18
  54. package/src/components/native-select.tsx +1 -1
  55. package/src/components/navigation-menu.tsx +2 -2
  56. package/src/components/notification.tsx +1 -1
  57. package/src/components/pagination.tsx +97 -3
  58. package/src/components/popover.tsx +2 -0
  59. package/src/components/property-row.tsx +7 -4
  60. package/src/components/radio-card.tsx +1 -1
  61. package/src/components/radio-group.tsx +2 -1
  62. package/src/components/rating.tsx +136 -0
  63. package/src/components/resizable.tsx +1 -1
  64. package/src/components/resource-item.tsx +133 -0
  65. package/src/components/rich-text-editor.tsx +1 -0
  66. package/src/components/search-input.tsx +98 -0
  67. package/src/components/searchable-table.tsx +10 -11
  68. package/src/components/select.tsx +28 -9
  69. package/src/components/sidebar.tsx +4 -4
  70. package/src/components/slider.tsx +78 -36
  71. package/src/components/sonner.tsx +18 -4
  72. package/src/components/stat-card.tsx +121 -37
  73. package/src/components/status-badge.tsx +142 -47
  74. package/src/components/status-tile.tsx +9 -0
  75. package/src/components/switch.tsx +6 -5
  76. package/src/components/tabs-subtle.tsx +10 -2
  77. package/src/components/tabs.tsx +23 -3
  78. package/src/components/textarea.tsx +2 -3
  79. package/src/components/thinking-steps.tsx +3 -3
  80. package/src/components/toggle.tsx +14 -13
  81. package/src/components/tooltip.tsx +11 -8
  82. package/src/components/url-redirect-prompt.tsx +0 -1
  83. package/src/index.ts +15 -0
  84. package/src/lib/density-context.tsx +65 -0
  85. package/src/lib/format.tsx +301 -0
  86. package/src/lib/interaction.ts +12 -4
  87. package/src/lib/scroll-fade.tsx +39 -0
  88. package/src/tokens/tokens.test.ts +77 -0
  89. package/src/tokens/tokens.ts +114 -5
  90. package/dist/chunk-RI6QJR2L.js.map +0 -1
@@ -239,3 +239,42 @@ export function ScrollEdgeCue({
239
239
  </div>
240
240
  );
241
241
  }
242
+
243
+ // ---------------------------------------------------------------------------
244
+ // Horizontal overflow helpers (tab strips, chip rows)
245
+ // ---------------------------------------------------------------------------
246
+
247
+ const EDGE_FADE_PX = 24;
248
+
249
+ /**
250
+ * CSS mask that fades whichever horizontal edges still hide content. Works on
251
+ * any background (unlike a surface-coloured gradient), so it suits tab tracks.
252
+ */
253
+ export function horizontalEdgeMask(left: boolean, right: boolean): string | undefined {
254
+ if (!left && !right) return undefined;
255
+ const start = left ? `transparent 0, #000 ${EDGE_FADE_PX}px` : "#000 0";
256
+ const end = right ? `#000 calc(100% - ${EDGE_FADE_PX}px), transparent 100%` : "#000 100%";
257
+ return `linear-gradient(to right, ${start}, ${end})`;
258
+ }
259
+
260
+ /** Style for a horizontally scrolling strip: edge fades while content is hidden. */
261
+ export function useHorizontalOverflowMask(
262
+ ref: RefObject<HTMLElement | null>,
263
+ enabled = true,
264
+ ): CSSProperties | undefined {
265
+ const edges = useScrollEdges(ref, { axis: "horizontal", enabled });
266
+ const mask = enabled ? horizontalEdgeMask(edges.left, edges.right) : undefined;
267
+ return mask ? { maskImage: mask, WebkitMaskImage: mask } : undefined;
268
+ }
269
+
270
+ /** Scroll `index`'s `[data-proximity-index]` child into view inside a horizontal strip. */
271
+ export function scrollStripItemIntoView(container: HTMLElement | null, index: number) {
272
+ if (!container || index < 0 || container.scrollWidth <= container.clientWidth) return;
273
+ const el = container.querySelector<HTMLElement>(`[data-proximity-index="${index}"]`);
274
+ if (!el) return;
275
+ const left = el.offsetLeft;
276
+ const right = left + el.offsetWidth;
277
+ if (left < container.scrollLeft) container.scrollLeft = Math.max(0, left - EDGE_FADE_PX);
278
+ else if (right > container.scrollLeft + container.clientWidth)
279
+ container.scrollLeft = right - container.clientWidth + EDGE_FADE_PX;
280
+ }
@@ -0,0 +1,77 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { tokens } from "./tokens";
3
+ import { SURFACE_BG, SURFACE_SHADOW } from "../lib/surface-classes";
4
+
5
+ describe("surface ladder tokens", () => {
6
+ it.each(["light", "mid", "dark"] as const)("%s defines every level surface-classes emits", (theme) => {
7
+ const levels = Object.keys(SURFACE_BG).length;
8
+ expect(Object.keys(SURFACE_SHADOW)).toHaveLength(levels);
9
+ expect(tokens.surfaces[theme].bg).toHaveLength(levels);
10
+ expect(tokens.surfaces[theme].shadow).toHaveLength(levels);
11
+ });
12
+
13
+ it("level 1 matches the theme background", () => {
14
+ for (const theme of ["light", "mid", "dark"] as const) {
15
+ expect(tokens.surfaces[theme].bg[0]).toBe(tokens.semantic[theme].background);
16
+ }
17
+ });
18
+
19
+ it("shadow weight grows monotonically with level", () => {
20
+ const layers = tokens.surfaces.light.shadow.map((s) => s.split("px ").length);
21
+ for (let i = 1; i < layers.length; i++) expect(layers[i]).toBeGreaterThan(layers[i - 1]);
22
+ });
23
+ });
24
+
25
+ describe("semantic tokens", () => {
26
+ const themes = ["light", "mid", "dark"] as const;
27
+
28
+ it("every theme defines the same semantic keys", () => {
29
+ const keys = Object.keys(tokens.semantic.light).sort();
30
+ for (const theme of themes) expect(Object.keys(tokens.semantic[theme]).sort()).toEqual(keys);
31
+ });
32
+
33
+ it("defines the interaction, edge and canvas tokens components rely on", () => {
34
+ for (const theme of themes) {
35
+ for (const key of ["hover", "active", "borderStrong", "canvas", "checkerA", "checkerB"]) {
36
+ expect(tokens.semantic[theme]).toHaveProperty(key);
37
+ }
38
+ }
39
+ });
40
+
41
+ // WCAG relative-luminance contrast between two #rrggbb colours.
42
+ const luminance = (hex: string) => {
43
+ const [r, g, b] = [1, 3, 5].map((i) => {
44
+ const c = parseInt(hex.slice(i, i + 2), 16) / 255;
45
+ return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
46
+ });
47
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
48
+ };
49
+ const contrast = (a: string, b: string) => {
50
+ const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x);
51
+ return (hi + 0.05) / (lo + 0.05);
52
+ };
53
+
54
+ it("borders stay visible against their theme background", () => {
55
+ expect(contrast(tokens.semantic.light.border, tokens.semantic.light.background)).toBeGreaterThan(1.2);
56
+ expect(contrast(tokens.semantic.dark.border, tokens.semantic.dark.background)).toBeGreaterThanOrEqual(2);
57
+ expect(contrast(tokens.semantic.mid.border, tokens.semantic.mid.card)).toBeGreaterThan(1.5);
58
+ for (const theme of themes) {
59
+ expect(tokens.semantic[theme].input).toBe(tokens.semantic[theme].border);
60
+ }
61
+ });
62
+ });
63
+
64
+ describe("density tokens", () => {
65
+ it("compact tier matches the editor-chrome spec", () => {
66
+ expect(tokens.density.compact).toMatchObject({
67
+ controlHeight: "24px",
68
+ rowHeight: "28px",
69
+ text: "12px",
70
+ label: "11px",
71
+ menuItemHeight: "28px",
72
+ menuText: "13px",
73
+ paddingX: "8px",
74
+ });
75
+ expect(Object.keys(tokens.density.compact).sort()).toEqual(Object.keys(tokens.density.default).sort());
76
+ });
77
+ });
@@ -15,6 +15,24 @@
15
15
  //
16
16
  // ground — neutral spine for text, borders, and structure (values: Tailwind neutral)
17
17
 
18
+ // Surface elevation ladder helper. Level 1 is a hairline ring only; every
19
+ // step above adds one more (progressively softer, larger) drop layer, so
20
+ // shadow weight grows monotonically with the surface level. `ring` is the
21
+ // hairline edge colour, `drop` the drop-shadow colour at a given alpha.
22
+ const surfaceShadowRamp = (ring: string, drop: (alpha: number) => string) => {
23
+ const layers = [
24
+ `0 0 0 1px ${ring}`,
25
+ `0 1px 1px -0.5px ${drop(0.06)}, 0 3px 3px -1.5px ${drop(0.06)}`,
26
+ `0 6px 6px -3px ${drop(0.06)}`,
27
+ `0 12px 12px -6px ${drop(0.04)}`,
28
+ `0 24px 24px -12px ${drop(0.04)}`,
29
+ `0 24px 24px 2px ${drop(0.08)}`,
30
+ `0 32px 40px 4px ${drop(0.1)}`,
31
+ `0 48px 56px 8px ${drop(0.12)}`,
32
+ ];
33
+ return [1, 2, 3, 4, 5, 6, 7, 8].map((level) => layers.slice(0, level).join(", "));
34
+ };
35
+
18
36
  export const tokens = {
19
37
  /* ============================================================== *
20
38
  * PALETTE — concrete colors *
@@ -84,12 +102,19 @@ export const tokens = {
84
102
  cardForeground: "#171717",
85
103
  surface: "#fafafa", // ground-50
86
104
  surfaceForeground: "#262626", // ground-800
87
- border: "#f5f5f5", // ground-100
88
- input: "#f5f5f5",
105
+ // ground-200 on white ≈ 1.26:1 — the same hairline weight Figma/Linear use
106
+ // for panel and field edges (#f5f5f5 was ~1.09:1 and read as invisible).
107
+ border: "#e5e5e5", // ground-200
108
+ borderStrong: "#d4d4d4", // ground-300 — hover / emphasised edges
109
+ input: "#e5e5e5", // input edge (border-input) — matches border
89
110
  muted: "#fafafa",
90
111
  mutedForeground: "#737373", // ground-500
91
112
  accent: "#fdf0ff", // purple-50
92
113
  accentForeground: "#740092", // purple-700
114
+ // Neutral interaction washes behind `bg-hover` / `bg-active` (tabs,
115
+ // accordions, radio/checkbox groups, ghost + outline buttons).
116
+ hover: "rgba(23, 23, 23, 0.05)",
117
+ active: "rgba(23, 23, 23, 0.08)",
93
118
  primary: "#c100f1", // purple-500 = brand.primary
94
119
  primaryForeground: "#ffffff",
95
120
  secondary: "#fafafa", // ground-50
@@ -101,6 +126,12 @@ export const tokens = {
101
126
  warning: "#fff5bf", // butter-200 = brand.secondary
102
127
  warningForeground: "#171717", // ground-900
103
128
  ring: "#c100f1", // purple-500 = brand.primary
129
+ // Transparency checkerboard (colour picker alpha track, swatches).
130
+ checkerA: "#ffffff",
131
+ checkerB: "#e5e5e5",
132
+ // Editor workspace behind floating chrome (Figma-style grey canvas),
133
+ // one step below panels so they read as raised in every theme.
134
+ canvas: "#f5f5f5", // ground-100
104
135
  },
105
136
  // Mid — a neutral medium-gray theme (from the Pappery designer "mid" palette,
106
137
  // mapped onto the ground scale). Sits between light and dark.
@@ -112,11 +143,14 @@ export const tokens = {
112
143
  surface: "#525252", // ground-600 (designer canvas/pane)
113
144
  surfaceForeground: "#fafafa",
114
145
  border: "#a3a3a3", // ground-400 (designer border — lighter so it reads on the gray)
115
- input: "#404040", // ground-700 (designer input-bg)
146
+ borderStrong: "#bdbdbd", // hover / emphasised edges
147
+ input: "#a3a3a3", // input edge (border-input) — matches border
116
148
  muted: "#525252", // ground-600
117
149
  mutedForeground: "#e5e5e5", // ground-200 (designer text-secondary)
118
150
  accent: "#404040", // ground-700 (designer item-hover-bg)
119
151
  accentForeground: "#fafafa",
152
+ hover: "rgba(255, 255, 255, 0.08)",
153
+ active: "rgba(255, 255, 255, 0.13)",
120
154
  primary: "#c100f1", // brand stays consistent across themes
121
155
  primaryForeground: "#ffffff",
122
156
  secondary: "#525252", // ground-600
@@ -128,6 +162,9 @@ export const tokens = {
128
162
  warning: "#fff5bf", // butter-200
129
163
  warningForeground: "#171717",
130
164
  ring: "#c100f1",
165
+ checkerA: "#8a8a8a",
166
+ checkerB: "#6b6b6b",
167
+ canvas: "#636363",
131
168
  },
132
169
  dark: {
133
170
  background: "#171717", // ground-900 — designer canvas (deepest)
@@ -136,12 +173,17 @@ export const tokens = {
136
173
  cardForeground: "#fafafa",
137
174
  surface: "#1a1a1a", // designer item-hover depth
138
175
  surfaceForeground: "#f5f5f5",
139
- border: "#404040", // ground-700 — designer border (reads on the dark)
140
- input: "#262626", // ground-800
176
+ // ≈2:1 against the page background and ~1.7:1 against card panels;
177
+ // #404040 (1.73:1 vs bg) blended into panels at small sizes.
178
+ border: "#4a4a4a",
179
+ borderStrong: "#5c5c5c", // hover / emphasised edges
180
+ input: "#4a4a4a", // input edge (border-input) — matches border
141
181
  muted: "#262626", // ground-800
142
182
  mutedForeground: "#a3a3a3", // ground-400
143
183
  accent: "#404040", // ground-700 — neutral elevated/hover (designer item-hover)
144
184
  accentForeground: "#fafafa",
185
+ hover: "rgba(250, 250, 250, 0.06)",
186
+ active: "rgba(250, 250, 250, 0.1)",
145
187
  primary: "#c100f1", // purple-500 — brand stays consistent (D8)
146
188
  primaryForeground: "#ffffff",
147
189
  secondary: "#262626", // ground-800
@@ -153,6 +195,38 @@ export const tokens = {
153
195
  warning: "#221600", // butter-950 surface
154
196
  warningForeground: "#fffad0", // butter-100
155
197
  ring: "#c100f1", // purple-500 = brand.primary
198
+ checkerA: "#4a4a4a",
199
+ checkerB: "#333333",
200
+ canvas: "#1c1c1c",
201
+ },
202
+ },
203
+
204
+ /* ============================================================== *
205
+ * SURFACES — elevation ladder (levels 1–8) *
206
+ * ============================================================== *
207
+ * Consumed via surfaceClasses() / <Elevated> / SurfaceProvider:
208
+ * `bg-surface-N`, `shadow-surface-N`, and the raw `var(--surface-N)`
209
+ * (scroll-fade gradients). Level 1 is the page substrate; each nested
210
+ * layer (popover +2, dialog +4, …) walks up the ladder. Index 0 = level 1.
211
+ *
212
+ * Light: surfaces stay white (matching card/popover) and elevation is
213
+ * carried by the shadow ramp, the house style.
214
+ * Mid/Dark: surfaces step lighter/darker per level so nested layers stay
215
+ * distinguishable where drop shadows barely read. */
216
+ surfaces: {
217
+ light: {
218
+ bg: ["#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff"],
219
+ shadow: surfaceShadowRamp("rgba(0, 0, 0, 0.06)", (a) => `rgba(0, 0, 0, ${a})`),
220
+ },
221
+ mid: {
222
+ // background (#737373) → card (#525252) → ground-700 (#404040)
223
+ bg: ["#737373", "#6b6b6b", "#636363", "#5b5b5b", "#525252", "#4d4d4d", "#474747", "#404040"],
224
+ shadow: surfaceShadowRamp("rgba(0, 0, 0, 0.14)", (a) => `rgba(0, 0, 0, ${Math.min(a * 2.5, 0.3)})`),
225
+ },
226
+ dark: {
227
+ // background (#171717) → card (#262626) → accent (#404040)
228
+ bg: ["#171717", "#1f1f1f", "#262626", "#2b2b2b", "#303030", "#353535", "#3a3a3a", "#404040"],
229
+ shadow: surfaceShadowRamp("rgba(255, 255, 255, 0.08)", (a) => `rgba(0, 0, 0, ${Math.min(a * 4, 0.4)})`),
156
230
  },
157
231
  },
158
232
 
@@ -232,6 +306,9 @@ export const tokens = {
232
306
  lineHeight: "1.625",
233
307
  textWrap: "pretty",
234
308
  },
309
+ /** 11px — dense metadata (table sub-lines, chips, editor hints). Use instead of text-[11px]. */
310
+ "caption-sm": { family: "sans", size: "0.6875rem", weight: 400, lineHeight: "1.5" },
311
+ /** 10px — the floor. Use instead of text-[10px]; keep to non-essential metadata. */
235
312
  "caption-xs": { family: "sans", size: "0.625rem", weight: 400, lineHeight: "1.625" },
236
313
 
237
314
  /* --- "Eyebrow" family — uppercase tracked label used above headlines, --- *
@@ -295,6 +372,38 @@ export const tokens = {
295
372
  full: "9999px",
296
373
  },
297
374
 
375
+ /* ============================================================== *
376
+ * DENSITY — control sizing tiers *
377
+ * ============================================================== *
378
+ * Emitted as `--density-*` custom properties: `:root` carries the
379
+ * default tier, `[data-density="compact"]` the editor-chrome tier.
380
+ * Components switch via the `compact:` Tailwind variant (same
381
+ * attribute); consumers can read the vars for bespoke controls. */
382
+ density: {
383
+ default: {
384
+ controlHeight: "32px",
385
+ inputHeight: "40px",
386
+ rowHeight: "36px",
387
+ text: "14px",
388
+ label: "12px",
389
+ menuItemHeight: "40px",
390
+ menuText: "14px",
391
+ paddingX: "12px",
392
+ radius: "8px",
393
+ },
394
+ compact: {
395
+ controlHeight: "24px",
396
+ inputHeight: "24px",
397
+ rowHeight: "28px",
398
+ text: "12px",
399
+ label: "11px",
400
+ menuItemHeight: "28px",
401
+ menuText: "13px",
402
+ paddingX: "8px",
403
+ radius: "5px",
404
+ },
405
+ },
406
+
298
407
  /* ============================================================== *
299
408
  * Z-INDEX — semantic layering scale *
300
409
  * ============================================================== */
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tokens/tokens.ts"],"names":[],"mappings":"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","file":"chunk-RI6QJR2L.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:\n '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\": {\n family: \"display\",\n size: \"3rem\",\n weight: 400,\n lineHeight: \"1.15\",\n textWrap: \"balance\",\n },\n display: {\n family: \"display\",\n size: \"2.25rem\",\n weight: 400,\n lineHeight: \"1.15\",\n textWrap: \"balance\",\n },\n \"heading-xl\": {\n family: \"display\",\n size: \"1.875rem\",\n weight: 400,\n lineHeight: \"1.2\",\n textWrap: \"balance\",\n },\n heading: {\n family: \"display\",\n size: \"1.5rem\",\n weight: 400,\n lineHeight: \"1.2\",\n textWrap: \"balance\",\n },\n subheading: {\n family: \"display\",\n size: \"1.25rem\",\n weight: 400,\n lineHeight: \"1.4\",\n textWrap: \"balance\",\n },\n \"body-lg\": {\n family: \"sans\",\n size: \"1rem\",\n weight: 400,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\n body: {\n family: \"sans\",\n size: \"0.875rem\",\n weight: 400,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\n \"body-sm\": {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 500,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\n caption: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 400,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\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 \"hilum-orbit\": \"hilum-orbit 1.4s ease-in-out infinite\",\n \"hilum-spring-in\": \"hilum-spring-in 180ms cubic-bezier(0.2, 0.9, 0.2, 1.15)\",\n \"hilum-thinking\": \"hilum-thinking 1.1s ease-in-out infinite\",\n },\n} as const;\n\nexport type Tokens = typeof tokens;\nexport type SemanticTokens = typeof tokens.semantic.light;\n"]}