@nebutra/theme 0.2.2 → 3.0.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.
package/skins.css CHANGED
@@ -7,31 +7,255 @@
7
7
  * Switch: document.documentElement.dataset.brand = "vanta" | "linear" | ...
8
8
  * Factory: delete dataset.brand (or clearLanguage() / applyLanguage("factory")).
9
9
  *
10
- * Languages: gsap, linear, notion, raycast, stripe, vanta, vercel
10
+ * Languages: cosmos, gsap, linear, notion, raycast, stripe, vanta, vercel
11
11
  */
12
12
 
13
13
  /**
14
- * Brand carrier skin: GSAP (gsap) v1.0.0
15
- * darkDefault=true dualMode=false button=gradient-stroke
16
- * fonts=2 mode=global
14
+ * Brand carrier skin: Cosmos (cosmos) v2.0.0
15
+ * darkDefault=false dualMode=true button=solid
16
+ * fonts=0 mode=global
17
17
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
18
18
  */
19
19
 
20
- /* Brand font faces */
21
- @font-face {
22
- font-family: "Mori";
23
- src: url("/brand-assets/mori-regular.woff2") format("woff2");
24
- font-weight: 400;
25
- font-display: swap;
20
+ html[data-brand="cosmos"] {
21
+ /* ── Color roles (carrier) ── */
22
+ --role-canvas: 30 20% 96%;
23
+ --role-canvas-fg: 0 0% 5%;
24
+ --role-surface: 0 0% 100%;
25
+ --role-surface-fg: 0 0% 5%;
26
+ --role-action: 0 0% 5%;
27
+ --role-action-fg: 30 20% 96%;
28
+ --role-quiet: 0 0% 100%;
29
+ --role-quiet-fg: 0 0% 5%;
30
+ --role-muted: 30 20% 96%;
31
+ --role-muted-fg: 12 2% 42%;
32
+ --role-border: 30 5% 85%;
33
+ --role-input: 30 5% 85%;
34
+ --role-ring: 0 0% 5%;
35
+ --role-brand: 0 0% 5%;
36
+ --role-brand-fg: 30 20% 96%;
37
+ --brand-mark: 0 0% 5%;
38
+ --brand-mark-foreground: 30 20% 96%;
39
+
40
+ /* ── shadcn bridge (primary = action CTA) ── */
41
+ --background: 30 20% 96%;
42
+ --foreground: 0 0% 5%;
43
+ --card: 0 0% 100%;
44
+ --card-foreground: 0 0% 5%;
45
+ --popover: 0 0% 100%;
46
+ --popover-foreground: 0 0% 5%;
47
+ --primary: 0 0% 5%;
48
+ --primary-foreground: 30 20% 96%;
49
+ --secondary: 0 0% 100%;
50
+ --secondary-foreground: 0 0% 5%;
51
+ --muted: 30 20% 96%;
52
+ --muted-foreground: 12 2% 42%;
53
+ --accent: 0 0% 5%;
54
+ --accent-foreground: 30 20% 96%;
55
+ --destructive: 4 76% 40%;
56
+ --destructive-foreground: 0 0% 100%;
57
+ --border: 30 5% 85%;
58
+ --input: 30 5% 85%;
59
+ --ring: 0 0% 5%;
60
+ --success: 134 62% 40%;
61
+ --success-foreground: 0 0% 100%;
62
+ --info: 12 2% 42%;
63
+ --info-foreground: 0 0% 100%;
64
+ --sidebar: 0 0% 100%;
65
+ --sidebar-foreground: 0 0% 5%;
66
+ --sidebar-primary: 0 0% 5%;
67
+ --sidebar-primary-foreground: 30 20% 96%;
68
+ --sidebar-accent: 0 0% 5%;
69
+ --sidebar-accent-foreground: 30 20% 96%;
70
+ --sidebar-border: 30 5% 85%;
71
+ --sidebar-ring: 0 0% 5%;
72
+ --brand-primary: hsl(0 0% 5%);
73
+ --brand-accent: hsl(0 0% 5%);
74
+ --brand-accent-foreground: hsl(30 20% 96%);
75
+ --brand-tertiary: hsl(0 0% 5%);
76
+ --brand-gradient: hsl(var(--primary));
77
+ --brand-gradient-reverse: hsl(var(--primary));
78
+ --brand-gradient-vertical: hsl(var(--primary));
79
+ --brand-gradient-radial: hsl(var(--primary));
80
+
81
+ /* ── Neutral ramp, anchored on this language's roles ── */
82
+ --neutral-1: hsl(30 20% 96%);
83
+ --neutral-2: hsl(0 0% 100%);
84
+ --neutral-3: color-mix(in oklab, hsl(30 5% 85%) 20%, hsl(0 0% 100%));
85
+ --neutral-4: color-mix(in oklab, hsl(30 5% 85%) 40%, hsl(0 0% 100%));
86
+ --neutral-5: color-mix(in oklab, hsl(30 5% 85%) 60%, hsl(0 0% 100%));
87
+ --neutral-6: color-mix(in oklab, hsl(30 5% 85%) 80%, hsl(0 0% 100%));
88
+ --neutral-7: hsl(30 5% 85%);
89
+ --neutral-8: color-mix(in oklab, hsl(12 2% 42%) 25%, hsl(30 5% 85%));
90
+ --neutral-9: color-mix(in oklab, hsl(12 2% 42%) 50%, hsl(30 5% 85%));
91
+ --neutral-10: color-mix(in oklab, hsl(12 2% 42%) 75%, hsl(30 5% 85%));
92
+ --neutral-11: hsl(12 2% 42%);
93
+ --neutral-12: hsl(0 0% 5%);
94
+
95
+ /* Recipe (action language + free elev/radii) */
96
+ /* Shape slots */
97
+ --btn-default-radius: 16px;
98
+ --radius-button: 16px;
99
+ --radius-buttons: 16px;
100
+ --radius-md: min(16px, 16px);
101
+ --radius-card: 16px;
102
+ --radius-lg: 16px;
103
+ --radius-badge: 16px;
104
+ --badge-default-radius: 16px;
105
+ --radius-inputs: 16px;
106
+ --input-radius: 16px;
107
+ --radius-pill: 9999px;
108
+
109
+ /* Free elevation (carrier-provided CSS shadows) */
110
+ --elevation-card: 0 0 #0000;
111
+ --elevation-control: 0 0 #0000;
112
+ --elevation-raised: 0 0 #0000;
113
+ --elevation-xs: 0 0 #0000;
114
+ --elevation-sm: 0 0 #0000;
115
+ --elevation-md: 0 0 #0000;
116
+ --elevation-lg: 0 0 #0000;
117
+ --btn-default-shadow: 0 0 #0000;
118
+ --btn-default-bg: hsl(var(--primary));
119
+ --btn-default-fg: hsl(var(--primary-foreground));
120
+ --btn-default-border-width: 0px;
121
+ --btn-default-border: transparent;
122
+ --btn-default-stroke-gradient: linear-gradient(transparent, transparent);
123
+ --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
124
+ --badge-default-bg: hsl(var(--secondary));
125
+ --badge-default-fg: hsl(var(--secondary-foreground));
126
+ --badge-default-border: transparent;
127
+ --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
128
+
129
+ /* Typography */
130
+ --font-sans:
131
+ var(--font-reg-fraunces), "Fraunces", "GT Super", Georgia, var(--font-misans, "MiSans"),
132
+ "PingFang SC", ui-serif, serif;
133
+ --font-cn:
134
+ var(--font-reg-fraunces), "Fraunces", "GT Super", Georgia, var(--font-misans, "MiSans"),
135
+ "PingFang SC", ui-serif, serif;
136
+ --font-heading:
137
+ var(--font-reg-fraunces), "Fraunces", "GT Super", Georgia, var(--font-misans, "MiSans"),
138
+ "PingFang SC", ui-serif, serif;
139
+ --font-display:
140
+ var(--font-reg-fraunces), "Fraunces", "GT Super", Georgia, var(--font-misans, "MiSans"),
141
+ "PingFang SC", ui-serif, serif;
142
+ --font-mono: var(--font-jetbrains-mono), "JetBrains Mono", ui-monospace, monospace;
143
+ --font-weight-heading: 350;
144
+
145
+ /* Motion */
146
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
147
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
148
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
149
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
150
+ --duration-micro: 80ms;
151
+ --motion-duration-micro: 80ms;
152
+ --duration-flow: 180ms;
153
+ --motion-duration-flow: 180ms;
154
+ --duration-reveal: 180ms;
155
+ --motion-duration-reveal: 180ms;
156
+ --duration-cinematic: 320ms;
157
+ --motion-duration-cinematic: 320ms;
158
+
159
+ /* Spacing */
160
+ --space-source-xs: 0.5rem;
161
+ --space-source-sm: 1rem;
162
+ --space-source-md: 1.25rem;
163
+ --space-source-lg: 1.5rem;
164
+ --space-source-xl: 2rem;
165
+ --space-source-2xl: 3rem;
166
+
167
+ /* Taxonomy / decorative (not product CTA) */
168
+ --brand-category-linen-canvas: #f7f5f3;
169
+ --brand-category-ink-black: #0d0d0d;
170
+ --brand-category-paper-white: #ffffff;
171
+ --brand-category-stone: #6e6a69;
172
+ --brand-category-pebble: #9a9796;
26
173
  }
27
174
 
28
- @font-face {
29
- font-family: "Mori";
30
- src: url("/brand-assets/mori-semibold.woff2") format("woff2");
31
- font-weight: 600;
32
- font-display: swap;
175
+ .dark,
176
+ html.dark[data-brand="cosmos"] {
177
+ /* ── Color roles (carrier) ── */
178
+ --role-canvas: 0 0% 5%;
179
+ --role-canvas-fg: 30 20% 96%;
180
+ --role-surface: 0 0% 11%;
181
+ --role-surface-fg: 30 20% 96%;
182
+ --role-action: 30 20% 96%;
183
+ --role-action-fg: 0 0% 5%;
184
+ --role-quiet: 0 0% 14%;
185
+ --role-quiet-fg: 30 20% 96%;
186
+ --role-muted: 0 0% 11%;
187
+ --role-muted-fg: 15 2% 60%;
188
+ --role-border: 0 1% 18%;
189
+ --role-input: 0 1% 18%;
190
+ --role-ring: 30 20% 96%;
191
+ --role-brand: 30 20% 96%;
192
+ --role-brand-fg: 0 0% 5%;
193
+ --brand-mark: 30 20% 96%;
194
+ --brand-mark-foreground: 0 0% 5%;
195
+
196
+ /* ── shadcn bridge (primary = action CTA) ── */
197
+ --background: 0 0% 5%;
198
+ --foreground: 30 20% 96%;
199
+ --card: 0 0% 11%;
200
+ --card-foreground: 30 20% 96%;
201
+ --popover: 0 0% 11%;
202
+ --popover-foreground: 30 20% 96%;
203
+ --primary: 30 20% 96%;
204
+ --primary-foreground: 0 0% 5%;
205
+ --secondary: 0 0% 14%;
206
+ --secondary-foreground: 30 20% 96%;
207
+ --muted: 0 0% 11%;
208
+ --muted-foreground: 15 2% 60%;
209
+ --accent: 30 20% 96%;
210
+ --accent-foreground: 0 0% 5%;
211
+ --destructive: 4 76% 40%;
212
+ --destructive-foreground: 0 0% 100%;
213
+ --border: 0 1% 18%;
214
+ --input: 0 1% 18%;
215
+ --ring: 30 20% 96%;
216
+ --success: 134 62% 40%;
217
+ --success-foreground: 0 0% 100%;
218
+ --info: 12 2% 42%;
219
+ --info-foreground: 0 0% 100%;
220
+ --sidebar: 0 0% 11%;
221
+ --sidebar-foreground: 30 20% 96%;
222
+ --sidebar-primary: 30 20% 96%;
223
+ --sidebar-primary-foreground: 0 0% 5%;
224
+ --sidebar-accent: 30 20% 96%;
225
+ --sidebar-accent-foreground: 0 0% 5%;
226
+ --sidebar-border: 0 1% 18%;
227
+ --sidebar-ring: 30 20% 96%;
228
+ --brand-primary: hsl(30 20% 96%);
229
+ --brand-accent: hsl(30 20% 96%);
230
+ --brand-accent-foreground: hsl(0 0% 5%);
231
+ --brand-tertiary: hsl(30 20% 96%);
232
+ --brand-gradient: hsl(var(--primary));
233
+ --brand-gradient-reverse: hsl(var(--primary));
234
+ --brand-gradient-vertical: hsl(var(--primary));
235
+ --brand-gradient-radial: hsl(var(--primary));
236
+
237
+ /* ── Neutral ramp, anchored on this language's roles ── */
238
+ --neutral-1: hsl(0 0% 5%);
239
+ --neutral-2: hsl(0 0% 11%);
240
+ --neutral-3: color-mix(in oklab, hsl(0 1% 18%) 20%, hsl(0 0% 11%));
241
+ --neutral-4: color-mix(in oklab, hsl(0 1% 18%) 40%, hsl(0 0% 11%));
242
+ --neutral-5: color-mix(in oklab, hsl(0 1% 18%) 60%, hsl(0 0% 11%));
243
+ --neutral-6: color-mix(in oklab, hsl(0 1% 18%) 80%, hsl(0 0% 11%));
244
+ --neutral-7: hsl(0 1% 18%);
245
+ --neutral-8: color-mix(in oklab, hsl(15 2% 60%) 25%, hsl(0 1% 18%));
246
+ --neutral-9: color-mix(in oklab, hsl(15 2% 60%) 50%, hsl(0 1% 18%));
247
+ --neutral-10: color-mix(in oklab, hsl(15 2% 60%) 75%, hsl(0 1% 18%));
248
+ --neutral-11: hsl(15 2% 60%);
249
+ --neutral-12: hsl(30 20% 96%);
33
250
  }
34
251
 
252
+ /**
253
+ * Brand carrier skin: GSAP (gsap) v1.0.0
254
+ * darkDefault=true dualMode=false button=gradient-stroke
255
+ * fonts=0 mode=global
256
+ * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
257
+ */
258
+
35
259
  html[data-brand="gsap"] {
36
260
  /* ── Color roles (carrier) ── */
37
261
  --role-canvas: 150 7% 6%;
@@ -80,17 +304,35 @@ html[data-brand="gsap"] {
80
304
  --sidebar-accent-foreground: 54 100% 94%;
81
305
  --sidebar-border: 70 5% 25%;
82
306
  --sidebar-ring: 137 92% 47%;
307
+ --brand-primary: hsl(137 92% 47%);
308
+ --brand-accent: hsl(137 92% 47%);
309
+ --brand-accent-foreground: hsl(150 7% 6%);
310
+ --brand-tertiary: hsl(137 92% 47%);
83
311
  --brand-gradient: hsl(var(--primary));
84
312
  --brand-gradient-reverse: hsl(var(--primary));
85
313
  --brand-gradient-vertical: hsl(var(--primary));
86
314
  --brand-gradient-radial: hsl(var(--primary));
87
315
 
316
+ /* ── Neutral ramp, anchored on this language's roles ── */
317
+ --neutral-1: hsl(150 7% 6%);
318
+ --neutral-2: hsl(0 0% 10%);
319
+ --neutral-3: color-mix(in oklab, hsl(70 5% 25%) 20%, hsl(0 0% 10%));
320
+ --neutral-4: color-mix(in oklab, hsl(70 5% 25%) 40%, hsl(0 0% 10%));
321
+ --neutral-5: color-mix(in oklab, hsl(70 5% 25%) 60%, hsl(0 0% 10%));
322
+ --neutral-6: color-mix(in oklab, hsl(70 5% 25%) 80%, hsl(0 0% 10%));
323
+ --neutral-7: hsl(70 5% 25%);
324
+ --neutral-8: color-mix(in oklab, hsl(60 6% 46%) 25%, hsl(70 5% 25%));
325
+ --neutral-9: color-mix(in oklab, hsl(60 6% 46%) 50%, hsl(70 5% 25%));
326
+ --neutral-10: color-mix(in oklab, hsl(60 6% 46%) 75%, hsl(70 5% 25%));
327
+ --neutral-11: hsl(60 6% 46%);
328
+ --neutral-12: hsl(54 100% 94%);
329
+
88
330
  /* Recipe (action language + free elev/radii) */
89
331
  /* Shape slots */
90
332
  --btn-default-radius: 100px;
91
333
  --radius-button: 100px;
92
334
  --radius-buttons: 100px;
93
- --radius-md: 100px;
335
+ --radius-md: min(100px, 8px);
94
336
  --radius-card: 8px;
95
337
  --radius-lg: 8px;
96
338
  --radius-badge: 9999px;
@@ -130,9 +372,18 @@ html[data-brand="gsap"] {
130
372
  --control-font-size-md: 0.8125rem;
131
373
 
132
374
  /* Typography */
133
- --font-sans: "Mori", "Inter Tight", "DM Sans", ui-sans-serif, system-ui, sans-serif;
134
- --font-heading: "Mori", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
135
- --font-display: "Mori", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
375
+ --font-sans:
376
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", "DM Sans", var(--font-misans, "MiSans"),
377
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
378
+ --font-cn:
379
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", "DM Sans", var(--font-misans, "MiSans"),
380
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
381
+ --font-heading:
382
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", var(--font-misans, "MiSans"), "PingFang SC",
383
+ ui-sans-serif, system-ui, sans-serif;
384
+ --font-display:
385
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", var(--font-misans, "MiSans"), "PingFang SC",
386
+ ui-sans-serif, system-ui, sans-serif;
136
387
  --font-weight-heading: 600;
137
388
 
138
389
  /* Motion */
@@ -171,19 +422,10 @@ html[data-brand="gsap"] {
171
422
  /**
172
423
  * Brand carrier skin: Linear (linear) v1.0.0
173
424
  * darkDefault=true dualMode=true button=solid
174
- * fonts=1 mode=global
425
+ * fonts=0 mode=global
175
426
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
176
427
  */
177
428
 
178
- /* Brand font faces */
179
- @font-face {
180
- font-family: "Inter Variable";
181
- src: url("https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2")
182
- format("woff2");
183
- font-weight: 100 900;
184
- font-display: swap;
185
- }
186
-
187
429
  html[data-brand="linear"] {
188
430
  /* ── Color roles (carrier) ── */
189
431
  --role-canvas: 0 0% 100%;
@@ -197,7 +439,7 @@ html[data-brand="linear"] {
197
439
  --role-muted: 220 14% 96%;
198
440
  --role-muted-fg: 218 5% 41%;
199
441
  --role-border: 220 13% 91%;
200
- --role-input: 0 0% 100%;
442
+ --role-input: 220 13% 91%;
201
443
  --role-ring: 64 89% 54%;
202
444
 
203
445
  /* ── shadcn bridge (primary = action CTA) ── */
@@ -218,7 +460,7 @@ html[data-brand="linear"] {
218
460
  --destructive: 0 79% 63%;
219
461
  --destructive-foreground: 0 0% 100%;
220
462
  --border: 220 13% 91%;
221
- --input: 0 0% 100%;
463
+ --input: 220 13% 91%;
222
464
  --ring: 64 89% 54%;
223
465
  --success: 134 62% 40%;
224
466
  --success-foreground: 0 0% 100%;
@@ -232,17 +474,35 @@ html[data-brand="linear"] {
232
474
  --sidebar-accent-foreground: 210 11% 4%;
233
475
  --sidebar-border: 220 13% 91%;
234
476
  --sidebar-ring: 64 89% 54%;
477
+ --brand-primary: hsl(64 89% 54%);
478
+ --brand-accent: hsl(64 89% 54%);
479
+ --brand-accent-foreground: hsl(210 11% 4%);
480
+ --brand-tertiary: hsl(64 89% 54%);
235
481
  --brand-gradient: hsl(var(--primary));
236
482
  --brand-gradient-reverse: hsl(var(--primary));
237
483
  --brand-gradient-vertical: hsl(var(--primary));
238
484
  --brand-gradient-radial: hsl(var(--primary));
239
485
 
486
+ /* ── Neutral ramp, anchored on this language's roles ── */
487
+ --neutral-1: hsl(0 0% 100%);
488
+ --neutral-2: hsl(0 0% 98%);
489
+ --neutral-3: color-mix(in oklab, hsl(220 13% 91%) 20%, hsl(0 0% 98%));
490
+ --neutral-4: color-mix(in oklab, hsl(220 13% 91%) 40%, hsl(0 0% 98%));
491
+ --neutral-5: color-mix(in oklab, hsl(220 13% 91%) 60%, hsl(0 0% 98%));
492
+ --neutral-6: color-mix(in oklab, hsl(220 13% 91%) 80%, hsl(0 0% 98%));
493
+ --neutral-7: hsl(220 13% 91%);
494
+ --neutral-8: color-mix(in oklab, hsl(218 5% 41%) 25%, hsl(220 13% 91%));
495
+ --neutral-9: color-mix(in oklab, hsl(218 5% 41%) 50%, hsl(220 13% 91%));
496
+ --neutral-10: color-mix(in oklab, hsl(218 5% 41%) 75%, hsl(220 13% 91%));
497
+ --neutral-11: hsl(218 5% 41%);
498
+ --neutral-12: hsl(210 11% 4%);
499
+
240
500
  /* Recipe (action language + free elev/radii) */
241
501
  /* Shape slots */
242
502
  --btn-default-radius: 6px;
243
503
  --radius-button: 6px;
244
504
  --radius-buttons: 6px;
245
- --radius-md: 6px;
505
+ --radius-md: min(6px, 12px);
246
506
  --radius-card: 12px;
247
507
  --radius-lg: 12px;
248
508
  --radius-badge: 9999px;
@@ -282,10 +542,20 @@ html[data-brand="linear"] {
282
542
  --control-font-size-md: 0.8125rem;
283
543
 
284
544
  /* Typography */
285
- --font-sans: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
286
- --font-heading: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
287
- --font-display: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
288
- --font-mono: "Berkeley Mono", "JetBrains Mono", ui-monospace, monospace;
545
+ --font-sans:
546
+ var(--font-inter), "Inter Variable", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
547
+ ui-sans-serif, system-ui, sans-serif;
548
+ --font-cn:
549
+ var(--font-inter), "Inter Variable", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
550
+ ui-sans-serif, system-ui, sans-serif;
551
+ --font-heading:
552
+ var(--font-inter), "Inter Variable", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
553
+ ui-sans-serif, system-ui, sans-serif;
554
+ --font-display:
555
+ var(--font-inter), "Inter Variable", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
556
+ ui-sans-serif, system-ui, sans-serif;
557
+ --font-mono:
558
+ var(--font-jetbrains-mono), "Berkeley Mono", "JetBrains Mono", ui-monospace, monospace;
289
559
  --font-weight-heading: 510;
290
560
 
291
561
  /* Motion */
@@ -360,35 +630,37 @@ html.dark[data-brand="linear"] {
360
630
  --sidebar-accent-foreground: 218 21% 85%;
361
631
  --sidebar-border: 223 9% 15%;
362
632
  --sidebar-ring: 64 89% 54%;
633
+ --brand-primary: hsl(64 89% 54%);
634
+ --brand-accent: hsl(64 89% 54%);
635
+ --brand-accent-foreground: hsl(210 11% 4%);
636
+ --brand-tertiary: hsl(64 89% 54%);
363
637
  --brand-gradient: hsl(var(--primary));
364
638
  --brand-gradient-reverse: hsl(var(--primary));
365
639
  --brand-gradient-vertical: hsl(var(--primary));
366
640
  --brand-gradient-radial: hsl(var(--primary));
641
+
642
+ /* ── Neutral ramp, anchored on this language's roles ── */
643
+ --neutral-1: hsl(210 11% 4%);
644
+ --neutral-2: hsl(210 6% 6%);
645
+ --neutral-3: color-mix(in oklab, hsl(223 9% 15%) 20%, hsl(210 6% 6%));
646
+ --neutral-4: color-mix(in oklab, hsl(223 9% 15%) 40%, hsl(210 6% 6%));
647
+ --neutral-5: color-mix(in oklab, hsl(223 9% 15%) 60%, hsl(210 6% 6%));
648
+ --neutral-6: color-mix(in oklab, hsl(223 9% 15%) 80%, hsl(210 6% 6%));
649
+ --neutral-7: hsl(223 9% 15%);
650
+ --neutral-8: color-mix(in oklab, hsl(218 5% 41%) 25%, hsl(223 9% 15%));
651
+ --neutral-9: color-mix(in oklab, hsl(218 5% 41%) 50%, hsl(223 9% 15%));
652
+ --neutral-10: color-mix(in oklab, hsl(218 5% 41%) 75%, hsl(223 9% 15%));
653
+ --neutral-11: hsl(218 5% 41%);
654
+ --neutral-12: hsl(0 0% 100%);
367
655
  }
368
656
 
369
657
  /**
370
658
  * Brand carrier skin: Notion (notion) v1.0.0
371
659
  * darkDefault=false dualMode=false button=solid
372
- * fonts=2 mode=global
660
+ * fonts=0 mode=global
373
661
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
374
662
  */
375
663
 
376
- /* Brand font faces */
377
- @font-face {
378
- font-family: "NotionInter";
379
- src: url("https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2")
380
- format("woff2");
381
- font-weight: 100 900;
382
- font-display: swap;
383
- }
384
-
385
- @font-face {
386
- font-family: "Lyon Text";
387
- src: url("/brand-assets/lyon-text-regular.woff2") format("woff2");
388
- font-weight: 400;
389
- font-display: swap;
390
- }
391
-
392
664
  html[data-brand="notion"] {
393
665
  /* ── Color roles (carrier) ── */
394
666
  --role-canvas: 30 10% 96%;
@@ -400,9 +672,9 @@ html[data-brand="notion"] {
400
672
  --role-quiet: 208 92% 95%;
401
673
  --role-quiet-fg: 208 100% 44%;
402
674
  --role-muted: 208 92% 95%;
403
- --role-muted-fg: 0 0% 46%;
675
+ --role-muted-fg: 0 0% 43%;
404
676
  --role-border: 30 5% 88%;
405
- --role-input: 0 0% 100%;
677
+ --role-input: 30 5% 88%;
406
678
  --role-ring: 208 100% 44%;
407
679
  --role-brand: 0 0% 0%;
408
680
  --role-brand-fg: 0 0% 100%;
@@ -421,13 +693,13 @@ html[data-brand="notion"] {
421
693
  --secondary: 208 92% 95%;
422
694
  --secondary-foreground: 208 100% 44%;
423
695
  --muted: 208 92% 95%;
424
- --muted-foreground: 0 0% 46%;
696
+ --muted-foreground: 0 0% 43%;
425
697
  --accent: 0 0% 0%;
426
698
  --accent-foreground: 0 0% 100%;
427
699
  --destructive: 7 92% 58%;
428
700
  --destructive-foreground: 0 0% 100%;
429
701
  --border: 30 5% 88%;
430
- --input: 0 0% 100%;
702
+ --input: 30 5% 88%;
431
703
  --ring: 208 100% 44%;
432
704
  --warning: 40 100% 53%;
433
705
  --warning-foreground: 0 0% 0%;
@@ -441,17 +713,35 @@ html[data-brand="notion"] {
441
713
  --sidebar-accent-foreground: 0 0% 100%;
442
714
  --sidebar-border: 30 5% 88%;
443
715
  --sidebar-ring: 208 100% 44%;
716
+ --brand-primary: hsl(0 0% 0%);
717
+ --brand-accent: hsl(208 100% 44%);
718
+ --brand-accent-foreground: hsl(0 0% 100%);
719
+ --brand-tertiary: hsl(208 100% 44%);
444
720
  --brand-gradient: hsl(var(--primary));
445
721
  --brand-gradient-reverse: hsl(var(--primary));
446
722
  --brand-gradient-vertical: hsl(var(--primary));
447
723
  --brand-gradient-radial: hsl(var(--primary));
448
724
 
725
+ /* ── Neutral ramp, anchored on this language's roles ── */
726
+ --neutral-1: hsl(30 10% 96%);
727
+ --neutral-2: hsl(0 0% 100%);
728
+ --neutral-3: color-mix(in oklab, hsl(30 5% 88%) 20%, hsl(0 0% 100%));
729
+ --neutral-4: color-mix(in oklab, hsl(30 5% 88%) 40%, hsl(0 0% 100%));
730
+ --neutral-5: color-mix(in oklab, hsl(30 5% 88%) 60%, hsl(0 0% 100%));
731
+ --neutral-6: color-mix(in oklab, hsl(30 5% 88%) 80%, hsl(0 0% 100%));
732
+ --neutral-7: hsl(30 5% 88%);
733
+ --neutral-8: color-mix(in oklab, hsl(0 0% 43%) 25%, hsl(30 5% 88%));
734
+ --neutral-9: color-mix(in oklab, hsl(0 0% 43%) 50%, hsl(30 5% 88%));
735
+ --neutral-10: color-mix(in oklab, hsl(0 0% 43%) 75%, hsl(30 5% 88%));
736
+ --neutral-11: hsl(0 0% 43%);
737
+ --neutral-12: hsl(0 0% 0%);
738
+
449
739
  /* Recipe (action language + free elev/radii) */
450
740
  /* Shape slots */
451
741
  --btn-default-radius: 8px;
452
742
  --radius-button: 8px;
453
743
  --radius-buttons: 8px;
454
- --radius-md: 8px;
744
+ --radius-md: min(8px, 12px);
455
745
  --radius-card: 12px;
456
746
  --radius-lg: 12px;
457
747
  --radius-badge: 9999px;
@@ -481,9 +771,18 @@ html[data-brand="notion"] {
481
771
  --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
482
772
 
483
773
  /* Typography */
484
- --font-sans: "NotionInter", "Inter", ui-sans-serif, system-ui, sans-serif;
485
- --font-heading: "NotionInter", "Inter", ui-sans-serif, system-ui, sans-serif;
486
- --font-display: "NotionInter", "Inter", ui-sans-serif, system-ui, sans-serif;
774
+ --font-sans:
775
+ var(--font-inter), "NotionInter", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
776
+ ui-sans-serif, system-ui, sans-serif;
777
+ --font-cn:
778
+ var(--font-inter), "NotionInter", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
779
+ ui-sans-serif, system-ui, sans-serif;
780
+ --font-heading:
781
+ var(--font-inter), "NotionInter", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
782
+ ui-sans-serif, system-ui, sans-serif;
783
+ --font-display:
784
+ var(--font-inter), "NotionInter", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
785
+ ui-sans-serif, system-ui, sans-serif;
487
786
  --font-weight-heading: 700;
488
787
 
489
788
  /* Motion */
@@ -527,19 +826,10 @@ html[data-brand="notion"] {
527
826
  /**
528
827
  * Brand carrier skin: Raycast (raycast) v1.0.0
529
828
  * darkDefault=true dualMode=false button=solid
530
- * fonts=1 mode=global
829
+ * fonts=0 mode=global
531
830
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
532
831
  */
533
832
 
534
- /* Brand font faces */
535
- @font-face {
536
- font-family: "Inter";
537
- src: url("https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2")
538
- format("woff2");
539
- font-weight: 100 900;
540
- font-display: swap;
541
- }
542
-
543
833
  html[data-brand="raycast"] {
544
834
  /* ── Color roles (carrier) ── */
545
835
  --role-canvas: 210 20% 2%;
@@ -551,9 +841,9 @@ html[data-brand="raycast"] {
551
841
  --role-quiet: 220 5% 11%;
552
842
  --role-quiet-fg: 0 0% 100%;
553
843
  --role-muted: 220 8% 7%;
554
- --role-muted-fg: 210 1% 42%;
844
+ --role-muted-fg: 210 1% 48%;
555
845
  --role-border: 210 2% 19%;
556
- --role-input: 220 8% 7%;
846
+ --role-input: 210 2% 19%;
557
847
  --role-ring: 240 1% 61%;
558
848
  --role-brand: 0 100% 69%;
559
849
  --role-brand-fg: 210 1% 27%;
@@ -572,13 +862,13 @@ html[data-brand="raycast"] {
572
862
  --secondary: 220 5% 11%;
573
863
  --secondary-foreground: 0 0% 100%;
574
864
  --muted: 220 8% 7%;
575
- --muted-foreground: 210 1% 42%;
865
+ --muted-foreground: 210 1% 48%;
576
866
  --accent: 0 100% 69%;
577
867
  --accent-foreground: 210 1% 27%;
578
868
  --destructive: 0 72% 51%;
579
869
  --destructive-foreground: 0 0% 100%;
580
870
  --border: 210 2% 19%;
581
- --input: 220 8% 7%;
871
+ --input: 210 2% 19%;
582
872
  --ring: 240 1% 61%;
583
873
  --success: 151 59% 59%;
584
874
  --success-foreground: 210 20% 2%;
@@ -592,17 +882,35 @@ html[data-brand="raycast"] {
592
882
  --sidebar-accent-foreground: 210 1% 27%;
593
883
  --sidebar-border: 210 2% 19%;
594
884
  --sidebar-ring: 240 1% 61%;
885
+ --brand-primary: hsl(0 100% 69%);
886
+ --brand-accent: hsl(0 0% 90%);
887
+ --brand-accent-foreground: hsl(210 1% 27%);
888
+ --brand-tertiary: hsl(0 0% 90%);
595
889
  --brand-gradient: hsl(var(--primary));
596
890
  --brand-gradient-reverse: hsl(var(--primary));
597
891
  --brand-gradient-vertical: hsl(var(--primary));
598
892
  --brand-gradient-radial: hsl(var(--primary));
599
893
 
894
+ /* ── Neutral ramp, anchored on this language's roles ── */
895
+ --neutral-1: hsl(210 20% 2%);
896
+ --neutral-2: hsl(220 18% 3%);
897
+ --neutral-3: color-mix(in oklab, hsl(210 2% 19%) 20%, hsl(220 18% 3%));
898
+ --neutral-4: color-mix(in oklab, hsl(210 2% 19%) 40%, hsl(220 18% 3%));
899
+ --neutral-5: color-mix(in oklab, hsl(210 2% 19%) 60%, hsl(220 18% 3%));
900
+ --neutral-6: color-mix(in oklab, hsl(210 2% 19%) 80%, hsl(220 18% 3%));
901
+ --neutral-7: hsl(210 2% 19%);
902
+ --neutral-8: color-mix(in oklab, hsl(210 1% 48%) 25%, hsl(210 2% 19%));
903
+ --neutral-9: color-mix(in oklab, hsl(210 1% 48%) 50%, hsl(210 2% 19%));
904
+ --neutral-10: color-mix(in oklab, hsl(210 1% 48%) 75%, hsl(210 2% 19%));
905
+ --neutral-11: hsl(210 1% 48%);
906
+ --neutral-12: hsl(0 0% 100%);
907
+
600
908
  /* Recipe (action language + free elev/radii) */
601
909
  /* Shape slots */
602
910
  --btn-default-radius: 8px;
603
911
  --radius-button: 8px;
604
912
  --radius-buttons: 8px;
605
- --radius-md: 8px;
913
+ --radius-md: min(8px, 16px);
606
914
  --radius-card: 16px;
607
915
  --radius-lg: 16px;
608
916
  --radius-badge: 6px;
@@ -672,10 +980,19 @@ html[data-brand="raycast"] {
672
980
  --control-font-size-md: 0.8125rem;
673
981
 
674
982
  /* Typography */
675
- --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
676
- --font-heading: "Inter", ui-sans-serif, system-ui, sans-serif;
677
- --font-display: "Inter", ui-sans-serif, system-ui, sans-serif;
678
- --font-mono: "Geist Mono", "GeistMono", ui-monospace, Menlo, monospace;
983
+ --font-sans:
984
+ var(--font-inter), "Inter", var(--font-misans, "MiSans"), "PingFang SC", ui-sans-serif,
985
+ system-ui, -apple-system, sans-serif;
986
+ --font-cn:
987
+ var(--font-inter), "Inter", var(--font-misans, "MiSans"), "PingFang SC", ui-sans-serif,
988
+ system-ui, -apple-system, sans-serif;
989
+ --font-heading:
990
+ var(--font-inter), "Inter", var(--font-misans, "MiSans"), "PingFang SC", ui-sans-serif,
991
+ system-ui, sans-serif;
992
+ --font-display:
993
+ var(--font-inter), "Inter", var(--font-misans, "MiSans"), "PingFang SC", ui-sans-serif,
994
+ system-ui, sans-serif;
995
+ --font-mono: var(--font-geist-mono), "Geist Mono", "GeistMono", ui-monospace, Menlo, monospace;
679
996
  --font-weight-heading: 400;
680
997
 
681
998
  /* Motion */
@@ -711,18 +1028,10 @@ html[data-brand="raycast"] {
711
1028
  /**
712
1029
  * Brand carrier skin: Stripe (stripe) v1.0.0
713
1030
  * darkDefault=false dualMode=false button=solid
714
- * fonts=1 mode=global
1031
+ * fonts=0 mode=global
715
1032
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
716
1033
  */
717
1034
 
718
- /* Brand font faces */
719
- @font-face {
720
- font-family: "sohne-var";
721
- src: url("/brand-assets/sohne-var.woff2") format("woff2");
722
- font-weight: 300 400;
723
- font-display: swap;
724
- }
725
-
726
1035
  html[data-brand="stripe"] {
727
1036
  /* ── Color roles (carrier) ── */
728
1037
  --role-canvas: 0 0% 100%;
@@ -736,7 +1045,7 @@ html[data-brand="stripe"] {
736
1045
  --role-muted: 216 56% 98%;
737
1046
  --role-muted-fg: 217 17% 47%;
738
1047
  --role-border: 210 44% 93%;
739
- --role-input: 0 0% 100%;
1048
+ --role-input: 210 44% 93%;
740
1049
  --role-ring: 248 98% 61%;
741
1050
  --role-brand: 211 78% 11%;
742
1051
  --role-brand-fg: 0 0% 100%;
@@ -761,7 +1070,7 @@ html[data-brand="stripe"] {
761
1070
  --destructive: 0 72% 51%;
762
1071
  --destructive-foreground: 0 0% 100%;
763
1072
  --border: 210 44% 93%;
764
- --input: 0 0% 100%;
1073
+ --input: 210 44% 93%;
765
1074
  --ring: 248 98% 61%;
766
1075
  --info: 231 100% 73%;
767
1076
  --info-foreground: 211 78% 11%;
@@ -773,17 +1082,35 @@ html[data-brand="stripe"] {
773
1082
  --sidebar-accent-foreground: 0 0% 100%;
774
1083
  --sidebar-border: 210 44% 93%;
775
1084
  --sidebar-ring: 248 98% 61%;
1085
+ --brand-primary: hsl(211 78% 11%);
1086
+ --brand-accent: hsl(248 98% 61%);
1087
+ --brand-accent-foreground: hsl(0 0% 100%);
1088
+ --brand-tertiary: hsl(248 98% 61%);
776
1089
  --brand-gradient: hsl(var(--primary));
777
1090
  --brand-gradient-reverse: hsl(var(--primary));
778
1091
  --brand-gradient-vertical: hsl(var(--primary));
779
1092
  --brand-gradient-radial: hsl(var(--primary));
780
1093
 
1094
+ /* ── Neutral ramp, anchored on this language's roles ── */
1095
+ --neutral-1: hsl(0 0% 100%);
1096
+ --neutral-2: hsl(0 0% 100%);
1097
+ --neutral-3: color-mix(in oklab, hsl(210 44% 93%) 20%, hsl(0 0% 100%));
1098
+ --neutral-4: color-mix(in oklab, hsl(210 44% 93%) 40%, hsl(0 0% 100%));
1099
+ --neutral-5: color-mix(in oklab, hsl(210 44% 93%) 60%, hsl(0 0% 100%));
1100
+ --neutral-6: color-mix(in oklab, hsl(210 44% 93%) 80%, hsl(0 0% 100%));
1101
+ --neutral-7: hsl(210 44% 93%);
1102
+ --neutral-8: color-mix(in oklab, hsl(217 17% 47%) 25%, hsl(210 44% 93%));
1103
+ --neutral-9: color-mix(in oklab, hsl(217 17% 47%) 50%, hsl(210 44% 93%));
1104
+ --neutral-10: color-mix(in oklab, hsl(217 17% 47%) 75%, hsl(210 44% 93%));
1105
+ --neutral-11: hsl(217 17% 47%);
1106
+ --neutral-12: hsl(211 78% 11%);
1107
+
781
1108
  /* Recipe (action language + free elev/radii) */
782
1109
  /* Shape slots */
783
1110
  --btn-default-radius: 4px;
784
1111
  --radius-button: 4px;
785
1112
  --radius-buttons: 4px;
786
- --radius-md: 4px;
1113
+ --radius-md: min(4px, 4px);
787
1114
  --radius-card: 4px;
788
1115
  --radius-lg: 4px;
789
1116
  --radius-badge: 9999px;
@@ -813,9 +1140,18 @@ html[data-brand="stripe"] {
813
1140
  --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
814
1141
 
815
1142
  /* Typography */
816
- --font-sans: "sohne-var", "Inter Tight", "Inter", ui-sans-serif, system-ui, sans-serif;
817
- --font-heading: "sohne-var", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
818
- --font-display: "sohne-var", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
1143
+ --font-sans:
1144
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight", "Inter", var(--font-misans, "MiSans"),
1145
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
1146
+ --font-cn:
1147
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight", "Inter", var(--font-misans, "MiSans"),
1148
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
1149
+ --font-heading:
1150
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight", var(--font-misans, "MiSans"),
1151
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
1152
+ --font-display:
1153
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight", var(--font-misans, "MiSans"),
1154
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
819
1155
  --font-weight-heading: 300;
820
1156
 
821
1157
  /* Motion */
@@ -857,33 +1193,10 @@ html[data-brand="stripe"] {
857
1193
  /**
858
1194
  * Brand carrier skin: Vanta (vanta) v1.0.0
859
1195
  * darkDefault=false dualMode=false button=solid
860
- * fonts=3 mode=global
1196
+ * fonts=0 mode=global
861
1197
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
862
1198
  */
863
1199
 
864
- /* Brand font faces */
865
- @font-face {
866
- font-family: "Inter Variable";
867
- src: url("https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2")
868
- format("woff2");
869
- font-weight: 100 900;
870
- font-display: swap;
871
- }
872
-
873
- @font-face {
874
- font-family: "Reckless";
875
- src: url("/brand-assets/reckless-regular.woff2") format("woff2");
876
- font-weight: 400;
877
- font-display: swap;
878
- }
879
-
880
- @font-face {
881
- font-family: "Reckless";
882
- src: url("/brand-assets/reckless-medium.woff2") format("woff2");
883
- font-weight: 500;
884
- font-display: swap;
885
- }
886
-
887
1200
  html[data-brand="vanta"] {
888
1201
  /* ── Color roles (carrier) ── */
889
1202
  --role-canvas: 220 23% 97%;
@@ -897,7 +1210,7 @@ html[data-brand="vanta"] {
897
1210
  --role-muted: 240 20% 93%;
898
1211
  --role-muted-fg: 238 11% 48%;
899
1212
  --role-border: 240 17% 11%;
900
- --role-input: 0 0% 100%;
1213
+ --role-input: 240 17% 11%;
901
1214
  --role-ring: 268 95% 39%;
902
1215
  --role-brand: 272 100% 14%;
903
1216
  --role-brand-fg: 0 0% 100%;
@@ -922,7 +1235,7 @@ html[data-brand="vanta"] {
922
1235
  --destructive: 0 72% 51%;
923
1236
  --destructive-foreground: 0 0% 100%;
924
1237
  --border: 240 17% 11%;
925
- --input: 0 0% 100%;
1238
+ --input: 240 17% 11%;
926
1239
  --ring: 268 95% 39%;
927
1240
  --warning: 44 100% 53%;
928
1241
  --warning-foreground: 240 17% 11%;
@@ -936,17 +1249,35 @@ html[data-brand="vanta"] {
936
1249
  --sidebar-accent-foreground: 0 0% 100%;
937
1250
  --sidebar-border: 240 17% 11%;
938
1251
  --sidebar-ring: 268 95% 39%;
1252
+ --brand-primary: hsl(272 100% 14%);
1253
+ --brand-accent: hsl(268 95% 39%);
1254
+ --brand-accent-foreground: hsl(0 0% 100%);
1255
+ --brand-tertiary: hsl(268 95% 39%);
939
1256
  --brand-gradient: hsl(var(--primary));
940
1257
  --brand-gradient-reverse: hsl(var(--primary));
941
1258
  --brand-gradient-vertical: hsl(var(--primary));
942
1259
  --brand-gradient-radial: hsl(var(--primary));
943
1260
 
1261
+ /* ── Neutral ramp, anchored on this language's roles ── */
1262
+ --neutral-1: hsl(220 23% 97%);
1263
+ --neutral-2: hsl(0 0% 100%);
1264
+ --neutral-3: color-mix(in oklab, hsl(240 17% 11%) 20%, hsl(0 0% 100%));
1265
+ --neutral-4: color-mix(in oklab, hsl(240 17% 11%) 40%, hsl(0 0% 100%));
1266
+ --neutral-5: color-mix(in oklab, hsl(240 17% 11%) 60%, hsl(0 0% 100%));
1267
+ --neutral-6: color-mix(in oklab, hsl(240 17% 11%) 80%, hsl(0 0% 100%));
1268
+ --neutral-7: hsl(240 17% 11%);
1269
+ --neutral-8: color-mix(in oklab, hsl(238 11% 48%) 25%, hsl(240 17% 11%));
1270
+ --neutral-9: color-mix(in oklab, hsl(238 11% 48%) 50%, hsl(240 17% 11%));
1271
+ --neutral-10: color-mix(in oklab, hsl(238 11% 48%) 75%, hsl(240 17% 11%));
1272
+ --neutral-11: hsl(238 11% 48%);
1273
+ --neutral-12: hsl(240 17% 11%);
1274
+
944
1275
  /* Recipe (action language + free elev/radii) */
945
1276
  /* Shape slots */
946
1277
  --btn-default-radius: 999px;
947
1278
  --radius-button: 999px;
948
1279
  --radius-buttons: 999px;
949
- --radius-md: 999px;
1280
+ --radius-md: min(999px, 16px);
950
1281
  --radius-card: 16px;
951
1282
  --radius-lg: 16px;
952
1283
  --radius-badge: 999px;
@@ -976,9 +1307,18 @@ html[data-brand="vanta"] {
976
1307
  --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
977
1308
 
978
1309
  /* Typography */
979
- --font-sans: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
980
- --font-heading: "Reckless", "Source Serif 4", "Lora", ui-serif, Georgia, serif;
981
- --font-display: "Reckless", "Source Serif 4", "Lora", ui-serif, Georgia, serif;
1310
+ --font-sans:
1311
+ var(--font-inter), "Inter Variable", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
1312
+ ui-sans-serif, system-ui, sans-serif;
1313
+ --font-cn:
1314
+ var(--font-inter), "Inter Variable", "Inter", var(--font-misans, "MiSans"), "PingFang SC",
1315
+ ui-sans-serif, system-ui, sans-serif;
1316
+ --font-heading:
1317
+ var(--font-reg-source-serif-4), "Reckless", "Source Serif 4", "Lora",
1318
+ var(--font-misans, "MiSans"), "PingFang SC", ui-serif, Georgia, serif;
1319
+ --font-display:
1320
+ var(--font-reg-source-serif-4), "Reckless", "Source Serif 4", "Lora",
1321
+ var(--font-misans, "MiSans"), "PingFang SC", ui-serif, Georgia, serif;
982
1322
  --font-weight-heading: 500;
983
1323
 
984
1324
  /* Motion */
@@ -1017,19 +1357,10 @@ html[data-brand="vanta"] {
1017
1357
  /**
1018
1358
  * Brand carrier skin: Vercel (vercel) v1.0.0
1019
1359
  * darkDefault=false dualMode=true button=solid
1020
- * fonts=1 mode=global
1360
+ * fonts=0 mode=global
1021
1361
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
1022
1362
  */
1023
1363
 
1024
- /* Brand font faces */
1025
- @font-face {
1026
- font-family: "Geist Sans";
1027
- src: url("https://cdn.jsdelivr.net/fontsource/fonts/geist-sans:vf@latest/latin-wght-normal.woff2")
1028
- format("woff2");
1029
- font-weight: 100 900;
1030
- font-display: swap;
1031
- }
1032
-
1033
1364
  html[data-brand="vercel"] {
1034
1365
  /* ── Color roles (carrier) ── */
1035
1366
  --role-canvas: 0 0% 98%;
@@ -1043,7 +1374,7 @@ html[data-brand="vercel"] {
1043
1374
  --role-muted: 0 0% 92%;
1044
1375
  --role-muted-fg: 0 0% 40%;
1045
1376
  --role-border: 0 0% 92%;
1046
- --role-input: 0 0% 100%;
1377
+ --role-input: 0 0% 92%;
1047
1378
  --role-ring: 0 0% 9%;
1048
1379
 
1049
1380
  /* ── shadcn bridge (primary = action CTA) ── */
@@ -1064,7 +1395,7 @@ html[data-brand="vercel"] {
1064
1395
  --destructive: 0 72% 51%;
1065
1396
  --destructive-foreground: 0 0% 100%;
1066
1397
  --border: 0 0% 92%;
1067
- --input: 0 0% 100%;
1398
+ --input: 0 0% 92%;
1068
1399
  --ring: 0 0% 9%;
1069
1400
  --success: 133 50% 32%;
1070
1401
  --success-foreground: 0 0% 100%;
@@ -1078,17 +1409,35 @@ html[data-brand="vercel"] {
1078
1409
  --sidebar-accent-foreground: 0 0% 30%;
1079
1410
  --sidebar-border: 0 0% 92%;
1080
1411
  --sidebar-ring: 0 0% 9%;
1412
+ --brand-primary: hsl(0 0% 9%);
1413
+ --brand-accent: hsl(0 0% 9%);
1414
+ --brand-accent-foreground: hsl(0 0% 100%);
1415
+ --brand-tertiary: hsl(0 0% 9%);
1081
1416
  --brand-gradient: hsl(var(--primary));
1082
1417
  --brand-gradient-reverse: hsl(var(--primary));
1083
1418
  --brand-gradient-vertical: hsl(var(--primary));
1084
1419
  --brand-gradient-radial: hsl(var(--primary));
1085
1420
 
1421
+ /* ── Neutral ramp, anchored on this language's roles ── */
1422
+ --neutral-1: hsl(0 0% 98%);
1423
+ --neutral-2: hsl(0 0% 100%);
1424
+ --neutral-3: color-mix(in oklab, hsl(0 0% 92%) 20%, hsl(0 0% 100%));
1425
+ --neutral-4: color-mix(in oklab, hsl(0 0% 92%) 40%, hsl(0 0% 100%));
1426
+ --neutral-5: color-mix(in oklab, hsl(0 0% 92%) 60%, hsl(0 0% 100%));
1427
+ --neutral-6: color-mix(in oklab, hsl(0 0% 92%) 80%, hsl(0 0% 100%));
1428
+ --neutral-7: hsl(0 0% 92%);
1429
+ --neutral-8: color-mix(in oklab, hsl(0 0% 40%) 25%, hsl(0 0% 92%));
1430
+ --neutral-9: color-mix(in oklab, hsl(0 0% 40%) 50%, hsl(0 0% 92%));
1431
+ --neutral-10: color-mix(in oklab, hsl(0 0% 40%) 75%, hsl(0 0% 92%));
1432
+ --neutral-11: hsl(0 0% 40%);
1433
+ --neutral-12: hsl(0 0% 9%);
1434
+
1086
1435
  /* Recipe (action language + free elev/radii) */
1087
1436
  /* Shape slots */
1088
1437
  --btn-default-radius: 6px;
1089
1438
  --radius-button: 6px;
1090
1439
  --radius-buttons: 6px;
1091
- --radius-md: 6px;
1440
+ --radius-md: min(6px, 6px);
1092
1441
  --radius-card: 6px;
1093
1442
  --radius-lg: 6px;
1094
1443
  --radius-badge: 6px;
@@ -1128,10 +1477,19 @@ html[data-brand="vercel"] {
1128
1477
  --control-font-size-md: 0.8125rem;
1129
1478
 
1130
1479
  /* Typography */
1131
- --font-sans: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
1132
- --font-heading: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
1133
- --font-display: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
1134
- --font-mono: "Geist Mono", ui-monospace, Menlo, monospace;
1480
+ --font-sans:
1481
+ var(--font-geist-sans), "Geist Sans", "Geist", var(--font-misans, "MiSans"), "PingFang SC",
1482
+ ui-sans-serif, system-ui, sans-serif;
1483
+ --font-cn:
1484
+ var(--font-geist-sans), "Geist Sans", "Geist", var(--font-misans, "MiSans"), "PingFang SC",
1485
+ ui-sans-serif, system-ui, sans-serif;
1486
+ --font-heading:
1487
+ var(--font-geist-sans), "Geist Sans", "Geist", var(--font-misans, "MiSans"), "PingFang SC",
1488
+ ui-sans-serif, system-ui, sans-serif;
1489
+ --font-display:
1490
+ var(--font-geist-sans), "Geist Sans", "Geist", var(--font-misans, "MiSans"), "PingFang SC",
1491
+ ui-sans-serif, system-ui, sans-serif;
1492
+ --font-mono: var(--font-geist-mono), "Geist Mono", ui-monospace, Menlo, monospace;
1135
1493
  --font-weight-heading: 450;
1136
1494
 
1137
1495
  /* Motion */
@@ -1175,7 +1533,7 @@ html.dark[data-brand="vercel"] {
1175
1533
  --role-muted: 0 0% 12%;
1176
1534
  --role-muted-fg: 0 0% 63%;
1177
1535
  --role-border: 0 0% 16%;
1178
- --role-input: 0 0% 4%;
1536
+ --role-input: 0 0% 16%;
1179
1537
  --role-ring: 0 0% 100%;
1180
1538
 
1181
1539
  /* ── shadcn bridge (primary = action CTA) ── */
@@ -1196,7 +1554,7 @@ html.dark[data-brand="vercel"] {
1196
1554
  --destructive: 0 72% 51%;
1197
1555
  --destructive-foreground: 0 0% 100%;
1198
1556
  --border: 0 0% 16%;
1199
- --input: 0 0% 4%;
1557
+ --input: 0 0% 16%;
1200
1558
  --ring: 0 0% 100%;
1201
1559
  --success: 133 49% 40%;
1202
1560
  --success-foreground: 0 0% 100%;
@@ -1210,8 +1568,26 @@ html.dark[data-brand="vercel"] {
1210
1568
  --sidebar-accent-foreground: 0 0% 93%;
1211
1569
  --sidebar-border: 0 0% 16%;
1212
1570
  --sidebar-ring: 0 0% 100%;
1571
+ --brand-primary: hsl(0 0% 100%);
1572
+ --brand-accent: hsl(0 0% 100%);
1573
+ --brand-accent-foreground: hsl(0 0% 0%);
1574
+ --brand-tertiary: hsl(0 0% 100%);
1213
1575
  --brand-gradient: hsl(var(--primary));
1214
1576
  --brand-gradient-reverse: hsl(var(--primary));
1215
1577
  --brand-gradient-vertical: hsl(var(--primary));
1216
1578
  --brand-gradient-radial: hsl(var(--primary));
1579
+
1580
+ /* ── Neutral ramp, anchored on this language's roles ── */
1581
+ --neutral-1: hsl(0 0% 0%);
1582
+ --neutral-2: hsl(0 0% 4%);
1583
+ --neutral-3: color-mix(in oklab, hsl(0 0% 16%) 20%, hsl(0 0% 4%));
1584
+ --neutral-4: color-mix(in oklab, hsl(0 0% 16%) 40%, hsl(0 0% 4%));
1585
+ --neutral-5: color-mix(in oklab, hsl(0 0% 16%) 60%, hsl(0 0% 4%));
1586
+ --neutral-6: color-mix(in oklab, hsl(0 0% 16%) 80%, hsl(0 0% 4%));
1587
+ --neutral-7: hsl(0 0% 16%);
1588
+ --neutral-8: color-mix(in oklab, hsl(0 0% 63%) 25%, hsl(0 0% 16%));
1589
+ --neutral-9: color-mix(in oklab, hsl(0 0% 63%) 50%, hsl(0 0% 16%));
1590
+ --neutral-10: color-mix(in oklab, hsl(0 0% 63%) 75%, hsl(0 0% 16%));
1591
+ --neutral-11: hsl(0 0% 63%);
1592
+ --neutral-12: hsl(0 0% 93%);
1217
1593
  }