@nebutra/tokens 0.1.0
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.
- package/AGENTS.md +42 -0
- package/DESIGN.md +333 -0
- package/LICENSE +676 -0
- package/README.md +79 -0
- package/package.json +45 -0
- package/src/index.ts +37 -0
- package/src/theme-provider.tsx +231 -0
- package/styles.css +1391 -0
- package/tsconfig.json +11 -0
package/styles.css
ADDED
|
@@ -0,0 +1,1391 @@
|
|
|
1
|
+
/* biome-ignore-all lint/suspicious/noDuplicateCustomProperties: auto-generated from W3C DTCG tokens — primitive + semantic blocks intentionally redeclare aliases. Fix in tokens/*.json source if real, then re-run pnpm --filter @nebutra/design-tokens build. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @nebutra/design-tokens — styles.generated.css
|
|
5
|
+
* AUTO-GENERATED from packages/design/design-tokens/tokens/*.json — DO NOT EDIT.
|
|
6
|
+
* Run `pnpm --filter @nebutra/design-tokens build` after editing tokens.
|
|
7
|
+
*
|
|
8
|
+
* SSOT Architecture:
|
|
9
|
+
* tokens/core.json primitive scales (colors, sizes, durations, fonts)
|
|
10
|
+
* tokens/semantic.json semantic aliases (brand.primary, status.danger, gradients)
|
|
11
|
+
* tokens/themes/light.json 12-step scales + shadcn HSL + Geist DS + elevation
|
|
12
|
+
* tokens/themes/dark.json same shape, dark-mode values
|
|
13
|
+
*
|
|
14
|
+
* Modeling extensions:
|
|
15
|
+
* - Display-P3 wide-gamut overrides (`@supports (color: color(display-p3 ...))`)
|
|
16
|
+
* - oklch fallbacks for ds-gray-* (`@supports (color: oklch(0 0 0))`)
|
|
17
|
+
* - Composite shorthand tokens (`--transition`, `--focus-ring`)
|
|
18
|
+
* - Tailwind v4 `@theme inline` block
|
|
19
|
+
* - Dark-mode brand alias overrides (`--brand-primary` → `--blue-9` in .dark)
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @nebutra/design-tokens — generated from W3C DTCG tokens.
|
|
24
|
+
* DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
:root {
|
|
28
|
+
--nebutra-blue-50: #f0f4ff;
|
|
29
|
+
--nebutra-blue-100: #dbe4ff;
|
|
30
|
+
--nebutra-blue-200: #bac8ff;
|
|
31
|
+
--nebutra-blue-300: #91a7ff;
|
|
32
|
+
--nebutra-blue-400: #5c7cfa;
|
|
33
|
+
--nebutra-blue-500: #0033fe; /** Base brand color — 云毓蓝 */
|
|
34
|
+
--nebutra-blue-600: #002ad4;
|
|
35
|
+
--nebutra-blue-700: #0021ab;
|
|
36
|
+
--nebutra-blue-800: #001882;
|
|
37
|
+
--nebutra-blue-900: #000f59;
|
|
38
|
+
--nebutra-blue-950: #000830;
|
|
39
|
+
--nebutra-cyan-50: #e6fff8;
|
|
40
|
+
--nebutra-cyan-100: #b3ffec;
|
|
41
|
+
--nebutra-cyan-200: #80ffe0;
|
|
42
|
+
--nebutra-cyan-300: #4dfcd4;
|
|
43
|
+
--nebutra-cyan-400: #1af7c8;
|
|
44
|
+
--nebutra-cyan-500: #0bf1c3; /** Base brand accent — 云毓青 */
|
|
45
|
+
--nebutra-cyan-600: #09c9a3;
|
|
46
|
+
--nebutra-cyan-700: #07a183;
|
|
47
|
+
--nebutra-cyan-800: #057963;
|
|
48
|
+
--nebutra-cyan-900: #035143;
|
|
49
|
+
--nebutra-cyan-950: #012923;
|
|
50
|
+
--nebutra-neutral-50: #f8fafc;
|
|
51
|
+
--nebutra-neutral-100: #f1f5f9;
|
|
52
|
+
--nebutra-neutral-200: #e2e8f0;
|
|
53
|
+
--nebutra-neutral-300: #cbd5e1;
|
|
54
|
+
--nebutra-neutral-400: #94a3b8;
|
|
55
|
+
--nebutra-neutral-500: #64748b;
|
|
56
|
+
--nebutra-neutral-600: #475569;
|
|
57
|
+
--nebutra-neutral-700: #334155;
|
|
58
|
+
--nebutra-neutral-800: #1e293b;
|
|
59
|
+
--nebutra-neutral-900: #0f172a;
|
|
60
|
+
--nebutra-neutral-950: #020617;
|
|
61
|
+
--nebutra-gray-50: #fafafa;
|
|
62
|
+
--nebutra-gray-100: #f5f5f5;
|
|
63
|
+
--nebutra-gray-200: #e5e5e5;
|
|
64
|
+
--nebutra-gray-300: #d4d4d4;
|
|
65
|
+
--nebutra-gray-400: #a3a3a3;
|
|
66
|
+
--nebutra-gray-500: #737373;
|
|
67
|
+
--nebutra-gray-600: #525252;
|
|
68
|
+
--nebutra-gray-700: #404040;
|
|
69
|
+
--nebutra-gray-800: #262626;
|
|
70
|
+
--nebutra-gray-900: #171717;
|
|
71
|
+
--nebutra-gray-950: #0a0a0a;
|
|
72
|
+
--brand-tertiary: #8b5cf6; /** Tertiary accent — data viz, infrastructure tags */
|
|
73
|
+
--status-danger: #ef4444;
|
|
74
|
+
--status-warning: #f59e0b;
|
|
75
|
+
--status-success: #22c55e; /** Tailwind green-500 — VI manual canonical success color (replaces drifted #10b981 emerald). */
|
|
76
|
+
--container-text: 896px; /** Reading-focused (hero copy, FAQ) */
|
|
77
|
+
--container-content: 1152px; /** Pricing, blog */
|
|
78
|
+
--container-wide: 1400px; /** Feature bento, navbar */
|
|
79
|
+
--radius-none: 0;
|
|
80
|
+
--radius-sm: 0.25rem;
|
|
81
|
+
--radius-md: 0.375rem;
|
|
82
|
+
--radius-lg: 0.5rem;
|
|
83
|
+
--radius-xl: 0.75rem;
|
|
84
|
+
--radius-2xl: 1rem;
|
|
85
|
+
--radius-3xl: 1.5rem;
|
|
86
|
+
--radius-full: 9999px;
|
|
87
|
+
--radius-button: 0.5rem; /** 2026 button radius — Vercel/Linear/Cursor consensus */
|
|
88
|
+
--radius-card: 0.75rem; /** 2026 card radius */
|
|
89
|
+
--radius-panel: 1rem; /** 2026 bento/hero panel radius */
|
|
90
|
+
--duration-micro: 100ms; /** Micro-feedback: hover, focus, toggle, button press */
|
|
91
|
+
--duration-flow: 200ms; /** State flow: modal open, dropdown reveal, tab switch, default page transition */
|
|
92
|
+
--duration-reveal: 300ms; /** Content unveil: slide-in, expand, accordion, drawer */
|
|
93
|
+
--duration-cinematic: 500ms; /** Hero-grade entrance: landing reveal, large delight moments */
|
|
94
|
+
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
95
|
+
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
96
|
+
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
97
|
+
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
98
|
+
--tracking-display: -0.04em; /** Hero H1 */
|
|
99
|
+
--tracking-heading: -0.03em; /** Section H2/H3 */
|
|
100
|
+
--tracking-tight: -0.015em; /** Body emphasis */
|
|
101
|
+
--leading-display: 1.05;
|
|
102
|
+
--leading-heading: 1.15;
|
|
103
|
+
--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) */
|
|
104
|
+
--overlay-faint: rgb(0 0 0 / 0.06); /** Light-mode faint overlay (6% black) */
|
|
105
|
+
--font-sans: "Geist", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
106
|
+
--font-cn: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "vivo Sans", sans-serif;
|
|
107
|
+
--font-display: "Geist", "Noto Sans SC", sans-serif;
|
|
108
|
+
--font-heading: "Geist", "Noto Sans SC", sans-serif;
|
|
109
|
+
--font-mono: "Geist Mono", "Fira Code", ui-monospace, Consolas, "Courier New", monospace;
|
|
110
|
+
--transition-duration: 200ms; /** Default transition duration — 200ms flow rail. */
|
|
111
|
+
--transition-easing: ease-out; /** ease-out keyword form (CSS-friendly). Equivalent to cubic-bezier(0,0,0.2,1). */
|
|
112
|
+
--brand-primary: #0033fe; /** Brand primary — 云毓蓝 */
|
|
113
|
+
--brand-accent: #0bf1c3; /** Brand accent — 云毓青 */
|
|
114
|
+
--brand-tertiary: #8b5cf6;
|
|
115
|
+
--brand-gradient: linear-gradient(135deg, #0033fe 0%, #0bf1c3 100%); /** Brand gradient — Logo standard 135° */
|
|
116
|
+
--brand-gradient-reverse: linear-gradient(135deg, #0bf1c3 0%, #0033fe 100%);
|
|
117
|
+
--brand-gradient-vertical: linear-gradient(180deg, #0033fe 0%, #0bf1c3 100%);
|
|
118
|
+
--brand-gradient-radial: radial-gradient(circle, #0bf1c3 0%, #0033fe 100%);
|
|
119
|
+
--status-danger: #ef4444;
|
|
120
|
+
--status-warning: #f59e0b;
|
|
121
|
+
--status-success: #22c55e;
|
|
122
|
+
--status-info: #0033fe; /** VI: Info = Brand Blue */
|
|
123
|
+
--container-text: 896px;
|
|
124
|
+
--container-content: 1152px;
|
|
125
|
+
--container-wide: 1400px;
|
|
126
|
+
--radius: 0.375rem; /** Geist-matching 6px */
|
|
127
|
+
--motion-duration-micro: 100ms;
|
|
128
|
+
--motion-duration-flow: 200ms;
|
|
129
|
+
--motion-duration-reveal: 300ms;
|
|
130
|
+
--motion-duration-cinematic: 500ms;
|
|
131
|
+
--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. */
|
|
132
|
+
--neutral-1: #ffffff; /** app background */
|
|
133
|
+
--neutral-2: #f8fafc; /** subtle background */
|
|
134
|
+
--neutral-3: #f1f5f9; /** component bg default */
|
|
135
|
+
--neutral-4: #e2e8f0; /** component bg hover */
|
|
136
|
+
--neutral-5: #cbd5e1; /** component bg active */
|
|
137
|
+
--neutral-6: #e2e8f0; /** subtle border */
|
|
138
|
+
--neutral-7: #cbd5e1; /** default border */
|
|
139
|
+
--neutral-8: #94a3b8; /** hovered border */
|
|
140
|
+
--neutral-9: #64748b; /** solid fill */
|
|
141
|
+
--neutral-10: #475569; /** solid fill hover */
|
|
142
|
+
--neutral-11: #334155; /** secondary text */
|
|
143
|
+
--neutral-12: #0f172a; /** primary text */
|
|
144
|
+
--blue-1: #f0f4ff;
|
|
145
|
+
--blue-2: #dbe4ff;
|
|
146
|
+
--blue-3: #bac8ff;
|
|
147
|
+
--blue-4: #91a7ff;
|
|
148
|
+
--blue-5: #5c7cfa;
|
|
149
|
+
--blue-6: #bac8ff;
|
|
150
|
+
--blue-7: #91a7ff;
|
|
151
|
+
--blue-8: #5c7cfa;
|
|
152
|
+
--blue-9: #0033fe; /** solid fill — main brand */
|
|
153
|
+
--blue-10: #002ad4;
|
|
154
|
+
--blue-11: #0021ab;
|
|
155
|
+
--blue-12: #000f59;
|
|
156
|
+
--cyan-1: #e6fff8;
|
|
157
|
+
--cyan-2: #b3ffec;
|
|
158
|
+
--cyan-3: #80ffe0;
|
|
159
|
+
--cyan-4: #4dfcd4;
|
|
160
|
+
--cyan-5: #1af7c8;
|
|
161
|
+
--cyan-6: #80ffe0;
|
|
162
|
+
--cyan-7: #4dfcd4;
|
|
163
|
+
--cyan-8: #1af7c8;
|
|
164
|
+
--cyan-9: #0bf1c3;
|
|
165
|
+
--cyan-10: #09c9a3;
|
|
166
|
+
--cyan-11: #07a183;
|
|
167
|
+
--cyan-12: #035143;
|
|
168
|
+
--background: 0 0% 100%; /** HSL channel triple — consume via hsl(var(--background)) */
|
|
169
|
+
--foreground: 222 47% 11%;
|
|
170
|
+
--card: 0 0% 100%;
|
|
171
|
+
--card-foreground: 222 47% 11%;
|
|
172
|
+
--popover: 0 0% 100%;
|
|
173
|
+
--popover-foreground: 222 47% 11%;
|
|
174
|
+
--primary: 228 85% 56%; /** Softer brand blue #254bfa */
|
|
175
|
+
--primary-foreground: 0 0% 100%;
|
|
176
|
+
--secondary: 210 40% 96%;
|
|
177
|
+
--secondary-foreground: 222 47% 11%;
|
|
178
|
+
--muted: 210 40% 96%;
|
|
179
|
+
--muted-foreground: 215 25% 45%;
|
|
180
|
+
--accent: 228 100% 97%;
|
|
181
|
+
--accent-foreground: 228 85% 56%; /** Softer brand blue — desaturated to match --primary, avoids 100% saturation glare on focus/accent */
|
|
182
|
+
--destructive: 0 84% 45%;
|
|
183
|
+
--destructive-foreground: 0 0% 100%;
|
|
184
|
+
--success: 142 71% 29%;
|
|
185
|
+
--success-foreground: 0 0% 100%;
|
|
186
|
+
--warning: 38 92% 50%;
|
|
187
|
+
--warning-foreground: 222 47% 11%;
|
|
188
|
+
--info: 228 85% 56%;
|
|
189
|
+
--info-foreground: 0 0% 100%;
|
|
190
|
+
--border: 240 5.9% 90%;
|
|
191
|
+
--input: 240 5.9% 90%;
|
|
192
|
+
--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). */
|
|
193
|
+
--sidebar: 210 40% 98%;
|
|
194
|
+
--sidebar-foreground: 215 25% 27%;
|
|
195
|
+
--sidebar-primary: 228 85% 56%;
|
|
196
|
+
--sidebar-primary-foreground: 0 0% 100%;
|
|
197
|
+
--sidebar-accent: 228 100% 97%;
|
|
198
|
+
--sidebar-accent-foreground: 228 85% 56%;
|
|
199
|
+
--sidebar-border: 214 32% 91%;
|
|
200
|
+
--sidebar-ring: 228 85% 56%;
|
|
201
|
+
--chart-1: 228 100% 50%;
|
|
202
|
+
--chart-2: 168 91% 49%;
|
|
203
|
+
--chart-3: 263 70% 66%;
|
|
204
|
+
--chart-4: 168 91% 70%;
|
|
205
|
+
--chart-5: 228 100% 35%;
|
|
206
|
+
--ds-blue-200: oklch(96.29% 0.0195 250.59);
|
|
207
|
+
--ds-blue-700: oklch(57.61% 0.2508 258.23);
|
|
208
|
+
--ds-blue-900: oklch(53.18% 0.2399 256.9900584162342);
|
|
209
|
+
--ds-red-200: oklch(95.41% 0.0299 14.252646656611997);
|
|
210
|
+
--ds-red-700: oklch(62.56% 0.2524 23.03);
|
|
211
|
+
--ds-red-900: oklch(54.99% 0.232 25.29);
|
|
212
|
+
--ds-amber-200: oklch(96.81% 0.0495 90.24227879900472);
|
|
213
|
+
--ds-amber-700: oklch(81.87% 0.1969 76.46);
|
|
214
|
+
--ds-amber-900: oklch(52.79% 0.1496 54.65);
|
|
215
|
+
--ds-green-200: oklch(96.92% 0.037 147.15);
|
|
216
|
+
--ds-green-700: oklch(64.58% 0.1746 147.27);
|
|
217
|
+
--ds-green-900: oklch(51.75% 0.1453 147.65);
|
|
218
|
+
--ds-teal-300: oklch(94.92% 0.0478 182.07);
|
|
219
|
+
--ds-teal-700: oklch(64.92% 0.1572 181.95);
|
|
220
|
+
--ds-teal-900: oklch(52.08% 0.1251 182.93);
|
|
221
|
+
--ds-purple-200: oklch(96.73% 0.0228 309.8);
|
|
222
|
+
--ds-purple-700: oklch(55.5% 0.3008 306.12);
|
|
223
|
+
--ds-purple-900: oklch(47.18% 0.2579 304);
|
|
224
|
+
--ds-pink-300: oklch(93.83% 0.0451 356.29);
|
|
225
|
+
--ds-pink-700: oklch(63.52% 0.238 1.01);
|
|
226
|
+
--ds-pink-900: oklch(53.5% 0.2058 2.84);
|
|
227
|
+
--ds-gray-100: hsla(0, 0%, 95%, 1);
|
|
228
|
+
--ds-gray-200: hsla(0, 0%, 92%, 1);
|
|
229
|
+
--ds-gray-500: hsla(0, 0%, 79%, 1);
|
|
230
|
+
--ds-gray-600: hsla(0, 0%, 66%, 1);
|
|
231
|
+
--ds-gray-700: hsla(0, 0%, 56%, 1);
|
|
232
|
+
--ds-gray-1000: hsla(0, 0%, 9%, 1);
|
|
233
|
+
--ds-background-100: hsla(0, 0%, 100%, 1);
|
|
234
|
+
--ds-trial-start: rgb(0, 112, 243);
|
|
235
|
+
--ds-trial-end: rgb(248, 28, 229);
|
|
236
|
+
--ds-turbo-start: #ff1e56;
|
|
237
|
+
--ds-turbo-end: #0096ff;
|
|
238
|
+
--elevation-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
239
|
+
--elevation-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
240
|
+
--elevation-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
241
|
+
--elevation-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
242
|
+
--elevation-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
243
|
+
--elevation-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
|
|
244
|
+
--elevation-brand: 0 0 0 1px rgb(0 51 254 / 0.15), 0 4px 20px -2px rgb(0 51 254 / 0.2);
|
|
245
|
+
--elevation-brand-lg: 0 0 0 1px rgb(0 51 254 / 0.2), 0 8px 40px -4px rgb(0 51 254 / 0.3);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
:root {
|
|
249
|
+
/* Wide-gamut bridge: default to sRGB, upgrade to Display-P3 when available. */
|
|
250
|
+
--nebutra-brand-blue: var(--nebutra-blue-500);
|
|
251
|
+
--nebutra-brand-cyan: var(--nebutra-cyan-500);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
:root {
|
|
255
|
+
/* Gradient aliases — both --brand-gradient-* (canonical, CLAUDE.md) and --gradient-brand-* (legacy) are emitted. */
|
|
256
|
+
--gradient-brand: var(--brand-gradient);
|
|
257
|
+
--gradient-brand-hover: var(--brand-gradient-reverse);
|
|
258
|
+
--gradient-brand-vertical: var(--brand-gradient-vertical);
|
|
259
|
+
--gradient-brand-reverse: var(--brand-gradient-reverse);
|
|
260
|
+
--gradient-brand-radial: var(--brand-gradient-radial);
|
|
261
|
+
--gradient-brand-glow: var(--brand-gradient-radial);
|
|
262
|
+
--gradient-section: var(--brand-gradient-vertical);
|
|
263
|
+
--gradient-glow: var(--brand-gradient-radial);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
:root {
|
|
267
|
+
/* Composite tokens — combine duration + easing for shorthand use. */
|
|
268
|
+
--transition: 150ms ease-out;
|
|
269
|
+
--focus-ring: 0 0 0 2px hsl(var(--ring) / 0.4);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@supports (color: color(display-p3 1 1 1)) {
|
|
273
|
+
:root {
|
|
274
|
+
/* Richer brand values on Display-P3 hardware; sRGB fallback above. */
|
|
275
|
+
--nebutra-blue-500: color(display-p3 0.03 0.19 0.99);
|
|
276
|
+
--nebutra-cyan-500: color(display-p3 0.07 0.94 0.79);
|
|
277
|
+
--nebutra-brand-blue: color(display-p3 0.03 0.19 0.99);
|
|
278
|
+
--nebutra-brand-cyan: color(display-p3 0.07 0.94 0.79);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
@supports (color: oklch(0 0 0)) {
|
|
283
|
+
:root {
|
|
284
|
+
/* oklch values for modern engines (2024+); sRGB hsla() fallback above. */
|
|
285
|
+
--ds-gray-100: oklch(0.953 0 0);
|
|
286
|
+
--ds-gray-200: oklch(0.929 0 0);
|
|
287
|
+
--ds-gray-500: oklch(0.81 0 0);
|
|
288
|
+
--ds-gray-600: oklch(0.69 0 0);
|
|
289
|
+
--ds-gray-700: oklch(0.598 0 0);
|
|
290
|
+
--ds-gray-1000: oklch(0.215 0 0);
|
|
291
|
+
--ds-background-100: oklch(1 0 0);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* @nebutra/design-tokens — generated from W3C DTCG tokens.
|
|
297
|
+
* DO NOT EDIT — edit tokens/*.json and re-run `pnpm build`.
|
|
298
|
+
*/
|
|
299
|
+
|
|
300
|
+
.dark {
|
|
301
|
+
--nebutra-blue-50: #f0f4ff;
|
|
302
|
+
--nebutra-blue-100: #dbe4ff;
|
|
303
|
+
--nebutra-blue-200: #bac8ff;
|
|
304
|
+
--nebutra-blue-300: #91a7ff;
|
|
305
|
+
--nebutra-blue-400: #5c7cfa;
|
|
306
|
+
--nebutra-blue-500: #0033fe; /** Base brand color — 云毓蓝 */
|
|
307
|
+
--nebutra-blue-600: #002ad4;
|
|
308
|
+
--nebutra-blue-700: #0021ab;
|
|
309
|
+
--nebutra-blue-800: #001882;
|
|
310
|
+
--nebutra-blue-900: #000f59;
|
|
311
|
+
--nebutra-blue-950: #000830;
|
|
312
|
+
--nebutra-cyan-50: #e6fff8;
|
|
313
|
+
--nebutra-cyan-100: #b3ffec;
|
|
314
|
+
--nebutra-cyan-200: #80ffe0;
|
|
315
|
+
--nebutra-cyan-300: #4dfcd4;
|
|
316
|
+
--nebutra-cyan-400: #1af7c8;
|
|
317
|
+
--nebutra-cyan-500: #0bf1c3; /** Base brand accent — 云毓青 */
|
|
318
|
+
--nebutra-cyan-600: #09c9a3;
|
|
319
|
+
--nebutra-cyan-700: #07a183;
|
|
320
|
+
--nebutra-cyan-800: #057963;
|
|
321
|
+
--nebutra-cyan-900: #035143;
|
|
322
|
+
--nebutra-cyan-950: #012923;
|
|
323
|
+
--nebutra-neutral-50: #f8fafc;
|
|
324
|
+
--nebutra-neutral-100: #f1f5f9;
|
|
325
|
+
--nebutra-neutral-200: #e2e8f0;
|
|
326
|
+
--nebutra-neutral-300: #cbd5e1;
|
|
327
|
+
--nebutra-neutral-400: #94a3b8;
|
|
328
|
+
--nebutra-neutral-500: #64748b;
|
|
329
|
+
--nebutra-neutral-600: #475569;
|
|
330
|
+
--nebutra-neutral-700: #334155;
|
|
331
|
+
--nebutra-neutral-800: #1e293b;
|
|
332
|
+
--nebutra-neutral-900: #0f172a;
|
|
333
|
+
--nebutra-neutral-950: #020617;
|
|
334
|
+
--nebutra-gray-50: #fafafa;
|
|
335
|
+
--nebutra-gray-100: #f5f5f5;
|
|
336
|
+
--nebutra-gray-200: #e5e5e5;
|
|
337
|
+
--nebutra-gray-300: #d4d4d4;
|
|
338
|
+
--nebutra-gray-400: #a3a3a3;
|
|
339
|
+
--nebutra-gray-500: #737373;
|
|
340
|
+
--nebutra-gray-600: #525252;
|
|
341
|
+
--nebutra-gray-700: #404040;
|
|
342
|
+
--nebutra-gray-800: #262626;
|
|
343
|
+
--nebutra-gray-900: #171717;
|
|
344
|
+
--nebutra-gray-950: #0a0a0a;
|
|
345
|
+
--brand-tertiary: #8b5cf6; /** Tertiary accent — data viz, infrastructure tags */
|
|
346
|
+
--status-danger: #ef4444;
|
|
347
|
+
--status-warning: #f59e0b;
|
|
348
|
+
--status-success: #22c55e; /** Tailwind green-500 — VI manual canonical success color (replaces drifted #10b981 emerald). */
|
|
349
|
+
--container-text: 896px; /** Reading-focused (hero copy, FAQ) */
|
|
350
|
+
--container-content: 1152px; /** Pricing, blog */
|
|
351
|
+
--container-wide: 1400px; /** Feature bento, navbar */
|
|
352
|
+
--radius-none: 0;
|
|
353
|
+
--radius-sm: 0.25rem;
|
|
354
|
+
--radius-md: 0.375rem;
|
|
355
|
+
--radius-lg: 0.5rem;
|
|
356
|
+
--radius-xl: 0.75rem;
|
|
357
|
+
--radius-2xl: 1rem;
|
|
358
|
+
--radius-3xl: 1.5rem;
|
|
359
|
+
--radius-full: 9999px;
|
|
360
|
+
--radius-button: 0.5rem; /** 2026 button radius — Vercel/Linear/Cursor consensus */
|
|
361
|
+
--radius-card: 0.75rem; /** 2026 card radius */
|
|
362
|
+
--radius-panel: 1rem; /** 2026 bento/hero panel radius */
|
|
363
|
+
--duration-micro: 100ms; /** Micro-feedback: hover, focus, toggle, button press */
|
|
364
|
+
--duration-flow: 200ms; /** State flow: modal open, dropdown reveal, tab switch, default page transition */
|
|
365
|
+
--duration-reveal: 300ms; /** Content unveil: slide-in, expand, accordion, drawer */
|
|
366
|
+
--duration-cinematic: 500ms; /** Hero-grade entrance: landing reveal, large delight moments */
|
|
367
|
+
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
368
|
+
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
369
|
+
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
370
|
+
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
371
|
+
--tracking-display: -0.04em; /** Hero H1 */
|
|
372
|
+
--tracking-heading: -0.03em; /** Section H2/H3 */
|
|
373
|
+
--tracking-tight: -0.015em; /** Body emphasis */
|
|
374
|
+
--leading-display: 1.05;
|
|
375
|
+
--leading-heading: 1.15;
|
|
376
|
+
--ring-hairline: inset 0 0 0 1px rgb(255 255 255 / 0.06); /** Hairline override — more visible on dark background */
|
|
377
|
+
--overlay-faint: rgb(255 255 255 / 0.06); /** Dark-mode faint overlay (6% white) — inverted from light */
|
|
378
|
+
--font-sans: "Geist", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
379
|
+
--font-cn: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "vivo Sans", sans-serif;
|
|
380
|
+
--font-display: "Geist", "Noto Sans SC", sans-serif;
|
|
381
|
+
--font-heading: "Geist", "Noto Sans SC", sans-serif;
|
|
382
|
+
--font-mono: "Geist Mono", "Fira Code", ui-monospace, Consolas, "Courier New", monospace;
|
|
383
|
+
--transition-duration: 200ms; /** Default transition duration — 200ms flow rail. */
|
|
384
|
+
--transition-easing: ease-out; /** ease-out keyword form (CSS-friendly). Equivalent to cubic-bezier(0,0,0.2,1). */
|
|
385
|
+
--brand-primary: #5c7cfa; /** Dark-mode brand primary — visible against dark surfaces (uses --blue-9 = nebutra-blue-400). */
|
|
386
|
+
--brand-accent: #1af7c8; /** Dark-mode brand accent — visible against dark surfaces (uses --cyan-9 = nebutra-cyan-400). */
|
|
387
|
+
--brand-tertiary: #8b5cf6;
|
|
388
|
+
--brand-gradient: linear-gradient(135deg, #0033fe 0%, #0bf1c3 100%); /** Brand gradient — Logo standard 135° */
|
|
389
|
+
--brand-gradient-reverse: linear-gradient(135deg, #0bf1c3 0%, #0033fe 100%);
|
|
390
|
+
--brand-gradient-vertical: linear-gradient(180deg, #0033fe 0%, #0bf1c3 100%);
|
|
391
|
+
--brand-gradient-radial: radial-gradient(circle, #0bf1c3 0%, #0033fe 100%);
|
|
392
|
+
--status-danger: #ef4444;
|
|
393
|
+
--status-warning: #f59e0b;
|
|
394
|
+
--status-success: #22c55e;
|
|
395
|
+
--status-info: #5c7cfa; /** Dark-mode info color — equals dark brand-primary. */
|
|
396
|
+
--container-text: 896px;
|
|
397
|
+
--container-content: 1152px;
|
|
398
|
+
--container-wide: 1400px;
|
|
399
|
+
--radius: 0.375rem; /** Geist-matching 6px */
|
|
400
|
+
--motion-duration-micro: 100ms;
|
|
401
|
+
--motion-duration-flow: 200ms;
|
|
402
|
+
--motion-duration-reveal: 300ms;
|
|
403
|
+
--motion-duration-cinematic: 500ms;
|
|
404
|
+
--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. */
|
|
405
|
+
--neutral-1: #020617;
|
|
406
|
+
--neutral-2: #0f172a;
|
|
407
|
+
--neutral-3: #1e293b;
|
|
408
|
+
--neutral-4: #334155;
|
|
409
|
+
--neutral-5: #475569;
|
|
410
|
+
--neutral-6: #171717;
|
|
411
|
+
--neutral-7: #262626;
|
|
412
|
+
--neutral-8: #404040;
|
|
413
|
+
--neutral-9: #94a3b8;
|
|
414
|
+
--neutral-10: #cbd5e1;
|
|
415
|
+
--neutral-11: #e2e8f0;
|
|
416
|
+
--neutral-12: #f8fafc;
|
|
417
|
+
--blue-1: #000830;
|
|
418
|
+
--blue-2: #000f59;
|
|
419
|
+
--blue-3: #001882;
|
|
420
|
+
--blue-4: #0021ab;
|
|
421
|
+
--blue-5: #002ad4;
|
|
422
|
+
--blue-6: #001882;
|
|
423
|
+
--blue-7: #0021ab;
|
|
424
|
+
--blue-8: #002ad4;
|
|
425
|
+
--blue-9: #5c7cfa;
|
|
426
|
+
--blue-10: #91a7ff;
|
|
427
|
+
--blue-11: #bac8ff;
|
|
428
|
+
--blue-12: #dbe4ff;
|
|
429
|
+
--cyan-1: #012923;
|
|
430
|
+
--cyan-2: #035143;
|
|
431
|
+
--cyan-3: #057963;
|
|
432
|
+
--cyan-4: #07a183;
|
|
433
|
+
--cyan-5: #09c9a3;
|
|
434
|
+
--cyan-6: #057963;
|
|
435
|
+
--cyan-7: #07a183;
|
|
436
|
+
--cyan-8: #09c9a3;
|
|
437
|
+
--cyan-9: #1af7c8;
|
|
438
|
+
--cyan-10: #4dfcd4;
|
|
439
|
+
--cyan-11: #80ffe0;
|
|
440
|
+
--cyan-12: #b3ffec;
|
|
441
|
+
--background: 222 47% 4%;
|
|
442
|
+
--foreground: 210 40% 98%;
|
|
443
|
+
--card: 222 47% 7%;
|
|
444
|
+
--card-foreground: 210 40% 98%;
|
|
445
|
+
--popover: 222 47% 7%;
|
|
446
|
+
--popover-foreground: 210 40% 98%;
|
|
447
|
+
--primary: 228 90% 72%;
|
|
448
|
+
--primary-foreground: 222 47% 4%;
|
|
449
|
+
--secondary: 217 33% 17%;
|
|
450
|
+
--secondary-foreground: 210 40% 98%;
|
|
451
|
+
--muted: 217 33% 17%;
|
|
452
|
+
--muted-foreground: 215 20% 65%;
|
|
453
|
+
--accent: 228 100% 12%;
|
|
454
|
+
--accent-foreground: 228 95% 67%;
|
|
455
|
+
--destructive: 0 63% 31%;
|
|
456
|
+
--destructive-foreground: 210 40% 98%;
|
|
457
|
+
--success: 142 76% 36%;
|
|
458
|
+
--success-foreground: 222 47% 4%;
|
|
459
|
+
--warning: 38 80% 45%;
|
|
460
|
+
--warning-foreground: 222 47% 4%;
|
|
461
|
+
--info: 228 95% 67%;
|
|
462
|
+
--info-foreground: 222 47% 4%;
|
|
463
|
+
--border: 0 0% 14.9%;
|
|
464
|
+
--input: 0 0% 14.9%;
|
|
465
|
+
--ring: 0 0% 88%; /** Focus ring (dark mode) — neutral light gray. Mirrors light-mode neutral foreground choice. */
|
|
466
|
+
--sidebar: 222 47% 6%;
|
|
467
|
+
--sidebar-foreground: 210 40% 96%;
|
|
468
|
+
--sidebar-primary: 228 95% 67%;
|
|
469
|
+
--sidebar-primary-foreground: 222 47% 4%;
|
|
470
|
+
--sidebar-accent: 228 100% 12%;
|
|
471
|
+
--sidebar-accent-foreground: 228 95% 67%;
|
|
472
|
+
--sidebar-border: 0 0% 14.9%;
|
|
473
|
+
--sidebar-ring: 228 95% 67%;
|
|
474
|
+
--chart-1: 228 95% 67%;
|
|
475
|
+
--chart-2: 168 96% 54%;
|
|
476
|
+
--chart-3: 228 100% 82%;
|
|
477
|
+
--chart-4: 168 100% 75%;
|
|
478
|
+
--chart-5: 228 100% 50%;
|
|
479
|
+
--ds-blue-200: oklch(25.45% 0.0811 255.8);
|
|
480
|
+
--ds-blue-700: oklch(57.61% 0.2321 258.23);
|
|
481
|
+
--ds-blue-900: oklch(71.7% 0.1648 250.79360374054167);
|
|
482
|
+
--ds-red-200: oklch(25.93% 0.0834 19.02);
|
|
483
|
+
--ds-red-700: oklch(62.56% 0.2234 23.03);
|
|
484
|
+
--ds-red-900: oklch(69.96% 0.2136 22.03);
|
|
485
|
+
--ds-amber-200: oklch(24.95% 0.0642 64.78);
|
|
486
|
+
--ds-amber-700: oklch(81.87% 0.1969 76.46);
|
|
487
|
+
--ds-amber-900: oklch(77.21% 0.1991 64.28);
|
|
488
|
+
--ds-green-200: oklch(27.12% 0.0895 150.09);
|
|
489
|
+
--ds-green-700: oklch(64.58% 0.199 147.27);
|
|
490
|
+
--ds-green-900: oklch(73.1% 0.2158 148.29);
|
|
491
|
+
--ds-teal-300: oklch(31.5% 0.0767 180.99);
|
|
492
|
+
--ds-teal-700: oklch(64.92% 0.1403 181.95);
|
|
493
|
+
--ds-teal-900: oklch(74.56% 0.1765 182.8);
|
|
494
|
+
--ds-purple-200: oklch(25.91% 0.0921 314.41);
|
|
495
|
+
--ds-purple-700: oklch(55.5% 0.2186 306.12);
|
|
496
|
+
--ds-purple-900: oklch(69.87% 0.2037 309.51);
|
|
497
|
+
--ds-pink-300: oklch(31.15% 0.1067 355.93);
|
|
498
|
+
--ds-pink-700: oklch(63.52% 0.2346 1.01);
|
|
499
|
+
--ds-pink-900: oklch(69.36% 0.2223 3.91);
|
|
500
|
+
--ds-gray-100: hsla(0, 0%, 10%, 1);
|
|
501
|
+
--ds-gray-200: hsla(0, 0%, 12%, 1);
|
|
502
|
+
--ds-gray-500: hsla(0, 0%, 27%, 1);
|
|
503
|
+
--ds-gray-600: hsla(0, 0%, 53%, 1);
|
|
504
|
+
--ds-gray-700: hsla(0, 0%, 56%, 1);
|
|
505
|
+
--ds-gray-1000: hsla(0, 0%, 93%, 1);
|
|
506
|
+
--ds-background-100: hsla(0, 0%, 4%, 1);
|
|
507
|
+
--ds-trial-start: rgb(0, 112, 243);
|
|
508
|
+
--ds-trial-end: rgb(248, 28, 229);
|
|
509
|
+
--ds-turbo-start: #ff1e56;
|
|
510
|
+
--ds-turbo-end: #0096ff;
|
|
511
|
+
--elevation-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);
|
|
512
|
+
--elevation-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4);
|
|
513
|
+
--elevation-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4);
|
|
514
|
+
--elevation-lg: 0 10px 15px -3px rgb(0 0 0 / 0.5), 0 4px 6px -4px rgb(0 0 0 / 0.5);
|
|
515
|
+
--elevation-xl: 0 20px 25px -5px rgb(0 0 0 / 0.6), 0 8px 10px -6px rgb(0 0 0 / 0.6);
|
|
516
|
+
--elevation-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.8);
|
|
517
|
+
--elevation-brand: 0 0 0 1px rgb(92 124 250 / 0.25), 0 4px 20px -2px rgb(92 124 250 / 0.3);
|
|
518
|
+
--elevation-brand-lg: 0 0 0 1px rgb(92 124 250 / 0.3), 0 8px 40px -4px rgb(92 124 250 / 0.4);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
.dark {
|
|
522
|
+
/* Gradient aliases — both --brand-gradient-* (canonical, CLAUDE.md) and --gradient-brand-* (legacy) are emitted. */
|
|
523
|
+
--gradient-brand: var(--brand-gradient);
|
|
524
|
+
--gradient-brand-hover: var(--brand-gradient-reverse);
|
|
525
|
+
--gradient-brand-vertical: var(--brand-gradient-vertical);
|
|
526
|
+
--gradient-brand-reverse: var(--brand-gradient-reverse);
|
|
527
|
+
--gradient-brand-radial: var(--brand-gradient-radial);
|
|
528
|
+
--gradient-brand-glow: var(--brand-gradient-radial);
|
|
529
|
+
--gradient-section: var(--brand-gradient-vertical);
|
|
530
|
+
--gradient-glow: var(--brand-gradient-radial);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
@supports (color: oklch(0 0 0)) {
|
|
534
|
+
.dark {
|
|
535
|
+
/* oklch values for modern engines (2024+); sRGB hsla() fallback above. */
|
|
536
|
+
--ds-gray-100: oklch(0.232 0 0);
|
|
537
|
+
--ds-gray-200: oklch(0.259 0 0);
|
|
538
|
+
--ds-gray-500: oklch(0.409 0 0);
|
|
539
|
+
--ds-gray-600: oklch(0.59 0 0);
|
|
540
|
+
--ds-gray-700: oklch(0.598 0 0);
|
|
541
|
+
--ds-gray-1000: oklch(0.94 0 0);
|
|
542
|
+
--ds-background-100: oklch(0.143 0 0);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/* ============================================
|
|
547
|
+
Tailwind CSS 4 Theme Configuration (auto-generated)
|
|
548
|
+
============================================ */
|
|
549
|
+
@theme inline {
|
|
550
|
+
/* Nebutra Brand Color Palette */
|
|
551
|
+
--color-nebutra-blue-50: var(--nebutra-blue-50);
|
|
552
|
+
--color-nebutra-blue-100: var(--nebutra-blue-100);
|
|
553
|
+
--color-nebutra-blue-200: var(--nebutra-blue-200);
|
|
554
|
+
--color-nebutra-blue-300: var(--nebutra-blue-300);
|
|
555
|
+
--color-nebutra-blue-400: var(--nebutra-blue-400);
|
|
556
|
+
--color-nebutra-blue-500: var(--nebutra-blue-500);
|
|
557
|
+
--color-nebutra-blue-600: var(--nebutra-blue-600);
|
|
558
|
+
--color-nebutra-blue-700: var(--nebutra-blue-700);
|
|
559
|
+
--color-nebutra-blue-800: var(--nebutra-blue-800);
|
|
560
|
+
--color-nebutra-blue-900: var(--nebutra-blue-900);
|
|
561
|
+
--color-nebutra-blue-950: var(--nebutra-blue-950);
|
|
562
|
+
|
|
563
|
+
--color-nebutra-cyan-50: var(--nebutra-cyan-50);
|
|
564
|
+
--color-nebutra-cyan-100: var(--nebutra-cyan-100);
|
|
565
|
+
--color-nebutra-cyan-200: var(--nebutra-cyan-200);
|
|
566
|
+
--color-nebutra-cyan-300: var(--nebutra-cyan-300);
|
|
567
|
+
--color-nebutra-cyan-400: var(--nebutra-cyan-400);
|
|
568
|
+
--color-nebutra-cyan-500: var(--nebutra-cyan-500);
|
|
569
|
+
--color-nebutra-cyan-600: var(--nebutra-cyan-600);
|
|
570
|
+
--color-nebutra-cyan-700: var(--nebutra-cyan-700);
|
|
571
|
+
--color-nebutra-cyan-800: var(--nebutra-cyan-800);
|
|
572
|
+
--color-nebutra-cyan-900: var(--nebutra-cyan-900);
|
|
573
|
+
--color-nebutra-cyan-950: var(--nebutra-cyan-950);
|
|
574
|
+
|
|
575
|
+
--color-nebutra-neutral-50: var(--nebutra-neutral-50);
|
|
576
|
+
--color-nebutra-neutral-100: var(--nebutra-neutral-100);
|
|
577
|
+
--color-nebutra-neutral-200: var(--nebutra-neutral-200);
|
|
578
|
+
--color-nebutra-neutral-300: var(--nebutra-neutral-300);
|
|
579
|
+
--color-nebutra-neutral-400: var(--nebutra-neutral-400);
|
|
580
|
+
--color-nebutra-neutral-500: var(--nebutra-neutral-500);
|
|
581
|
+
--color-nebutra-neutral-600: var(--nebutra-neutral-600);
|
|
582
|
+
--color-nebutra-neutral-700: var(--nebutra-neutral-700);
|
|
583
|
+
--color-nebutra-neutral-800: var(--nebutra-neutral-800);
|
|
584
|
+
--color-nebutra-neutral-900: var(--nebutra-neutral-900);
|
|
585
|
+
--color-nebutra-neutral-950: var(--nebutra-neutral-950);
|
|
586
|
+
|
|
587
|
+
/* Semantic Theme Colors */
|
|
588
|
+
--color-background: hsl(var(--background));
|
|
589
|
+
--color-foreground: hsl(var(--foreground));
|
|
590
|
+
--color-card: hsl(var(--card));
|
|
591
|
+
--color-card-foreground: hsl(var(--card-foreground));
|
|
592
|
+
--color-popover: hsl(var(--popover));
|
|
593
|
+
--color-popover-foreground: hsl(var(--popover-foreground));
|
|
594
|
+
--color-primary: hsl(var(--primary));
|
|
595
|
+
--color-primary-foreground: hsl(var(--primary-foreground));
|
|
596
|
+
--color-secondary: hsl(var(--secondary));
|
|
597
|
+
--color-secondary-foreground: hsl(var(--secondary-foreground));
|
|
598
|
+
--color-muted: hsl(var(--muted));
|
|
599
|
+
--color-muted-foreground: hsl(var(--muted-foreground));
|
|
600
|
+
--color-accent: hsl(var(--accent));
|
|
601
|
+
--color-accent-foreground: hsl(var(--accent-foreground));
|
|
602
|
+
--color-destructive: hsl(var(--destructive));
|
|
603
|
+
--color-destructive-foreground: hsl(var(--destructive-foreground));
|
|
604
|
+
--color-success: hsl(var(--success));
|
|
605
|
+
--color-success-foreground: hsl(var(--success-foreground));
|
|
606
|
+
--color-warning: hsl(var(--warning));
|
|
607
|
+
--color-warning-foreground: hsl(var(--warning-foreground));
|
|
608
|
+
--color-info: hsl(var(--info));
|
|
609
|
+
--color-info-foreground: hsl(var(--info-foreground));
|
|
610
|
+
--color-border: hsl(var(--border));
|
|
611
|
+
--color-input: hsl(var(--input));
|
|
612
|
+
--color-ring: hsl(var(--ring));
|
|
613
|
+
|
|
614
|
+
/* Sidebar */
|
|
615
|
+
--color-sidebar: hsl(var(--sidebar));
|
|
616
|
+
--color-sidebar-foreground: hsl(var(--sidebar-foreground));
|
|
617
|
+
--color-sidebar-primary: hsl(var(--sidebar-primary));
|
|
618
|
+
--color-sidebar-primary-foreground: hsl(var(--sidebar-primary-foreground));
|
|
619
|
+
--color-sidebar-accent: hsl(var(--sidebar-accent));
|
|
620
|
+
--color-sidebar-accent-foreground: hsl(var(--sidebar-accent-foreground));
|
|
621
|
+
--color-sidebar-border: hsl(var(--sidebar-border));
|
|
622
|
+
--color-sidebar-ring: hsl(var(--sidebar-ring));
|
|
623
|
+
|
|
624
|
+
/* Brand aliases */
|
|
625
|
+
--color-brand-primary: var(--brand-primary);
|
|
626
|
+
--color-brand-accent: var(--brand-accent);
|
|
627
|
+
--color-brand-tertiary: var(--brand-tertiary);
|
|
628
|
+
|
|
629
|
+
/* Chart colors */
|
|
630
|
+
--color-chart-1: hsl(var(--chart-1));
|
|
631
|
+
--color-chart-2: hsl(var(--chart-2));
|
|
632
|
+
--color-chart-3: hsl(var(--chart-3));
|
|
633
|
+
--color-chart-4: hsl(var(--chart-4));
|
|
634
|
+
--color-chart-5: hsl(var(--chart-5));
|
|
635
|
+
|
|
636
|
+
/* 12-Step Functional Scales */
|
|
637
|
+
--color-neutral-1: var(--neutral-1);
|
|
638
|
+
--color-neutral-2: var(--neutral-2);
|
|
639
|
+
--color-neutral-3: var(--neutral-3);
|
|
640
|
+
--color-neutral-4: var(--neutral-4);
|
|
641
|
+
--color-neutral-5: var(--neutral-5);
|
|
642
|
+
--color-neutral-6: var(--neutral-6);
|
|
643
|
+
--color-neutral-7: var(--neutral-7);
|
|
644
|
+
--color-neutral-8: var(--neutral-8);
|
|
645
|
+
--color-neutral-9: var(--neutral-9);
|
|
646
|
+
--color-neutral-10: var(--neutral-10);
|
|
647
|
+
--color-neutral-11: var(--neutral-11);
|
|
648
|
+
--color-neutral-12: var(--neutral-12);
|
|
649
|
+
|
|
650
|
+
--color-blue-1: var(--blue-1);
|
|
651
|
+
--color-blue-2: var(--blue-2);
|
|
652
|
+
--color-blue-3: var(--blue-3);
|
|
653
|
+
--color-blue-4: var(--blue-4);
|
|
654
|
+
--color-blue-5: var(--blue-5);
|
|
655
|
+
--color-blue-6: var(--blue-6);
|
|
656
|
+
--color-blue-7: var(--blue-7);
|
|
657
|
+
--color-blue-8: var(--blue-8);
|
|
658
|
+
--color-blue-9: var(--blue-9);
|
|
659
|
+
--color-blue-10: var(--blue-10);
|
|
660
|
+
--color-blue-11: var(--blue-11);
|
|
661
|
+
--color-blue-12: var(--blue-12);
|
|
662
|
+
|
|
663
|
+
--color-cyan-1: var(--cyan-1);
|
|
664
|
+
--color-cyan-2: var(--cyan-2);
|
|
665
|
+
--color-cyan-3: var(--cyan-3);
|
|
666
|
+
--color-cyan-4: var(--cyan-4);
|
|
667
|
+
--color-cyan-5: var(--cyan-5);
|
|
668
|
+
--color-cyan-6: var(--cyan-6);
|
|
669
|
+
--color-cyan-7: var(--cyan-7);
|
|
670
|
+
--color-cyan-8: var(--cyan-8);
|
|
671
|
+
--color-cyan-9: var(--cyan-9);
|
|
672
|
+
--color-cyan-10: var(--cyan-10);
|
|
673
|
+
--color-cyan-11: var(--cyan-11);
|
|
674
|
+
--color-cyan-12: var(--cyan-12);
|
|
675
|
+
|
|
676
|
+
/* Geist DS color scale */
|
|
677
|
+
--color-blue-700: var(--ds-blue-700);
|
|
678
|
+
--color-blue-900: var(--ds-blue-900);
|
|
679
|
+
--color-red-200: var(--ds-red-200);
|
|
680
|
+
--color-red-700: var(--ds-red-700);
|
|
681
|
+
--color-red-900: var(--ds-red-900);
|
|
682
|
+
--color-amber-200: var(--ds-amber-200);
|
|
683
|
+
--color-amber-700: var(--ds-amber-700);
|
|
684
|
+
--color-amber-900: var(--ds-amber-900);
|
|
685
|
+
--color-green-200: var(--ds-green-200);
|
|
686
|
+
--color-green-700: var(--ds-green-700);
|
|
687
|
+
--color-green-900: var(--ds-green-900);
|
|
688
|
+
--color-teal-300: var(--ds-teal-300);
|
|
689
|
+
--color-teal-700: var(--ds-teal-700);
|
|
690
|
+
--color-teal-900: var(--ds-teal-900);
|
|
691
|
+
--color-purple-200: var(--ds-purple-200);
|
|
692
|
+
--color-purple-700: var(--ds-purple-700);
|
|
693
|
+
--color-purple-900: var(--ds-purple-900);
|
|
694
|
+
--color-pink-300: var(--ds-pink-300);
|
|
695
|
+
--color-pink-700: var(--ds-pink-700);
|
|
696
|
+
--color-pink-900: var(--ds-pink-900);
|
|
697
|
+
--color-gray-100: var(--ds-gray-100);
|
|
698
|
+
--color-gray-200: var(--ds-gray-200);
|
|
699
|
+
--color-gray-700: var(--ds-gray-700);
|
|
700
|
+
--color-gray-1000: var(--ds-gray-1000);
|
|
701
|
+
--color-trial-start: var(--ds-trial-start);
|
|
702
|
+
--color-trial-end: var(--ds-trial-end);
|
|
703
|
+
--color-turbo-start: var(--ds-turbo-start);
|
|
704
|
+
--color-turbo-end: var(--ds-turbo-end);
|
|
705
|
+
--color-geist-gray-100: var(--ds-gray-100);
|
|
706
|
+
--color-geist-gray-200: var(--ds-gray-200);
|
|
707
|
+
--color-geist-gray-500: var(--ds-gray-500);
|
|
708
|
+
--color-geist-gray-600: var(--ds-gray-600);
|
|
709
|
+
--color-geist-gray-700: var(--ds-gray-700);
|
|
710
|
+
--color-geist-gray-1000: var(--ds-gray-1000);
|
|
711
|
+
--color-geist-background-100: var(--ds-background-100);
|
|
712
|
+
|
|
713
|
+
/* Border Radius */
|
|
714
|
+
--radius-none: 0;
|
|
715
|
+
--radius-sm: 0.25rem;
|
|
716
|
+
--radius-md: 0.375rem;
|
|
717
|
+
--radius-lg: 0.5rem;
|
|
718
|
+
--radius-xl: 0.75rem;
|
|
719
|
+
--radius-2xl: 1rem;
|
|
720
|
+
--radius-3xl: 1.5rem;
|
|
721
|
+
--radius-full: 9999px;
|
|
722
|
+
|
|
723
|
+
/* Shadows */
|
|
724
|
+
--shadow-xs: var(--elevation-xs);
|
|
725
|
+
--shadow-sm: var(--elevation-sm);
|
|
726
|
+
--shadow-md: var(--elevation-md);
|
|
727
|
+
--shadow-lg: var(--elevation-lg);
|
|
728
|
+
--shadow-xl: var(--elevation-xl);
|
|
729
|
+
--shadow-2xl: var(--elevation-2xl);
|
|
730
|
+
--shadow-brand: var(--elevation-brand);
|
|
731
|
+
--shadow-brand-lg: var(--elevation-brand-lg);
|
|
732
|
+
|
|
733
|
+
/* Motion — Easing curves */
|
|
734
|
+
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
735
|
+
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
736
|
+
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
737
|
+
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
738
|
+
|
|
739
|
+
/* Motion — Durations (four-rail; see core.json:duration). Names denote intent, not relative speed. */
|
|
740
|
+
--duration-micro: 100ms;
|
|
741
|
+
--duration-flow: 200ms;
|
|
742
|
+
--duration-reveal: 300ms;
|
|
743
|
+
--duration-cinematic: 500ms;
|
|
744
|
+
|
|
745
|
+
/* Font family — Geist primary stack with CJK fallbacks */
|
|
746
|
+
--font-sans: "Geist", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
747
|
+
--font-cn: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "vivo Sans", sans-serif;
|
|
748
|
+
--font-display: "Geist", "Noto Sans SC", sans-serif;
|
|
749
|
+
--font-heading: "Geist", "Noto Sans SC", sans-serif;
|
|
750
|
+
--font-mono: "Geist Mono", "Fira Code", ui-monospace, Consolas, "Courier New", monospace;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/* ============================================
|
|
754
|
+
Base Styles — non-token CSS that complements the design-tokens output.
|
|
755
|
+
This file is concatenated into styles.generated.css after the @theme block.
|
|
756
|
+
============================================ */
|
|
757
|
+
|
|
758
|
+
*,
|
|
759
|
+
*::before,
|
|
760
|
+
*::after {
|
|
761
|
+
/* Token-aware default border — resolves via cascade:
|
|
762
|
+
:root → light (hsl 240 5.9% 90% ≈ #e4e4e7)
|
|
763
|
+
.dark → dark (hsl 0 0% 14.9% ≈ #262626)
|
|
764
|
+
Previously hardcoded to the light value, which leaked a near-white border
|
|
765
|
+
into every element in dark mode regardless of component. See ADR 2026-05-11. */
|
|
766
|
+
border-color: hsl(var(--border));
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
body {
|
|
770
|
+
background-color: hsl(var(--background));
|
|
771
|
+
color: hsl(var(--foreground));
|
|
772
|
+
font-family: var(--font-sans);
|
|
773
|
+
font-feature-settings:
|
|
774
|
+
"rlig" 1,
|
|
775
|
+
"calt" 1;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
html {
|
|
779
|
+
scroll-behavior: smooth;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
:focus-visible {
|
|
783
|
+
outline: 2px solid hsl(var(--ring) / 0.5);
|
|
784
|
+
outline-offset: 2px;
|
|
785
|
+
border-radius: inherit;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
::selection {
|
|
789
|
+
background-color: hsl(var(--primary) / 0.2);
|
|
790
|
+
color: hsl(var(--primary));
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/* ============================================
|
|
794
|
+
Animation Utilities
|
|
795
|
+
============================================ */
|
|
796
|
+
|
|
797
|
+
@keyframes spinner {
|
|
798
|
+
to {
|
|
799
|
+
transform: rotate(360deg);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
@keyframes accordion-down {
|
|
804
|
+
from {
|
|
805
|
+
height: 0;
|
|
806
|
+
}
|
|
807
|
+
to {
|
|
808
|
+
height: var(--radix-accordion-content-height);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
@keyframes accordion-up {
|
|
813
|
+
from {
|
|
814
|
+
height: var(--radix-accordion-content-height);
|
|
815
|
+
}
|
|
816
|
+
to {
|
|
817
|
+
height: 0;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
@keyframes fade-in {
|
|
822
|
+
from {
|
|
823
|
+
opacity: 0;
|
|
824
|
+
}
|
|
825
|
+
to {
|
|
826
|
+
opacity: 1;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
@keyframes fade-out {
|
|
831
|
+
from {
|
|
832
|
+
opacity: 1;
|
|
833
|
+
}
|
|
834
|
+
to {
|
|
835
|
+
opacity: 0;
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
@keyframes slide-in-from-top {
|
|
840
|
+
from {
|
|
841
|
+
transform: translateY(-100%);
|
|
842
|
+
}
|
|
843
|
+
to {
|
|
844
|
+
transform: translateY(0);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
@keyframes slide-in-from-bottom {
|
|
849
|
+
from {
|
|
850
|
+
transform: translateY(100%);
|
|
851
|
+
}
|
|
852
|
+
to {
|
|
853
|
+
transform: translateY(0);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
@keyframes slide-in-from-left {
|
|
858
|
+
from {
|
|
859
|
+
transform: translateX(-100%);
|
|
860
|
+
}
|
|
861
|
+
to {
|
|
862
|
+
transform: translateX(0);
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
@keyframes slide-in-from-right {
|
|
867
|
+
from {
|
|
868
|
+
transform: translateX(100%);
|
|
869
|
+
}
|
|
870
|
+
to {
|
|
871
|
+
transform: translateX(0);
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
@keyframes spin {
|
|
876
|
+
from {
|
|
877
|
+
transform: rotate(0deg);
|
|
878
|
+
}
|
|
879
|
+
to {
|
|
880
|
+
transform: rotate(360deg);
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
@keyframes pulse {
|
|
885
|
+
0%,
|
|
886
|
+
100% {
|
|
887
|
+
opacity: 1;
|
|
888
|
+
}
|
|
889
|
+
50% {
|
|
890
|
+
opacity: 0.5;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
@keyframes bounce {
|
|
895
|
+
0%,
|
|
896
|
+
100% {
|
|
897
|
+
transform: translateY(-25%);
|
|
898
|
+
animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
|
|
899
|
+
}
|
|
900
|
+
50% {
|
|
901
|
+
transform: translateY(0);
|
|
902
|
+
animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/* ============================================
|
|
907
|
+
Named Typography Utility Classes
|
|
908
|
+
Geist-style: size encoded in class name,
|
|
909
|
+
state variants as suffixes (-strong/-mono/-tabular)
|
|
910
|
+
============================================ */
|
|
911
|
+
|
|
912
|
+
@utility text-heading-72 {
|
|
913
|
+
font-family: var(--font-display);
|
|
914
|
+
font-size: 4.5rem;
|
|
915
|
+
line-height: 1.1;
|
|
916
|
+
letter-spacing: -0.03em;
|
|
917
|
+
font-weight: 700;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
@utility text-heading-64 {
|
|
921
|
+
font-family: var(--font-display);
|
|
922
|
+
font-size: 4rem;
|
|
923
|
+
line-height: 1.1;
|
|
924
|
+
letter-spacing: -0.03em;
|
|
925
|
+
font-weight: 700;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
@utility text-heading-56 {
|
|
929
|
+
font-family: var(--font-display);
|
|
930
|
+
font-size: 3.5rem;
|
|
931
|
+
line-height: 1.1;
|
|
932
|
+
letter-spacing: -0.025em;
|
|
933
|
+
font-weight: 700;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
@utility text-heading-48 {
|
|
937
|
+
font-family: var(--font-display);
|
|
938
|
+
font-size: 3rem;
|
|
939
|
+
line-height: 1.1;
|
|
940
|
+
letter-spacing: -0.02em;
|
|
941
|
+
font-weight: 700;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
@utility text-heading-40 {
|
|
945
|
+
font-family: var(--font-display);
|
|
946
|
+
font-size: 2.5rem;
|
|
947
|
+
line-height: 1.15;
|
|
948
|
+
letter-spacing: -0.02em;
|
|
949
|
+
font-weight: 700;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
@utility text-heading-32 {
|
|
953
|
+
font-family: var(--font-display);
|
|
954
|
+
font-size: 2rem;
|
|
955
|
+
line-height: 1.2;
|
|
956
|
+
letter-spacing: -0.015em;
|
|
957
|
+
font-weight: 600;
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
@utility text-heading-24 {
|
|
961
|
+
font-family: var(--font-display);
|
|
962
|
+
font-size: 1.5rem;
|
|
963
|
+
line-height: 1.3;
|
|
964
|
+
letter-spacing: -0.01em;
|
|
965
|
+
font-weight: 600;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
@utility text-heading-20 {
|
|
969
|
+
font-family: var(--font-display);
|
|
970
|
+
font-size: 1.25rem;
|
|
971
|
+
line-height: 1.3;
|
|
972
|
+
letter-spacing: -0.01em;
|
|
973
|
+
font-weight: 600;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
@utility text-heading-16 {
|
|
977
|
+
font-family: var(--font-display);
|
|
978
|
+
font-size: 1rem;
|
|
979
|
+
line-height: 1.4;
|
|
980
|
+
letter-spacing: -0.005em;
|
|
981
|
+
font-weight: 600;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
@utility text-heading-14 {
|
|
985
|
+
font-family: var(--font-display);
|
|
986
|
+
font-size: 0.875rem;
|
|
987
|
+
line-height: 1.4;
|
|
988
|
+
letter-spacing: 0;
|
|
989
|
+
font-weight: 600;
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
@utility text-button-16 {
|
|
993
|
+
font-family: var(--font-sans);
|
|
994
|
+
font-size: 1rem;
|
|
995
|
+
line-height: 1;
|
|
996
|
+
letter-spacing: 0;
|
|
997
|
+
font-weight: 500;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
@utility text-button-14 {
|
|
1001
|
+
font-family: var(--font-sans);
|
|
1002
|
+
font-size: 0.875rem;
|
|
1003
|
+
line-height: 1;
|
|
1004
|
+
letter-spacing: 0;
|
|
1005
|
+
font-weight: 500;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
@utility text-button-12 {
|
|
1009
|
+
font-family: var(--font-sans);
|
|
1010
|
+
font-size: 0.75rem;
|
|
1011
|
+
line-height: 1;
|
|
1012
|
+
letter-spacing: 0.01em;
|
|
1013
|
+
font-weight: 500;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
@utility text-label-20 {
|
|
1017
|
+
font-family: var(--font-sans);
|
|
1018
|
+
font-size: 1.25rem;
|
|
1019
|
+
line-height: 1.25;
|
|
1020
|
+
letter-spacing: 0;
|
|
1021
|
+
font-weight: 500;
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
@utility text-label-18 {
|
|
1025
|
+
font-family: var(--font-sans);
|
|
1026
|
+
font-size: 1.125rem;
|
|
1027
|
+
line-height: 1.25;
|
|
1028
|
+
letter-spacing: 0;
|
|
1029
|
+
font-weight: 500;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
@utility text-label-16 {
|
|
1033
|
+
font-family: var(--font-sans);
|
|
1034
|
+
font-size: 1rem;
|
|
1035
|
+
line-height: 1.25;
|
|
1036
|
+
letter-spacing: 0;
|
|
1037
|
+
font-weight: 500;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
@utility text-label-14 {
|
|
1041
|
+
font-family: var(--font-sans);
|
|
1042
|
+
font-size: 0.875rem;
|
|
1043
|
+
line-height: 1.25;
|
|
1044
|
+
letter-spacing: 0;
|
|
1045
|
+
font-weight: 500;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
@utility text-label-13 {
|
|
1049
|
+
font-family: var(--font-sans);
|
|
1050
|
+
font-size: 0.8125rem;
|
|
1051
|
+
line-height: 1.25;
|
|
1052
|
+
letter-spacing: 0;
|
|
1053
|
+
font-weight: 500;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
@utility text-label-12 {
|
|
1057
|
+
font-family: var(--font-sans);
|
|
1058
|
+
font-size: 0.75rem;
|
|
1059
|
+
line-height: 1.25;
|
|
1060
|
+
letter-spacing: 0.01em;
|
|
1061
|
+
font-weight: 500;
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
@utility text-label-20-strong {
|
|
1065
|
+
font-family: var(--font-sans);
|
|
1066
|
+
font-size: 1.25rem;
|
|
1067
|
+
line-height: 1.25;
|
|
1068
|
+
letter-spacing: 0;
|
|
1069
|
+
font-weight: 600;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
@utility text-label-18-strong {
|
|
1073
|
+
font-family: var(--font-sans);
|
|
1074
|
+
font-size: 1.125rem;
|
|
1075
|
+
line-height: 1.25;
|
|
1076
|
+
letter-spacing: 0;
|
|
1077
|
+
font-weight: 600;
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
@utility text-label-16-strong {
|
|
1081
|
+
font-family: var(--font-sans);
|
|
1082
|
+
font-size: 1rem;
|
|
1083
|
+
line-height: 1.25;
|
|
1084
|
+
letter-spacing: 0;
|
|
1085
|
+
font-weight: 600;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
@utility text-label-14-strong {
|
|
1089
|
+
font-family: var(--font-sans);
|
|
1090
|
+
font-size: 0.875rem;
|
|
1091
|
+
line-height: 1.25;
|
|
1092
|
+
letter-spacing: 0;
|
|
1093
|
+
font-weight: 600;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
@utility text-label-13-strong {
|
|
1097
|
+
font-family: var(--font-sans);
|
|
1098
|
+
font-size: 0.8125rem;
|
|
1099
|
+
line-height: 1.25;
|
|
1100
|
+
letter-spacing: 0;
|
|
1101
|
+
font-weight: 600;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
@utility text-label-12-strong {
|
|
1105
|
+
font-family: var(--font-sans);
|
|
1106
|
+
font-size: 0.75rem;
|
|
1107
|
+
line-height: 1.25;
|
|
1108
|
+
letter-spacing: 0.01em;
|
|
1109
|
+
font-weight: 600;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
@utility text-label-20-mono {
|
|
1113
|
+
font-family: var(--font-mono);
|
|
1114
|
+
font-size: 1.25rem;
|
|
1115
|
+
line-height: 1.25;
|
|
1116
|
+
letter-spacing: 0;
|
|
1117
|
+
font-weight: 500;
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
@utility text-label-18-mono {
|
|
1121
|
+
font-family: var(--font-mono);
|
|
1122
|
+
font-size: 1.125rem;
|
|
1123
|
+
line-height: 1.25;
|
|
1124
|
+
letter-spacing: 0;
|
|
1125
|
+
font-weight: 500;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
@utility text-label-16-mono {
|
|
1129
|
+
font-family: var(--font-mono);
|
|
1130
|
+
font-size: 1rem;
|
|
1131
|
+
line-height: 1.25;
|
|
1132
|
+
letter-spacing: 0;
|
|
1133
|
+
font-weight: 500;
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
@utility text-label-14-mono {
|
|
1137
|
+
font-family: var(--font-mono);
|
|
1138
|
+
font-size: 0.875rem;
|
|
1139
|
+
line-height: 1.25;
|
|
1140
|
+
letter-spacing: 0;
|
|
1141
|
+
font-weight: 500;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
@utility text-label-13-mono {
|
|
1145
|
+
font-family: var(--font-mono);
|
|
1146
|
+
font-size: 0.8125rem;
|
|
1147
|
+
line-height: 1.25;
|
|
1148
|
+
letter-spacing: 0;
|
|
1149
|
+
font-weight: 500;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
@utility text-label-12-mono {
|
|
1153
|
+
font-family: var(--font-mono);
|
|
1154
|
+
font-size: 0.75rem;
|
|
1155
|
+
line-height: 1.25;
|
|
1156
|
+
letter-spacing: 0.01em;
|
|
1157
|
+
font-weight: 500;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
@utility text-label-20-tabular {
|
|
1161
|
+
font-family: var(--font-sans);
|
|
1162
|
+
font-size: 1.25rem;
|
|
1163
|
+
line-height: 1.25;
|
|
1164
|
+
letter-spacing: 0;
|
|
1165
|
+
font-weight: 500;
|
|
1166
|
+
font-variant-numeric: tabular-nums;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
@utility text-label-18-tabular {
|
|
1170
|
+
font-family: var(--font-sans);
|
|
1171
|
+
font-size: 1.125rem;
|
|
1172
|
+
line-height: 1.25;
|
|
1173
|
+
letter-spacing: 0;
|
|
1174
|
+
font-weight: 500;
|
|
1175
|
+
font-variant-numeric: tabular-nums;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
@utility text-label-16-tabular {
|
|
1179
|
+
font-family: var(--font-sans);
|
|
1180
|
+
font-size: 1rem;
|
|
1181
|
+
line-height: 1.25;
|
|
1182
|
+
letter-spacing: 0;
|
|
1183
|
+
font-weight: 500;
|
|
1184
|
+
font-variant-numeric: tabular-nums;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
@utility text-label-14-tabular {
|
|
1188
|
+
font-family: var(--font-sans);
|
|
1189
|
+
font-size: 0.875rem;
|
|
1190
|
+
line-height: 1.25;
|
|
1191
|
+
letter-spacing: 0;
|
|
1192
|
+
font-weight: 500;
|
|
1193
|
+
font-variant-numeric: tabular-nums;
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
@utility text-label-13-tabular {
|
|
1197
|
+
font-family: var(--font-sans);
|
|
1198
|
+
font-size: 0.8125rem;
|
|
1199
|
+
line-height: 1.25;
|
|
1200
|
+
letter-spacing: 0;
|
|
1201
|
+
font-weight: 500;
|
|
1202
|
+
font-variant-numeric: tabular-nums;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
@utility text-label-12-tabular {
|
|
1206
|
+
font-family: var(--font-sans);
|
|
1207
|
+
font-size: 0.75rem;
|
|
1208
|
+
line-height: 1.25;
|
|
1209
|
+
letter-spacing: 0.01em;
|
|
1210
|
+
font-weight: 500;
|
|
1211
|
+
font-variant-numeric: tabular-nums;
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
@utility text-copy-24 {
|
|
1215
|
+
font-family: var(--font-sans);
|
|
1216
|
+
font-size: 1.5rem;
|
|
1217
|
+
line-height: 1.6;
|
|
1218
|
+
letter-spacing: -0.005em;
|
|
1219
|
+
font-weight: 400;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
@utility text-copy-20 {
|
|
1223
|
+
font-family: var(--font-sans);
|
|
1224
|
+
font-size: 1.25rem;
|
|
1225
|
+
line-height: 1.6;
|
|
1226
|
+
letter-spacing: -0.005em;
|
|
1227
|
+
font-weight: 400;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
@utility text-copy-18 {
|
|
1231
|
+
font-family: var(--font-sans);
|
|
1232
|
+
font-size: 1.125rem;
|
|
1233
|
+
line-height: 1.6;
|
|
1234
|
+
letter-spacing: 0;
|
|
1235
|
+
font-weight: 400;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
@utility text-copy-16 {
|
|
1239
|
+
font-family: var(--font-sans);
|
|
1240
|
+
font-size: 1rem;
|
|
1241
|
+
line-height: 1.6;
|
|
1242
|
+
letter-spacing: 0;
|
|
1243
|
+
font-weight: 400;
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
@utility text-copy-14 {
|
|
1247
|
+
font-family: var(--font-sans);
|
|
1248
|
+
font-size: 0.875rem;
|
|
1249
|
+
line-height: 1.5;
|
|
1250
|
+
letter-spacing: 0;
|
|
1251
|
+
font-weight: 400;
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
@utility text-copy-13 {
|
|
1255
|
+
font-family: var(--font-sans);
|
|
1256
|
+
font-size: 0.8125rem;
|
|
1257
|
+
line-height: 1.5;
|
|
1258
|
+
letter-spacing: 0;
|
|
1259
|
+
font-weight: 400;
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
@utility text-copy-24-strong {
|
|
1263
|
+
font-family: var(--font-sans);
|
|
1264
|
+
font-size: 1.5rem;
|
|
1265
|
+
line-height: 1.6;
|
|
1266
|
+
letter-spacing: -0.005em;
|
|
1267
|
+
font-weight: 600;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
@utility text-copy-20-strong {
|
|
1271
|
+
font-family: var(--font-sans);
|
|
1272
|
+
font-size: 1.25rem;
|
|
1273
|
+
line-height: 1.6;
|
|
1274
|
+
letter-spacing: -0.005em;
|
|
1275
|
+
font-weight: 600;
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
@utility text-copy-18-strong {
|
|
1279
|
+
font-family: var(--font-sans);
|
|
1280
|
+
font-size: 1.125rem;
|
|
1281
|
+
line-height: 1.6;
|
|
1282
|
+
letter-spacing: 0;
|
|
1283
|
+
font-weight: 600;
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
@utility text-copy-16-strong {
|
|
1287
|
+
font-family: var(--font-sans);
|
|
1288
|
+
font-size: 1rem;
|
|
1289
|
+
line-height: 1.6;
|
|
1290
|
+
letter-spacing: 0;
|
|
1291
|
+
font-weight: 600;
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
@utility text-copy-14-strong {
|
|
1295
|
+
font-family: var(--font-sans);
|
|
1296
|
+
font-size: 0.875rem;
|
|
1297
|
+
line-height: 1.5;
|
|
1298
|
+
letter-spacing: 0;
|
|
1299
|
+
font-weight: 600;
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
@utility text-copy-13-strong {
|
|
1303
|
+
font-family: var(--font-sans);
|
|
1304
|
+
font-size: 0.8125rem;
|
|
1305
|
+
line-height: 1.5;
|
|
1306
|
+
letter-spacing: 0;
|
|
1307
|
+
font-weight: 600;
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
@utility text-copy-24-mono {
|
|
1311
|
+
font-family: var(--font-mono);
|
|
1312
|
+
font-size: 1.5rem;
|
|
1313
|
+
line-height: 1.6;
|
|
1314
|
+
letter-spacing: -0.005em;
|
|
1315
|
+
font-weight: 400;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
@utility text-copy-20-mono {
|
|
1319
|
+
font-family: var(--font-mono);
|
|
1320
|
+
font-size: 1.25rem;
|
|
1321
|
+
line-height: 1.6;
|
|
1322
|
+
letter-spacing: -0.005em;
|
|
1323
|
+
font-weight: 400;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
@utility text-copy-18-mono {
|
|
1327
|
+
font-family: var(--font-mono);
|
|
1328
|
+
font-size: 1.125rem;
|
|
1329
|
+
line-height: 1.6;
|
|
1330
|
+
letter-spacing: 0;
|
|
1331
|
+
font-weight: 400;
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
@utility text-copy-16-mono {
|
|
1335
|
+
font-family: var(--font-mono);
|
|
1336
|
+
font-size: 1rem;
|
|
1337
|
+
line-height: 1.6;
|
|
1338
|
+
letter-spacing: 0;
|
|
1339
|
+
font-weight: 400;
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
@utility text-copy-14-mono {
|
|
1343
|
+
font-family: var(--font-mono);
|
|
1344
|
+
font-size: 0.875rem;
|
|
1345
|
+
line-height: 1.5;
|
|
1346
|
+
letter-spacing: 0;
|
|
1347
|
+
font-weight: 400;
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
@utility text-copy-13-mono {
|
|
1351
|
+
font-family: var(--font-mono);
|
|
1352
|
+
font-size: 0.8125rem;
|
|
1353
|
+
line-height: 1.5;
|
|
1354
|
+
letter-spacing: 0;
|
|
1355
|
+
font-weight: 400;
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
@utility font-cn {
|
|
1359
|
+
font-family: var(--font-cn);
|
|
1360
|
+
line-height: 1.75;
|
|
1361
|
+
word-break: break-all;
|
|
1362
|
+
overflow-wrap: break-word;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
/* ─── CJK Auto-Activation via :lang() ───────────────────────
|
|
1366
|
+
When <html lang="zh|ja|ko"> is set by app layouts, body
|
|
1367
|
+
automatically switches to the CJK font stack.
|
|
1368
|
+
─────────────────────────────────────────────────────────── */
|
|
1369
|
+
:is(html:lang(zh), html:lang(ja), html:lang(ko)) body {
|
|
1370
|
+
font-family: var(--font-cn);
|
|
1371
|
+
line-height: 1.75;
|
|
1372
|
+
word-break: break-all;
|
|
1373
|
+
overflow-wrap: break-word;
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
:is(html:lang(zh), html:lang(ja), html:lang(ko)) :is(code, kbd, pre, samp) {
|
|
1377
|
+
font-family: var(--font-mono);
|
|
1378
|
+
word-break: normal;
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
/* ─── Reduced Motion ─────────────────────────────────────── */
|
|
1382
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1383
|
+
*,
|
|
1384
|
+
*::before,
|
|
1385
|
+
*::after {
|
|
1386
|
+
animation-duration: 0.01ms;
|
|
1387
|
+
animation-iteration-count: 1;
|
|
1388
|
+
transition-duration: 0.01ms;
|
|
1389
|
+
scroll-behavior: auto;
|
|
1390
|
+
}
|
|
1391
|
+
}
|