@nebutra/design-tokens 0.1.0 → 0.1.1

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 (43) hide show
  1. package/README.md +2 -0
  2. package/build/css/dark-dense.css +32 -0
  3. package/build/css/dark.css +247 -0
  4. package/build/css/gradient.css +35 -0
  5. package/build/css/light.css +269 -0
  6. package/build/css/minimal.css +36 -0
  7. package/build/css/neon.css +49 -0
  8. package/build/css/ocean.css +35 -0
  9. package/build/css/styles.generated.css +1385 -0
  10. package/build/css/theme-inline.css +206 -0
  11. package/build/css/themes.generated.css +386 -0
  12. package/build/css/vibrant.css +36 -0
  13. package/build/tailwind/dark-dense.preset.cjs +33 -0
  14. package/build/tailwind/dark.preset.cjs +230 -0
  15. package/build/tailwind/gradient.preset.cjs +36 -0
  16. package/build/tailwind/light.preset.cjs +230 -0
  17. package/build/tailwind/minimal.preset.cjs +37 -0
  18. package/build/tailwind/neon.preset.cjs +50 -0
  19. package/build/tailwind/ocean.preset.cjs +36 -0
  20. package/build/tailwind/vibrant.preset.cjs +37 -0
  21. package/build/ts/dark-dense.d.ts +29 -0
  22. package/build/ts/dark-dense.ts +33 -0
  23. package/build/ts/dark.d.ts +261 -0
  24. package/build/ts/dark.ts +246 -0
  25. package/build/ts/gradient.d.ts +32 -0
  26. package/build/ts/gradient.ts +34 -0
  27. package/build/ts/light.d.ts +277 -0
  28. package/build/ts/light.ts +246 -0
  29. package/build/ts/minimal.d.ts +33 -0
  30. package/build/ts/minimal.ts +35 -0
  31. package/build/ts/neon.d.ts +46 -0
  32. package/build/ts/neon.ts +50 -0
  33. package/build/ts/ocean.d.ts +32 -0
  34. package/build/ts/ocean.ts +34 -0
  35. package/build/ts/vibrant.d.ts +33 -0
  36. package/build/ts/vibrant.ts +37 -0
  37. package/package.json +7 -2
  38. package/style-dictionary.config.mjs +162 -71
  39. package/themes.ts +25 -0
  40. package/tokens/semantic.json +14 -5
  41. package/tokens/themes/gradient.json +3 -0
  42. package/tokens/themes/minimal.json +1 -0
  43. package/tokens/themes/ocean.json +3 -0
package/README.md CHANGED
@@ -86,6 +86,8 @@ A custom Style Dictionary transform (`name/nebutra/css`) maps DTCG paths to the
86
86
  | `elevation.xs` | `--elevation-xs` |
87
87
  | `brand.primary` | `--brand-primary` |
88
88
  | `brand.gradient.primary` | `--brand-gradient` |
89
+ | `brand.gradient.logo` | `--brand-gradient-logo` |
90
+ | `brand.gradient.logo-reverse` | `--brand-gradient-logo-reverse` |
89
91
  | `size.container.text` | `--container-text` |
90
92
  | `size.radius.md` | `--radius-md` |
