@nebutra/tokens 0.1.2 → 2.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/brands/README.md +66 -0
  3. package/brands/cosmos/DESIGN.md +356 -0
  4. package/brands/cosmos/brand.json +209 -0
  5. package/brands/cosmos/refero-tokens.json +312 -0
  6. package/brands/gsap/brand.json +18 -91
  7. package/brands/linear/DESIGN.md +478 -0
  8. package/brands/linear/brand.json +20 -76
  9. package/brands/notion/brand.json +20 -90
  10. package/brands/raycast/brand.json +19 -81
  11. package/brands/stripe/brand.json +17 -88
  12. package/brands/vanta/brand.json +17 -101
  13. package/brands/vercel/brand.json +17 -68
  14. package/dist/brand-package/index.d.ts +123 -0
  15. package/dist/brand-package/index.js +2316 -0
  16. package/dist/brand-package/index.js.map +1 -0
  17. package/dist/brand-package/use-brand.d.ts +2 -0
  18. package/dist/brand-package/use-brand.js +963 -0
  19. package/dist/brand-package/use-brand.js.map +1 -0
  20. package/dist/index.d.ts +81 -0
  21. package/dist/index.js +2581 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/use-brand-ClmvK_lC.d.ts +387 -0
  24. package/package.json +41 -10
  25. package/recipe.css +330 -1
  26. package/skins/README.md +2 -4
  27. package/skins/cosmos.css +239 -0
  28. package/skins/gsap.css +62 -138
  29. package/skins/linear.css +85 -132
  30. package/skins/notion.css +62 -141
  31. package/skins/raycast.css +68 -137
  32. package/skins/stripe.css +60 -143
  33. package/skins/vanta.css +60 -151
  34. package/skins/vercel.css +83 -128
  35. package/styles.css +477 -115
  36. package/.turbo/turbo-build.log +0 -8
  37. package/.turbo/turbo-typecheck.log +0 -4
  38. package/AGENTS.md +0 -45
  39. package/DESIGN.md +0 -357
  40. package/scripts/compile-brand-run.ts +0 -79
  41. package/scripts/compile-brand.mjs +0 -25
  42. package/scripts/emit-skins-run.ts +0 -62
  43. package/scripts/emit-skins.mjs +0 -31
  44. package/scripts/sync-styles.mjs +0 -29
  45. package/src/brand-package/__tests__/compile-refero.test.ts +0 -427
  46. package/src/brand-package/__tests__/emit-css.test.ts +0 -130
  47. package/src/brand-package/apply-brand.ts +0 -92
  48. package/src/brand-package/compile-helpers.ts +0 -170
  49. package/src/brand-package/compile-refero.ts +0 -69
  50. package/src/brand-package/emit-css.ts +0 -468
  51. package/src/brand-package/hex-to-hsl.ts +0 -100
  52. package/src/brand-package/index.ts +0 -71
  53. package/src/brand-package/infer-recipe.ts +0 -198
  54. package/src/brand-package/normalize.ts +0 -295
  55. package/src/brand-package/presets/context.ts +0 -17
  56. package/src/brand-package/presets/generic.ts +0 -214
  57. package/src/brand-package/presets/gsap.ts +0 -146
  58. package/src/brand-package/presets/index.ts +0 -31
  59. package/src/brand-package/presets/linear.ts +0 -183
  60. package/src/brand-package/presets/notion.ts +0 -208
  61. package/src/brand-package/presets/raycast.ts +0 -138
  62. package/src/brand-package/presets/recipe.ts +0 -61
  63. package/src/brand-package/presets/stripe.ts +0 -207
  64. package/src/brand-package/presets/vanta.ts +0 -220
  65. package/src/brand-package/presets/vercel.ts +0 -187
  66. package/src/brand-package/types.ts +0 -285
  67. package/src/brand-package/use-brand.ts +0 -207
  68. package/src/brand-package/validate.ts +0 -108
  69. package/src/index.ts +0 -67
  70. package/src/theme-provider.tsx +0 -246
  71. package/tsconfig.json +0 -11
  72. package/turbo.json +0 -15
package/skins/gsap.css CHANGED
@@ -1,25 +1,10 @@
1
1
  /**
2
2
  * Brand carrier skin: GSAP (gsap) v1.0.0
3
3
  * darkDefault=true dualMode=false button=gradient-stroke
4
- * fonts=2 zones=yes mode=global
4
+ * fonts=0 mode=global
5
5
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
6
6
  */
