@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
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Brand carrier skin: Stripe (stripe) v1.0.0
3
+ * darkDefault=false dualMode=false button=solid
4
+ * fonts=1 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
+ --elevation-xs: 0 0 #0000;
91
+ --elevation-sm: 0 0 #0000;
92
+ --elevation-md: 0 0 #0000;
93
+ --elevation-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: linear-gradient(transparent, 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
+ /* Motion */
113
+ --ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
114
+ --motion-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
115
+ --ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
116
+ --motion-ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
117
+ --duration-micro: 100ms;
118
+ --motion-duration-micro: 100ms;
119
+ --duration-flow: 180ms;
120
+ --motion-duration-flow: 180ms;
121
+ --duration-reveal: 260ms;
122
+ --motion-duration-reveal: 260ms;
123
+ --duration-cinematic: 400ms;
124
+ --motion-duration-cinematic: 400ms;
125
+
126
+ /* Spacing */
127
+ --space-source-xs: 0.5rem;
128
+ --space-source-sm: 0.75rem;
129
+ --space-source-md: 1.125rem;
130
+ --space-source-lg: 1.75rem;
131
+ --space-source-xl: 2.25rem;
132
+ --space-source-2xl: 3.25rem;
133
+
134
+ /* Taxonomy / decorative (not product CTA) */
135
+ --brand-category-brand: #061b31;
136
+ --brand-category-action: #533afd;
137
+ --brand-category-link: #533afd;
138
+ --brand-category-hover: #7389ff;
139
+ --brand-category-ghostborder: #b9b9f9;
140
+ --brand-category-wash: #e8e9ff;
141
+ --brand-category-deep: #182659;
142
+ --brand-category-smoke: #839bc8;
143
+ --brand-category-steel: #50617a;
144
+ --brand-decorative-section-band: #f8fafd;
145
+ --brand-decorative-frost: #e5edf5;
146
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Brand carrier skin: Vanta (vanta) v1.0.0
3
+ * darkDefault=false dualMode=false button=solid
4
+ * fonts=3 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
+ --elevation-xs: 0 0 #0000;
108
+ --elevation-sm: 0 0 #0000;
109
+ --elevation-md: 0 0 #0000;
110
+ --elevation-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: linear-gradient(transparent, 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
+ /* Motion */
130
+ --ease-out: cubic-bezier(0.33, 1, 0.68, 1);
131
+ --motion-ease-out: cubic-bezier(0.33, 1, 0.68, 1);
132
+ --ease-in-out: cubic-bezier(0.37, 0, 0.63, 1);
133
+ --motion-ease-in-out: cubic-bezier(0.37, 0, 0.63, 1);
134
+ --duration-micro: 120ms;
135
+ --motion-duration-micro: 120ms;
136
+ --duration-flow: 240ms;
137
+ --motion-duration-flow: 240ms;
138
+ --duration-reveal: 380ms;
139
+ --motion-duration-reveal: 380ms;
140
+ --duration-cinematic: 620ms;
141
+ --motion-duration-cinematic: 620ms;
142
+
143
+ /* Spacing */
144
+ --space-source-xs: 0.75rem;
145
+ --space-source-sm: 1.125rem;
146
+ --space-source-md: 1.75rem;
147
+ --space-source-lg: 2.5rem;
148
+ --space-source-xl: 3.5rem;
149
+ --space-source-2xl: 5rem;
150
+
151
+ /* Taxonomy / decorative (not product CTA) */
152
+ --brand-category-brand: #260048;
153
+ --brand-category-action: #5e05c4;
154
+ --brand-category-link: #8f47d5;
155
+ --brand-category-herowash: #ddd6ff;
156
+ --brand-category-warning: #ffbe0f;
157
+ --brand-category-steel: #9e9fb7;
158
+ --brand-category-ash: #dfdfe9;
159
+ --brand-decorative-hero-wash: #ddd6ff;
160
+ }
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Brand carrier skin: Vercel (vercel) v1.0.0
3
+ * darkDefault=false dualMode=true button=solid
4
+ * fonts=1 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
+ --elevation-xs: 0 0 #0000;
90
+ --elevation-sm: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
91
+ --elevation-md: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px;
92
+ --elevation-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: linear-gradient(transparent, 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-height-icon-sm: 1.5rem;
111
+ --control-height-icon-md: 1.75rem;
112
+ --control-height-icon-lg: 2rem;
113
+ --control-font-size-md: 0.8125rem;
114
+
115
+ /* Typography */
116
+ --font-sans: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
117
+ --font-heading: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
118
+ --font-display: "Geist Sans", "Geist", ui-sans-serif, system-ui, sans-serif;
119
+ --font-mono: "Geist Mono", ui-monospace, Menlo, monospace;
120
+ --font-weight-heading: 450;
121
+
122
+ /* Motion */
123
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
124
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
125
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
126
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
127
+ --duration-micro: 100ms;
128
+ --motion-duration-micro: 100ms;
129
+ --duration-flow: 150ms;
130
+ --motion-duration-flow: 150ms;
131
+ --duration-reveal: 200ms;
132
+ --motion-duration-reveal: 200ms;
133
+ --duration-cinematic: 300ms;
134
+ --motion-duration-cinematic: 300ms;
135
+
136
+ /* Spacing */
137
+ --space-source-xs: 0.5rem;
138
+ --space-source-sm: 0.75rem;
139
+ --space-source-md: 1rem;
140
+ --space-source-lg: 1.5rem;
141
+ --space-source-xl: 2rem;
142
+ --space-source-2xl: 3rem;
143
+
144
+ /* Taxonomy / decorative (not product CTA) */
145
+ --brand-category-carbon: #000000;
146
+ --brand-category-terminal: #297a3a;
147
+ }
148
+
149
+ .dark,
150
+ html.dark[data-brand="vercel"] {
151
+ /* ── Color roles (carrier) ── */
152
+ --role-canvas: 0 0% 0%;
153
+ --role-canvas-fg: 0 0% 93%;
154
+ --role-surface: 0 0% 4%;
155
+ --role-surface-fg: 0 0% 93%;
156
+ --role-action: 0 0% 100%;
157
+ --role-action-fg: 0 0% 0%;
158
+ --role-quiet: 0 0% 12%;
159
+ --role-quiet-fg: 0 0% 93%;
160
+ --role-muted: 0 0% 12%;
161
+ --role-muted-fg: 0 0% 63%;
162
+ --role-border: 0 0% 16%;
163
+ --role-input: 0 0% 4%;
164
+ --role-ring: 0 0% 100%;
165
+
166
+ /* ── shadcn bridge (primary = action CTA) ── */
167
+ --background: 0 0% 0%;
168
+ --foreground: 0 0% 93%;
169
+ --card: 0 0% 4%;
170
+ --card-foreground: 0 0% 93%;
171
+ --popover: 0 0% 4%;
172
+ --popover-foreground: 0 0% 93%;
173
+ --primary: 0 0% 100%;
174
+ --primary-foreground: 0 0% 0%;
175
+ --secondary: 0 0% 12%;
176
+ --secondary-foreground: 0 0% 93%;
177
+ --muted: 0 0% 12%;
178
+ --muted-foreground: 0 0% 63%;
179
+ --accent: 0 0% 12%;
180
+ --accent-foreground: 0 0% 93%;
181
+ --destructive: 0 72% 51%;
182
+ --destructive-foreground: 0 0% 100%;
183
+ --border: 0 0% 16%;
184
+ --input: 0 0% 4%;
185
+ --ring: 0 0% 100%;
186
+ --success: 133 49% 40%;
187
+ --success-foreground: 0 0% 100%;
188
+ --info: 0 0% 70%;
189
+ --info-foreground: 0 0% 0%;
190
+ --sidebar: 0 0% 4%;
191
+ --sidebar-foreground: 0 0% 93%;
192
+ --sidebar-primary: 0 0% 100%;
193
+ --sidebar-primary-foreground: 0 0% 0%;
194
+ --sidebar-accent: 0 0% 12%;
195
+ --sidebar-accent-foreground: 0 0% 93%;
196
+ --sidebar-border: 0 0% 16%;
197
+ --sidebar-ring: 0 0% 100%;
198
+ --brand-gradient: hsl(var(--primary));
199
+ --brand-gradient-reverse: hsl(var(--primary));
200
+ --brand-gradient-vertical: hsl(var(--primary));
201
+ --brand-gradient-radial: hsl(var(--primary));
202
+ }