91
93
  | `duration.flow` | `--duration-flow` |
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @nebutra/design-tokens — generated from W3C DTCG tokens.
3
+ * DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
4
+ */
5
+
6
+ [data-theme="dark-dense"] {
7
+ --color-primary: oklch(0.696 0.17 162.5);
8
+ --color-primary-foreground: oklch(1 0 0);
9
+ --color-secondary: oklch(0.527 0.154 163.2);
10
+ --color-secondary-foreground: oklch(1 0 0);
11
+ --color-accent: oklch(0.765 0.163 163.4);
12
+ --color-accent-foreground: oklch(0.141 0.005 285.9);
13
+ --color-background: oklch(0.112 0 0);
14
+ --color-foreground: oklch(0.985 0 0);
15
+ --color-card: oklch(0.162 0.004 285.9);
16
+ --color-card-foreground: oklch(0.985 0 0);
17
+ --color-popover: oklch(0.162 0.004 285.9);
18
+ --color-popover-foreground: oklch(0.985 0 0);
19
+ --color-muted: oklch(0.215 0.006 285.9);
20
+ --color-muted-foreground: oklch(0.705 0.015 286);
21
+ --color-border: oklch(0.215 0.006 285.9);
22
+ --color-input: oklch(0.215 0.006 285.9);
23
+ --color-ring: oklch(0.696 0.17 162.5);
24
+ --color-primary-hover: color-mix(in oklch, oklch(0.696 0.17 162.5), white 15%);
25
+ --color-primary-active: color-mix(in oklch, oklch(0.696 0.17 162.5), black 10%);
26
+ --radius-sm: 0.125rem;
27
+ --radius-md: 0.25rem;
28
+ --radius-lg: 0.25rem;
29
+ --radius-xl: 0.375rem;
30
+ --font-sans: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
31
+ --font-heading: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
32
+ }
@@ -0,0 +1,247 @@
1
+ /**
2
+ * @nebutra/design-tokens — generated from W3C DTCG tokens.
3
+ * DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
4
+ */
5
+
6
+ .dark {
7
+ --nebutra-blue-50: #f0f4ff;
8
+ --nebutra-blue-100: #dbe4ff;
9
+ --nebutra-blue-200: #bac8ff;
10
+ --nebutra-blue-300: #91a7ff;
11
+ --nebutra-blue-400: #5c7cfa;
12
+ --nebutra-blue-500: #0033fe; /** Base brand color — 云毓蓝 */
13
+ --nebutra-blue-600: #002ad4;
14
+ --nebutra-blue-700: #0021ab;
15
+ --nebutra-blue-800: #001882;
16
+ --nebutra-blue-900: #000f59;
17
+ --nebutra-blue-950: #000830;
18
+ --nebutra-cyan-50: #e6fff8;
19
+ --nebutra-cyan-100: #b3ffec;
20
+ --nebutra-cyan-200: #80ffe0;
21
+ --nebutra-cyan-300: #4dfcd4;
22
+ --nebutra-cyan-400: #1af7c8;
23
+ --nebutra-cyan-500: #0bf1c3; /** Base brand accent — 云毓青 */
24
+ --nebutra-cyan-600: #09c9a3;
25
+ --nebutra-cyan-700: #07a183;
26
+ --nebutra-cyan-800: #057963;
27
+ --nebutra-cyan-900: #035143;
28
+ --nebutra-cyan-950: #012923;
29
+ --nebutra-neutral-50: #f8fafc;
30
+ --nebutra-neutral-100: #f1f5f9;
31
+ --nebutra-neutral-200: #e2e8f0;
32
+ --nebutra-neutral-300: #cbd5e1;
33
+ --nebutra-neutral-400: #94a3b8;
34
+ --nebutra-neutral-500: #64748b;
35
+ --nebutra-neutral-600: #475569;
36
+ --nebutra-neutral-700: #334155;
37
+ --nebutra-neutral-800: #1e293b;
38
+ --nebutra-neutral-900: #0f172a;
39
+ --nebutra-neutral-950: #020617;
40
+ --nebutra-gray-50: #fafafa;
41
+ --nebutra-gray-100: #f5f5f5;
42
+ --nebutra-gray-200: #e5e5e5;
43
+ --nebutra-gray-300: #d4d4d4;
44
+ --nebutra-gray-400: #a3a3a3;
45
+ --nebutra-gray-500: #737373;
46
+ --nebutra-gray-600: #525252;
47
+ --nebutra-gray-700: #404040;
48
+ --nebutra-gray-800: #262626;
49
+ --nebutra-gray-900: #171717;
50
+ --nebutra-gray-950: #0a0a0a;
51
+ --radius-none: 0;
52
+ --radius-sm: 0.25rem;
53
+ --radius-md: 0.375rem;
54
+ --radius-lg: 0.5rem;
55
+ --radius-xl: 0.75rem;
56
+ --radius-2xl: 1rem;
57
+ --radius-3xl: 1.5rem;
58
+ --radius-full: 9999px;
59
+ --radius-button: 0.5rem; /** 2026 button radius — Vercel/Linear/Cursor consensus */
60
+ --radius-card: 0.75rem; /** 2026 card radius */
61
+ --radius-panel: 1rem; /** 2026 bento/hero panel radius */
62
+ --duration-micro: 100ms; /** Micro-feedback: hover, focus, toggle, button press */
63
+ --duration-flow: 200ms; /** State flow: modal open, dropdown reveal, tab switch, default page transition */
64
+ --duration-reveal: 300ms; /** Content unveil: slide-in, expand, accordion, drawer */
65
+ --duration-cinematic: 500ms; /** Hero-grade entrance: landing reveal, large delight moments */
66
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
67
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
68
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
69
+ --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
70
+ --tracking-display: -0.04em; /** Hero H1 */
71
+ --tracking-heading: -0.03em; /** Section H2/H3 */
72
+ --tracking-tight: -0.015em; /** Body emphasis */
73
+ --leading-display: 1.05;
74
+ --leading-heading: 1.15;
75
+ --ring-hairline: inset 0 0 0 1px rgb(255 255 255 / 0.06); /** Hairline override — more visible on dark background */
76
+ --overlay-faint: rgb(255 255 255 / 0.06); /** Dark-mode faint overlay (6% white) — inverted from light */
77
+ --font-sans: "Geist", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
78
+ --font-cn: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "vivo Sans", sans-serif;
79
+ --font-display: "Geist", "Noto Sans SC", sans-serif;
80
+ --font-heading: "Geist", "Noto Sans SC", sans-serif;
81
+ --font-mono: "Geist Mono", "Fira Code", ui-monospace, Consolas, "Courier New", monospace;
82
+ --transition-duration: 200ms; /** Default transition duration — 200ms flow rail. */
83
+ --transition-easing: ease-out; /** ease-out keyword form (CSS-friendly). Equivalent to cubic-bezier(0,0,0.2,1). */
84
+ --brand-primary: #5c7cfa; /** Dark-mode brand primary — visible against dark surfaces (uses --blue-9 = nebutra-blue-400). */
85
+ --brand-accent: #1af7c8; /** Dark-mode brand accent — visible against dark surfaces (uses --cyan-9 = nebutra-cyan-400). */
86
+ --brand-tertiary: #8b5cf6;
87
+ --brand-gradient: linear-gradient(135deg, #254bfa 0%, #057963 100%); /** UI brand gradient — usage-adjusted from the locked VI blue/cyan anchors to reduce saturation and preserve white-text contrast. */
88
+ --brand-gradient-reverse: linear-gradient(135deg, #057963 0%, #254bfa 100%);
89
+ --brand-gradient-vertical: linear-gradient(180deg, #254bfa 0%, #057963 100%);
90
+ --brand-gradient-radial: radial-gradient(circle, #057963 0%, #254bfa 100%);
91
+ --brand-gradient-logo: linear-gradient(135deg, #0033fe 0%, #0bf1c3 100%); /** Logo/VI standard gradient. Use for brand assets only; product UI should use --brand-gradient. */
92
+ --brand-gradient-logo-reverse: linear-gradient(135deg, #0bf1c3 0%, #0033fe 100%);
93
+ --status-danger: #ef4444;
94
+ --status-warning: #f59e0b;
95
+ --status-success: #22c55e;
96
+ --status-info: #5c7cfa; /** Dark-mode info color — equals dark brand-primary. */
97
+ --container-text: 896px;
98
+ --container-content: 1152px;
99
+ --container-wide: 1400px;
100
+ --radius: 0.375rem; /** Geist-matching 6px */
101
+ --motion-duration-micro: 100ms;
102
+ --motion-duration-flow: 200ms;
103
+ --motion-duration-reveal: 300ms;
104
+ --motion-duration-cinematic: 500ms;
105
+ --focus-ring: 0 0 0 2px hsl(var(--ring) / 0.4); /** Single-layer translucent focus ring (2026 pattern). Legacy box-shadow consumers stay compatible; modern surfaces should prefer the global :focus-visible outline rule in static/base.css. */
106
+ --neutral-1: #020617;
107
+ --neutral-2: #0f172a;
108
+ --neutral-3: #1e293b;
109
+ --neutral-4: #334155;
110
+ --neutral-5: #475569;
111
+ --neutral-6: #171717;
112
+ --neutral-7: #262626;
113
+ --neutral-8: #404040;
114
+ --neutral-9: #94a3b8;
115
+ --neutral-10: #cbd5e1;
116
+ --neutral-11: #e2e8f0;
117
+ --neutral-12: #f8fafc;
118
+ --blue-1: #000830;
119
+ --blue-2: #000f59;
120
+ --blue-3: #001882;
121
+ --blue-4: #0021ab;
122
+ --blue-5: #002ad4;
123
+ --blue-6: #001882;
124
+ --blue-7: #0021ab;
125
+ --blue-8: #002ad4;
126
+ --blue-9: #5c7cfa;
127
+ --blue-10: #91a7ff;
128
+ --blue-11: #bac8ff;
129
+ --blue-12: #dbe4ff;
130
+ --cyan-1: #012923;
131
+ --cyan-2: #035143;
132
+ --cyan-3: #057963;
133
+ --cyan-4: #07a183;
134
+ --cyan-5: #09c9a3;
135
+ --cyan-6: #057963;
136
+ --cyan-7: #07a183;
137
+ --cyan-8: #09c9a3;
138
+ --cyan-9: #1af7c8;
139
+ --cyan-10: #4dfcd4;
140
+ --cyan-11: #80ffe0;
141
+ --cyan-12: #b3ffec;
142
+ --background: 222 47% 4%;
143
+ --foreground: 210 40% 98%;
144
+ --card: 222 47% 7%;
145
+ --card-foreground: 210 40% 98%;
146
+ --popover: 222 47% 7%;
147
+ --popover-foreground: 210 40% 98%;
148
+ --primary: 228 90% 72%;
149
+ --primary-foreground: 222 47% 4%;
150
+ --secondary: 217 33% 17%;
151
+ --secondary-foreground: 210 40% 98%;
152
+ --muted: 217 33% 17%;
153
+ --muted-foreground: 215 20% 65%;
154
+ --accent: 228 100% 12%;
155
+ --accent-foreground: 228 95% 67%;
156
+ --destructive: 0 63% 31%;
157
+ --destructive-foreground: 210 40% 98%;
158
+ --success: 142 76% 36%;
159
+ --success-foreground: 222 47% 4%;
160
+ --warning: 38 80% 45%;
161
+ --warning-foreground: 222 47% 4%;
162
+ --info: 228 95% 67%;
163
+ --info-foreground: 222 47% 4%;
164
+ --border: 0 0% 14.9%;
165
+ --input: 0 0% 14.9%;
166
+ --ring: 0 0% 88%; /** Focus ring (dark mode) — neutral light gray. Mirrors light-mode neutral foreground choice. */
167
+ --sidebar: 222 47% 6%;
168
+ --sidebar-foreground: 210 40% 96%;
169
+ --sidebar-primary: 228 95% 67%;
170
+ --sidebar-primary-foreground: 222 47% 4%;
171
+ --sidebar-accent: 228 100% 12%;
172
+ --sidebar-accent-foreground: 228 95% 67%;
173
+ --sidebar-border: 0 0% 14.9%;
174
+ --sidebar-ring: 228 95% 67%;
175
+ --chart-1: 228 95% 67%;
176
+ --chart-2: 168 96% 54%;
177
+ --chart-3: 228 100% 82%;
178
+ --chart-4: 168 100% 75%;
179
+ --chart-5: 228 100% 50%;
180
+ --ds-blue-200: oklch(25.45% 0.0811 255.8);
181
+ --ds-blue-700: oklch(57.61% 0.2321 258.23);
182
+ --ds-blue-900: oklch(71.7% 0.1648 250.79360374054167);
183
+ --ds-red-200: oklch(25.93% 0.0834 19.02);
184
+ --ds-red-700: oklch(62.56% 0.2234 23.03);
185
+ --ds-red-900: oklch(69.96% 0.2136 22.03);
186
+ --ds-amber-200: oklch(24.95% 0.0642 64.78);
187
+ --ds-amber-700: oklch(81.87% 0.1969 76.46);
188
+ --ds-amber-900: oklch(77.21% 0.1991 64.28);
189
+ --ds-green-200: oklch(27.12% 0.0895 150.09);
190
+ --ds-green-700: oklch(64.58% 0.199 147.27);
191
+ --ds-green-900: oklch(73.1% 0.2158 148.29);
192
+ --ds-teal-300: oklch(31.5% 0.0767 180.99);
193
+ --ds-teal-700: oklch(64.92% 0.1403 181.95);
194
+ --ds-teal-900: oklch(74.56% 0.1765 182.8);
195
+ --ds-purple-200: oklch(25.91% 0.0921 314.41);
196
+ --ds-purple-700: oklch(55.5% 0.2186 306.12);
197
+ --ds-purple-900: oklch(69.87% 0.2037 309.51);
198
+ --ds-pink-300: oklch(31.15% 0.1067 355.93);
199
+ --ds-pink-700: oklch(63.52% 0.2346 1.01);
200
+ --ds-pink-900: oklch(69.36% 0.2223 3.91);
201
+ --ds-gray-100: hsla(0, 0%, 10%, 1);
202
+ --ds-gray-200: hsla(0, 0%, 12%, 1);
203
+ --ds-gray-500: hsla(0, 0%, 27%, 1);
204
+ --ds-gray-600: hsla(0, 0%, 53%, 1);
205
+ --ds-gray-700: hsla(0, 0%, 56%, 1);
206
+ --ds-gray-1000: hsla(0, 0%, 93%, 1);
207
+ --ds-background-100: hsla(0, 0%, 4%, 1);
208
+ --ds-trial-start: rgb(0, 112, 243);
209
+ --ds-trial-end: rgb(248, 28, 229);
210
+ --ds-turbo-start: #ff1e56;
211
+ --ds-turbo-end: #0096ff;
212
+ --elevation-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);
213
+ --elevation-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4);
214
+ --elevation-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4);
215
+ --elevation-lg: 0 10px 15px -3px rgb(0 0 0 / 0.5), 0 4px 6px -4px rgb(0 0 0 / 0.5);
216
+ --elevation-xl: 0 20px 25px -5px rgb(0 0 0 / 0.6), 0 8px 10px -6px rgb(0 0 0 / 0.6);
217
+ --elevation-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.8);
218
+ --elevation-brand: 0 0 0 1px rgb(92 124 250 / 0.25), 0 4px 20px -2px rgb(92 124 250 / 0.3);
219
+ --elevation-brand-lg: 0 0 0 1px rgb(92 124 250 / 0.3), 0 8px 40px -4px rgb(92 124 250 / 0.4);
220
+ }
221
+
222
+ .dark {
223
+ /* Gradient aliases — both --brand-gradient-* (canonical, CLAUDE.md) and --gradient-brand-* (legacy) are emitted. */
224
+ --gradient-brand: var(--brand-gradient);
225
+ --gradient-brand-hover: var(--brand-gradient-reverse);
226
+ --gradient-brand-vertical: var(--brand-gradient-vertical);
227
+ --gradient-brand-reverse: var(--brand-gradient-reverse);
228
+ --gradient-brand-radial: var(--brand-gradient-radial);
229
+ --gradient-brand-glow: var(--brand-gradient-radial);
230
+ --gradient-brand-logo: var(--brand-gradient-logo);
231
+ --gradient-brand-logo-reverse: var(--brand-gradient-logo-reverse);
232
+ --gradient-section: var(--brand-gradient-vertical);
233
+ --gradient-glow: var(--brand-gradient-radial);
234
+ }
235
+
236
+ @supports (color: oklch(0 0 0)) {
237
+ .dark {
238
+ /* oklch values for modern engines (2024+); sRGB hsla() fallback above. */
239
+ --ds-gray-100: oklch(0.232 0 0);
240
+ --ds-gray-200: oklch(0.259 0 0);
241
+ --ds-gray-500: oklch(0.409 0 0);
242
+ --ds-gray-600: oklch(0.59 0 0);
243
+ --ds-gray-700: oklch(0.598 0 0);
244
+ --ds-gray-1000: oklch(0.94 0 0);
245
+ --ds-background-100: oklch(0.143 0 0);
246
+ }
247
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @nebutra/design-tokens — generated from W3C DTCG tokens.
3
+ * DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
4
+ */
5
+
6
+ [data-theme="gradient"] {
7
+ --color-primary: oklch(0.546 0.245 262.9);
8
+ --color-primary-foreground: oklch(1 0 0);
9
+ --color-secondary: oklch(0.707 0.165 254.6);
10
+ --color-secondary-foreground: oklch(1 0 0);
11
+ --color-accent: oklch(0.623 0.214 259.1);
12
+ --color-accent-foreground: oklch(1 0 0);
13
+ --color-background: oklch(1 0 0);
14
+ --color-foreground: oklch(0.141 0.005 285.9);
15
+ --color-card: oklch(0.985 0 0);
16
+ --color-card-foreground: oklch(0.141 0.005 285.9);
17
+ --color-popover: oklch(1 0 0);
18
+ --color-popover-foreground: oklch(0.141 0.005 285.9);
19
+ --color-muted: oklch(0.967 0.001 286);
20
+ --color-muted-foreground: oklch(0.552 0.016 286);
21
+ --color-border: oklch(0.922 0.004 286);
22
+ --color-input: oklch(0.922 0.004 286);
23
+ --color-ring: oklch(0.546 0.245 262.9);
24
+ --color-primary-hover: color-mix(in oklch, oklch(0.546 0.245 262.9), black 10%);
25
+ --color-primary-active: color-mix(in oklch, oklch(0.546 0.245 262.9), black 20%);
26
+ --radius-sm: 0.375rem;
27
+ --radius-md: 0.5rem;
28
+ --radius-lg: 0.75rem;
29
+ --radius-xl: 1rem;
30
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
31
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
32
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
33
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
34
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
35
+ }
@@ -0,0 +1,269 @@
1
+ /**
2
+ * @nebutra/design-tokens — generated from W3C DTCG tokens.
3
+ * DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
4
+ */
5
+
6
+ :root {
7
+ --nebutra-blue-50: #f0f4ff;
8
+ --nebutra-blue-100: #dbe4ff;
9
+ --nebutra-blue-200: #bac8ff;
10
+ --nebutra-blue-300: #91a7ff;
11
+ --nebutra-blue-400: #5c7cfa;
12
+ --nebutra-blue-500: #0033fe; /** Base brand color — 云毓蓝 */
13
+ --nebutra-blue-600: #002ad4;
14
+ --nebutra-blue-700: #0021ab;
15
+ --nebutra-blue-800: #001882;
16
+ --nebutra-blue-900: #000f59;
17
+ --nebutra-blue-950: #000830;
18
+ --nebutra-cyan-50: #e6fff8;
19
+ --nebutra-cyan-100: #b3ffec;
20
+ --nebutra-cyan-200: #80ffe0;
21
+ --nebutra-cyan-300: #4dfcd4;
22
+ --nebutra-cyan-400: #1af7c8;
23
+ --nebutra-cyan-500: #0bf1c3; /** Base brand accent — 云毓青 */
24
+ --nebutra-cyan-600: #09c9a3;
25
+ --nebutra-cyan-700: #07a183;
26
+ --nebutra-cyan-800: #057963;
27
+ --nebutra-cyan-900: #035143;
28
+ --nebutra-cyan-950: #012923;
29
+ --nebutra-neutral-50: #f8fafc;
30
+ --nebutra-neutral-100: #f1f5f9;
31
+ --nebutra-neutral-200: #e2e8f0;
32
+ --nebutra-neutral-300: #cbd5e1;
33
+ --nebutra-neutral-400: #94a3b8;
34
+ --nebutra-neutral-500: #64748b;
35
+ --nebutra-neutral-600: #475569;
36
+ --nebutra-neutral-700: #334155;
37
+ --nebutra-neutral-800: #1e293b;
38
+ --nebutra-neutral-900: #0f172a;
39
+ --nebutra-neutral-950: #020617;
40
+ --nebutra-gray-50: #fafafa;
41
+ --nebutra-gray-100: #f5f5f5;
42
+ --nebutra-gray-200: #e5e5e5;
43
+ --nebutra-gray-300: #d4d4d4;
44
+ --nebutra-gray-400: #a3a3a3;
45
+ --nebutra-gray-500: #737373;
46
+ --nebutra-gray-600: #525252;
47
+ --nebutra-gray-700: #404040;
48
+ --nebutra-gray-800: #262626;
49
+ --nebutra-gray-900: #171717;
50
+ --nebutra-gray-950: #0a0a0a;
51
+ --radius-none: 0;
52
+ --radius-sm: 0.25rem;
53
+ --radius-md: 0.375rem;
54
+ --radius-lg: 0.5rem;
55
+ --radius-xl: 0.75rem;
56
+ --radius-2xl: 1rem;
57
+ --radius-3xl: 1.5rem;
58
+ --radius-full: 9999px;
59
+ --radius-button: 0.5rem; /** 2026 button radius — Vercel/Linear/Cursor consensus */
60
+ --radius-card: 0.75rem; /** 2026 card radius */
61
+ --radius-panel: 1rem; /** 2026 bento/hero panel radius */
62
+ --duration-micro: 100ms; /** Micro-feedback: hover, focus, toggle, button press */
63
+ --duration-flow: 200ms; /** State flow: modal open, dropdown reveal, tab switch, default page transition */
64
+ --duration-reveal: 300ms; /** Content unveil: slide-in, expand, accordion, drawer */
65
+ --duration-cinematic: 500ms; /** Hero-grade entrance: landing reveal, large delight moments */
66
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
67
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
68
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
69
+ --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
70
+ --tracking-display: -0.04em; /** Hero H1 */
71
+ --tracking-heading: -0.03em; /** Section H2/H3 */
72
+ --tracking-tight: -0.015em; /** Body emphasis */
73
+ --leading-display: 1.05;
74
+ --leading-heading: 1.15;
75
+ --ring-hairline: inset 0 0 0 1px rgb(255 255 255 / 0.04); /** Etched-glass hairline (light mode value, dark mode override in themes/dark.json) */
76
+ --overlay-faint: rgb(0 0 0 / 0.06); /** Light-mode faint overlay (6% black) */
77
+ --font-sans: "Geist", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
78
+ --font-cn: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "vivo Sans", sans-serif;
79
+ --font-display: "Geist", "Noto Sans SC", sans-serif;
80
+ --font-heading: "Geist", "Noto Sans SC", sans-serif;
81
+ --font-mono: "Geist Mono", "Fira Code", ui-monospace, Consolas, "Courier New", monospace;
82
+ --transition-duration: 200ms; /** Default transition duration — 200ms flow rail. */
83
+ --transition-easing: ease-out; /** ease-out keyword form (CSS-friendly). Equivalent to cubic-bezier(0,0,0.2,1). */
84
+ --brand-primary: #0033fe; /** Brand primary — 云毓蓝 */
85
+ --brand-accent: #0bf1c3; /** Brand accent — 云毓青 */
86
+ --brand-tertiary: #8b5cf6;
87
+ --brand-gradient: linear-gradient(135deg, #254bfa 0%, #057963 100%); /** UI brand gradient — usage-adjusted from the locked VI blue/cyan anchors to reduce saturation and preserve white-text contrast. */
88
+ --brand-gradient-reverse: linear-gradient(135deg, #057963 0%, #254bfa 100%);
89
+ --brand-gradient-vertical: linear-gradient(180deg, #254bfa 0%, #057963 100%);
90
+ --brand-gradient-radial: radial-gradient(circle, #057963 0%, #254bfa 100%);
91
+ --brand-gradient-logo: linear-gradient(135deg, #0033fe 0%, #0bf1c3 100%); /** Logo/VI standard gradient. Use for brand assets only; product UI should use --brand-gradient. */
92
+ --brand-gradient-logo-reverse: linear-gradient(135deg, #0bf1c3 0%, #0033fe 100%);
93
+ --status-danger: #ef4444;
94
+ --status-warning: #f59e0b;
95
+ --status-success: #22c55e;
96
+ --status-info: #0033fe; /** VI: Info = Brand Blue */
97
+ --container-text: 896px;
98
+ --container-content: 1152px;
99
+ --container-wide: 1400px;
100
+ --radius: 0.375rem; /** Geist-matching 6px */
101
+ --motion-duration-micro: 100ms;
102
+ --motion-duration-flow: 200ms;
103
+ --motion-duration-reveal: 300ms;
104
+ --motion-duration-cinematic: 500ms;
105
+ --focus-ring: 0 0 0 2px hsl(var(--ring) / 0.4); /** Single-layer translucent focus ring (2026 pattern). Legacy box-shadow consumers stay compatible; modern surfaces should prefer the global :focus-visible outline rule in static/base.css. */
106
+ --neutral-1: #ffffff; /** app background */
107
+ --neutral-2: #f8fafc; /** subtle background */
108
+ --neutral-3: #f1f5f9; /** component bg default */
109
+ --neutral-4: #e2e8f0; /** component bg hover */
110
+ --neutral-5: #cbd5e1; /** component bg active */
111
+ --neutral-6: #e2e8f0; /** subtle border */
112
+ --neutral-7: #cbd5e1; /** default border */
113
+ --neutral-8: #94a3b8; /** hovered border */
114
+ --neutral-9: #64748b; /** solid fill */
115
+ --neutral-10: #475569; /** solid fill hover */
116
+ --neutral-11: #334155; /** secondary text */
117
+ --neutral-12: #0f172a; /** primary text */
118
+ --blue-1: #f0f4ff;
119
+ --blue-2: #dbe4ff;
120
+ --blue-3: #bac8ff;
121
+ --blue-4: #91a7ff;
122
+ --blue-5: #5c7cfa;
123
+ --blue-6: #bac8ff;
124
+ --blue-7: #91a7ff;
125
+ --blue-8: #5c7cfa;
126
+ --blue-9: #0033fe; /** solid fill — main brand */
127
+ --blue-10: #002ad4;
128
+ --blue-11: #0021ab;
129
+ --blue-12: #000f59;
130
+ --cyan-1: #e6fff8;
131
+ --cyan-2: #b3ffec;
132
+ --cyan-3: #80ffe0;
133
+ --cyan-4: #4dfcd4;
134
+ --cyan-5: #1af7c8;
135
+ --cyan-6: #80ffe0;
136
+ --cyan-7: #4dfcd4;
137
+ --cyan-8: #1af7c8;
138
+ --cyan-9: #0bf1c3;
139
+ --cyan-10: #09c9a3;
140
+ --cyan-11: #07a183;
141
+ --cyan-12: #035143;
142
+ --background: 0 0% 100%; /** HSL channel triple — consume via hsl(var(--background)) */
143
+ --foreground: 222 47% 11%;
144
+ --card: 0 0% 100%;
145
+ --card-foreground: 222 47% 11%;
146
+ --popover: 0 0% 100%;
147
+ --popover-foreground: 222 47% 11%;
148
+ --primary: 228 85% 56%; /** Softer brand blue #254bfa */
149
+ --primary-foreground: 0 0% 100%;
150
+ --secondary: 210 40% 96%;
151
+ --secondary-foreground: 222 47% 11%;
152
+ --muted: 210 40% 96%;
153
+ --muted-foreground: 215 25% 45%;
154
+ --accent: 228 100% 97%;
155
+ --accent-foreground: 228 85% 56%; /** Softer brand blue — desaturated to match --primary, avoids 100% saturation glare on focus/accent */
156
+ --destructive: 0 84% 45%;
157
+ --destructive-foreground: 0 0% 100%;
158
+ --success: 142 71% 29%;
159
+ --success-foreground: 0 0% 100%;
160
+ --warning: 38 92% 50%;
161
+ --warning-foreground: 222 47% 11%;
162
+ --info: 228 85% 56%;
163
+ --info-foreground: 0 0% 100%;
164
+ --border: 240 5.9% 90%;
165
+ --input: 240 5.9% 90%;
166
+ --ring: 222 47% 11%; /** Focus ring — neutral foreground (Vercel/Linear/Cursor 2026 pattern). Brand blue is reserved for selected/active states; focus indication is chrome and stays neutral. Consumed by global :focus-visible outline as hsl(var(--ring) / 0.5). */
167
+ --sidebar: 210 40% 98%;
168
+ --sidebar-foreground: 215 25% 27%;
169
+ --sidebar-primary: 228 85% 56%;
170
+ --sidebar-primary-foreground: 0 0% 100%;
171
+ --sidebar-accent: 228 100% 97%;
172
+ --sidebar-accent-foreground: 228 85% 56%;
173
+ --sidebar-border: 214 32% 91%;
174
+ --sidebar-ring: 228 85% 56%;
175
+ --chart-1: 228 100% 50%;
176
+ --chart-2: 168 91% 49%;
177
+ --chart-3: 263 70% 66%;
178
+ --chart-4: 168 91% 70%;
179
+ --chart-5: 228 100% 35%;
180
+ --ds-blue-200: oklch(96.29% 0.0195 250.59);
181
+ --ds-blue-700: oklch(57.61% 0.2508 258.23);
182
+ --ds-blue-900: oklch(53.18% 0.2399 256.9900584162342);
183
+ --ds-red-200: oklch(95.41% 0.0299 14.252646656611997);
184
+ --ds-red-700: oklch(62.56% 0.2524 23.03);
185
+ --ds-red-900: oklch(54.99% 0.232 25.29);
186
+ --ds-amber-200: oklch(96.81% 0.0495 90.24227879900472);
187
+ --ds-amber-700: oklch(81.87% 0.1969 76.46);
188
+ --ds-amber-900: oklch(52.79% 0.1496 54.65);
189
+ --ds-green-200: oklch(96.92% 0.037 147.15);
190
+ --ds-green-700: oklch(64.58% 0.1746 147.27);
191
+ --ds-green-900: oklch(51.75% 0.1453 147.65);
192
+ --ds-teal-300: oklch(94.92% 0.0478 182.07);
193
+ --ds-teal-700: oklch(64.92% 0.1572 181.95);
194
+ --ds-teal-900: oklch(52.08% 0.1251 182.93);
195
+ --ds-purple-200: oklch(96.73% 0.0228 309.8);
196
+ --ds-purple-700: oklch(55.5% 0.3008 306.12);
197
+ --ds-purple-900: oklch(47.18% 0.2579 304);
198
+ --ds-pink-300: oklch(93.83% 0.0451 356.29);
199
+ --ds-pink-700: oklch(63.52% 0.238 1.01);
200
+ --ds-pink-900: oklch(53.5% 0.2058 2.84);
201
+ --ds-gray-100: hsla(0, 0%, 95%, 1);
202
+ --ds-gray-200: hsla(0, 0%, 92%, 1);
203
+ --ds-gray-500: hsla(0, 0%, 79%, 1);
204
+ --ds-gray-600: hsla(0, 0%, 66%, 1);
205
+ --ds-gray-700: hsla(0, 0%, 56%, 1);
206
+ --ds-gray-1000: hsla(0, 0%, 9%, 1);
207
+ --ds-background-100: hsla(0, 0%, 100%, 1);
208
+ --ds-trial-start: rgb(0, 112, 243);
209
+ --ds-trial-end: rgb(248, 28, 229);
210
+ --ds-turbo-start: #ff1e56;
211
+ --ds-turbo-end: #0096ff;
212
+ --elevation-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
213
+ --elevation-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
214
+ --elevation-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
215
+ --elevation-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
216
+ --elevation-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
217
+ --elevation-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
218
+ --elevation-brand: 0 0 0 1px rgb(0 51 254 / 0.15), 0 4px 20px -2px rgb(0 51 254 / 0.2);
219
+ --elevation-brand-lg: 0 0 0 1px rgb(0 51 254 / 0.2), 0 8px 40px -4px rgb(0 51 254 / 0.3);
220
+ }
221
+
222
+ :root {
223
+ /* Wide-gamut bridge: default to sRGB, upgrade to Display-P3 when available. */
224
+ --nebutra-brand-blue: var(--nebutra-blue-500);
225
+ --nebutra-brand-cyan: var(--nebutra-cyan-500);
226
+ }
227
+
228
+ :root {
229
+ /* Gradient aliases — both --brand-gradient-* (canonical, CLAUDE.md) and --gradient-brand-* (legacy) are emitted. */
230
+ --gradient-brand: var(--brand-gradient);
231
+ --gradient-brand-hover: var(--brand-gradient-reverse);
232
+ --gradient-brand-vertical: var(--brand-gradient-vertical);
233
+ --gradient-brand-reverse: var(--brand-gradient-reverse);
234
+ --gradient-brand-radial: var(--brand-gradient-radial);
235
+ --gradient-brand-glow: var(--brand-gradient-radial);
236
+ --gradient-brand-logo: var(--brand-gradient-logo);
237
+ --gradient-brand-logo-reverse: var(--brand-gradient-logo-reverse);
238
+ --gradient-section: var(--brand-gradient-vertical);
239
+ --gradient-glow: var(--brand-gradient-radial);
240
+ }
241
+
242
+ :root {
243
+ /* Composite tokens — combine duration + easing for shorthand use. */
244
+ --transition: 150ms ease-out;
245
+ --focus-ring: 0 0 0 2px hsl(var(--ring) / 0.4);
246
+ }
247
+
248
+ @supports (color: color(display-p3 1 1 1)) {
249
+ :root {
250
+ /* Richer brand values on Display-P3 hardware; sRGB fallback above. */
251
+ --nebutra-blue-500: color(display-p3 0.03 0.19 0.99);
252
+ --nebutra-cyan-500: color(display-p3 0.07 0.94 0.79);
253
+ --nebutra-brand-blue: color(display-p3 0.03 0.19 0.99);
254
+ --nebutra-brand-cyan: color(display-p3 0.07 0.94 0.79);
255
+ }
256
+ }
257
+
258
+ @supports (color: oklch(0 0 0)) {
259
+ :root {
260
+ /* oklch values for modern engines (2024+); sRGB hsla() fallback above. */
261
+ --ds-gray-100: oklch(0.953 0 0);
262
+ --ds-gray-200: oklch(0.929 0 0);
263
+ --ds-gray-500: oklch(0.81 0 0);
264
+ --ds-gray-600: oklch(0.69 0 0);
265
+ --ds-gray-700: oklch(0.598 0 0);
266
+ --ds-gray-1000: oklch(0.215 0 0);
267
+ --ds-background-100: oklch(1 0 0);
268
+ }
269
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @nebutra/design-tokens — generated from W3C DTCG tokens.
3
+ * DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
4
+ */
5
+
6
+ [data-theme="minimal"] {
7
+ --color-primary: oklch(0.21 0.006 285.9);
8
+ --color-primary-foreground: oklch(1 0 0);
9
+ --color-secondary: oklch(0.442 0.017 285.9);
10
+ --color-secondary-foreground: oklch(1 0 0);
11
+ --color-accent: oklch(0.552 0.016 286);
12
+ --color-accent-foreground: oklch(1 0 0);
13
+ --color-background: oklch(0.985 0 0);
14
+ --color-foreground: oklch(0.141 0.005 285.9);
15
+ --color-card: oklch(1 0 0);
16
+ --color-card-foreground: oklch(0.141 0.005 285.9);
17
+ --color-popover: oklch(1 0 0);
18
+ --color-popover-foreground: oklch(0.141 0.005 285.9);
19
+ --color-muted: oklch(0.967 0.001 286);
20
+ --color-muted-foreground: oklch(0.552 0.016 286);
21
+ --color-border: oklch(0.922 0.004 286);
22
+ --color-input: oklch(0.922 0.004 286);
23
+ --color-ring: oklch(0.21 0.006 285.9);
24
+ --color-primary-hover: color-mix(in oklch, oklch(0.21 0.006 285.9), white 20%);
25
+ --color-primary-active: color-mix(in oklch, oklch(0.21 0.006 285.9), white 10%);
26
+ --radius-sm: 0.25rem;
27
+ --radius-md: 0.375rem;
28
+ --radius-lg: 0.5rem;
29
+ --radius-xl: 0.75rem;
30
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
31
+ --font-heading: "Playfair Display", ui-serif, Georgia, serif;
32
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.03);
33
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.07);
34
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.07);
35
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.07);
36
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @nebutra/design-tokens — generated from W3C DTCG tokens.
3
+ * DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
4
+ */
5
+
6
+ @theme {
7
+ --color-primary: oklch(0.452 0.313 264.1);
8
+ --color-primary-foreground: oklch(1 0 0);
9
+ --color-secondary: oklch(0.715 0.143 215.2);
10
+ --color-secondary-foreground: oklch(1 0 0);
11
+ --color-accent: oklch(0.714 0.203 264.1);
12
+ --color-accent-foreground: oklch(0.141 0.005 285.9);
13
+ --color-background: oklch(0.141 0.005 285.9);
14
+ --color-foreground: oklch(0.985 0 0);
15
+ --color-card: oklch(0.212 0.006 285.9);
16
+ --color-card-foreground: oklch(0.985 0 0);
17
+ --color-popover: oklch(0.212 0.006 285.9);
18
+ --color-popover-foreground: oklch(0.985 0 0);
19
+ --color-muted: oklch(0.274 0.006 286);
20
+ --color-muted-foreground: oklch(0.705 0.015 286);
21
+ --color-border: oklch(0.274 0.006 286);
22
+ --color-input: oklch(0.274 0.006 286);
23
+ --color-ring: oklch(0.452 0.313 264.1);
24
+ --color-destructive: oklch(0.577 0.245 27.3);
25
+ --color-destructive-foreground: oklch(1 0 0);
26
+ --color-success: oklch(0.723 0.219 149.6);
27
+ --color-success-foreground: oklch(1 0 0);
28
+ --color-warning: oklch(0.769 0.189 70.1);
29
+ --color-warning-foreground: oklch(0.141 0.005 285.9);
30
+ --color-info: oklch(0.623 0.214 259.1);
31
+ --color-info-foreground: oklch(1 0 0);
32
+ --color-primary-hover: color-mix(in oklch, oklch(0.452 0.313 264.1), white 15%);
33
+ --color-primary-active: color-mix(in oklch, oklch(0.452 0.313 264.1), black 10%);
34
+ --radius-sm: 0.25rem;
35
+ --radius-md: 0.375rem;
36
+ --radius-lg: 0.5rem;
37
+ --radius-xl: 0.75rem;
38
+ --radius-full: 9999px;
39
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
40
+ --font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
41
+ --font-heading: "Inter", ui-sans-serif, system-ui, sans-serif;
42
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.5);
43
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5);
44
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.5);
45
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.5);
46
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
47
+ --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
48
+ --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
49
+ }