7
7
 
8
- /* Brand font faces */
9
- @font-face {
10
- font-family: "Mori";
11
- src: url("/brand-assets/mori-regular.woff2") format("woff2");
12
- font-weight: 400;
13
- font-display: swap;
14
- }
15
-
16
- @font-face {
17
- font-family: "Mori";
18
- src: url("/brand-assets/mori-semibold.woff2") format("woff2");
19
- font-weight: 600;
20
- font-display: swap;
21
- }
22
-
23
8
  :root,
24
9
  .dark,
25
10
  html[data-brand="gsap"] {
@@ -70,17 +55,35 @@ html[data-brand="gsap"] {
70
55
  --sidebar-accent-foreground: 54 100% 94%;
71
56
  --sidebar-border: 70 5% 25%;
72
57
  --sidebar-ring: 137 92% 47%;
58
+ --brand-primary: hsl(137 92% 47%);
59
+ --brand-accent: hsl(137 92% 47%);
60
+ --brand-accent-foreground: hsl(150 7% 6%);
61
+ --brand-tertiary: hsl(137 92% 47%);
73
62
  --brand-gradient: hsl(var(--primary));
74
63
  --brand-gradient-reverse: hsl(var(--primary));
75
64
  --brand-gradient-vertical: hsl(var(--primary));
76
65
  --brand-gradient-radial: hsl(var(--primary));
77
66
 
67
+ /* ── Neutral ramp, anchored on this language's roles ── */
68
+ --neutral-1: hsl(150 7% 6%);
69
+ --neutral-2: hsl(0 0% 10%);
70
+ --neutral-3: color-mix(in oklab, hsl(70 5% 25%) 20%, hsl(0 0% 10%));
71
+ --neutral-4: color-mix(in oklab, hsl(70 5% 25%) 40%, hsl(0 0% 10%));
72
+ --neutral-5: color-mix(in oklab, hsl(70 5% 25%) 60%, hsl(0 0% 10%));
73
+ --neutral-6: color-mix(in oklab, hsl(70 5% 25%) 80%, hsl(0 0% 10%));
74
+ --neutral-7: hsl(70 5% 25%);
75
+ --neutral-8: color-mix(in oklab, hsl(60 6% 46%) 25%, hsl(70 5% 25%));
76
+ --neutral-9: color-mix(in oklab, hsl(60 6% 46%) 50%, hsl(70 5% 25%));
77
+ --neutral-10: color-mix(in oklab, hsl(60 6% 46%) 75%, hsl(70 5% 25%));
78
+ --neutral-11: hsl(60 6% 46%);
79
+ --neutral-12: hsl(54 100% 94%);
80
+
78
81
  /* Recipe (action language + free elev/radii) */
79
82
  /* Shape slots */
80
83
  --btn-default-radius: 100px;
81
84
  --radius-button: 100px;
82
85
  --radius-buttons: 100px;
83
- --radius-md: 100px;
86
+ --radius-md: min(100px, 8px);
84
87
  --radius-card: 8px;
85
88
  --radius-lg: 8px;
86
89
  --radius-badge: 9999px;
@@ -93,10 +96,10 @@ html[data-brand="gsap"] {
93
96
  --elevation-card: 0 0 #0000;
94
97
  --elevation-control: 0 0 #0000;
95
98
  --elevation-raised: 0 0 #0000;
96
- --shadow-xs: 0 0 #0000;
97
- --shadow-sm: 0 0 #0000;
98
- --shadow-md: 0 0 #0000;
99
- --shadow-lg: 0 0 #0000;
99
+ --elevation-xs: 0 0 #0000;
100
+ --elevation-sm: 0 0 #0000;
101
+ --elevation-md: 0 0 #0000;
102
+ --elevation-lg: 0 0 #0000;
100
103
  --btn-default-shadow: 0 0 #0000;
101
104
  --btn-default-bg: transparent;
102
105
  --btn-default-fg: hsl(var(--foreground));
@@ -114,52 +117,49 @@ html[data-brand="gsap"] {
114
117
  --control-height-sm: 1.75rem;
115
118
  --control-height-md: 2rem;
116
119
  --control-height-lg: 2.5rem;
120
+ --control-height-icon-sm: 1.5rem;
121
+ --control-height-icon-md: 1.75rem;
122
+ --control-height-icon-lg: 2rem;
117
123
  --control-font-size-md: 0.8125rem;
118
124
 
119
125
  /* Typography */
120
- --font-sans: "Mori", "Inter Tight", "DM Sans", ui-sans-serif, system-ui, sans-serif;
121
- --font-heading: "Mori", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
122
- --font-display: "Mori", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
126
+ --font-sans:
127
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", "DM Sans",
128
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-sans-serif, system-ui, sans-serif;
129
+ --font-cn:
130
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", "DM Sans",
131
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-sans-serif, system-ui, sans-serif;
132
+ --font-heading:
133
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", var(--font-noto-sans-sc, "Noto Sans SC"),
134
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
135
+ --font-display:
136
+ var(--font-reg-inter-tight), "Mori", "Inter Tight", var(--font-noto-sans-sc, "Noto Sans SC"),
137
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
123
138
  --font-weight-heading: 600;
124
139
 
125
- /* Zone type scales */
126
- --zone-product-caption-size: 14px;
127
- --zone-product-caption-leading: 1.4;
128
- --zone-product-caption-tracking: -0.14px;
129
- --zone-product-caption-weight: 400;
130
- --zone-product-body-sm-size: 16px;
131
- --zone-product-body-sm-leading: 1.15;
132
- --zone-product-body-sm-weight: 400;
133
- --zone-product-body-size: 19px;
134
- --zone-product-body-leading: 1.15;
135
- --zone-product-body-weight: 400;
136
- --zone-product-body-lg-size: 23px;
137
- --zone-product-body-lg-leading: 1.38;
138
- --zone-product-body-lg-tracking: -0.23px;
139
- --zone-product-body-lg-weight: 400;
140
- --zone-product-subheading-size: 34px;
141
- --zone-product-subheading-leading: 1.2;
142
- --zone-product-subheading-tracking: -0.34px;
143
- --zone-product-subheading-weight: 400;
144
- --zone-product-heading-size: 44px;
145
- --zone-product-heading-leading: 1.2;
146
- --zone-product-heading-tracking: -0.44px;
147
- --zone-product-heading-weight: 600;
148
- --zone-marketing-body-size: 19px;
149
- --zone-marketing-body-leading: 1.15;
150
- --zone-marketing-body-weight: 400;
151
- --zone-marketing-heading-size: 66px;
152
- --zone-marketing-heading-leading: 1.2;
153
- --zone-marketing-heading-tracking: -0.66px;
154
- --zone-marketing-heading-weight: 600;
155
- --zone-marketing-heading-lg-size: 101px;
156
- --zone-marketing-heading-lg-leading: 1;
157
- --zone-marketing-heading-lg-tracking: -1.11px;
158
- --zone-marketing-heading-lg-weight: 600;
159
- --zone-marketing-display-size: 224px;
160
- --zone-marketing-display-leading: 0.9;
161
- --zone-marketing-display-tracking: -4.48px;
162
- --zone-marketing-display-weight: 600;
140
+ /* Motion */
141
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
142
+ --motion-ease-out: cubic-bezier(0.22, 1, 0.36, 1);
143
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
144
+ --motion-ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
145
+ --ease-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
146
+ --motion-ease-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
147
+ --duration-micro: 120ms;
148
+ --motion-duration-micro: 120ms;
149
+ --duration-flow: 250ms;
150
+ --motion-duration-flow: 250ms;
151
+ --duration-reveal: 400ms;
152
+ --motion-duration-reveal: 400ms;
153
+ --duration-cinematic: 700ms;
154
+ --motion-duration-cinematic: 700ms;
155
+
156
+ /* Spacing */
157
+ --space-source-xs: 0.5rem;
158
+ --space-source-sm: 0.875rem;
159
+ --space-source-md: 1.25rem;
160
+ --space-source-lg: 1.75rem;
161
+ --space-source-xl: 2.5rem;
162
+ --space-source-2xl: 3.5rem;
163
163
 
164
164
  /* Taxonomy / decorative (not product CTA) */
165
165
  --brand-category-gsap: #0ae448;
@@ -169,79 +169,3 @@ html[data-brand="gsap"] {
169
169
  --brand-category-ui: #00bae2;
170
170
  --brand-category-other: #abff84;
171
171
  }
172
-
173
- /* Zone: product — product never inherits marketing display */
174
- [data-zone="product"],
175
- .zone-product {
176
- font-size: var(--zone-product-body-size, 19px);
177
- line-height: var(--zone-product-body-leading, 1.15);
178
- font-weight: var(--zone-product-body-weight, 400);
179
- --text-caption: var(--zone-product-caption-size, inherit);
180
- --leading-caption: var(--zone-product-caption-leading, inherit);
181
- --tracking-caption: var(--zone-product-caption-tracking, inherit);
182
- --text-body-sm: var(--zone-product-body-sm-size, inherit);
183
- --leading-body-sm: var(--zone-product-body-sm-leading, inherit);
184
- --tracking-body-sm: var(--zone-product-body-sm-tracking, inherit);
185
- --text-body: var(--zone-product-body-size, inherit);
186
- --leading-body: var(--zone-product-body-leading, inherit);
187
- --tracking-body: var(--zone-product-body-tracking, inherit);
188
- --text-body-lg: var(--zone-product-body-lg-size, inherit);
189
- --leading-body-lg: var(--zone-product-body-lg-leading, inherit);
190
- --tracking-body-lg: var(--zone-product-body-lg-tracking, inherit);
191
- --text-subheading: var(--zone-product-subheading-size, inherit);
192
- --leading-subheading: var(--zone-product-subheading-leading, inherit);
193
- --tracking-subheading: var(--zone-product-subheading-tracking, inherit);
194
- --text-heading-sm: var(--zone-product-heading-sm-size, inherit);
195
- --leading-heading-sm: var(--zone-product-heading-sm-leading, inherit);
196
- --tracking-heading-sm: var(--zone-product-heading-sm-tracking, inherit);
197
- --text-heading: var(--zone-product-heading-size, inherit);
198
- --leading-heading: var(--zone-product-heading-leading, inherit);
199
- --tracking-heading: var(--zone-product-heading-tracking, inherit);
200
- --text-heading-lg: var(--zone-product-heading-lg-size, inherit);
201
- --leading-heading-lg: var(--zone-product-heading-lg-leading, inherit);
202
- --tracking-heading-lg: var(--zone-product-heading-lg-tracking, inherit);
203
- --text-display: var(--zone-product-display-size, var(--zone-product-heading-size, inherit));
204
- --leading-display: var(--zone-product-display-leading, inherit);
205
- --tracking-display: var(--zone-product-display-tracking, inherit);
206
- }
207
-
208
- /* Zone: marketing — product never inherits marketing display */
209
- [data-zone="marketing"],
210
- .zone-marketing {
211
- font-size: var(--zone-marketing-body-size, 19px);
212
- line-height: var(--zone-marketing-body-leading, 1.15);
213
- font-weight: var(--zone-marketing-body-weight, 400);
214
- --text-caption: var(--zone-marketing-caption-size, inherit);
215
- --leading-caption: var(--zone-marketing-caption-leading, inherit);
216
- --tracking-caption: var(--zone-marketing-caption-tracking, inherit);
217
- --text-body-sm: var(--zone-marketing-body-sm-size, inherit);
218
- --leading-body-sm: var(--zone-marketing-body-sm-leading, inherit);
219
- --tracking-body-sm: var(--zone-marketing-body-sm-tracking, inherit);
220
- --text-body: var(--zone-marketing-body-size, inherit);
221
- --leading-body: var(--zone-marketing-body-leading, inherit);
222
- --tracking-body: var(--zone-marketing-body-tracking, inherit);
223
- --text-body-lg: var(--zone-marketing-body-lg-size, inherit);
224
- --leading-body-lg: var(--zone-marketing-body-lg-leading, inherit);
225
- --tracking-body-lg: var(--zone-marketing-body-lg-tracking, inherit);
226
- --text-subheading: var(--zone-marketing-subheading-size, inherit);
227
- --leading-subheading: var(--zone-marketing-subheading-leading, inherit);
228
- --tracking-subheading: var(--zone-marketing-subheading-tracking, inherit);
229
- --text-heading-sm: var(--zone-marketing-heading-sm-size, inherit);
230
- --leading-heading-sm: var(--zone-marketing-heading-sm-leading, inherit);
231
- --tracking-heading-sm: var(--zone-marketing-heading-sm-tracking, inherit);
232
- --text-heading: var(--zone-marketing-heading-size, inherit);
233
- --leading-heading: var(--zone-marketing-heading-leading, inherit);
234
- --tracking-heading: var(--zone-marketing-heading-tracking, inherit);
235
- --text-heading-lg: var(--zone-marketing-heading-lg-size, inherit);
236
- --leading-heading-lg: var(--zone-marketing-heading-lg-leading, inherit);
237
- --tracking-heading-lg: var(--zone-marketing-heading-lg-tracking, inherit);
238
- --text-display: var(--zone-marketing-display-size, inherit);
239
- --leading-display: var(--zone-marketing-display-leading, inherit);
240
- --tracking-display: var(--zone-marketing-display-tracking, inherit);
241
- }
242
-
243
- /* Product chrome must not use decorative gradients as action fills */
244
- [data-zone="product"] .btn-brand-default,
245
- .zone-product .btn-brand-default {
246
- /* intentional no-op: documents contract; action uses --primary only */
247
- }
package/skins/linear.css CHANGED
@@ -1,19 +1,10 @@
1
1
  /**
2
2
  * Brand carrier skin: Linear (linear) v1.0.0
3
3
  * darkDefault=true dualMode=true button=solid
4
- * fonts=1 zones=yes mode=global
4
+ * fonts=0 mode=global
5
5
  * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
6
6
  */
7
7
 
8
- /* Brand font faces */
9
- @font-face {
10
- font-family: "Inter Variable";
11
- src: url("https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2")
12
- format("woff2");
13
- font-weight: 100 900;
14
- font-display: swap;
15
- }
16
-
17
8
  :root,
18
9
  html[data-brand="linear"] {
19
10
  /* ── Color roles (carrier) ── */
@@ -28,7 +19,7 @@ html[data-brand="linear"] {
28
19
  --role-muted: 220 14% 96%;
29
20
  --role-muted-fg: 218 5% 41%;
30
21
  --role-border: 220 13% 91%;
31
- --role-input: 0 0% 100%;
22
+ --role-input: 220 13% 91%;
32
23
  --role-ring: 64 89% 54%;
33
24
 
34
25
  /* ── shadcn bridge (primary = action CTA) ── */
@@ -49,7 +40,7 @@ html[data-brand="linear"] {
49
40
  --destructive: 0 79% 63%;
50
41
  --destructive-foreground: 0 0% 100%;
51
42
  --border: 220 13% 91%;
52
- --input: 0 0% 100%;
43
+ --input: 220 13% 91%;
53
44
  --ring: 64 89% 54%;
54
45
  --success: 134 62% 40%;
55
46
  --success-foreground: 0 0% 100%;
@@ -63,17 +54,35 @@ html[data-brand="linear"] {
63
54
  --sidebar-accent-foreground: 210 11% 4%;
64
55
  --sidebar-border: 220 13% 91%;
65
56
  --sidebar-ring: 64 89% 54%;
57
+ --brand-primary: hsl(64 89% 54%);
58
+ --brand-accent: hsl(64 89% 54%);
59
+ --brand-accent-foreground: hsl(210 11% 4%);
60
+ --brand-tertiary: hsl(64 89% 54%);
66
61
  --brand-gradient: hsl(var(--primary));
67
62
  --brand-gradient-reverse: hsl(var(--primary));
68
63
  --brand-gradient-vertical: hsl(var(--primary));
69
64
  --brand-gradient-radial: hsl(var(--primary));
70
65
 
66
+ /* ── Neutral ramp, anchored on this language's roles ── */
67
+ --neutral-1: hsl(0 0% 100%);
68
+ --neutral-2: hsl(0 0% 98%);
69
+ --neutral-3: color-mix(in oklab, hsl(220 13% 91%) 20%, hsl(0 0% 98%));
70
+ --neutral-4: color-mix(in oklab, hsl(220 13% 91%) 40%, hsl(0 0% 98%));
71
+ --neutral-5: color-mix(in oklab, hsl(220 13% 91%) 60%, hsl(0 0% 98%));
72
+ --neutral-6: color-mix(in oklab, hsl(220 13% 91%) 80%, hsl(0 0% 98%));
73
+ --neutral-7: hsl(220 13% 91%);
74
+ --neutral-8: color-mix(in oklab, hsl(218 5% 41%) 25%, hsl(220 13% 91%));
75
+ --neutral-9: color-mix(in oklab, hsl(218 5% 41%) 50%, hsl(220 13% 91%));
76
+ --neutral-10: color-mix(in oklab, hsl(218 5% 41%) 75%, hsl(220 13% 91%));
77
+ --neutral-11: hsl(218 5% 41%);
78
+ --neutral-12: hsl(210 11% 4%);
79
+
71
80
  /* Recipe (action language + free elev/radii) */
72
81
  /* Shape slots */
73
82
  --btn-default-radius: 6px;
74
83
  --radius-button: 6px;
75
84
  --radius-buttons: 6px;
76
- --radius-md: 6px;
85
+ --radius-md: min(6px, 12px);
77
86
  --radius-card: 12px;
78
87
  --radius-lg: 12px;
79
88
  --radius-badge: 9999px;
@@ -83,19 +92,19 @@ html[data-brand="linear"] {
83
92
  --radius-pill: 9999px;
84
93
 
85
94
  /* Free elevation (carrier-provided CSS shadows) */
86
- --elevation-card: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
87
- --elevation-control: var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.04));
88
- --elevation-raised: var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));
89
- --shadow-xs: var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.04));
90
- --shadow-sm: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
91
- --shadow-md: var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));
92
- --shadow-lg: var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));
95
+ --elevation-card: 0 1px 2px 0 rgb(0 0 0 / 0.05);
96
+ --elevation-control: 0 1px 2px 0 rgb(0 0 0 / 0.04);
97
+ --elevation-raised: 0 4px 6px -1px rgb(0 0 0 / 0.1);
98
+ --elevation-xs: 0 1px 2px 0 rgb(0 0 0 / 0.04);
99
+ --elevation-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
100
+ --elevation-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
101
+ --elevation-lg: 0 4px 6px -1px rgb(0 0 0 / 0.1);
93
102
  --btn-default-shadow: 0 0 #0000;
