@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
package/README.md CHANGED
@@ -5,8 +5,7 @@
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- # Internal monorepo dependency
9
- pnpm add @nebutra/tokens@workspace:*
8
+ pnpm add @nebutra/tokens
10
9
  ```
11
10
 
12
11
  ## Usage
@@ -58,22 +57,56 @@ function ThemeToggle() {
58
57
 
59
58
  | Export | Description |
60
59
  |--------|-------------|
61
- | `ThemeProvider` | React provider for light/dark mode (from next-themes) |
60
+ | `ThemeProvider` | React provider for light/dark mode (custom; class + cookie, not next-themes) |
62
61
  | `useTheme()` | Hook to read/set current theme |
63
62
  | `ThemeProviderProps` | Props type for ThemeProvider |
64
- | `THEME_IDS` | `["light", "dark"]` |
63
+ | `THEME_IDS` | `["light", "dark"]` (appearance mode, not design language) |
65
64
  | `ThemeId` | `"light" \| "dark"` |
66
65
  | `DEFAULT_THEME` | `"dark"` |
67
66
 
68
67
  ## Token Architecture
69
68
 
70
69
  ```
71
- @nebutra/brand --> Brand primitives (source data, not runtime)
72
- @nebutra/tokens --> Runtime CSS variables (THIS PACKAGE)
73
- @nebutra/theme --> Multi-theme presets (oklch, 6 variants)
74
- @nebutra/ui --> Components (consume tokens via CSS vars)
70
+ @nebutra/design-tokens --> DTCG JSON + Style Dictionary → build/css/styles.generated.css
71
+ @nebutra/tokens --> styles.css (copied from generated; verify:parity must stay 100%)
72
+ @nebutra/theme --> design languages (Brand Packages, applyLanguage)
73
+ @nebutra/ui --> components (consume tokens via CSS vars)
74
+ ```
75
+
76
+ ### Regenerating `styles.css`
77
+
78
+ ```bash
79
+ pnpm --filter @nebutra/design-tokens build
80
+ pnpm --filter @nebutra/design-tokens verify:parity # requires 100%
81
+ pnpm --filter @nebutra/tokens sync # copies styles.generated.css → styles.css
82
+ ```
83
+
84
+ ### Brand Packages (design-language skins)
85
+
86
+ ```ts
87
+ import { emitBrandCss, type BrandPackage } from "@nebutra/tokens/brand-package";
88
+
89
+ // Optional dual light/dark palettes (orthogonal to catalog language id):
90
+ const brand: BrandPackage = {
91
+ id: "acme",
92
+ name: "Acme",
93
+ darkDefault: false,
94
+ version: "1.0.0",
95
+ semantic: { /* default mode */ },
96
+ modes: {
97
+ light: { semantic: { /* light */ } },
98
+ dark: { semantic: { /* dark */ } },
99
+ },
100
+ recipe: { buttonDefault: "solid", density: "comfortable", radii: {…}, elevationTokens: {…} },
101
+ typography: { fontSans: "Inter, sans-serif" },
102
+ };
103
+ // emit: light under :root/html[data-brand]; dark under .dark/html.dark[data-brand]
75
104
  ```
76
105
 
77
106
  ## Peer Dependencies
78
107
 
79
108
  - `react` ^19
109
+
110
+ ## License
111
+
112
+ MIT
@@ -0,0 +1,180 @@
1
+ {
2
+ "id": "gsap",
3
+ "name": "GSAP",
4
+ "darkDefault": true,
5
+ "version": "1.0.0",
6
+ "semantic": {
7
+ "background": "150 7% 6%",
8
+ "foreground": "54 100% 94%",
9
+ "card": "0 0% 10%",
10
+ "cardForeground": "54 100% 94%",
11
+ "popover": "0 0% 10%",
12
+ "popoverForeground": "54 100% 94%",
13
+ "primary": "137 92% 47%",
14
+ "primaryForeground": "150 7% 6%",
15
+ "secondary": "70 5% 25%",
16
+ "secondaryForeground": "54 100% 94%",
17
+ "muted": "0 0% 10%",
18
+ "mutedForeground": "60 6% 46%",
19
+ "accent": "70 5% 25%",
20
+ "accentForeground": "54 100% 94%",
21
+ "destructive": "309 100% 47%",
22
+ "destructiveForeground": "54 100% 94%",
23
+ "border": "70 5% 25%",
24
+ "input": "70 5% 25%",
25
+ "ring": "137 92% 47%",
26
+ "success": "137 92% 47%",
27
+ "successForeground": "150 7% 6%",
28
+ "info": "191 100% 44%",
29
+ "infoForeground": "150 7% 6%"
30
+ },
31
+ "recipe": {
32
+ "buttonDefault": "gradient-stroke",
33
+ "density": "compact",
34
+ "badgeDefault": "match-action",
35
+ "radii": {
36
+ "button": "100px",
37
+ "card": "8px",
38
+ "badge": "9999px",
39
+ "input": "100px",
40
+ "pill": "9999px"
41
+ },
42
+ "elevationTokens": {
43
+ "card": "0 0 #0000",
44
+ "control": "0 0 #0000",
45
+ "raised": "0 0 #0000"
46
+ },
47
+ "primaryStrokeGradient": "linear-gradient(114.41deg, #0ae448 20.74%, #abff84 65.5%)",
48
+ "outlineBorder": "#fffce1"
49
+ },
50
+ "typography": {
51
+ "fontSans": "'Mori', 'Inter Tight', 'DM Sans', ui-sans-serif, system-ui, sans-serif",
52
+ "fontDisplay": "'Mori', 'Inter Tight', ui-sans-serif, system-ui, sans-serif",
53
+ "headingWeight": 600,
54
+ "faces": [
55
+ {
56
+ "family": "Mori",
57
+ "src": [
58
+ {
59
+ "url": "/brand-assets/mori-regular.woff2",
60
+ "format": "woff2"
61
+ }
62
+ ],
63
+ "weight": 400,
64
+ "display": "swap"
65
+ },
66
+ {
67
+ "family": "Mori",
68
+ "src": [
69
+ {
70
+ "url": "/brand-assets/mori-semibold.woff2",
71
+ "format": "woff2"
72
+ }
73
+ ],
74
+ "weight": 600,
75
+ "display": "swap"
76
+ }
77
+ ]
78
+ },
79
+ "zones": {
80
+ "product": {
81
+ "caption": {
82
+ "fontSize": "14px",
83
+ "lineHeight": 1.4,
84
+ "fontWeight": 400,
85
+ "letterSpacing": "-0.14px"
86
+ },
87
+ "bodySm": {
88
+ "fontSize": "16px",
89
+ "lineHeight": 1.15,
90
+ "fontWeight": 400
91
+ },
92
+ "body": {
93
+ "fontSize": "19px",
94
+ "lineHeight": 1.15,
95
+ "fontWeight": 400
96
+ },
97
+ "bodyLg": {
98
+ "fontSize": "23px",
99
+ "lineHeight": 1.38,
100
+ "fontWeight": 400,
101
+ "letterSpacing": "-0.23px"
102
+ },
103
+ "subheading": {
104
+ "fontSize": "34px",
105
+ "lineHeight": 1.2,
106
+ "fontWeight": 400,
107
+ "letterSpacing": "-0.34px"
108
+ },
109
+ "heading": {
110
+ "fontSize": "44px",
111
+ "lineHeight": 1.2,
112
+ "fontWeight": 600,
113
+ "letterSpacing": "-0.44px"
114
+ }
115
+ },
116
+ "marketing": {
117
+ "body": {
118
+ "fontSize": "19px",
119
+ "lineHeight": 1.15,
120
+ "fontWeight": 400
121
+ },
122
+ "heading": {
123
+ "fontSize": "66px",
124
+ "lineHeight": 1.2,
125
+ "fontWeight": 600,
126
+ "letterSpacing": "-0.66px"
127
+ },
128
+ "headingLg": {
129
+ "fontSize": "101px",
130
+ "lineHeight": 1,
131
+ "fontWeight": 600,
132
+ "letterSpacing": "-1.11px"
133
+ },
134
+ "display": {
135
+ "fontSize": "224px",
136
+ "lineHeight": 0.9,
137
+ "fontWeight": 600,
138
+ "letterSpacing": "-4.48px"
139
+ }
140
+ }
141
+ },
142
+ "extensions": {
143
+ "categories": {
144
+ "gsap": "#0ae448",
145
+ "scroll": "#fec5fb",
146
+ "svg": "#ff8709",
147
+ "text": "#9d95ff",
148
+ "ui": "#00bae2",
149
+ "other": "#abff84"
150
+ },
151
+ "displaySizePx": 224,
152
+ "sourceUrl": "https://gsap.com",
153
+ "notes": [
154
+ "Outline-first product controls; category colors are marketing extensions.",
155
+ "Replace typography.faces[].src with Create Center hosted font URLs.",
156
+ "Use data-zone=\"marketing\" for hero/display; product zone for app chrome."
157
+ ]
158
+ },
159
+ "roles": {
160
+ "canvas": "150 7% 6%",
161
+ "canvasForeground": "54 100% 94%",
162
+ "surface": "0 0% 10%",
163
+ "surfaceForeground": "54 100% 94%",
164
+ "action": "137 92% 47%",
165
+ "actionForeground": "150 7% 6%",
166
+ "quiet": "70 5% 25%",
167
+ "quietForeground": "54 100% 94%",
168
+ "muted": "0 0% 10%",
169
+ "mutedForeground": "60 6% 46%",
170
+ "border": "70 5% 25%",
171
+ "input": "70 5% 25%",
172
+ "ring": "137 92% 47%",
173
+ "destructive": "309 100% 47%",
174
+ "destructiveForeground": "54 100% 94%",
175
+ "success": "137 92% 47%",
176
+ "successForeground": "150 7% 6%",
177
+ "info": "191 100% 44%",
178
+ "infoForeground": "150 7% 6%"
179
+ }
180
+ }
@@ -0,0 +1,202 @@
1
+ {
2
+ "id": "linear",
3
+ "name": "Linear",
4
+ "darkDefault": true,
5
+ "version": "1.0.0",
6
+ "semantic": {
7
+ "background": "210 11% 4%",
8
+ "foreground": "0 0% 100%",
9
+ "card": "210 6% 6%",
10
+ "cardForeground": "0 0% 100%",
11
+ "popover": "210 6% 6%",
12
+ "popoverForeground": "0 0% 100%",
13
+ "primary": "64 89% 54%",
14
+ "primaryForeground": "210 11% 4%",
15
+ "secondary": "223 9% 15%",
16
+ "secondaryForeground": "218 21% 85%",
17
+ "muted": "210 4% 9%",
18
+ "mutedForeground": "218 5% 41%",
19
+ "accent": "223 9% 15%",
20
+ "accentForeground": "218 21% 85%",
21
+ "destructive": "0 79% 63%",
22
+ "destructiveForeground": "0 0% 100%",
23
+ "border": "223 9% 15%",
24
+ "input": "223 9% 15%",
25
+ "ring": "64 89% 54%",
26
+ "success": "134 62% 40%",
27
+ "successForeground": "0 0% 100%",
28
+ "info": "186 98% 40%",
29
+ "infoForeground": "0 0% 100%"
30
+ },
31
+ "recipe": {
32
+ "buttonDefault": "solid",
33
+ "density": "compact",
34
+ "badgeDefault": "match-action",
35
+ "radii": {
36
+ "button": "6px",
37
+ "card": "12px",
38
+ "badge": "9999px",
39
+ "input": "6px",
40
+ "pill": "9999px"
41
+ },
42
+ "elevationTokens": {
43
+ "card": "var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05))",
44
+ "control": "var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.04))",
45
+ "raised": "var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1))"
46
+ }
47
+ },
48
+ "typography": {
49
+ "fontSans": "'Inter Variable', 'Inter', ui-sans-serif, system-ui, sans-serif",
50
+ "fontMono": "'Berkeley Mono', 'JetBrains Mono', ui-monospace, monospace",
51
+ "headingWeight": 510,
52
+ "faces": [
53
+ {
54
+ "family": "Inter Variable",
55
+ "src": [
56
+ {
57
+ "url": "https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2",
58
+ "format": "woff2"
59
+ }
60
+ ],
61
+ "weight": "100 900",
62
+ "display": "swap"
63
+ }
64
+ ]
65
+ },
66
+ "zones": {
67
+ "product": {
68
+ "caption": {
69
+ "fontSize": "13px",
70
+ "lineHeight": 1.2,
71
+ "fontWeight": 400
72
+ },
73
+ "bodySm": {
74
+ "fontSize": "14px",
75
+ "lineHeight": 1.5,
76
+ "fontWeight": 400
77
+ },
78
+ "body": {
79
+ "fontSize": "14px",
80
+ "lineHeight": 1.5,
81
+ "fontWeight": 400
82
+ },
83
+ "bodyLg": {
84
+ "fontSize": "16px",
85
+ "lineHeight": 1.5,
86
+ "fontWeight": 400
87
+ },
88
+ "heading": {
89
+ "fontSize": "24px",
90
+ "lineHeight": 1.25,
91
+ "fontWeight": 510,
92
+ "letterSpacing": "-0.012em"
93
+ },
94
+ "display": {
95
+ "fontSize": "32px",
96
+ "lineHeight": 1.15,
97
+ "fontWeight": 510,
98
+ "letterSpacing": "-0.022em"
99
+ }
100
+ },
101
+ "marketing": {
102
+ "body": {
103
+ "fontSize": "15px",
104
+ "lineHeight": 1.6,
105
+ "fontWeight": 400
106
+ },
107
+ "heading": {
108
+ "fontSize": "48px",
109
+ "lineHeight": 1,
110
+ "fontWeight": 510,
111
+ "letterSpacing": "-0.022em"
112
+ },
113
+ "display": {
114
+ "fontSize": "72px",
115
+ "lineHeight": 1,
116
+ "fontWeight": 510,
117
+ "letterSpacing": "-0.022em"
118
+ }
119
+ }
120
+ },
121
+ "extensions": {
122
+ "sourceUrl": "https://linear.app",
123
+ "notes": ["Dual-mode: dark void default + light paper; acid-lime solid CTA in both modes."]
124
+ },
125
+ "roles": {
126
+ "canvas": "210 11% 4%",
127
+ "canvasForeground": "0 0% 100%",
128
+ "surface": "210 6% 6%",
129
+ "surfaceForeground": "0 0% 100%",
130
+ "action": "64 89% 54%",
131
+ "actionForeground": "210 11% 4%",
132
+ "quiet": "223 9% 15%",
133
+ "quietForeground": "218 21% 85%",
134
+ "muted": "210 4% 9%",
135
+ "mutedForeground": "218 5% 41%",
136
+ "border": "223 9% 15%",
137
+ "input": "223 9% 15%",
138
+ "ring": "64 89% 54%",
139
+ "destructive": "0 79% 63%",
140
+ "destructiveForeground": "0 0% 100%",
141
+ "success": "134 62% 40%",
142
+ "successForeground": "0 0% 100%",
143
+ "info": "186 98% 40%",
144
+ "infoForeground": "0 0% 100%"
145
+ },
146
+ "modes": {
147
+ "dark": {
148
+ "semantic": {
149
+ "background": "210 11% 4%",
150
+ "foreground": "0 0% 100%",
151
+ "card": "210 6% 6%",
152
+ "cardForeground": "0 0% 100%",
153
+ "popover": "210 6% 6%",
154
+ "popoverForeground": "0 0% 100%",
155
+ "primary": "64 89% 54%",
156
+ "primaryForeground": "210 11% 4%",
157
+ "secondary": "223 9% 15%",
158
+ "secondaryForeground": "218 21% 85%",
159
+ "muted": "210 4% 9%",
160
+ "mutedForeground": "218 5% 41%",
161
+ "accent": "223 9% 15%",
162
+ "accentForeground": "218 21% 85%",
163
+ "destructive": "0 79% 63%",
164
+ "destructiveForeground": "0 0% 100%",
165
+ "border": "223 9% 15%",
166
+ "input": "223 9% 15%",
167
+ "ring": "64 89% 54%",
168
+ "success": "134 62% 40%",
169
+ "successForeground": "0 0% 100%",
170
+ "info": "186 98% 40%",
171
+ "infoForeground": "0 0% 100%"
172
+ }
173
+ },
174
+ "light": {
175
+ "semantic": {
176
+ "background": "0 0% 100%",
177
+ "foreground": "210 11% 4%",
178
+ "card": "0 0% 98%",
179
+ "cardForeground": "210 11% 4%",
180
+ "popover": "0 0% 100%",
181
+ "popoverForeground": "210 11% 4%",
182
+ "primary": "64 89% 54%",
183
+ "primaryForeground": "210 11% 4%",
184
+ "secondary": "220 14% 96%",
185
+ "secondaryForeground": "210 11% 4%",
186
+ "muted": "220 14% 96%",
187
+ "mutedForeground": "218 5% 41%",
188
+ "accent": "220 14% 96%",
189
+ "accentForeground": "210 11% 4%",
190
+ "destructive": "0 79% 63%",
191
+ "destructiveForeground": "0 0% 100%",
192
+ "border": "220 13% 91%",
193
+ "input": "0 0% 100%",
194
+ "ring": "64 89% 54%",
195
+ "success": "134 62% 40%",
196
+ "successForeground": "0 0% 100%",
197
+ "info": "186 98% 40%",
198
+ "infoForeground": "0 0% 100%"
199
+ }
200
+ }
201
+ }
202
+ }
@@ -0,0 +1,189 @@
1
+ {
2
+ "id": "notion",
3
+ "name": "Notion",
4
+ "darkDefault": false,
5
+ "version": "1.0.0",
6
+ "roles": {
7
+ "canvas": "30 10% 96%",
8
+ "canvasForeground": "0 0% 0%",
9
+ "surface": "0 0% 100%",
10
+ "surfaceForeground": "0 0% 0%",
11
+ "action": "208 100% 44%",
12
+ "actionForeground": "0 0% 100%",
13
+ "quiet": "208 92% 95%",
14
+ "quietForeground": "208 100% 44%",
15
+ "muted": "208 92% 95%",
16
+ "mutedForeground": "0 0% 46%",
17
+ "border": "30 5% 88%",
18
+ "input": "0 0% 100%",
19
+ "ring": "208 100% 44%",
20
+ "destructive": "7 92% 58%",
21
+ "destructiveForeground": "0 0% 100%",
22
+ "brand": "0 0% 0%",
23
+ "brandForeground": "0 0% 100%",
24
+ "warning": "40 100% 53%",
25
+ "warningForeground": "0 0% 0%",
26
+ "info": "208 93% 47%",
27
+ "infoForeground": "0 0% 100%"
28
+ },
29
+ "semantic": {
30
+ "background": "30 10% 96%",
31
+ "foreground": "0 0% 0%",
32
+ "card": "0 0% 100%",
33
+ "cardForeground": "0 0% 0%",
34
+ "popover": "0 0% 100%",
35
+ "popoverForeground": "0 0% 0%",
36
+ "primary": "208 100% 44%",
37
+ "primaryForeground": "0 0% 100%",
38
+ "secondary": "208 92% 95%",
39
+ "secondaryForeground": "208 100% 44%",
40
+ "muted": "208 92% 95%",
41
+ "mutedForeground": "0 0% 46%",
42
+ "accent": "0 0% 0%",
43
+ "accentForeground": "0 0% 100%",
44
+ "destructive": "7 92% 58%",
45
+ "destructiveForeground": "0 0% 100%",
46
+ "border": "30 5% 88%",
47
+ "input": "0 0% 100%",
48
+ "ring": "208 100% 44%",
49
+ "warning": "40 100% 53%",
50
+ "warningForeground": "0 0% 0%",
51
+ "info": "208 93% 47%",
52
+ "infoForeground": "0 0% 100%"
53
+ },
54
+ "recipe": {
55
+ "buttonDefault": "solid",
56
+ "density": "comfortable",
57
+ "badgeDefault": "muted",
58
+ "radii": {
59
+ "button": "8px",
60
+ "card": "12px",
61
+ "badge": "9999px",
62
+ "input": "8px",
63
+ "pill": "9999px"
64
+ },
65
+ "elevationTokens": {
66
+ "card": "0 0 #0000",
67
+ "control": "0 0 #0000",
68
+ "raised": "0px 0.7px 1.462px 0px rgb(0 0 0 / 0.015), 0px 3px 9px 0px rgb(0 0 0 / 0.03)"
69
+ },
70
+ "outlineBorder": "#000000"
71
+ },
72
+ "typography": {
73
+ "fontSans": "'NotionInter', 'Inter', ui-sans-serif, system-ui, sans-serif",
74
+ "fontDisplay": "'NotionInter', 'Inter', ui-sans-serif, system-ui, sans-serif",
75
+ "headingWeight": 700,
76
+ "faces": [
77
+ {
78
+ "family": "NotionInter",
79
+ "src": [
80
+ {
81
+ "url": "https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2",
82
+ "format": "woff2"
83
+ }
84
+ ],
85
+ "weight": "100 900",
86
+ "display": "swap"
87
+ },
88
+ {
89
+ "family": "Lyon Text",
90
+ "src": [
91
+ {
92
+ "url": "/brand-assets/lyon-text-regular.woff2",
93
+ "format": "woff2"
94
+ }
95
+ ],
96
+ "weight": 400,
97
+ "display": "swap"
98
+ }
99
+ ]
100
+ },
101
+ "zones": {
102
+ "product": {
103
+ "caption": {
104
+ "fontSize": "12px",
105
+ "lineHeight": 1.33,
106
+ "fontWeight": 500,
107
+ "letterSpacing": "0.12px"
108
+ },
109
+ "bodySm": {
110
+ "fontSize": "14px",
111
+ "lineHeight": 1.43,
112
+ "fontWeight": 500
113
+ },
114
+ "body": {
115
+ "fontSize": "16px",
116
+ "lineHeight": 1.5,
117
+ "fontWeight": 400
118
+ },
119
+ "subheading": {
120
+ "fontSize": "20px",
121
+ "lineHeight": 1,
122
+ "fontWeight": 500
123
+ },
124
+ "headingSm": {
125
+ "fontSize": "22px",
126
+ "lineHeight": 1.27,
127
+ "fontWeight": 600,
128
+ "letterSpacing": "-0.242px"
129
+ },
130
+ "heading": {
131
+ "fontSize": "40px",
132
+ "lineHeight": 1.5,
133
+ "fontWeight": 600
134
+ }
135
+ },
136
+ "marketing": {
137
+ "body": {
138
+ "fontSize": "16px",
139
+ "lineHeight": 1.5,
140
+ "fontWeight": 400
141
+ },
142
+ "heading": {
143
+ "fontSize": "48px",
144
+ "lineHeight": 1.5,
145
+ "fontWeight": 700
146
+ },
147
+ "headingLg": {
148
+ "fontSize": "54px",
149
+ "lineHeight": 1.04,
150
+ "fontWeight": 700,
151
+ "letterSpacing": "-1.89px"
152
+ },
153
+ "display": {
154
+ "fontSize": "72px",
155
+ "lineHeight": 1.21,
156
+ "fontWeight": 700,
157
+ "letterSpacing": "-2.016px"
158
+ }
159
+ }
160
+ },
161
+ "extensions": {
162
+ "categories": {
163
+ "brand": "#000000",
164
+ "action": "#0075de",
165
+ "ghost": "#e6f3fe",
166
+ "marigold": "#ffb110",
167
+ "coral": "#f64932",
168
+ "midnight": "#02093a",
169
+ "charcoal": "#111111",
170
+ "graphite": "#615d59"
171
+ },
172
+ "decorative": {
173
+ "marigold": "#ffb110",
174
+ "coral": "#f64932",
175
+ "saffron": "#e89d01",
176
+ "sky-wash": "#62aef0",
177
+ "midnight": "#02093a"
178
+ },
179
+ "sourceUrl": "https://notion.so",
180
+ "notes": [
181
+ "roles.action = Notion Blue (only filled CTA). Accent hues are decorative card washes.",
182
+ "roles.brand = Ink Black (logo / wordmark / text hierarchy via alpha).",
183
+ "Canvas = Paper Warmth; cards = Pure White — never invert.",
184
+ "Card elev=none + hairline border; sticky nav soft shadow → elevation raised slot.",
185
+ "Buttons 8px, cards 12px, pills 9999px.",
186
+ "Lyon Text is editorial accent only — not product chrome UI."
187
+ ]
188
+ }
189
+ }