@nebutra/tokens 0.1.1 → 0.1.2

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 (57) hide show
  1. package/.turbo/turbo-build.log +5 -2
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/AGENTS.md +5 -2
  4. package/CHANGELOG.md +23 -0
  5. package/DESIGN.md +30 -8
  6. package/LICENSE +21 -676
  7. package/README.md +41 -8
  8. package/brands/gsap/brand.json +180 -0
  9. package/brands/linear/brand.json +202 -0
  10. package/brands/notion/brand.json +189 -0
  11. package/brands/raycast/brand.json +167 -0
  12. package/brands/stripe/brand.json +183 -0
  13. package/brands/vanta/brand.json +198 -0
  14. package/brands/vercel/brand.json +207 -0
  15. package/package.json +17 -8
  16. package/recipe.css +114 -0
  17. package/scripts/compile-brand-run.ts +79 -0
  18. package/scripts/compile-brand.mjs +25 -0
  19. package/scripts/emit-skins-run.ts +62 -0
  20. package/scripts/emit-skins.mjs +31 -0
  21. package/scripts/sync-styles.mjs +29 -0
  22. package/skins/README.md +151 -0
  23. package/skins/gsap.css +247 -0
  24. package/skins/linear.css +282 -0
  25. package/skins/notion.css +248 -0
  26. package/skins/raycast.css +272 -0
  27. package/skins/stripe.css +248 -0
  28. package/skins/vanta.css +255 -0
  29. package/skins/vercel.css +283 -0
  30. package/src/brand-package/__tests__/compile-refero.test.ts +427 -0
  31. package/src/brand-package/__tests__/emit-css.test.ts +130 -0
  32. package/src/brand-package/apply-brand.ts +92 -0
  33. package/src/brand-package/compile-helpers.ts +170 -0
  34. package/src/brand-package/compile-refero.ts +69 -0
  35. package/src/brand-package/emit-css.ts +468 -0
  36. package/src/brand-package/hex-to-hsl.ts +100 -0
  37. package/src/brand-package/index.ts +71 -0
  38. package/src/brand-package/infer-recipe.ts +198 -0
  39. package/src/brand-package/normalize.ts +295 -0
  40. package/src/brand-package/presets/context.ts +17 -0
  41. package/src/brand-package/presets/generic.ts +214 -0
  42. package/src/brand-package/presets/gsap.ts +146 -0
  43. package/src/brand-package/presets/index.ts +31 -0
  44. package/src/brand-package/presets/linear.ts +183 -0
  45. package/src/brand-package/presets/notion.ts +208 -0
  46. package/src/brand-package/presets/raycast.ts +138 -0
  47. package/src/brand-package/presets/recipe.ts +61 -0
  48. package/src/brand-package/presets/stripe.ts +207 -0
  49. package/src/brand-package/presets/vanta.ts +220 -0
  50. package/src/brand-package/presets/vercel.ts +187 -0
  51. package/src/brand-package/types.ts +285 -0
  52. package/src/brand-package/use-brand.ts +207 -0
  53. package/src/brand-package/validate.ts +108 -0
  54. package/src/index.ts +31 -1
  55. package/src/theme-provider.tsx +5 -3
  56. package/styles.css +153 -69
  57. package/turbo.json +15 -0
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Brand carrier skin: Vercel (vercel) v1.0.0
3
+ * darkDefault=false dualMode=true button=solid
4
+ * fonts=1 zones=yes mode=global
5
+ * Contract: roles.action → --primary; roles.brand → --brand-mark (never default CTA)
6
+ */
7
+
8
+ /* Brand font faces */
9
+ @font-face {
10
+ font-family: "Geist Sans";
11
+ src: url("https://cdn.jsdelivr.net/fontsource/fonts/geist-sans:vf@latest/latin-wght-normal.woff2")
12
+ format("woff2");
13
+ font-weight: 100 900;
14
+ font-display: swap;
15
+ }
16
+
17
+ :root,
18
+ html[data-brand="vercel"] {
19
+ /* ── Color roles (carrier) ── */
20
+ --role-canvas: 0 0% 98%;
21
+ --role-canvas-fg: 0 0% 9%;
22
+ --role-surface: 0 0% 100%;
23
+ --role-surface-fg: 0 0% 9%;
24
+ --role-action: 0 0% 9%;
25
+ --role-action-fg: 0 0% 100%;
26
+ --role-quiet: 0 0% 92%;
27
+ --role-quiet-fg: 0 0% 30%;
28
+ --role-muted: 0 0% 92%;
29
+ --role-muted-fg: 0 0% 40%;
30
+ --role-border: 0 0% 92%;
31
+ --role-input: 0 0% 100%;
32
+ --role-ring: 0 0% 9%;
33
+
34
+ /* ── shadcn bridge (primary = action CTA) ── */
35
+ --background: 0 0% 98%;
36
+ --foreground: 0 0% 9%;
37
+ --card: 0 0% 100%;
38
+ --card-foreground: 0 0% 9%;
39
+ --popover: 0 0% 100%;
40
+ --popover-foreground: 0 0% 9%;
41
+ --primary: 0 0% 9%;
42
+ --primary-foreground: 0 0% 100%;
43
+ --secondary: 0 0% 92%;
44
+ --secondary-foreground: 0 0% 30%;
45
+ --muted: 0 0% 92%;
46
+ --muted-foreground: 0 0% 40%;
47
+ --accent: 0 0% 92%;
48
+ --accent-foreground: 0 0% 30%;
49
+ --destructive: 0 72% 51%;
50
+ --destructive-foreground: 0 0% 100%;
51
+ --border: 0 0% 92%;
52
+ --input: 0 0% 100%;
53
+ --ring: 0 0% 9%;
54
+ --success: 133 50% 32%;
55
+ --success-foreground: 0 0% 100%;
56
+ --info: 0 0% 30%;
57
+ --info-foreground: 0 0% 100%;
58
+ --sidebar: 0 0% 100%;
59
+ --sidebar-foreground: 0 0% 9%;
60
+ --sidebar-primary: 0 0% 9%;
61
+ --sidebar-primary-foreground: 0 0% 100%;
62
+ --sidebar-accent: 0 0% 92%;
63
+ --sidebar-accent-foreground: 0 0% 30%;
64
+ --sidebar-border: 0 0% 92%;
65
+ --sidebar-ring: 0 0% 9%;
66
+ --brand-gradient: hsl(var(--primary));
67
+ --brand-gradient-reverse: hsl(var(--primary));
68
+ --brand-gradient-vertical: hsl(var(--primary));
69
+ --brand-gradient-radial: hsl(var(--primary));
70
+
71
+ /* Recipe (action language + free elev/radii) */
72
+ /* Shape slots */
73
+ --btn-default-radius: 6px;
74
+ --radius-button: 6px;
75
+ --radius-buttons: 6px;
76
+ --radius-md: 6px;
77
+ --radius-card: 6px;
78
+ --radius-lg: 6px;
79
+ --radius-badge: 6px;
80
+ --badge-default-radius: 6px;
81
+ --radius-inputs: 6px;
82
+ --input-radius: 6px;
83
+ --radius-pill: 9999px;
84
+
85
+ /* Free elevation (carrier-provided CSS shadows) */
86
+ --elevation-card: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
87
+ --elevation-control: 0 0 #0000;
88
+ --elevation-raised: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
89
+ --shadow-xs: 0 0 #0000;
90
+ --shadow-sm: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
91
+ --shadow-md: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
92
+ --shadow-lg: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
93
+ --btn-default-shadow: 0 0 #0000;
94
+ --btn-default-bg: hsl(var(--primary));
95
+ --btn-default-fg: hsl(var(--primary-foreground));
96
+ --btn-default-border-width: 0px;
97
+ --btn-default-border: transparent;
98
+ --btn-default-stroke-gradient: transparent;
99
+ --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
100
+ --badge-default-bg: hsl(var(--secondary));
101
+ --badge-default-fg: hsl(var(--secondary-foreground));
102
+ --badge-default-border: transparent;
103
+ --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
104
+ --btn-default-padding-y: 0.5rem;
105
+ --btn-default-padding-x: 0.875rem;
106
+ --control-height-tiny: 1.25rem;
107
+ --control-height-sm: 1.75rem;
108
+ --control-height-md: 2rem;
109
+ --control-height-lg: 2.5rem;
110
+ --control-font-size-md: 0.8125rem;
111
+
112
+ /* Typography */
113
+ --font-sans: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
114
+ --font-heading: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
115
+ --font-display: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
116
+ --font-mono: "Geist Mono", ui-monospace, Menlo, monospace;
117
+ --font-weight-heading: 450;
118
+
119
+ /* Zone type scales */
120
+ --zone-product-caption-size: 13px;
121
+ --zone-product-caption-leading: 1.54;
122
+ --zone-product-caption-weight: 400;
123
+ --zone-product-body-sm-size: 14px;
124
+ --zone-product-body-sm-leading: 1.43;
125
+ --zone-product-body-sm-weight: 400;
126
+ --zone-product-body-size: 16px;
127
+ --zone-product-body-leading: 1.5;
128
+ --zone-product-body-weight: 400;
129
+ --zone-product-heading-size: 30px;
130
+ --zone-product-heading-leading: 1.1;
131
+ --zone-product-heading-tracking: -1.5px;
132
+ --zone-product-heading-weight: 500;
133
+ --zone-marketing-body-size: 16px;
134
+ --zone-marketing-body-leading: 1.5;
135
+ --zone-marketing-body-weight: 400;
136
+ --zone-marketing-heading-size: 30px;
137
+ --zone-marketing-heading-leading: 1.1;
138
+ --zone-marketing-heading-tracking: -1.5px;
139
+ --zone-marketing-heading-weight: 450;
140
+ --zone-marketing-heading-lg-size: 56px;
141
+ --zone-marketing-heading-lg-leading: 1;
142
+ --zone-marketing-heading-lg-tracking: -3.36px;
143
+ --zone-marketing-heading-lg-weight: 450;
144
+ --zone-marketing-display-size: 64px;
145
+ --zone-marketing-display-leading: 1;
146
+ --zone-marketing-display-tracking: -3.84px;
147
+ --zone-marketing-display-weight: 450;
148
+
149
+ /* Taxonomy / decorative (not product CTA) */
150
+ --brand-category-carbon: #000000;
151
+ --brand-category-terminal: #297a3a;
152
+ }
153
+
154
+ .dark,
155
+ html.dark[data-brand="vercel"] {
156
+ /* ── Color roles (carrier) ── */
157
+ --role-canvas: 0 0% 0%;
158
+ --role-canvas-fg: 0 0% 93%;
159
+ --role-surface: 0 0% 4%;
160
+ --role-surface-fg: 0 0% 93%;
161
+ --role-action: 0 0% 100%;
162
+ --role-action-fg: 0 0% 0%;
163
+ --role-quiet: 0 0% 12%;
164
+ --role-quiet-fg: 0 0% 93%;
165
+ --role-muted: 0 0% 12%;
166
+ --role-muted-fg: 0 0% 63%;
167
+ --role-border: 0 0% 16%;
168
+ --role-input: 0 0% 4%;
169
+ --role-ring: 0 0% 100%;
170
+
171
+ /* ── shadcn bridge (primary = action CTA) ── */
172
+ --background: 0 0% 0%;
173
+ --foreground: 0 0% 93%;
174
+ --card: 0 0% 4%;
175
+ --card-foreground: 0 0% 93%;
176
+ --popover: 0 0% 4%;
177
+ --popover-foreground: 0 0% 93%;
178
+ --primary: 0 0% 100%;
179
+ --primary-foreground: 0 0% 0%;
180
+ --secondary: 0 0% 12%;
181
+ --secondary-foreground: 0 0% 93%;
182
+ --muted: 0 0% 12%;
183
+ --muted-foreground: 0 0% 63%;
184
+ --accent: 0 0% 12%;
185
+ --accent-foreground: 0 0% 93%;
186
+ --destructive: 0 72% 51%;
187
+ --destructive-foreground: 0 0% 100%;
188
+ --border: 0 0% 16%;
189
+ --input: 0 0% 4%;
190
+ --ring: 0 0% 100%;
191
+ --success: 133 49% 40%;
192
+ --success-foreground: 0 0% 100%;
193
+ --info: 0 0% 70%;
194
+ --info-foreground: 0 0% 0%;
195
+ --sidebar: 0 0% 4%;
196
+ --sidebar-foreground: 0 0% 93%;
197
+ --sidebar-primary: 0 0% 100%;
198
+ --sidebar-primary-foreground: 0 0% 0%;
199
+ --sidebar-accent: 0 0% 12%;
200
+ --sidebar-accent-foreground: 0 0% 93%;
201
+ --sidebar-border: 0 0% 16%;
202
+ --sidebar-ring: 0 0% 100%;
203
+ --brand-gradient: hsl(var(--primary));
204
+ --brand-gradient-reverse: hsl(var(--primary));
205
+ --brand-gradient-vertical: hsl(var(--primary));
206
+ --brand-gradient-radial: hsl(var(--primary));
207
+ }
208
+
209
+ /* Zone: product — product never inherits marketing display */
210
+ [data-zone="product"],
211
+ .zone-product {
212
+ font-size: var(--zone-product-body-size, 16px);
213
+ line-height: var(--zone-product-body-leading, 1.5);
214
+ font-weight: var(--zone-product-body-weight, 400);
215
+ --text-caption: var(--zone-product-caption-size, inherit);
216
+ --leading-caption: var(--zone-product-caption-leading, inherit);
217
+ --tracking-caption: var(--zone-product-caption-tracking, inherit);
218
+ --text-body-sm: var(--zone-product-body-sm-size, inherit);
219
+ --leading-body-sm: var(--zone-product-body-sm-leading, inherit);
220
+ --tracking-body-sm: var(--zone-product-body-sm-tracking, inherit);
221
+ --text-body: var(--zone-product-body-size, inherit);
222
+ --leading-body: var(--zone-product-body-leading, inherit);
223
+ --tracking-body: var(--zone-product-body-tracking, inherit);
224
+ --text-body-lg: var(--zone-product-body-lg-size, inherit);
225
+ --leading-body-lg: var(--zone-product-body-lg-leading, inherit);
226
+ --tracking-body-lg: var(--zone-product-body-lg-tracking, inherit);
227
+ --text-subheading: var(--zone-product-subheading-size, inherit);
228
+ --leading-subheading: var(--zone-product-subheading-leading, inherit);
229
+ --tracking-subheading: var(--zone-product-subheading-tracking, inherit);
230
+ --text-heading-sm: var(--zone-product-heading-sm-size, inherit);
231
+ --leading-heading-sm: var(--zone-product-heading-sm-leading, inherit);
232
+ --tracking-heading-sm: var(--zone-product-heading-sm-tracking, inherit);
233
+ --text-heading: var(--zone-product-heading-size, inherit);
234
+ --leading-heading: var(--zone-product-heading-leading, inherit);
235
+ --tracking-heading: var(--zone-product-heading-tracking, inherit);
236
+ --text-heading-lg: var(--zone-product-heading-lg-size, inherit);
237
+ --leading-heading-lg: var(--zone-product-heading-lg-leading, inherit);
238
+ --tracking-heading-lg: var(--zone-product-heading-lg-tracking, inherit);
239
+ --text-display: var(--zone-product-display-size, var(--zone-product-heading-size, inherit));
240
+ --leading-display: var(--zone-product-display-leading, inherit);
241
+ --tracking-display: var(--zone-product-display-tracking, inherit);
242
+ }
243
+
244
+ /* Zone: marketing — product never inherits marketing display */
245
+ [data-zone="marketing"],
246
+ .zone-marketing {
247
+ font-size: var(--zone-marketing-body-size, 16px);
248
+ line-height: var(--zone-marketing-body-leading, 1.5);
249
+ font-weight: var(--zone-marketing-body-weight, 400);
250
+ --text-caption: var(--zone-marketing-caption-size, inherit);
251
+ --leading-caption: var(--zone-marketing-caption-leading, inherit);
252
+ --tracking-caption: var(--zone-marketing-caption-tracking, inherit);
253
+ --text-body-sm: var(--zone-marketing-body-sm-size, inherit);
254
+ --leading-body-sm: var(--zone-marketing-body-sm-leading, inherit);
255
+ --tracking-body-sm: var(--zone-marketing-body-sm-tracking, inherit);
256
+ --text-body: var(--zone-marketing-body-size, inherit);
257
+ --leading-body: var(--zone-marketing-body-leading, inherit);
258
+ --tracking-body: var(--zone-marketing-body-tracking, inherit);
259
+ --text-body-lg: var(--zone-marketing-body-lg-size, inherit);
260
+ --leading-body-lg: var(--zone-marketing-body-lg-leading, inherit);
261
+ --tracking-body-lg: var(--zone-marketing-body-lg-tracking, inherit);
262
+ --text-subheading: var(--zone-marketing-subheading-size, inherit);
263
+ --leading-subheading: var(--zone-marketing-subheading-leading, inherit);
264
+ --tracking-subheading: var(--zone-marketing-subheading-tracking, inherit);
265
+ --text-heading-sm: var(--zone-marketing-heading-sm-size, inherit);
266
+ --leading-heading-sm: var(--zone-marketing-heading-sm-leading, inherit);
267
+ --tracking-heading-sm: var(--zone-marketing-heading-sm-tracking, inherit);
268
+ --text-heading: var(--zone-marketing-heading-size, inherit);
269
+ --leading-heading: var(--zone-marketing-heading-leading, inherit);
270
+ --tracking-heading: var(--zone-marketing-heading-tracking, inherit);
271
+ --text-heading-lg: var(--zone-marketing-heading-lg-size, inherit);
272
+ --leading-heading-lg: var(--zone-marketing-heading-lg-leading, inherit);
273
+ --tracking-heading-lg: var(--zone-marketing-heading-lg-tracking, inherit);
274
+ --text-display: var(--zone-marketing-display-size, inherit);
275
+ --leading-display: var(--zone-marketing-display-leading, inherit);
276
+ --tracking-display: var(--zone-marketing-display-tracking, inherit);
277
+ }
278
+
279
+ /* Product chrome must not use decorative gradients as action fills */
280
+ [data-zone="product"] .btn-brand-default,
281
+ .zone-product .btn-brand-default {
282
+ /* intentional no-op: documents contract; action uses --primary only */
283
+ }