94
103
  --btn-default-bg: hsl(var(--primary));
95
104
  --btn-default-fg: hsl(var(--primary-foreground));
96
105
  --btn-default-border-width: 0px;
97
106
  --btn-default-border: transparent;
98
- --btn-default-stroke-gradient: transparent;
107
+ --btn-default-stroke-gradient: linear-gradient(transparent, transparent);
99
108
  --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
100
109
  --badge-default-bg: hsl(var(--primary));
101
110
  --badge-default-fg: hsl(var(--primary-foreground));
@@ -107,47 +116,49 @@ html[data-brand="linear"] {
107
116
  --control-height-sm: 1.75rem;
108
117
  --control-height-md: 2rem;
109
118
  --control-height-lg: 2.5rem;
119
+ --control-height-icon-sm: 1.5rem;
120
+ --control-height-icon-md: 1.75rem;
121
+ --control-height-icon-lg: 2rem;
110
122
  --control-font-size-md: 0.8125rem;
111
123
 
112
124
  /* Typography */
113
- --font-sans: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
114
- --font-heading: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
115
- --font-display: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
116
- --font-mono: "Berkeley Mono", "JetBrains Mono", ui-monospace, monospace;
125
+ --font-sans:
126
+ var(--font-inter), "Inter Variable", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
127
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
128
+ --font-cn:
129
+ var(--font-inter), "Inter Variable", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
130
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
131
+ --font-heading:
132
+ var(--font-inter), "Inter Variable", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
133
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
134
+ --font-display:
135
+ var(--font-inter), "Inter Variable", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
136
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
137
+ --font-mono:
138
+ var(--font-jetbrains-mono), "Berkeley Mono", "JetBrains Mono", ui-monospace, monospace;
117
139
  --font-weight-heading: 510;
118
140
 
119
- /* Zone type scales */
120
- --zone-product-caption-size: 13px;
121
- --zone-product-caption-leading: 1.2;
122
- --zone-product-caption-weight: 400;
123
- --zone-product-body-sm-size: 14px;
124
- --zone-product-body-sm-leading: 1.5;
125
- --zone-product-body-sm-weight: 400;
126
- --zone-product-body-size: 14px;
127
- --zone-product-body-leading: 1.5;
128
- --zone-product-body-weight: 400;
129
- --zone-product-body-lg-size: 16px;
130
- --zone-product-body-lg-leading: 1.5;
131
- --zone-product-body-lg-weight: 400;
132
- --zone-product-heading-size: 24px;
133
- --zone-product-heading-leading: 1.25;
134
- --zone-product-heading-tracking: -0.012em;
135
- --zone-product-heading-weight: 510;
136
- --zone-product-display-size: 32px;
137
- --zone-product-display-leading: 1.15;
138
- --zone-product-display-tracking: -0.022em;
139
- --zone-product-display-weight: 510;
140
- --zone-marketing-body-size: 15px;
141
- --zone-marketing-body-leading: 1.6;
142
- --zone-marketing-body-weight: 400;
143
- --zone-marketing-heading-size: 48px;
144
- --zone-marketing-heading-leading: 1;
145
- --zone-marketing-heading-tracking: -0.022em;
146
- --zone-marketing-heading-weight: 510;
147
- --zone-marketing-display-size: 72px;
148
- --zone-marketing-display-leading: 1;
149
- --zone-marketing-display-tracking: -0.022em;
150
- --zone-marketing-display-weight: 510;
141
+ /* Motion */
142
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
143
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
144
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
145
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
146
+ --duration-micro: 80ms;
147
+ --motion-duration-micro: 80ms;
148
+ --duration-flow: 140ms;
149
+ --motion-duration-flow: 140ms;
150
+ --duration-reveal: 200ms;
151
+ --motion-duration-reveal: 200ms;
152
+ --duration-cinematic: 320ms;
153
+ --motion-duration-cinematic: 320ms;
154
+
155
+ /* Spacing */
156
+ --space-source-xs: 0.375rem;
157
+ --space-source-sm: 0.5rem;
158
+ --space-source-md: 0.75rem;
159
+ --space-source-lg: 1rem;
160
+ --space-source-xl: 1.5rem;
161
+ --space-source-2xl: 2rem;
151
162
  }
