@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/notion.css CHANGED
@@ -1,26 +1,10 @@
1
1
  /**
2
2
  * Brand carrier skin: Notion (notion) v1.0.0
3
3
  * darkDefault=false dualMode=false button=solid
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: "NotionInter";
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: "Lyon Text";
19
- src: url("/brand-assets/lyon-text-regular.woff2") format("woff2");
20
- font-weight: 400;
21
- font-display: swap;
22
- }
23
-
24
8
  :root,
25
9
  html[data-brand="notion"] {
26
10
  /* ── Color roles (carrier) ── */
@@ -33,9 +17,9 @@ html[data-brand="notion"] {
33
17
  --role-quiet: 208 92% 95%;
34
18
  --role-quiet-fg: 208 100% 44%;
35
19
  --role-muted: 208 92% 95%;
36
- --role-muted-fg: 0 0% 46%;
20
+ --role-muted-fg: 0 0% 43%;
37
21
  --role-border: 30 5% 88%;
38
- --role-input: 0 0% 100%;
22
+ --role-input: 30 5% 88%;
39
23
  --role-ring: 208 100% 44%;
40
24
  --role-brand: 0 0% 0%;
41
25
  --role-brand-fg: 0 0% 100%;
@@ -54,13 +38,13 @@ html[data-brand="notion"] {
54
38
  --secondary: 208 92% 95%;
55
39
  --secondary-foreground: 208 100% 44%;
56
40
  --muted: 208 92% 95%;
57
- --muted-foreground: 0 0% 46%;
41
+ --muted-foreground: 0 0% 43%;
58
42
  --accent: 0 0% 0%;
59
43
  --accent-foreground: 0 0% 100%;
60
44
  --destructive: 7 92% 58%;
61
45
  --destructive-foreground: 0 0% 100%;
62
46
  --border: 30 5% 88%;
63
- --input: 0 0% 100%;
47
+ --input: 30 5% 88%;
64
48
  --ring: 208 100% 44%;
65
49
  --warning: 40 100% 53%;
66
50
  --warning-foreground: 0 0% 0%;
@@ -74,17 +58,35 @@ html[data-brand="notion"] {
74
58
  --sidebar-accent-foreground: 0 0% 100%;
75
59
  --sidebar-border: 30 5% 88%;
76
60
  --sidebar-ring: 208 100% 44%;
61
+ --brand-primary: hsl(0 0% 0%);
62
+ --brand-accent: hsl(208 100% 44%);
63
+ --brand-accent-foreground: hsl(0 0% 100%);
64
+ --brand-tertiary: hsl(208 100% 44%);
77
65
  --brand-gradient: hsl(var(--primary));
78
66
  --brand-gradient-reverse: hsl(var(--primary));
79
67
  --brand-gradient-vertical: hsl(var(--primary));
80
68
  --brand-gradient-radial: hsl(var(--primary));
81
69
 
70
+ /* ── Neutral ramp, anchored on this language's roles ── */
71
+ --neutral-1: hsl(30 10% 96%);
72
+ --neutral-2: hsl(0 0% 100%);
73
+ --neutral-3: color-mix(in oklab, hsl(30 5% 88%) 20%, hsl(0 0% 100%));
74
+ --neutral-4: color-mix(in oklab, hsl(30 5% 88%) 40%, hsl(0 0% 100%));
75
+ --neutral-5: color-mix(in oklab, hsl(30 5% 88%) 60%, hsl(0 0% 100%));
76
+ --neutral-6: color-mix(in oklab, hsl(30 5% 88%) 80%, hsl(0 0% 100%));
77
+ --neutral-7: hsl(30 5% 88%);
78
+ --neutral-8: color-mix(in oklab, hsl(0 0% 43%) 25%, hsl(30 5% 88%));
79
+ --neutral-9: color-mix(in oklab, hsl(0 0% 43%) 50%, hsl(30 5% 88%));
80
+ --neutral-10: color-mix(in oklab, hsl(0 0% 43%) 75%, hsl(30 5% 88%));
81
+ --neutral-11: hsl(0 0% 43%);
82
+ --neutral-12: hsl(0 0% 0%);
83
+
82
84
  /* Recipe (action language + free elev/radii) */
83
85
  /* Shape slots */
84
86
  --btn-default-radius: 8px;
85
87
  --radius-button: 8px;
86
88
  --radius-buttons: 8px;
87
- --radius-md: 8px;
89
+ --radius-md: min(8px, 12px);
88
90
  --radius-card: 12px;
89
91
  --radius-lg: 12px;
90
92
  --radius-badge: 9999px;
@@ -97,16 +99,16 @@ html[data-brand="notion"] {
97
99
  --elevation-card: 0 0 #0000;
98
100
  --elevation-control: 0 0 #0000;
99
101
  --elevation-raised: 0px 0.7px 1.462px 0px rgb(0 0 0 / 0.015), 0px 3px 9px 0px rgb(0 0 0 / 0.03);
100
- --shadow-xs: 0 0 #0000;
101
- --shadow-sm: 0 0 #0000;
102
- --shadow-md: 0px 0.7px 1.462px 0px rgb(0 0 0 / 0.015), 0px 3px 9px 0px rgb(0 0 0 / 0.03);
103
- --shadow-lg: 0px 0.7px 1.462px 0px rgb(0 0 0 / 0.015), 0px 3px 9px 0px rgb(0 0 0 / 0.03);
102
+ --elevation-xs: 0 0 #0000;
103
+ --elevation-sm: 0 0 #0000;
104
+ --elevation-md: 0px 0.7px 1.462px 0px rgb(0 0 0 / 0.015), 0px 3px 9px 0px rgb(0 0 0 / 0.03);
105
+ --elevation-lg: 0px 0.7px 1.462px 0px rgb(0 0 0 / 0.015), 0px 3px 9px 0px rgb(0 0 0 / 0.03);
104
106
  --btn-default-shadow: 0 0 #0000;
105
107
  --btn-default-bg: hsl(var(--primary));
106
108
  --btn-default-fg: hsl(var(--primary-foreground));
107
109
  --btn-default-border-width: 0px;
108
110
  --btn-default-border: transparent;
109
- --btn-default-stroke-gradient: transparent;
111
+ --btn-default-stroke-gradient: linear-gradient(transparent, transparent);
110
112
  --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
111
113
  --badge-default-bg: hsl(var(--secondary));
112
114
  --badge-default-fg: hsl(var(--secondary-foreground));
@@ -114,46 +116,41 @@ html[data-brand="notion"] {
114
116
  --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
115
117
 
116
118
  /* Typography */
117
- --font-sans: "NotionInter", "Inter", ui-sans-serif, system-ui, sans-serif;
118
- --font-heading: "NotionInter", "Inter", ui-sans-serif, system-ui, sans-serif;
119
- --font-display: "NotionInter", "Inter", ui-sans-serif, system-ui, sans-serif;
119
+ --font-sans:
120
+ var(--font-inter), "NotionInter", "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), "NotionInter", "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-inter), "NotionInter", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
127
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
128
+ --font-display:
129
+ var(--font-inter), "NotionInter", "Inter", var(--font-noto-sans-sc, "Noto Sans SC"),
130
+ "PingFang SC", ui-sans-serif, system-ui, sans-serif;
120
131
  --font-weight-heading: 700;
121
132
 
122
- /* Zone type scales */
123
- --zone-product-caption-size: 12px;
124
- --zone-product-caption-leading: 1.33;
125
- --zone-product-caption-tracking: 0.12px;
126
- --zone-product-caption-weight: 500;
127
- --zone-product-body-sm-size: 14px;
128
- --zone-product-body-sm-leading: 1.43;
129
- --zone-product-body-sm-weight: 500;
130
- --zone-product-body-size: 16px;
131
- --zone-product-body-leading: 1.5;
132
- --zone-product-body-weight: 400;
133
- --zone-product-subheading-size: 20px;
134
- --zone-product-subheading-leading: 1;
135
- --zone-product-subheading-weight: 500;
136
- --zone-product-heading-sm-size: 22px;
137
- --zone-product-heading-sm-leading: 1.27;
138
- --zone-product-heading-sm-tracking: -0.242px;
139
- --zone-product-heading-sm-weight: 600;
140
- --zone-product-heading-size: 40px;
141
- --zone-product-heading-leading: 1.5;
142
- --zone-product-heading-weight: 600;
143
- --zone-marketing-body-size: 16px;
144
- --zone-marketing-body-leading: 1.5;
145
- --zone-marketing-body-weight: 400;
146
- --zone-marketing-heading-size: 48px;
147
- --zone-marketing-heading-leading: 1.5;
148
- --zone-marketing-heading-weight: 700;
149
- --zone-marketing-heading-lg-size: 54px;
150
- --zone-marketing-heading-lg-leading: 1.04;
151
- --zone-marketing-heading-lg-tracking: -1.89px;
152
- --zone-marketing-heading-lg-weight: 700;
153
- --zone-marketing-display-size: 72px;
154
- --zone-marketing-display-leading: 1.21;
155
- --zone-marketing-display-tracking: -2.016px;
156
- --zone-marketing-display-weight: 700;
133
+ /* Motion */
134
+ --ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94);
135
+ --motion-ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94);
136
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
137
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
138
+ --duration-micro: 120ms;
139
+ --motion-duration-micro: 120ms;
140
+ --duration-flow: 200ms;
141
+ --motion-duration-flow: 200ms;
142
+ --duration-reveal: 280ms;
143
+ --motion-duration-reveal: 280ms;
144
+ --duration-cinematic: 460ms;
145
+ --motion-duration-cinematic: 460ms;
146
+
147
+ /* Spacing */
148
+ --space-source-xs: 0.625rem;
149
+ --space-source-sm: 1rem;
150
+ --space-source-md: 1.5rem;
151
+ --space-source-lg: 2rem;
152
+ --space-source-xl: 2.75rem;
153
+ --space-source-2xl: 3.75rem;
157
154
 
158
155
  /* Taxonomy / decorative (not product CTA) */
159
156
  --brand-category-brand: #000000;
@@ -170,79 +167,3 @@ html[data-brand="notion"] {
170
167
  --brand-decorative-sky-wash: #62aef0;
171
168
  --brand-decorative-midnight: #02093a;
172
169
  }
173
-
174
- /* Zone: product — product never inherits marketing display */
175
- [data-zone="product"],
176
- .zone-product {
177
- font-size: var(--zone-product-body-size, 16px);
178
- line-height: var(--zone-product-body-leading, 1.5);
179
- font-weight: var(--zone-product-body-weight, 400);
180
- --text-caption: var(--zone-product-caption-size, inherit);
181
- --leading-caption: var(--zone-product-caption-leading, inherit);
182
- --tracking-caption: var(--zone-product-caption-tracking, inherit);
183
- --text-body-sm: var(--zone-product-body-sm-size, inherit);
184
- --leading-body-sm: var(--zone-product-body-sm-leading, inherit);
185
- --tracking-body-sm: var(--zone-product-body-sm-tracking, inherit);
186
- --text-body: var(--zone-product-body-size, inherit);
187
- --leading-body: var(--zone-product-body-leading, inherit);
188
- --tracking-body: var(--zone-product-body-tracking, inherit);
189
- --text-body-lg: var(--zone-product-body-lg-size, inherit);
190
- --leading-body-lg: var(--zone-product-body-lg-leading, inherit);
191
- --tracking-body-lg: var(--zone-product-body-lg-tracking, inherit);
192
- --text-subheading: var(--zone-product-subheading-size, inherit);
193
- --leading-subheading: var(--zone-product-subheading-leading, inherit);
194
- --tracking-subheading: var(--zone-product-subheading-tracking, inherit);
195
- --text-heading-sm: var(--zone-product-heading-sm-size, inherit);
196
- --leading-heading-sm: var(--zone-product-heading-sm-leading, inherit);
197
- --tracking-heading-sm: var(--zone-product-heading-sm-tracking, inherit);
198
- --text-heading: var(--zone-product-heading-size, inherit);
199
- --leading-heading: var(--zone-product-heading-leading, inherit);
200
- --tracking-heading: var(--zone-product-heading-tracking, inherit);
201
- --text-heading-lg: var(--zone-product-heading-lg-size, inherit);
202
- --leading-heading-lg: var(--zone-product-heading-lg-leading, inherit);
203
- --tracking-heading-lg: var(--zone-product-heading-lg-tracking, inherit);
204
- --text-display: var(--zone-product-display-size, var(--zone-product-heading-size, inherit));
205
- --leading-display: var(--zone-product-display-leading, inherit);
206
- --tracking-display: var(--zone-product-display-tracking, inherit);
207
- }
208
-
209
- /* Zone: marketing — product never inherits marketing display */
210
- [data-zone="marketing"],
211
- .zone-marketing {
212
- font-size: var(--zone-marketing-body-size, 16px);
213
- line-height: var(--zone-marketing-body-leading, 1.5);
214
- font-weight: var(--zone-marketing-body-weight, 400);
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/raycast.css CHANGED
@@ -1,19 +1,10 @@
1
1
  /**
2
2
  * Brand carrier skin: Raycast (raycast) v1.0.0
3
3
  * darkDefault=true 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: "Inter";
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
  .dark,
19
10
  html[data-brand="raycast"] {
@@ -27,9 +18,9 @@ html[data-brand="raycast"] {
27
18
  --role-quiet: 220 5% 11%;
28
19
  --role-quiet-fg: 0 0% 100%;
29
20
  --role-muted: 220 8% 7%;
30
- --role-muted-fg: 210 1% 42%;
21
+ --role-muted-fg: 210 1% 48%;
31
22
  --role-border: 210 2% 19%;
32
- --role-input: 220 8% 7%;
23
+ --role-input: 210 2% 19%;
33
24
  --role-ring: 240 1% 61%;
34
25
  --role-brand: 0 100% 69%;
35
26
  --role-brand-fg: 210 1% 27%;
@@ -48,13 +39,13 @@ html[data-brand="raycast"] {
48
39
  --secondary: 220 5% 11%;
49
40
  --secondary-foreground: 0 0% 100%;
50
41
  --muted: 220 8% 7%;
51
- --muted-foreground: 210 1% 42%;
42
+ --muted-foreground: 210 1% 48%;
52
43
  --accent: 0 100% 69%;
53
44
  --accent-foreground: 210 1% 27%;
54
45
  --destructive: 0 72% 51%;
55
46
  --destructive-foreground: 0 0% 100%;
56
47
  --border: 210 2% 19%;
57
- --input: 220 8% 7%;
48
+ --input: 210 2% 19%;
58
49
  --ring: 240 1% 61%;
59
50
  --success: 151 59% 59%;
60
51
  --success-foreground: 210 20% 2%;
@@ -68,17 +59,35 @@ html[data-brand="raycast"] {
68
59
  --sidebar-accent-foreground: 210 1% 27%;
69
60
  --sidebar-border: 210 2% 19%;
70
61
  --sidebar-ring: 240 1% 61%;
62
+ --brand-primary: hsl(0 100% 69%);
63
+ --brand-accent: hsl(0 0% 90%);
64
+ --brand-accent-foreground: hsl(210 1% 27%);
65
+ --brand-tertiary: hsl(0 0% 90%);
71
66
  --brand-gradient: hsl(var(--primary));
72
67
  --brand-gradient-reverse: hsl(var(--primary));
73
68
  --brand-gradient-vertical: hsl(var(--primary));
74
69
  --brand-gradient-radial: hsl(var(--primary));
75
70
 
71
+ /* ── Neutral ramp, anchored on this language's roles ── */
72
+ --neutral-1: hsl(210 20% 2%);
73
+ --neutral-2: hsl(220 18% 3%);
74
+ --neutral-3: color-mix(in oklab, hsl(210 2% 19%) 20%, hsl(220 18% 3%));
75
+ --neutral-4: color-mix(in oklab, hsl(210 2% 19%) 40%, hsl(220 18% 3%));
76
+ --neutral-5: color-mix(in oklab, hsl(210 2% 19%) 60%, hsl(220 18% 3%));
77
+ --neutral-6: color-mix(in oklab, hsl(210 2% 19%) 80%, hsl(220 18% 3%));
78
+ --neutral-7: hsl(210 2% 19%);
79
+ --neutral-8: color-mix(in oklab, hsl(210 1% 48%) 25%, hsl(210 2% 19%));
80
+ --neutral-9: color-mix(in oklab, hsl(210 1% 48%) 50%, hsl(210 2% 19%));
81
+ --neutral-10: color-mix(in oklab, hsl(210 1% 48%) 75%, hsl(210 2% 19%));
82
+ --neutral-11: hsl(210 1% 48%);
83
+ --neutral-12: hsl(0 0% 100%);
84
+
76
85
  /* Recipe (action language + free elev/radii) */
77
86
  /* Shape slots */
78
87
  --btn-default-radius: 8px;
79
88
  --radius-button: 8px;
80
89
  --radius-buttons: 8px;
81
- --radius-md: 8px;
90
+ --radius-md: min(8px, 16px);
82
91
  --radius-card: 16px;
83
92
  --radius-lg: 16px;
84
93
  --radius-badge: 6px;
@@ -103,22 +112,22 @@ html[data-brand="raycast"] {
103
112
  0,
104
113
  0.2
105
114
  ) 0px -1px 0px 0px inset;
106
- --shadow-xs: 0 0 #0000;
107
- --shadow-sm:
115
+ --elevation-xs: 0 0 #0000;
116
+ --elevation-sm:
108
117
  rgba(255, 255, 255, 0.05) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.25) 0px 0px 0px 1px, rgba(
109
118
  0,
110
119
  0,
111
120
  0,
112
121
  0.2
113
122
  ) 0px -1px 0px 0px inset;
114
- --shadow-md:
123
+ --elevation-md:
115
124
  rgba(255, 255, 255, 0.05) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.25) 0px 0px 0px 1px, rgba(
116
125
  0,
117
126
  0,
118
127
  0,
119
128
  0.2
120
129
  ) 0px -1px 0px 0px inset;
121
- --shadow-lg:
130
+ --elevation-lg:
122
131
  rgba(255, 255, 255, 0.05) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.25) 0px 0px 0px 1px, rgba(
123
132
  0,
124
133
  0,
@@ -130,7 +139,7 @@ html[data-brand="raycast"] {
130
139
  --btn-default-fg: hsl(var(--primary-foreground));
131
140
  --btn-default-border-width: 0px;
132
141
  --btn-default-border: transparent;
133
- --btn-default-stroke-gradient: transparent;
142
+ --btn-default-stroke-gradient: linear-gradient(transparent, transparent);
134
143
  --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
135
144
  --badge-default-bg: hsl(var(--secondary));
136
145
  --badge-default-fg: hsl(var(--secondary-foreground));
@@ -142,131 +151,53 @@ html[data-brand="raycast"] {
142
151
  --control-height-sm: 1.75rem;
143
152
  --control-height-md: 2rem;
144
153
  --control-height-lg: 2.5rem;
154
+ --control-height-icon-sm: 1.5rem;
155
+ --control-height-icon-md: 1.75rem;
156
+ --control-height-icon-lg: 2rem;
145
157
  --control-font-size-md: 0.8125rem;
146
158
 
147
159
  /* Typography */
148
- --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
149
- --font-heading: "Inter", ui-sans-serif, system-ui, sans-serif;
150
- --font-display: "Inter", ui-sans-serif, system-ui, sans-serif;
151
- --font-mono: "Geist Mono", "GeistMono", ui-monospace, Menlo, monospace;
160
+ --font-sans:
161
+ var(--font-inter), "Inter", var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC",
162
+ ui-sans-serif, system-ui, -apple-system, sans-serif;
163
+ --font-cn:
164
+ var(--font-inter), "Inter", var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC",
165
+ ui-sans-serif, system-ui, -apple-system, sans-serif;
166
+ --font-heading:
167
+ var(--font-inter), "Inter", var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC",
168
+ ui-sans-serif, system-ui, sans-serif;
169
+ --font-display:
170
+ var(--font-inter), "Inter", var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC",
171
+ ui-sans-serif, system-ui, sans-serif;
172
+ --font-mono: var(--font-geist-mono), "Geist Mono", "GeistMono", ui-monospace, Menlo, monospace;
152
173
  --font-weight-heading: 400;
153
174
 
154
- /* Zone type scales */
155
- --zone-product-caption-size: 11px;
156
- --zone-product-caption-leading: 0.91;
157
- --zone-product-caption-tracking: 0.8px;
158
- --zone-product-caption-weight: 500;
159
- --zone-product-body-sm-size: 13px;
160
- --zone-product-body-sm-leading: 1.2;
161
- --zone-product-body-sm-weight: 500;
162
- --zone-product-body-size: 16px;
163
- --zone-product-body-leading: 1.15;
164
- --zone-product-body-weight: 400;
165
- --zone-product-body-lg-size: 18px;
166
- --zone-product-body-lg-leading: 1.15;
167
- --zone-product-body-lg-weight: 400;
168
- --zone-product-subheading-size: 20px;
169
- --zone-product-subheading-leading: 1.2;
170
- --zone-product-subheading-tracking: 0.2px;
171
- --zone-product-subheading-weight: 400;
172
- --zone-product-heading-sm-size: 24px;
173
- --zone-product-heading-sm-leading: 1.15;
174
- --zone-product-heading-sm-weight: 500;
175
- --zone-product-heading-size: 32px;
176
- --zone-product-heading-leading: 1.15;
177
- --zone-product-heading-weight: 500;
178
- --zone-marketing-body-size: 16px;
179
- --zone-marketing-body-leading: 1.15;
180
- --zone-marketing-body-weight: 400;
181
- --zone-marketing-heading-size: 32px;
182
- --zone-marketing-heading-leading: 1.15;
183
- --zone-marketing-heading-weight: 500;
184
- --zone-marketing-heading-lg-size: 56px;
185
- --zone-marketing-heading-lg-leading: 1.17;
186
- --zone-marketing-heading-lg-tracking: 0.22px;
187
- --zone-marketing-heading-lg-weight: 400;
188
- --zone-marketing-display-size: 64px;
189
- --zone-marketing-display-leading: 1.1;
190
- --zone-marketing-display-weight: 600;
175
+ /* Motion */
176
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
177
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
178
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
179
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
180
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
181
+ --motion-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
182
+ --duration-micro: 90ms;
183
+ --motion-duration-micro: 90ms;
184
+ --duration-flow: 160ms;
185
+ --motion-duration-flow: 160ms;
186
+ --duration-reveal: 220ms;
187
+ --motion-duration-reveal: 220ms;
188
+ --duration-cinematic: 340ms;
189
+ --motion-duration-cinematic: 340ms;
190
+
191
+ /* Spacing */
192
+ --space-source-xs: 0.375rem;
193
+ --space-source-sm: 0.5rem;
194
+ --space-source-md: 0.75rem;
195
+ --space-source-lg: 1rem;
196
+ --space-source-xl: 1.375rem;
197
+ --space-source-2xl: 2rem;
191
198
 
192
199
  /* Taxonomy / decorative (not product CTA) */
193
200
  --brand-category-brand: #ff6363;
194
201
  --brand-category-ember: #452324;
195
202
  --brand-category-sky: #63a1ff;
196
203
  }
197
-
198
- /* Zone: product — product never inherits marketing display */
199
- [data-zone="product"],
200
- .zone-product {
201
- font-size: var(--zone-product-body-size, 16px);
202
- line-height: var(--zone-product-body-leading, 1.15);
203
- font-weight: var(--zone-product-body-weight, 400);
204
- --text-caption: var(--zone-product-caption-size, inherit);
205
- --leading-caption: var(--zone-product-caption-leading, inherit);
206
- --tracking-caption: var(--zone-product-caption-tracking, inherit);
207
- --text-body-sm: var(--zone-product-body-sm-size, inherit);
208
- --leading-body-sm: var(--zone-product-body-sm-leading, inherit);
209
- --tracking-body-sm: var(--zone-product-body-sm-tracking, inherit);
210
- --text-body: var(--zone-product-body-size, inherit);
211
- --leading-body: var(--zone-product-body-leading, inherit);
212
- --tracking-body: var(--zone-product-body-tracking, inherit);
213
- --text-body-lg: var(--zone-product-body-lg-size, inherit);
214
- --leading-body-lg: var(--zone-product-body-lg-leading, inherit);
215
- --tracking-body-lg: var(--zone-product-body-lg-tracking, inherit);
216
- --text-subheading: var(--zone-product-subheading-size, inherit);
217
- --leading-subheading: var(--zone-product-subheading-leading, inherit);
218
- --tracking-subheading: var(--zone-product-subheading-tracking, inherit);
219
- --text-heading-sm: var(--zone-product-heading-sm-size, inherit);
220
- --leading-heading-sm: var(--zone-product-heading-sm-leading, inherit);
221
- --tracking-heading-sm: var(--zone-product-heading-sm-tracking, inherit);
222
- --text-heading: var(--zone-product-heading-size, inherit);
223
- --leading-heading: var(--zone-product-heading-leading, inherit);
224
- --tracking-heading: var(--zone-product-heading-tracking, inherit);
225
- --text-heading-lg: var(--zone-product-heading-lg-size, inherit);
226
- --leading-heading-lg: var(--zone-product-heading-lg-leading, inherit);
227
- --tracking-heading-lg: var(--zone-product-heading-lg-tracking, inherit);
228
- --text-display: var(--zone-product-display-size, var(--zone-product-heading-size, inherit));
229
- --leading-display: var(--zone-product-display-leading, inherit);
230
- --tracking-display: var(--zone-product-display-tracking, inherit);
231
- }
232
-
233
- /* Zone: marketing — product never inherits marketing display */
234
- [data-zone="marketing"],
235
- .zone-marketing {
236
- font-size: var(--zone-marketing-body-size, 16px);
237
- line-height: var(--zone-marketing-body-leading, 1.15);
238
- font-weight: var(--zone-marketing-body-weight, 400);
239
- --text-caption: var(--zone-marketing-caption-size, inherit);
240
- --leading-caption: var(--zone-marketing-caption-leading, inherit);
241
- --tracking-caption: var(--zone-marketing-caption-tracking, inherit);
242
- --text-body-sm: var(--zone-marketing-body-sm-size, inherit);
243
- --leading-body-sm: var(--zone-marketing-body-sm-leading, inherit);
244
- --tracking-body-sm: var(--zone-marketing-body-sm-tracking, inherit);
245
- --text-body: var(--zone-marketing-body-size, inherit);
246
- --leading-body: var(--zone-marketing-body-leading, inherit);
247
- --tracking-body: var(--zone-marketing-body-tracking, inherit);
248
- --text-body-lg: var(--zone-marketing-body-lg-size, inherit);
249
- --leading-body-lg: var(--zone-marketing-body-lg-leading, inherit);
250
- --tracking-body-lg: var(--zone-marketing-body-lg-tracking, inherit);
251
- --text-subheading: var(--zone-marketing-subheading-size, inherit);
252
- --leading-subheading: var(--zone-marketing-subheading-leading, inherit);
253
- --tracking-subheading: var(--zone-marketing-subheading-tracking, inherit);
254
- --text-heading-sm: var(--zone-marketing-heading-sm-size, inherit);
255
- --leading-heading-sm: var(--zone-marketing-heading-sm-leading, inherit);
256
- --tracking-heading-sm: var(--zone-marketing-heading-sm-tracking, inherit);
257
- --text-heading: var(--zone-marketing-heading-size, inherit);
258
- --leading-heading: var(--zone-marketing-heading-leading, inherit);
259
- --tracking-heading: var(--zone-marketing-heading-tracking, inherit);
260
- --text-heading-lg: var(--zone-marketing-heading-lg-size, inherit);
261
- --leading-heading-lg: var(--zone-marketing-heading-lg-leading, inherit);
262
- --tracking-heading-lg: var(--zone-marketing-heading-lg-tracking, inherit);
263
- --text-display: var(--zone-marketing-display-size, inherit);
264
- --leading-display: var(--zone-marketing-display-leading, inherit);
265
- --tracking-display: var(--zone-marketing-display-tracking, inherit);
266
- }
267
-
268
- /* Product chrome must not use decorative gradients as action fills */
269
- [data-zone="product"] .btn-brand-default,
270
- .zone-product .btn-brand-default {
271
- /* intentional no-op: documents contract; action uses --primary only */
272
- }