@nebutra/tokens 0.1.1 → 0.1.3

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 (42) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +21 -676
  3. package/README.md +41 -8
  4. package/brands/gsap/brand.json +133 -0
  5. package/brands/linear/brand.json +163 -0
  6. package/brands/notion/brand.json +145 -0
  7. package/brands/raycast/brand.json +120 -0
  8. package/brands/stripe/brand.json +127 -0
  9. package/brands/vanta/brand.json +151 -0
  10. package/brands/vercel/brand.json +173 -0
  11. package/dist/brand-package/index.d.ts +123 -0
  12. package/dist/brand-package/index.js +61 -0
  13. package/dist/brand-package/index.js.map +1 -0
  14. package/dist/brand-package/use-brand.d.ts +2 -0
  15. package/dist/brand-package/use-brand.js +12 -0
  16. package/dist/brand-package/use-brand.js.map +1 -0
  17. package/dist/chunk-ALJTP5HL.js +881 -0
  18. package/dist/chunk-ALJTP5HL.js.map +1 -0
  19. package/dist/chunk-RGUJQOLH.js +1582 -0
  20. package/dist/chunk-RGUJQOLH.js.map +1 -0
  21. package/dist/index.d.ts +81 -0
  22. package/dist/index.js +187 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/use-brand-C8d4DPqE.d.ts +371 -0
  25. package/package.json +46 -12
  26. package/recipe.css +435 -0
  27. package/skins/README.md +149 -0
  28. package/skins/gsap.css +159 -0
  29. package/skins/linear.css +198 -0
  30. package/skins/notion.css +158 -0
  31. package/skins/raycast.css +185 -0
  32. package/skins/stripe.css +146 -0
  33. package/skins/vanta.css +160 -0
  34. package/skins/vercel.css +202 -0
  35. package/styles.css +528 -169
  36. package/.turbo/turbo-build.log +0 -5
  37. package/.turbo/turbo-typecheck.log +0 -4
  38. package/AGENTS.md +0 -42
  39. package/DESIGN.md +0 -335
  40. package/src/index.ts +0 -37
  41. package/src/theme-provider.tsx +0 -244
  42. package/tsconfig.json +0 -11
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,133 @@
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
+ "motion": {
80
+ "easeOut": "cubic-bezier(0.22, 1, 0.36, 1)",
81
+ "easeInOut": "cubic-bezier(0.65, 0, 0.35, 1)",
82
+ "easeSpring": "cubic-bezier(0.68, -0.55, 0.265, 1.55)",
83
+ "micro": 120,
84
+ "flow": 250,
85
+ "reveal": 400,
86
+ "cinematic": 700
87
+ },
88
+ "spacing": {
89
+ "xs": "0.5rem",
90
+ "sm": "0.875rem",
91
+ "md": "1.25rem",
92
+ "lg": "1.75rem",
93
+ "xl": "2.5rem",
94
+ "2xl": "3.5rem"
95
+ },
96
+ "extensions": {
97
+ "categories": {
98
+ "gsap": "#0ae448",
99
+ "scroll": "#fec5fb",
100
+ "svg": "#ff8709",
101
+ "text": "#9d95ff",
102
+ "ui": "#00bae2",
103
+ "other": "#abff84"
104
+ },
105
+ "displaySizePx": 224,
106
+ "sourceUrl": "https://gsap.com",
107
+ "notes": [
108
+ "Outline-first product controls; category colors are marketing extensions.",
109
+ "Replace typography.faces[].src with Create Center hosted font URLs."
110
+ ]
111
+ },
112
+ "roles": {
113
+ "canvas": "150 7% 6%",
114
+ "canvasForeground": "54 100% 94%",
115
+ "surface": "0 0% 10%",
116
+ "surfaceForeground": "54 100% 94%",
117
+ "action": "137 92% 47%",
118
+ "actionForeground": "150 7% 6%",
119
+ "quiet": "70 5% 25%",
120
+ "quietForeground": "54 100% 94%",
121
+ "muted": "0 0% 10%",
122
+ "mutedForeground": "60 6% 46%",
123
+ "border": "70 5% 25%",
124
+ "input": "70 5% 25%",
125
+ "ring": "137 92% 47%",
126
+ "destructive": "309 100% 47%",
127
+ "destructiveForeground": "54 100% 94%",
128
+ "success": "137 92% 47%",
129
+ "successForeground": "150 7% 6%",
130
+ "info": "191 100% 44%",
131
+ "infoForeground": "150 7% 6%"
132
+ }
133
+ }
@@ -0,0 +1,163 @@
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": "0 1px 2px 0 rgb(0 0 0 / 0.05)",
44
+ "control": "0 1px 2px 0 rgb(0 0 0 / 0.04)",
45
+ "raised": "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
+ "motion": {
67
+ "easeOut": "cubic-bezier(0.16, 1, 0.3, 1)",
68
+ "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)",
69
+ "micro": 80,
70
+ "flow": 140,
71
+ "reveal": 200,
72
+ "cinematic": 320
73
+ },
74
+ "spacing": {
75
+ "xs": "0.375rem",
76
+ "sm": "0.5rem",
77
+ "md": "0.75rem",
78
+ "lg": "1rem",
79
+ "xl": "1.5rem",
80
+ "2xl": "2rem"
81
+ },
82
+ "extensions": {
83
+ "sourceUrl": "https://linear.app",
84
+ "notes": ["Dual-mode: dark void default + light paper; acid-lime solid CTA in both modes."]
85
+ },
86
+ "roles": {
87
+ "canvas": "210 11% 4%",
88
+ "canvasForeground": "0 0% 100%",
89
+ "surface": "210 6% 6%",
90
+ "surfaceForeground": "0 0% 100%",
91
+ "action": "64 89% 54%",
92
+ "actionForeground": "210 11% 4%",
93
+ "quiet": "223 9% 15%",
94
+ "quietForeground": "218 21% 85%",
95
+ "muted": "210 4% 9%",
96
+ "mutedForeground": "218 5% 41%",
97
+ "border": "223 9% 15%",
98
+ "input": "223 9% 15%",
99
+ "ring": "64 89% 54%",
100
+ "destructive": "0 79% 63%",
101
+ "destructiveForeground": "0 0% 100%",
102
+ "success": "134 62% 40%",
103
+ "successForeground": "0 0% 100%",
104
+ "info": "186 98% 40%",
105
+ "infoForeground": "0 0% 100%"
106
+ },
107
+ "modes": {
108
+ "dark": {
109
+ "semantic": {
110
+ "background": "210 11% 4%",
111
+ "foreground": "0 0% 100%",
112
+ "card": "210 6% 6%",
113
+ "cardForeground": "0 0% 100%",
114
+ "popover": "210 6% 6%",
115
+ "popoverForeground": "0 0% 100%",
116
+ "primary": "64 89% 54%",
117
+ "primaryForeground": "210 11% 4%",
118
+ "secondary": "223 9% 15%",
119
+ "secondaryForeground": "218 21% 85%",
120
+ "muted": "210 4% 9%",
121
+ "mutedForeground": "218 5% 41%",
122
+ "accent": "223 9% 15%",
123
+ "accentForeground": "218 21% 85%",
124
+ "destructive": "0 79% 63%",
125
+ "destructiveForeground": "0 0% 100%",
126
+ "border": "223 9% 15%",
127
+ "input": "223 9% 15%",
128
+ "ring": "64 89% 54%",
129
+ "success": "134 62% 40%",
130
+ "successForeground": "0 0% 100%",
131
+ "info": "186 98% 40%",
132
+ "infoForeground": "0 0% 100%"
133
+ }
134
+ },
135
+ "light": {
136
+ "semantic": {
137
+ "background": "0 0% 100%",
138
+ "foreground": "210 11% 4%",
139
+ "card": "0 0% 98%",
140
+ "cardForeground": "210 11% 4%",
141
+ "popover": "0 0% 100%",
142
+ "popoverForeground": "210 11% 4%",
143
+ "primary": "64 89% 54%",
144
+ "primaryForeground": "210 11% 4%",
145
+ "secondary": "220 14% 96%",
146
+ "secondaryForeground": "210 11% 4%",
147
+ "muted": "220 14% 96%",
148
+ "mutedForeground": "218 5% 41%",
149
+ "accent": "220 14% 96%",
150
+ "accentForeground": "210 11% 4%",
151
+ "destructive": "0 79% 63%",
152
+ "destructiveForeground": "0 0% 100%",
153
+ "border": "220 13% 91%",
154
+ "input": "0 0% 100%",
155
+ "ring": "64 89% 54%",
156
+ "success": "134 62% 40%",
157
+ "successForeground": "0 0% 100%",
158
+ "info": "186 98% 40%",
159
+ "infoForeground": "0 0% 100%"
160
+ }
161
+ }
162
+ }
163
+ }
@@ -0,0 +1,145 @@
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
+ "motion": {
102
+ "easeOut": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
103
+ "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)",
104
+ "micro": 120,
105
+ "flow": 200,
106
+ "reveal": 280,
107
+ "cinematic": 460
108
+ },
109
+ "spacing": {
110
+ "xs": "0.625rem",
111
+ "sm": "1rem",
112
+ "md": "1.5rem",
113
+ "lg": "2rem",
114
+ "xl": "2.75rem",
115
+ "2xl": "3.75rem"
116
+ },
117
+ "extensions": {
118
+ "categories": {
119
+ "brand": "#000000",
120
+ "action": "#0075de",
121
+ "ghost": "#e6f3fe",
122
+ "marigold": "#ffb110",
123
+ "coral": "#f64932",
124
+ "midnight": "#02093a",
125
+ "charcoal": "#111111",
126
+ "graphite": "#615d59"
127
+ },
128
+ "decorative": {
129
+ "marigold": "#ffb110",
130
+ "coral": "#f64932",
131
+ "saffron": "#e89d01",
132
+ "sky-wash": "#62aef0",
133
+ "midnight": "#02093a"
134
+ },
135
+ "sourceUrl": "https://notion.so",
136
+ "notes": [
137
+ "roles.action = Notion Blue (only filled CTA). Accent hues are decorative card washes.",
138
+ "roles.brand = Ink Black (logo / wordmark / text hierarchy via alpha).",
139
+ "Canvas = Paper Warmth; cards = Pure White \u2014 never invert.",
140
+ "Card elev=none + hairline border; sticky nav soft shadow \u2192 elevation raised slot.",
141
+ "Buttons 8px, cards 12px, pills 9999px.",
142
+ "Lyon Text is editorial accent only \u2014 not product chrome UI."
143
+ ]
144
+ }
145
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "id": "raycast",
3
+ "name": "Raycast",
4
+ "darkDefault": true,
5
+ "version": "1.0.0",
6
+ "semantic": {
7
+ "background": "210 20% 2%",
8
+ "foreground": "0 0% 100%",
9
+ "card": "220 18% 3%",
10
+ "cardForeground": "0 0% 100%",
11
+ "popover": "220 18% 3%",
12
+ "popoverForeground": "0 0% 100%",
13
+ "primary": "0 0% 90%",
14
+ "primaryForeground": "210 1% 27%",
15
+ "secondary": "220 5% 11%",
16
+ "secondaryForeground": "0 0% 100%",
17
+ "muted": "220 8% 7%",
18
+ "mutedForeground": "210 1% 42%",
19
+ "accent": "0 100% 69%",
20
+ "accentForeground": "210 1% 27%",
21
+ "destructive": "0 72% 51%",
22
+ "destructiveForeground": "0 0% 100%",
23
+ "border": "210 2% 19%",
24
+ "input": "220 8% 7%",
25
+ "ring": "240 1% 61%",
26
+ "success": "151 59% 59%",
27
+ "successForeground": "210 20% 2%",
28
+ "info": "202 100% 67%",
29
+ "infoForeground": "210 20% 2%"
30
+ },
31
+ "recipe": {
32
+ "buttonDefault": "solid",
33
+ "density": "compact",
34
+ "badgeDefault": "muted",
35
+ "radii": {
36
+ "button": "8px",
37
+ "card": "16px",
38
+ "badge": "6px",
39
+ "input": "8px",
40
+ "pill": "9999px"
41
+ },
42
+ "elevationTokens": {
43
+ "card": "rgba(255, 255, 255, 0.05) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.25) 0px 0px 0px 1px, rgba(0, 0, 0, 0.2) 0px -1px 0px 0px inset",
44
+ "control": "0 0 #0000",
45
+ "raised": "rgba(255, 255, 255, 0.05) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.25) 0px 0px 0px 1px, rgba(0, 0, 0, 0.2) 0px -1px 0px 0px inset"
46
+ }
47
+ },
48
+ "typography": {
49
+ "fontSans": "'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif",
50
+ "fontMono": "'Geist Mono', 'GeistMono', ui-monospace, Menlo, monospace",
51
+ "fontDisplay": "'Inter', ui-sans-serif, system-ui, sans-serif",
52
+ "headingWeight": 400,
53
+ "faces": [
54
+ {
55
+ "family": "Inter",
56
+ "src": [
57
+ {
58
+ "url": "https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2",
59
+ "format": "woff2"
60
+ }
61
+ ],
62
+ "weight": "100 900",
63
+ "display": "swap"
64
+ }
65
+ ]
66
+ },
67
+ "motion": {
68
+ "easeOut": "cubic-bezier(0.16, 1, 0.3, 1)",
69
+ "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)",
70
+ "easeSpring": "cubic-bezier(0.34, 1.56, 0.64, 1)",
71
+ "micro": 90,
72
+ "flow": 160,
73
+ "reveal": 220,
74
+ "cinematic": 340
75
+ },
76
+ "spacing": {
77
+ "xs": "0.375rem",
78
+ "sm": "0.5rem",
79
+ "md": "0.75rem",
80
+ "lg": "1rem",
81
+ "xl": "1.375rem",
82
+ "2xl": "2rem"
83
+ },
84
+ "extensions": {
85
+ "categories": {
86
+ "brand": "#ff6363",
87
+ "ember": "#452324",
88
+ "sky": "#63a1ff"
89
+ },
90
+ "sourceUrl": "https://raycast.com",
91
+ "notes": [
92
+ "Primary CTA = Mist fill + Iron text (neutral solid).",
93
+ "Coral Pulse is brand mark only \u2014 do not use for general product chrome CTAs.",
94
+ "Cards use elevation=key (keyboard-key inset shadow stack)."
95
+ ]
96
+ },
97
+ "roles": {
98
+ "canvas": "210 20% 2%",
99
+ "canvasForeground": "0 0% 100%",
100
+ "surface": "220 18% 3%",
101
+ "surfaceForeground": "0 0% 100%",
102
+ "action": "0 0% 90%",
103
+ "actionForeground": "210 1% 27%",
104
+ "quiet": "220 5% 11%",
105
+ "quietForeground": "0 0% 100%",
106
+ "muted": "220 8% 7%",
107
+ "mutedForeground": "210 1% 42%",
108
+ "border": "210 2% 19%",
109
+ "input": "220 8% 7%",
110
+ "ring": "240 1% 61%",
111
+ "destructive": "0 72% 51%",
112
+ "destructiveForeground": "0 0% 100%",
113
+ "brand": "0 100% 69%",
114
+ "brandForeground": "210 1% 27%",
115
+ "success": "151 59% 59%",
116
+ "successForeground": "210 20% 2%",
117
+ "info": "202 100% 67%",
118
+ "infoForeground": "210 20% 2%"
119
+ }
120
+ }