152
163
 
153
164
  .dark,
@@ -199,84 +210,26 @@ html.dark[data-brand="linear"] {
199
210
  --sidebar-accent-foreground: 218 21% 85%;
200
211
  --sidebar-border: 223 9% 15%;
201
212
  --sidebar-ring: 64 89% 54%;
213
+ --brand-primary: hsl(64 89% 54%);
214
+ --brand-accent: hsl(64 89% 54%);
215
+ --brand-accent-foreground: hsl(210 11% 4%);
216
+ --brand-tertiary: hsl(64 89% 54%);
202
217
  --brand-gradient: hsl(var(--primary));
203
218
  --brand-gradient-reverse: hsl(var(--primary));
204
219
  --brand-gradient-vertical: hsl(var(--primary));
205
220
  --brand-gradient-radial: hsl(var(--primary));
206
- }
207
-
208
- /* Zone: product — product never inherits marketing display */
209
- [data-zone="product"],
210
- .zone-product {
211
- font-size: var(--zone-product-body-size, 14px);
212
- line-height: var(--zone-product-body-leading, 1.5);
213
- font-weight: var(--zone-product-body-weight, 400);
214
- --text-caption: var(--zone-product-caption-size, inherit);
215
- --leading-caption: var(--zone-product-caption-leading, inherit);
216
- --tracking-caption: var(--zone-product-caption-tracking, inherit);
217
- --text-body-sm: var(--zone-product-body-sm-size, inherit);
218
- --leading-body-sm: var(--zone-product-body-sm-leading, inherit);
219
- --tracking-body-sm: var(--zone-product-body-sm-tracking, inherit);
220
- --text-body: var(--zone-product-body-size, inherit);
221
- --leading-body: var(--zone-product-body-leading, inherit);
222
- --tracking-body: var(--zone-product-body-tracking, inherit);
223
- --text-body-lg: var(--zone-product-body-lg-size, inherit);
224
- --leading-body-lg: var(--zone-product-body-lg-leading, inherit);
225
- --tracking-body-lg: var(--zone-product-body-lg-tracking, inherit);
226
- --text-subheading: var(--zone-product-subheading-size, inherit);
227
- --leading-subheading: var(--zone-product-subheading-leading, inherit);
228
- --tracking-subheading: var(--zone-product-subheading-tracking, inherit);
229
- --text-heading-sm: var(--zone-product-heading-sm-size, inherit);
230
- --leading-heading-sm: var(--zone-product-heading-sm-leading, inherit);
231
- --tracking-heading-sm: var(--zone-product-heading-sm-tracking, inherit);
232
- --text-heading: var(--zone-product-heading-size, inherit);
233
- --leading-heading: var(--zone-product-heading-leading, inherit);
234
- --tracking-heading: var(--zone-product-heading-tracking, inherit);
235
- --text-heading-lg: var(--zone-product-heading-lg-size, inherit);
236
- --leading-heading-lg: var(--zone-product-heading-lg-leading, inherit);
237
- --tracking-heading-lg: var(--zone-product-heading-lg-tracking, inherit);
238
- --text-display: var(--zone-product-display-size, var(--zone-product-heading-size, inherit));
239
- --leading-display: var(--zone-product-display-leading, inherit);
240
- --tracking-display: var(--zone-product-display-tracking, inherit);
241
- }
242
-
243
- /* Zone: marketing — product never inherits marketing display */
244
- [data-zone="marketing"],
245
- .zone-marketing {
246
- font-size: var(--zone-marketing-body-size, 15px);
247
- line-height: var(--zone-marketing-body-leading, 1.6);
248
- font-weight: var(--zone-marketing-body-weight, 400);
249
- --text-caption: var(--zone-marketing-caption-size, inherit);
250
- --leading-caption: var(--zone-marketing-caption-leading, inherit);
251
- --tracking-caption: var(--zone-marketing-caption-tracking, inherit);
252
- --text-body-sm: var(--zone-marketing-body-sm-size, inherit);
253
- --leading-body-sm: var(--zone-marketing-body-sm-leading, inherit);
254
- --tracking-body-sm: var(--zone-marketing-body-sm-tracking, inherit);
255
- --text-body: var(--zone-marketing-body-size, inherit);
256
- --leading-body: var(--zone-marketing-body-leading, inherit);
257
- --tracking-body: var(--zone-marketing-body-tracking, inherit);
258
- --text-body-lg: var(--zone-marketing-body-lg-size, inherit);
259
- --leading-body-lg: var(--zone-marketing-body-lg-leading, inherit);
260
- --tracking-body-lg: var(--zone-marketing-body-lg-tracking, inherit);
261
- --text-subheading: var(--zone-marketing-subheading-size, inherit);
262
- --leading-subheading: var(--zone-marketing-subheading-leading, inherit);
263
- --tracking-subheading: var(--zone-marketing-subheading-tracking, inherit);
264
- --text-heading-sm: var(--zone-marketing-heading-sm-size, inherit);
265
- --leading-heading-sm: var(--zone-marketing-heading-sm-leading, inherit);
266
- --tracking-heading-sm: var(--zone-marketing-heading-sm-tracking, inherit);
267
- --text-heading: var(--zone-marketing-heading-size, inherit);
268
- --leading-heading: var(--zone-marketing-heading-leading, inherit);
269
- --tracking-heading: var(--zone-marketing-heading-tracking, inherit);
270
- --text-heading-lg: var(--zone-marketing-heading-lg-size, inherit);
271
- --leading-heading-lg: var(--zone-marketing-heading-lg-leading, inherit);
272
- --tracking-heading-lg: var(--zone-marketing-heading-lg-tracking, inherit);
273
- --text-display: var(--zone-marketing-display-size, inherit);
274
- --leading-display: var(--zone-marketing-display-leading, inherit);
275
- --tracking-display: var(--zone-marketing-display-tracking, inherit);
276
- }
277
221
 
