@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/stripe.css CHANGED
@@ -1,18 +1,10 @@
1
1
  /**
2
2
  * Brand carrier skin: Stripe (stripe) v1.0.0
3
3
  * darkDefault=false dualMode=false 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: "sohne-var";
11
- src: url("/brand-assets/sohne-var.woff2") format("woff2");
12
- font-weight: 300 400;
13
- font-display: swap;
14
- }
15
-
16
8
  :root,
17
9
  html[data-brand="stripe"] {
18
10
  /* ── Color roles (carrier) ── */
@@ -27,7 +19,7 @@ html[data-brand="stripe"] {
27
19
  --role-muted: 216 56% 98%;
28
20
  --role-muted-fg: 217 17% 47%;
29
21
  --role-border: 210 44% 93%;
30
- --role-input: 0 0% 100%;
22
+ --role-input: 210 44% 93%;
31
23
  --role-ring: 248 98% 61%;
32
24
  --role-brand: 211 78% 11%;
33
25
  --role-brand-fg: 0 0% 100%;
@@ -52,7 +44,7 @@ html[data-brand="stripe"] {
52
44
  --destructive: 0 72% 51%;
53
45
  --destructive-foreground: 0 0% 100%;
54
46
  --border: 210 44% 93%;
55
- --input: 0 0% 100%;
47
+ --input: 210 44% 93%;
56
48
  --ring: 248 98% 61%;
57
49
  --info: 231 100% 73%;
58
50
  --info-foreground: 211 78% 11%;
@@ -64,17 +56,35 @@ html[data-brand="stripe"] {
64
56
  --sidebar-accent-foreground: 0 0% 100%;
65
57
  --sidebar-border: 210 44% 93%;
66
58
  --sidebar-ring: 248 98% 61%;
59
+ --brand-primary: hsl(211 78% 11%);
60
+ --brand-accent: hsl(248 98% 61%);
61
+ --brand-accent-foreground: hsl(0 0% 100%);
62
+ --brand-tertiary: hsl(248 98% 61%);
67
63
  --brand-gradient: hsl(var(--primary));
68
64
  --brand-gradient-reverse: hsl(var(--primary));
69
65
  --brand-gradient-vertical: hsl(var(--primary));
70
66
  --brand-gradient-radial: hsl(var(--primary));
71
67
 
68
+ /* ── Neutral ramp, anchored on this language's roles ── */
69
+ --neutral-1: hsl(0 0% 100%);
70
+ --neutral-2: hsl(0 0% 100%);
71
+ --neutral-3: color-mix(in oklab, hsl(210 44% 93%) 20%, hsl(0 0% 100%));
72
+ --neutral-4: color-mix(in oklab, hsl(210 44% 93%) 40%, hsl(0 0% 100%));
73
+ --neutral-5: color-mix(in oklab, hsl(210 44% 93%) 60%, hsl(0 0% 100%));
74
+ --neutral-6: color-mix(in oklab, hsl(210 44% 93%) 80%, hsl(0 0% 100%));
75
+ --neutral-7: hsl(210 44% 93%);
76
+ --neutral-8: color-mix(in oklab, hsl(217 17% 47%) 25%, hsl(210 44% 93%));
77
+ --neutral-9: color-mix(in oklab, hsl(217 17% 47%) 50%, hsl(210 44% 93%));
78
+ --neutral-10: color-mix(in oklab, hsl(217 17% 47%) 75%, hsl(210 44% 93%));
79
+ --neutral-11: hsl(217 17% 47%);
80
+ --neutral-12: hsl(211 78% 11%);
81
+
72
82
  /* Recipe (action language + free elev/radii) */
73
83
  /* Shape slots */
74
84
  --btn-default-radius: 4px;
75
85
  --radius-button: 4px;
76
86
  --radius-buttons: 4px;
77
- --radius-md: 4px;
87
+ --radius-md: min(4px, 4px);
78
88
  --radius-card: 4px;
79
89
  --radius-lg: 4px;
80
90
  --radius-badge: 9999px;
@@ -87,16 +97,16 @@ html[data-brand="stripe"] {
87
97
  --elevation-card: 0 0 #0000;
88
98
  --elevation-control: 0 0 #0000;
89
99
  --elevation-raised: 0 0 #0000;
90
- --shadow-xs: 0 0 #0000;
91
- --shadow-sm: 0 0 #0000;
92
- --shadow-md: 0 0 #0000;
93
- --shadow-lg: 0 0 #0000;
100
+ --elevation-xs: 0 0 #0000;
101
+ --elevation-sm: 0 0 #0000;
102
+ --elevation-md: 0 0 #0000;
103
+ --elevation-lg: 0 0 #0000;
94
104
  --btn-default-shadow: 0 0 #0000;
95
105
  --btn-default-bg: hsl(var(--primary));
96
106
  --btn-default-fg: hsl(var(--primary-foreground));
97
107
  --btn-default-border-width: 0px;
98
108
  --btn-default-border: transparent;
99
- --btn-default-stroke-gradient: transparent;
109
+ --btn-default-stroke-gradient: linear-gradient(transparent, transparent);
100
110
  --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
101
111
  --badge-default-bg: hsl(var(--secondary));
102
112
  --badge-default-fg: hsl(var(--secondary-foreground));
@@ -104,56 +114,41 @@ html[data-brand="stripe"] {
104
114
  --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
105
115
 
106
116
  /* Typography */
107
- --font-sans: "sohne-var", "Inter Tight", "Inter", ui-sans-serif, system-ui, sans-serif;
108
- --font-heading: "sohne-var", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
109
- --font-display: "sohne-var", "Inter Tight", ui-sans-serif, system-ui, sans-serif;
117
+ --font-sans:
118
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight", "Inter",
119
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-sans-serif, system-ui, sans-serif;
120
+ --font-cn:
121
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight", "Inter",
122
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-sans-serif, system-ui, sans-serif;
123
+ --font-heading:
124
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight",
125
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-sans-serif, system-ui, sans-serif;
126
+ --font-display:
127
+ var(--font-reg-inter-tight), "sohne-var", "Inter Tight",
128
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-sans-serif, system-ui, sans-serif;
110
129
  --font-weight-heading: 300;
111
130
 
112
- /* Zone type scales */
113
- --zone-product-caption-size: 12px;
114
- --zone-product-caption-leading: 1.45;
115
- --zone-product-caption-tracking: -0.12px;
116
- --zone-product-caption-weight: 300;
117
- --zone-product-body-sm-size: 14px;
118
- --zone-product-body-sm-leading: 1.4;
119
- --zone-product-body-sm-tracking: -0.14px;
120
- --zone-product-body-sm-weight: 400;
121
- --zone-product-body-size: 16px;
122
- --zone-product-body-leading: 1.2;
123
- --zone-product-body-tracking: -0.16px;
124
- --zone-product-body-weight: 400;
125
- --zone-product-body-lg-size: 20px;
126
- --zone-product-body-lg-leading: 1.4;
127
- --zone-product-body-lg-tracking: -0.2px;
128
- --zone-product-body-lg-weight: 300;
129
- --zone-product-subheading-size: 22px;
130
- --zone-product-subheading-leading: 1.1;
131
- --zone-product-subheading-tracking: -0.22px;
132
- --zone-product-subheading-weight: 300;
133
- --zone-product-heading-sm-size: 26px;
134
- --zone-product-heading-sm-leading: 1.12;
135
- --zone-product-heading-sm-tracking: -0.26px;
136
- --zone-product-heading-sm-weight: 300;
137
- --zone-product-heading-size: 32px;
138
- --zone-product-heading-leading: 1.1;
139
- --zone-product-heading-tracking: -0.64px;
140
- --zone-product-heading-weight: 300;
141
- --zone-marketing-body-size: 16px;
142
- --zone-marketing-body-leading: 1.4;
143
- --zone-marketing-body-tracking: -0.16px;
144
- --zone-marketing-body-weight: 300;
145
- --zone-marketing-heading-size: 32px;
146
- --zone-marketing-heading-leading: 1.1;
147
- --zone-marketing-heading-tracking: -0.64px;
148
- --zone-marketing-heading-weight: 300;
149
- --zone-marketing-heading-lg-size: 48px;
150
- --zone-marketing-heading-lg-leading: 1.03;
151
- --zone-marketing-heading-lg-tracking: -0.96px;
152
- --zone-marketing-heading-lg-weight: 300;
153
- --zone-marketing-display-size: 56px;
154
- --zone-marketing-display-leading: 1.03;
155
- --zone-marketing-display-tracking: -1.4px;
156
- --zone-marketing-display-weight: 300;
131
+ /* Motion */
132
+ --ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
133
+ --motion-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
134
+ --ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
135
+ --motion-ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
136
+ --duration-micro: 100ms;
137
+ --motion-duration-micro: 100ms;
138
+ --duration-flow: 180ms;
139
+ --motion-duration-flow: 180ms;
140
+ --duration-reveal: 260ms;
141
+ --motion-duration-reveal: 260ms;
142
+ --duration-cinematic: 400ms;
143
+ --motion-duration-cinematic: 400ms;
144
+
145
+ /* Spacing */
146
+ --space-source-xs: 0.5rem;
147
+ --space-source-sm: 0.75rem;
148
+ --space-source-md: 1.125rem;
149
+ --space-source-lg: 1.75rem;
150
+ --space-source-xl: 2.25rem;
151
+ --space-source-2xl: 3.25rem;
157
152
 
158
153
  /* Taxonomy / decorative (not product CTA) */
159
154
  --brand-category-brand: #061b31;
@@ -168,81 +163,3 @@ html[data-brand="stripe"] {
168
163
  --brand-decorative-section-band: #f8fafd;
169
164
  --brand-decorative-frost: #e5edf5;
170
165
  }
171
-
172
- /* Zone: product — product never inherits marketing display */
173
- [data-zone="product"],
174
- .zone-product {
175
- font-size: var(--zone-product-body-size, 16px);
176
- line-height: var(--zone-product-body-leading, 1.2);
177
- font-weight: var(--zone-product-body-weight, 400);
178
- letter-spacing: var(--zone-product-body-tracking, -0.16px);
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, 16px);
212
- line-height: var(--zone-marketing-body-leading, 1.4);
213
- font-weight: var(--zone-marketing-body-weight, 300);
214
- letter-spacing: var(--zone-marketing-body-tracking, -0.16px);
215
- --text-caption: var(--zone-marketing-caption-size, inherit);
216
- --leading-caption: var(--zone-marketing-caption-leading, inherit);
217
- --tracking-caption: var(--zone-marketing-caption-tracking, inherit);
218
- --text-body-sm: var(--zone-marketing-body-sm-size, inherit);
219
- --leading-body-sm: var(--zone-marketing-body-sm-leading, inherit);
220
- --tracking-body-sm: var(--zone-marketing-body-sm-tracking, inherit);
221
- --text-body: var(--zone-marketing-body-size, inherit);
222
- --leading-body: var(--zone-marketing-body-leading, inherit);
223
- --tracking-body: var(--zone-marketing-body-tracking, inherit);
224
- --text-body-lg: var(--zone-marketing-body-lg-size, inherit);
225
- --leading-body-lg: var(--zone-marketing-body-lg-leading, inherit);
226
- --tracking-body-lg: var(--zone-marketing-body-lg-tracking, inherit);
227
- --text-subheading: var(--zone-marketing-subheading-size, inherit);
228
- --leading-subheading: var(--zone-marketing-subheading-leading, inherit);
229
- --tracking-subheading: var(--zone-marketing-subheading-tracking, inherit);
230
- --text-heading-sm: var(--zone-marketing-heading-sm-size, inherit);
231
- --leading-heading-sm: var(--zone-marketing-heading-sm-leading, inherit);
232
- --tracking-heading-sm: var(--zone-marketing-heading-sm-tracking, inherit);
233
- --text-heading: var(--zone-marketing-heading-size, inherit);
234
- --leading-heading: var(--zone-marketing-heading-leading, inherit);
235
- --tracking-heading: var(--zone-marketing-heading-tracking, inherit);
236
- --text-heading-lg: var(--zone-marketing-heading-lg-size, inherit);
237
- --leading-heading-lg: var(--zone-marketing-heading-lg-leading, inherit);
238
- --tracking-heading-lg: var(--zone-marketing-heading-lg-tracking, inherit);
239
- --text-display: var(--zone-marketing-display-size, inherit);
240
- --leading-display: var(--zone-marketing-display-leading, inherit);
241
- --tracking-display: var(--zone-marketing-display-tracking, inherit);
242
- }
243
-
244
- /* Product chrome must not use decorative gradients as action fills */
245
- [data-zone="product"] .btn-brand-default,
246
- .zone-product .btn-brand-default {
247
- /* intentional no-op: documents contract; action uses --primary only */
248
- }
package/skins/vanta.css CHANGED
@@ -1,33 +1,10 @@
1
1
  /**
2
2
  * Brand carrier skin: Vanta (vanta) v1.0.0
3
3
  * darkDefault=false dualMode=false button=solid
4
- * fonts=3 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
- @font-face {
18
- font-family: "Reckless";
19
- src: url("/brand-assets/reckless-regular.woff2") format("woff2");
20
- font-weight: 400;
21
- font-display: swap;
22
- }
23
-
24
- @font-face {
25
- font-family: "Reckless";
26
- src: url("/brand-assets/reckless-medium.woff2") format("woff2");
27
- font-weight: 500;
28
- font-display: swap;
29
- }
30
-
31
8
  :root,
32
9
  html[data-brand="vanta"] {
33
10
  /* ── Color roles (carrier) ── */
@@ -42,7 +19,7 @@ html[data-brand="vanta"] {
42
19
  --role-muted: 240 20% 93%;
43
20
  --role-muted-fg: 238 11% 48%;
44
21
  --role-border: 240 17% 11%;
45
- --role-input: 0 0% 100%;
22
+ --role-input: 240 17% 11%;
46
23
  --role-ring: 268 95% 39%;
47
24
  --role-brand: 272 100% 14%;
48
25
  --role-brand-fg: 0 0% 100%;
@@ -67,7 +44,7 @@ html[data-brand="vanta"] {
67
44
  --destructive: 0 72% 51%;
68
45
  --destructive-foreground: 0 0% 100%;
69
46
  --border: 240 17% 11%;
70
- --input: 0 0% 100%;
47
+ --input: 240 17% 11%;
71
48
  --ring: 268 95% 39%;
72
49
  --warning: 44 100% 53%;
73
50
  --warning-foreground: 240 17% 11%;
@@ -81,17 +58,35 @@ html[data-brand="vanta"] {
81
58
  --sidebar-accent-foreground: 0 0% 100%;
82
59
  --sidebar-border: 240 17% 11%;
83
60
  --sidebar-ring: 268 95% 39%;
61
+ --brand-primary: hsl(272 100% 14%);
62
+ --brand-accent: hsl(268 95% 39%);
63
+ --brand-accent-foreground: hsl(0 0% 100%);
64
+ --brand-tertiary: hsl(268 95% 39%);
84
65
  --brand-gradient: hsl(var(--primary));
85
66
  --brand-gradient-reverse: hsl(var(--primary));
86
67
  --brand-gradient-vertical: hsl(var(--primary));
87
68
  --brand-gradient-radial: hsl(var(--primary));
88
69
 
70
+ /* ── Neutral ramp, anchored on this language's roles ── */
71
+ --neutral-1: hsl(220 23% 97%);
72
+ --neutral-2: hsl(0 0% 100%);
73
+ --neutral-3: color-mix(in oklab, hsl(240 17% 11%) 20%, hsl(0 0% 100%));
74
+ --neutral-4: color-mix(in oklab, hsl(240 17% 11%) 40%, hsl(0 0% 100%));
75
+ --neutral-5: color-mix(in oklab, hsl(240 17% 11%) 60%, hsl(0 0% 100%));
76
+ --neutral-6: color-mix(in oklab, hsl(240 17% 11%) 80%, hsl(0 0% 100%));
77
+ --neutral-7: hsl(240 17% 11%);
78
+ --neutral-8: color-mix(in oklab, hsl(238 11% 48%) 25%, hsl(240 17% 11%));
79
+ --neutral-9: color-mix(in oklab, hsl(238 11% 48%) 50%, hsl(240 17% 11%));
80
+ --neutral-10: color-mix(in oklab, hsl(238 11% 48%) 75%, hsl(240 17% 11%));
81
+ --neutral-11: hsl(238 11% 48%);
82
+ --neutral-12: hsl(240 17% 11%);
83
+
89
84
  /* Recipe (action language + free elev/radii) */
90
85
  /* Shape slots */
91
86
  --btn-default-radius: 999px;
92
87
  --radius-button: 999px;
93
88
  --radius-buttons: 999px;
94
- --radius-md: 999px;
89
+ --radius-md: min(999px, 16px);
95
90
  --radius-card: 16px;
96
91
  --radius-lg: 16px;
97
92
  --radius-badge: 999px;
@@ -104,16 +99,16 @@ html[data-brand="vanta"] {
104
99
  --elevation-card: 0 0 #0000;
105
100
  --elevation-control: 0 0 #0000;
106
101
  --elevation-raised: 0 0 #0000;
107
- --shadow-xs: 0 0 #0000;
108
- --shadow-sm: 0 0 #0000;
109
- --shadow-md: 0 0 #0000;
110
- --shadow-lg: 0 0 #0000;
102
+ --elevation-xs: 0 0 #0000;
103
+ --elevation-sm: 0 0 #0000;
104
+ --elevation-md: 0 0 #0000;
105
+ --elevation-lg: 0 0 #0000;
111
106
  --btn-default-shadow: 0 0 #0000;
112
107
  --btn-default-bg: hsl(var(--primary));
113
108
  --btn-default-fg: hsl(var(--primary-foreground));
114
109
  --btn-default-border-width: 0px;
115
110
  --btn-default-border: transparent;
116
- --btn-default-stroke-gradient: transparent;
111
+ --btn-default-stroke-gradient: linear-gradient(transparent, transparent);
117
112
  --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
118
113
  --badge-default-bg: hsl(var(--secondary));
119
114
  --badge-default-fg: hsl(var(--secondary-foreground));
@@ -121,49 +116,41 @@ html[data-brand="vanta"] {
121
116
  --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
122
117
 
123
118
  /* Typography */
124
- --font-sans: "Inter Variable", "Inter", ui-sans-serif, system-ui, sans-serif;
125
- --font-heading: "Reckless", "Source Serif 4", "Lora", ui-serif, Georgia, serif;
126
- --font-display: "Reckless", "Source Serif 4", "Lora", ui-serif, Georgia, serif;
119
+ --font-sans:
120
+ var(--font-inter), "Inter Variable", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
121
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
122
+ --font-cn:
123
+ var(--font-inter), "Inter Variable", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
124
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
125
+ --font-heading:
126
+ var(--font-reg-source-serif-4), "Reckless", "Source Serif 4", "Lora",
127
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-serif, Georgia, serif;
128
+ --font-display:
129
+ var(--font-reg-source-serif-4), "Reckless", "Source Serif 4", "Lora",
130
+ var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", ui-serif, Georgia, serif;
127
131
  --font-weight-heading: 500;
128
132
 
129
- /* Zone type scales */
130
- --zone-product-caption-size: 12px;
131
- --zone-product-caption-leading: 1.5;
132
- --zone-product-caption-tracking: -0.02px;
133
- --zone-product-caption-weight: 500;
134
- --zone-product-body-sm-size: 14px;
135
- --zone-product-body-sm-leading: 1.43;
136
- --zone-product-body-sm-tracking: -0.02px;
137
- --zone-product-body-sm-weight: 400;
138
- --zone-product-body-size: 16px;
139
- --zone-product-body-leading: 1.5;
140
- --zone-product-body-tracking: -0.02px;
141
- --zone-product-body-weight: 400;
142
- --zone-product-subheading-size: 20px;
143
- --zone-product-subheading-leading: 1.4;
144
- --zone-product-subheading-weight: 500;
145
- --zone-product-heading-sm-size: 24px;
146
- --zone-product-heading-sm-leading: 1.35;
147
- --zone-product-heading-sm-weight: 500;
148
- --zone-product-heading-size: 32px;
149
- --zone-product-heading-leading: 1.3;
150
- --zone-product-heading-weight: 500;
151
- --zone-marketing-body-size: 16px;
152
- --zone-marketing-body-leading: 1.5;
153
- --zone-marketing-body-tracking: -0.02px;
154
- --zone-marketing-body-weight: 400;
155
- --zone-marketing-heading-size: 42px;
156
- --zone-marketing-heading-leading: 1.2;
157
- --zone-marketing-heading-tracking: -0.84px;
158
- --zone-marketing-heading-weight: 400;
159
- --zone-marketing-heading-lg-size: 56px;
160
- --zone-marketing-heading-lg-leading: 1.15;
161
- --zone-marketing-heading-lg-tracking: -1.12px;
162
- --zone-marketing-heading-lg-weight: 400;
163
- --zone-marketing-display-size: 90px;
164
- --zone-marketing-display-leading: 1.1;
165
- --zone-marketing-display-tracking: -1.62px;
166
- --zone-marketing-display-weight: 400;
133
+ /* Motion */
134
+ --ease-out: cubic-bezier(0.33, 1, 0.68, 1);
135
+ --motion-ease-out: cubic-bezier(0.33, 1, 0.68, 1);
136
+ --ease-in-out: cubic-bezier(0.37, 0, 0.63, 1);
137
+ --motion-ease-in-out: cubic-bezier(0.37, 0, 0.63, 1);
138
+ --duration-micro: 120ms;
139
+ --motion-duration-micro: 120ms;
140
+ --duration-flow: 240ms;
141
+ --motion-duration-flow: 240ms;
142
+ --duration-reveal: 380ms;
143
+ --motion-duration-reveal: 380ms;
144
+ --duration-cinematic: 620ms;
145
+ --motion-duration-cinematic: 620ms;
146
+
147
+ /* Spacing */
148
+ --space-source-xs: 0.75rem;
149
+ --space-source-sm: 1.125rem;
150
+ --space-source-md: 1.75rem;
151
+ --space-source-lg: 2.5rem;
152
+ --space-source-xl: 3.5rem;
153
+ --space-source-2xl: 5rem;
167
154
 
168
155
  /* Taxonomy / decorative (not product CTA) */
169
156
  --brand-category-brand: #260048;
@@ -175,81 +162,3 @@ html[data-brand="vanta"] {
175
162
  --brand-category-ash: #dfdfe9;
176
163
  --brand-decorative-hero-wash: #ddd6ff;
177
164
  }
178
-
179
- /* Zone: product — product never inherits marketing display */
180
- [data-zone="product"],
181
- .zone-product {
182
- font-size: var(--zone-product-body-size, 16px);
183
- line-height: var(--zone-product-body-leading, 1.5);
184
- font-weight: var(--zone-product-body-weight, 400);
185
- letter-spacing: var(--zone-product-body-tracking, -0.02px);
186
- --text-caption: var(--zone-product-caption-size, inherit);
187
- --leading-caption: var(--zone-product-caption-leading, inherit);
188
- --tracking-caption: var(--zone-product-caption-tracking, inherit);
189
- --text-body-sm: var(--zone-product-body-sm-size, inherit);
190
- --leading-body-sm: var(--zone-product-body-sm-leading, inherit);
191
- --tracking-body-sm: var(--zone-product-body-sm-tracking, inherit);
192
- --text-body: var(--zone-product-body-size, inherit);
193
- --leading-body: var(--zone-product-body-leading, inherit);
194
- --tracking-body: var(--zone-product-body-tracking, inherit);
195
- --text-body-lg: var(--zone-product-body-lg-size, inherit);
196
- --leading-body-lg: var(--zone-product-body-lg-leading, inherit);
197
- --tracking-body-lg: var(--zone-product-body-lg-tracking, inherit);
198
- --text-subheading: var(--zone-product-subheading-size, inherit);
199
- --leading-subheading: var(--zone-product-subheading-leading, inherit);
200
- --tracking-subheading: var(--zone-product-subheading-tracking, inherit);
201
- --text-heading-sm: var(--zone-product-heading-sm-size, inherit);
202
- --leading-heading-sm: var(--zone-product-heading-sm-leading, inherit);
203
- --tracking-heading-sm: var(--zone-product-heading-sm-tracking, inherit);
204
- --text-heading: var(--zone-product-heading-size, inherit);
205
- --leading-heading: var(--zone-product-heading-leading, inherit);
206
- --tracking-heading: var(--zone-product-heading-tracking, inherit);
207
- --text-heading-lg: var(--zone-product-heading-lg-size, inherit);
208
- --leading-heading-lg: var(--zone-product-heading-lg-leading, inherit);
209
- --tracking-heading-lg: var(--zone-product-heading-lg-tracking, inherit);
210
- --text-display: var(--zone-product-display-size, var(--zone-product-heading-size, inherit));
211
- --leading-display: var(--zone-product-display-leading, inherit);
212
- --tracking-display: var(--zone-product-display-tracking, inherit);
213
- }
214
-
215
- /* Zone: marketing — product never inherits marketing display */
216
- [data-zone="marketing"],
217
- .zone-marketing {
218
- font-size: var(--zone-marketing-body-size, 16px);
219
- line-height: var(--zone-marketing-body-leading, 1.5);
220
- font-weight: var(--zone-marketing-body-weight, 400);
221
- letter-spacing: var(--zone-marketing-body-tracking, -0.02px);
222
- --text-caption: var(--zone-marketing-caption-size, inherit);
223
- --leading-caption: var(--zone-marketing-caption-leading, inherit);
224
- --tracking-caption: var(--zone-marketing-caption-tracking, inherit);
225
- --text-body-sm: var(--zone-marketing-body-sm-size, inherit);
226
- --leading-body-sm: var(--zone-marketing-body-sm-leading, inherit);
227
- --tracking-body-sm: var(--zone-marketing-body-sm-tracking, inherit);
228
- --text-body: var(--zone-marketing-body-size, inherit);
229
- --leading-body: var(--zone-marketing-body-leading, inherit);
230
- --tracking-body: var(--zone-marketing-body-tracking, inherit);
231
- --text-body-lg: var(--zone-marketing-body-lg-size, inherit);
232
- --leading-body-lg: var(--zone-marketing-body-lg-leading, inherit);
233
- --tracking-body-lg: var(--zone-marketing-body-lg-tracking, inherit);
234
- --text-subheading: var(--zone-marketing-subheading-size, inherit);
235
- --leading-subheading: var(--zone-marketing-subheading-leading, inherit);
236
- --tracking-subheading: var(--zone-marketing-subheading-tracking, inherit);
237
- --text-heading-sm: var(--zone-marketing-heading-sm-size, inherit);
238
- --leading-heading-sm: var(--zone-marketing-heading-sm-leading, inherit);
239
- --tracking-heading-sm: var(--zone-marketing-heading-sm-tracking, inherit);
240
- --text-heading: var(--zone-marketing-heading-size, inherit);
241
- --leading-heading: var(--zone-marketing-heading-leading, inherit);
242
- --tracking-heading: var(--zone-marketing-heading-tracking, inherit);
243
- --text-heading-lg: var(--zone-marketing-heading-lg-size, inherit);
244
- --leading-heading-lg: var(--zone-marketing-heading-lg-leading, inherit);
245
- --tracking-heading-lg: var(--zone-marketing-heading-lg-tracking, inherit);
246
- --text-display: var(--zone-marketing-display-size, inherit);
247
- --leading-display: var(--zone-marketing-display-leading, inherit);
248
- --tracking-display: var(--zone-marketing-display-tracking, inherit);
249
- }
250
-
251
- /* Product chrome must not use decorative gradients as action fills */
252
- [data-zone="product"] .btn-brand-default,
253
- .zone-product .btn-brand-default {
254
- /* intentional no-op: documents contract; action uses --primary only */
255
- }