@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,248 @@
1
+ /**
2
+ * Brand carrier skin: Stripe (stripe) v1.0.0
3
+ * darkDefault=false dualMode=false 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: "sohne-var";
11
+ src: url("/brand-assets/sohne-var.woff2") format("woff2");
12
+ font-weight: 300 400;
13
+ font-display: swap;
14
+ }
15
+
16
+ :root,
17
+ html[data-brand="stripe"] {
18
+ /* ── Color roles (carrier) ── */
19
+ --role-canvas: 0 0% 100%;
20
+ --role-canvas-fg: 211 78% 11%;
21
+ --role-surface: 0 0% 100%;
22
+ --role-surface-fg: 211 78% 11%;
23
+ --role-action: 248 98% 61%;
24
+ --role-action-fg: 0 0% 100%;
25
+ --role-quiet: 237 100% 95%;
26
+ --role-quiet-fg: 248 98% 61%;
27
+ --role-muted: 216 56% 98%;
28
+ --role-muted-fg: 217 17% 47%;
29
+ --role-border: 210 44% 93%;
30
+ --role-input: 0 0% 100%;
31
+ --role-ring: 248 98% 61%;
32
+ --role-brand: 211 78% 11%;
33
+ --role-brand-fg: 0 0% 100%;
34
+ --brand-mark: 211 78% 11%;
35
+ --brand-mark-foreground: 0 0% 100%;
36
+
37
+ /* ── shadcn bridge (primary = action CTA) ── */
38
+ --background: 0 0% 100%;
39
+ --foreground: 211 78% 11%;
40
+ --card: 0 0% 100%;
41
+ --card-foreground: 211 78% 11%;
42
+ --popover: 0 0% 100%;
43
+ --popover-foreground: 211 78% 11%;
44
+ --primary: 248 98% 61%;
45
+ --primary-foreground: 0 0% 100%;
46
+ --secondary: 237 100% 95%;
47
+ --secondary-foreground: 248 98% 61%;
48
+ --muted: 216 56% 98%;
49
+ --muted-foreground: 217 17% 47%;
50
+ --accent: 211 78% 11%;
51
+ --accent-foreground: 0 0% 100%;
52
+ --destructive: 0 72% 51%;
53
+ --destructive-foreground: 0 0% 100%;
54
+ --border: 210 44% 93%;
55
+ --input: 0 0% 100%;
56
+ --ring: 248 98% 61%;
57
+ --info: 231 100% 73%;
58
+ --info-foreground: 211 78% 11%;
59
+ --sidebar: 0 0% 100%;
60
+ --sidebar-foreground: 211 78% 11%;
61
+ --sidebar-primary: 248 98% 61%;
62
+ --sidebar-primary-foreground: 0 0% 100%;
63
+ --sidebar-accent: 211 78% 11%;
64
+ --sidebar-accent-foreground: 0 0% 100%;
65
+ --sidebar-border: 210 44% 93%;
66
+ --sidebar-ring: 248 98% 61%;
67
+ --brand-gradient: hsl(var(--primary));
68
+ --brand-gradient-reverse: hsl(var(--primary));
69
+ --brand-gradient-vertical: hsl(var(--primary));
70
+ --brand-gradient-radial: hsl(var(--primary));
71
+
72
+ /* Recipe (action language + free elev/radii) */
73
+ /* Shape slots */
74
+ --btn-default-radius: 4px;
75
+ --radius-button: 4px;
76
+ --radius-buttons: 4px;
77
+ --radius-md: 4px;
78
+ --radius-card: 4px;
79
+ --radius-lg: 4px;
80
+ --radius-badge: 9999px;
81
+ --badge-default-radius: 9999px;
82
+ --radius-inputs: 4px;
83
+ --input-radius: 4px;
84
+ --radius-pill: 9999px;
85
+
86
+ /* Free elevation (carrier-provided CSS shadows) */
87
+ --elevation-card: 0 0 #0000;
88
+ --elevation-control: 0 0 #0000;
89
+ --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;
94
+ --btn-default-shadow: 0 0 #0000;
95
+ --btn-default-bg: hsl(var(--primary));
96
+ --btn-default-fg: hsl(var(--primary-foreground));
97
+ --btn-default-border-width: 0px;
98
+ --btn-default-border: transparent;
99
+ --btn-default-stroke-gradient: transparent;
100
+ --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
101
+ --badge-default-bg: hsl(var(--secondary));
102
+ --badge-default-fg: hsl(var(--secondary-foreground));
103
+ --badge-default-border: transparent;
104
+ --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
105
+
106
+ /* 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;
110
+ --font-weight-heading: 300;
111
+
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;
157
+
158
+ /* Taxonomy / decorative (not product CTA) */
159
+ --brand-category-brand: #061b31;
160
+ --brand-category-action: #533afd;
161
+ --brand-category-link: #533afd;
162
+ --brand-category-hover: #7389ff;
163
+ --brand-category-ghostborder: #b9b9f9;
164
+ --brand-category-wash: #e8e9ff;
165
+ --brand-category-deep: #182659;
166
+ --brand-category-smoke: #839bc8;
167
+ --brand-category-steel: #50617a;
168
+ --brand-decorative-section-band: #f8fafd;
169
+ --brand-decorative-frost: #e5edf5;
170
+ }
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
+ }
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Brand carrier skin: Vanta (vanta) v1.0.0
3
+ * darkDefault=false dualMode=false button=solid
4
+ * fonts=3 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: "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
+ :root,
32
+ html[data-brand="vanta"] {
33
+ /* ── Color roles (carrier) ── */
34
+ --role-canvas: 220 23% 97%;
35
+ --role-canvas-fg: 240 17% 11%;
36
+ --role-surface: 0 0% 100%;
37
+ --role-surface-fg: 240 17% 11%;
38
+ --role-action: 268 95% 39%;
39
+ --role-action-fg: 0 0% 100%;
40
+ --role-quiet: 250 100% 92%;
41
+ --role-quiet-fg: 272 100% 14%;
42
+ --role-muted: 240 20% 93%;
43
+ --role-muted-fg: 238 11% 48%;
44
+ --role-border: 240 17% 11%;
45
+ --role-input: 0 0% 100%;
46
+ --role-ring: 268 95% 39%;
47
+ --role-brand: 272 100% 14%;
48
+ --role-brand-fg: 0 0% 100%;
49
+ --brand-mark: 272 100% 14%;
50
+ --brand-mark-foreground: 0 0% 100%;
51
+
52
+ /* ── shadcn bridge (primary = action CTA) ── */
53
+ --background: 220 23% 97%;
54
+ --foreground: 240 17% 11%;
55
+ --card: 0 0% 100%;
56
+ --card-foreground: 240 17% 11%;
57
+ --popover: 0 0% 100%;
58
+ --popover-foreground: 240 17% 11%;
59
+ --primary: 268 95% 39%;
60
+ --primary-foreground: 0 0% 100%;
61
+ --secondary: 250 100% 92%;
62
+ --secondary-foreground: 272 100% 14%;
63
+ --muted: 240 20% 93%;
64
+ --muted-foreground: 238 11% 48%;
65
+ --accent: 272 100% 14%;
66
+ --accent-foreground: 0 0% 100%;
67
+ --destructive: 0 72% 51%;
68
+ --destructive-foreground: 0 0% 100%;
69
+ --border: 240 17% 11%;
70
+ --input: 0 0% 100%;
71
+ --ring: 268 95% 39%;
72
+ --warning: 44 100% 53%;
73
+ --warning-foreground: 240 17% 11%;
74
+ --info: 270 63% 56%;
75
+ --info-foreground: 0 0% 100%;
76
+ --sidebar: 0 0% 100%;
77
+ --sidebar-foreground: 240 17% 11%;
78
+ --sidebar-primary: 268 95% 39%;
79
+ --sidebar-primary-foreground: 0 0% 100%;
80
+ --sidebar-accent: 272 100% 14%;
81
+ --sidebar-accent-foreground: 0 0% 100%;
82
+ --sidebar-border: 240 17% 11%;
83
+ --sidebar-ring: 268 95% 39%;
84
+ --brand-gradient: hsl(var(--primary));
85
+ --brand-gradient-reverse: hsl(var(--primary));
86
+ --brand-gradient-vertical: hsl(var(--primary));
87
+ --brand-gradient-radial: hsl(var(--primary));
88
+
89
+ /* Recipe (action language + free elev/radii) */
90
+ /* Shape slots */
91
+ --btn-default-radius: 999px;
92
+ --radius-button: 999px;
93
+ --radius-buttons: 999px;
94
+ --radius-md: 999px;
95
+ --radius-card: 16px;
96
+ --radius-lg: 16px;
97
+ --radius-badge: 999px;
98
+ --badge-default-radius: 999px;
99
+ --radius-inputs: 999px;
100
+ --input-radius: 999px;
101
+ --radius-pill: 9999px;
102
+
103
+ /* Free elevation (carrier-provided CSS shadows) */
104
+ --elevation-card: 0 0 #0000;
105
+ --elevation-control: 0 0 #0000;
106
+ --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;
111
+ --btn-default-shadow: 0 0 #0000;
112
+ --btn-default-bg: hsl(var(--primary));
113
+ --btn-default-fg: hsl(var(--primary-foreground));
114
+ --btn-default-border-width: 0px;
115
+ --btn-default-border: transparent;
116
+ --btn-default-stroke-gradient: transparent;
117
+ --btn-default-hover-bg: color-mix(in srgb, hsl(var(--primary)) 90%, transparent);
118
+ --badge-default-bg: hsl(var(--secondary));
119
+ --badge-default-fg: hsl(var(--secondary-foreground));
120
+ --badge-default-border: transparent;
121
+ --badge-default-hover-bg: color-mix(in srgb, hsl(var(--secondary)) 90%, white);
122
+
123
+ /* 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;
127
+ --font-weight-heading: 500;
128
+
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;
167
+
168
+ /* Taxonomy / decorative (not product CTA) */
169
+ --brand-category-brand: #260048;
170
+ --brand-category-action: #5e05c4;
171
+ --brand-category-link: #8f47d5;
172
+ --brand-category-herowash: #ddd6ff;
173
+ --brand-category-warning: #ffbe0f;
174
+ --brand-category-steel: #9e9fb7;
175
+ --brand-category-ash: #dfdfe9;
176
+ --brand-decorative-hero-wash: #ddd6ff;
177
+ }
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
+ }