278
- /* Product chrome must not use decorative gradients as action fills */
279
- [data-zone="product"] .btn-brand-default,
280
- .zone-product .btn-brand-default {
281
- /* intentional no-op: documents contract; action uses --primary only */
222
+ /* ── Neutral ramp, anchored on this language's roles ── */
223
+ --neutral-1: hsl(210 11% 4%);
224
+ --neutral-2: hsl(210 6% 6%);
225
+ --neutral-3: color-mix(in oklab, hsl(223 9% 15%) 20%, hsl(210 6% 6%));
226
+ --neutral-4: color-mix(in oklab, hsl(223 9% 15%) 40%, hsl(210 6% 6%));
227
+ --neutral-5: color-mix(in oklab, hsl(223 9% 15%) 60%, hsl(210 6% 6%));
228
+ --neutral-6: color-mix(in oklab, hsl(223 9% 15%) 80%, hsl(210 6% 6%));
229
+ --neutral-7: hsl(223 9% 15%);
230
+ --neutral-8: color-mix(in oklab, hsl(218 5% 41%) 25%, hsl(223 9% 15%));
231
+ --neutral-9: color-mix(in oklab, hsl(218 5% 41%) 50%, hsl(223 9% 15%));
232
+ --neutral-10: color-mix(in oklab, hsl(218 5% 41%) 75%, hsl(223 9% 15%));
233
+ --neutral-11: hsl(218 5% 41%);
234
+ --neutral-12: hsl(0 0% 100%);
282
235
  }