brustjs 0.1.27-alpha → 0.1.29-alpha

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.
@@ -1,1713 +1,9 @@
1
- /* =====================================================================
2
- PokéDex app.css — AssetsArt Design System (tokens + components) +
3
- a PokéDex (.dex-*) layer that replaces the prototype's inline styles.
4
- ---------------------------------------------------------------------
5
- NOTE: light + dark. :root holds the LIGHT defaults; [data-mode="dark"]
6
- remaps them. The mode is set on <html data-mode={mode}> via BrustPage's
7
- data-* support, driven by the `mode` cookie + the native ThemeToggle.
8
- Remote @import of Google Fonts is dropped (the css pipeline runs through
9
- @tailwindcss/node); we rely on the system-font fallbacks in the stacks.
10
- ===================================================================== */
11
-
12
- /* =====================================================================
13
- ASSETSART DESIGN SYSTEM — TOKENS
14
- ---------------------------------------------------------------------
15
- Brand anchors (from the 2024 brand sheet — do not change):
16
- Brand Blue #1B75BB (CMYK 85 50 0 0)
17
- Brand Purple #7F3F97 (CMYK 59 90 1 0)
18
- Brand Magenta #D41C59 (CMYK 12 100 51 1)
19
- Brand Black #221F1F (CMYK 70 67 65 74)
20
-
21
- The brand is a wordmark + a tri-stop gradient that travels
22
- blue → purple → magenta. That gradient is THE signature.
23
-
24
- Modern SaaS direction:
25
- - generous whitespace, soft shadows, rounded radii
26
- - dark-mode default for the product (data-density screens)
27
- - light-mode for marketing + first-run screens
28
-
29
- Class prefix: `aa-` for typography utilities, `aa-` and `ks-` for
30
- component primitives (we adopted the Ketshopweb component naming
31
- so the token surface is portable across both brands).
32
- ===================================================================== */
33
-
34
-
35
- :root {
36
- /* ---------- BRAND CORE (from 2024 brand sheet — do not change) ---------- */
37
- --aa-blue: #1B75BB;
38
- --aa-purple: #7F3F97;
39
- --aa-magenta: #D41C59;
40
- --aa-black: #221F1F;
41
-
42
- /* ---------- BLUE SCALE ---------- */
43
- --blue-50: #EAF3FB;
44
- --blue-100: #CCE0F2;
45
- --blue-200: #9DC4E6;
46
- --blue-300: #6FA7D9;
47
- --blue-400: #4A8DC9;
48
- --blue-500: #2E7EBF;
49
- --blue-600: #1B75BB; /* = --aa-blue */
50
- --blue-700: #155F9A;
51
- --blue-800: #114B7B;
52
- --blue-900: #0C385D;
53
- --blue-950: #061E33;
54
-
55
- /* ---------- PURPLE SCALE ---------- */
56
- --purple-50: #F4ECF7;
57
- --purple-100: #E4D1EC;
58
- --purple-200: #C9A4D8;
59
- --purple-300: #AC78C2;
60
- --purple-400: #9355AC;
61
- --purple-500: #84459F;
62
- --purple-600: #7F3F97; /* = --aa-purple */
63
- --purple-700: #66317A;
64
- --purple-800: #4D2459;
65
- --purple-900: #361840;
66
- --purple-950: #1C0A22;
67
-
68
- /* ---------- MAGENTA SCALE ---------- */
69
- --magenta-50: #FCEAF1;
70
- --magenta-100: #F8CAD9;
71
- --magenta-200: #F195B2;
72
- --magenta-300: #E96088;
73
- --magenta-400: #DF3D6E;
74
- --magenta-500: #D72861;
75
- --magenta-600: #D41C59; /* = --aa-magenta */
76
- --magenta-700: #AB1648;
77
- --magenta-800: #821036;
78
- --magenta-900: #5B0B25;
79
- --magenta-950: #2F0513;
80
-
81
- /* ---------- INK / NEUTRAL SCALE (warm, leaning toward brand black) ----------
82
- These are LIGHT-MODE defaults. data-mode="dark" remaps them. */
83
- --ink-0: #FFFFFF;
84
- --ink-25: #FCFBFB;
85
- --ink-50: #F7F6F6;
86
- --ink-100: #EFEDED;
87
- --ink-150: #E8E5E5;
88
- --ink-200: #E3E0E0;
89
- --ink-300: #CAC5C5;
90
- --ink-400: #A39D9D;
91
- --ink-500: #7A7474;
92
- --ink-600: #5B5555;
93
- --ink-700: #3F3A3A;
94
- --ink-800: #2E2A2A;
95
- --ink-900: #221F1F; /* = --aa-black */
96
- --ink-950: #14110F;
97
-
98
- /* ---------- SEMANTIC STATE COLORS ---------- */
99
- --success-50: #E6F5EE;
100
- --success-100: #C1E7D2;
101
- --success-200: #93D6B0;
102
- --success-500: #1F9D6B;
103
- --success-600: #0F8458;
104
- --success-700: #0B6B47;
105
-
106
- --warning-50: #FBF3DF;
107
- --warning-100: #F6E3AB;
108
- --warning-200: #EFCC74;
109
- --warning-500: #D99817;
110
- --warning-600: #B47C0F;
111
- --warning-700: #8E6109;
112
-
113
- --danger-50: var(--magenta-50);
114
- --danger-100: var(--magenta-100);
115
- --danger-200: var(--magenta-200);
116
- --danger-500: var(--magenta-500);
117
- --danger-600: var(--magenta-600);
118
- --danger-700: var(--magenta-700);
119
-
120
- --info-50: var(--blue-50);
121
- --info-100: var(--blue-100);
122
- --info-200: var(--blue-200);
123
- --info-500: var(--blue-500);
124
- --info-600: var(--blue-600);
125
- --info-700: var(--blue-700);
126
-
127
- /* ---------- THEME — PRIMARY is purple-led by default ----------
128
- The wordmark's "Art" half lands on purple as its visual midpoint;
129
- UI primary = purple keeps brand resonance without screaming. */
130
- --primary-50: var(--purple-50);
131
- --primary-100: var(--purple-100);
132
- --primary-200: var(--purple-200);
133
- --primary-300: var(--purple-300);
134
- --primary-400: var(--purple-400);
135
- --primary-500: var(--purple-500);
136
- --primary-600: var(--purple-600);
137
- --primary-700: var(--purple-700);
138
- --primary-800: var(--purple-800);
139
- --primary-900: var(--purple-900);
140
- --primary-950: var(--purple-950);
141
- --accent-500: var(--blue-500);
142
- --accent-600: var(--blue-600);
143
-
144
- /* ---------- SURFACES ---------- */
145
- --surface-canvas: var(--ink-50);
146
- --surface-raised: var(--ink-0);
147
- --surface-sunken: var(--ink-100);
148
- --surface-inverse: var(--ink-900);
149
-
150
- /* ---------- TEXT ---------- */
151
- --text-primary: var(--ink-900);
152
- --text-secondary: var(--ink-700);
153
- --text-tertiary: var(--ink-500);
154
- --text-muted: var(--ink-400);
155
- --text-inverse: var(--ink-0);
156
- --text-brand: var(--primary-600);
157
- --text-link: var(--primary-600);
158
-
159
- /* ---------- BORDERS ---------- */
160
- --border-subtle: var(--ink-100);
161
- --border-default: var(--ink-150);
162
- --border-strong: var(--ink-200);
163
- --border-focus: var(--primary-500);
164
-
165
- /* Legacy AA names — keep so older preview cards keep working. */
166
- --fg-1: var(--text-primary);
167
- --fg-2: var(--text-secondary);
168
- --fg-3: var(--text-tertiary);
169
- --fg-4: var(--text-muted);
170
- --bg-1: var(--surface-raised);
171
- --bg-2: var(--surface-canvas);
172
- --bg-3: var(--surface-sunken);
173
- --border-1: var(--border-strong);
174
-
175
- /* ---------- DATA-VIZ PALETTE ----------
176
- Brand stops first, then their tints, then warm/cool accents. 8 colors. */
177
- --viz-1: var(--blue-600);
178
- --viz-2: var(--purple-600);
179
- --viz-3: var(--magenta-600);
180
- --viz-4: var(--blue-300);
181
- --viz-5: var(--purple-300);
182
- --viz-6: var(--magenta-300);
183
- --viz-7: #D99817; /* warm accent */
184
- --viz-8: #1F9D6B; /* green accent */
185
-
186
- --viz-1-soft: var(--blue-100);
187
- --viz-2-soft: var(--purple-100);
188
- --viz-3-soft: var(--magenta-100);
189
- --viz-4-soft: var(--blue-50);
190
- --viz-5-soft: var(--purple-50);
191
- --viz-6-soft: var(--magenta-50);
192
- --viz-7-soft: #FBF3DF;
193
- --viz-8-soft: #E6F5EE;
194
-
195
- /* ---------- BRAND GRADIENTS — the signature ----------
196
- Always blue → purple → magenta. Reversing it reads wrong. */
197
- --aa-gradient: linear-gradient(115deg, var(--aa-blue) 0%, var(--aa-purple) 50%, var(--aa-magenta) 100%);
198
- --aa-gradient-soft: linear-gradient(115deg, var(--blue-100) 0%, var(--purple-100) 50%, var(--magenta-100) 100%);
199
- --aa-gradient-radial: radial-gradient(120% 90% at 0% 100%, var(--aa-blue) 0%, var(--aa-purple) 45%, var(--aa-magenta) 100%);
200
-
201
- /* ---------- TYPOGRAPHY ----------
202
- Display/brand voice: Nunito (rounded geometric, matches the wordmark)
203
- Body/UI: Inter (dense data screens read well)
204
- Mono: JetBrains Mono (IDs, code, server hashes) */
205
- --font-display: "Nunito", ui-rounded, system-ui, -apple-system, "Segoe UI", sans-serif;
206
- --font-heading: "Nunito", ui-rounded, system-ui, sans-serif;
207
- --font-sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
208
- --font-body: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
209
- --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;
210
-
211
- /* Type scale (rem-based; 1rem = 16px). Mobile-friendly modular ramp. */
212
- --text-3xs: 0.6875rem; /* 11 — table caps, badges */
213
- --text-2xs: 0.75rem; /* 12 */
214
- --text-xs: 0.8125rem; /* 13 — small UI */
215
- --text-sm: 0.875rem; /* 14 */
216
- --text-md: 0.9375rem; /* 15 — dashboard default */
217
- --text-base: 1rem; /* 16 */
218
- --text-lg: 1.125rem; /* 18 */
219
- --text-xl: 1.25rem; /* 20 */
220
- --text-2xl: 1.5rem; /* 24 */
221
- --text-3xl: 1.875rem; /* 30 */
222
- --text-4xl: 2.25rem; /* 36 */
223
- --text-5xl: 3rem; /* 48 */
224
- --text-6xl: 3.75rem; /* 60 */
225
-
226
- /* legacy fs-* names for older preview cards */
227
- --fs-display: clamp(2.5rem, 4.5vw, 3.75rem);
228
- --fs-h1: var(--text-4xl);
229
- --fs-h2: 1.75rem;
230
- --fs-h3: 1.375rem;
231
- --fs-h4: var(--text-lg);
232
- --fs-body: var(--text-md);
233
- --fs-body-lg: var(--text-base);
234
- --fs-small: var(--text-xs);
235
- --fs-micro: var(--text-3xs);
236
-
237
- /* line heights */
238
- --lh-tight: 1.1;
239
- --lh-snug: 1.25;
240
- --lh-normal: 1.5;
241
- --lh-relaxed: 1.65;
242
-
243
- /* tracking */
244
- --tracking-tight: -0.02em;
245
- --tracking-snug: -0.01em;
246
- --tracking-normal: 0;
247
- --tracking-wide: 0.04em;
248
- --tracking-caps: 0.08em;
249
-
250
- /* weights */
251
- --fw-regular: 400;
252
- --fw-medium: 500;
253
- --fw-semibold: 600;
254
- --fw-bold: 700;
255
- --fw-extrabold: 800;
256
- --fw-black: 900;
257
-
258
- /* ---------- SPACING (4px base) ---------- */
259
- --space-0: 0;
260
- --space-px: 1px;
261
- --space-0_5: 2px;
262
- --space-1: 4px;
263
- --space-2: 8px;
264
- --space-3: 12px;
265
- --space-4: 16px;
266
- --space-5: 20px;
267
- --space-6: 24px;
268
- --space-8: 32px;
269
- --space-10: 40px;
270
- --space-12: 48px;
271
- --space-16: 64px;
272
- --space-20: 80px;
273
- --space-24: 96px;
274
- --space-32: 128px;
275
-
276
- /* ---------- RADII ---------- */
277
- --radius-xs: 4px;
278
- --radius-sm: 6px;
279
- --radius-md: 10px;
280
- --radius-lg: 14px;
281
- --radius-xl: 20px;
282
- --radius-2xl: 28px;
283
- --radius-3xl: 36px;
284
- --radius-pill: 999px;
285
- --radius-full: 999px;
286
-
287
- /* ---------- SHADOWS — soft, layered, warm-toned (built on brand black) ---------- */
288
- --shadow-xs: 0 1px 0 rgba(34,31,31,0.04);
289
- --shadow-sm: 0 1px 2px rgba(34,31,31,0.06), 0 1px 1px rgba(34,31,31,0.04);
290
- --shadow-md: 0 4px 12px rgba(34,31,31,0.08), 0 2px 4px rgba(34,31,31,0.04);
291
- --shadow-lg: 0 12px 28px rgba(34,31,31,0.10), 0 4px 8px rgba(34,31,31,0.05);
292
- --shadow-xl: 0 24px 56px rgba(34,31,31,0.14), 0 8px 16px rgba(34,31,31,0.06);
293
- --shadow-2xl: 0 32px 72px rgba(34,31,31,0.20);
294
- --shadow-3xl: 0 40px 96px rgba(34,31,31,0.28);
295
-
296
- /* Brand-tinted glow for the primary marketing CTA + focused KPI tile. */
297
- --shadow-brand: 0 12px 32px -8px rgba(127,63,151,0.35);
298
-
299
- /* Focus ring — brand-tinted blue, accessible on light surfaces */
300
- --ring-focus: 0 0 0 4px rgba(27,117,187,0.22);
301
- --ring-error: 0 0 0 4px rgba(212,28,89,0.20);
302
- --shadow-focus: var(--ring-focus);
303
-
304
- /* ---------- MOTION ---------- */
305
- --ease-standard: cubic-bezier(0.2, 0, 0, 1);
306
- --ease-emphasized:cubic-bezier(0.3, 0, 0, 1);
307
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
308
- --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
309
- --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
310
- --dur-fast: 120ms;
311
- --dur-base: 200ms;
312
- --dur-slow: 320ms;
313
-
314
- /* ---------- LAYOUT ---------- */
315
- --container-sm: 640px;
316
- --container-md: 768px;
317
- --container-lg: 1024px;
318
- --container-xl: 1280px;
319
- --container-2xl: 1440px;
320
-
321
- --sidebar-w: 244px;
322
- --topbar-h: 56px;
323
- }
324
-
325
- /* =====================================================================
326
- THEME — DARK MODE OVERRIDE
327
- Toggled via <body data-mode="dark"> or <html data-mode="dark">.
328
- The product (Cloud Server Portal) defaults to DARK; marketing + first-run
329
- default to LIGHT.
330
- ===================================================================== */
331
- [data-mode="dark"] {
332
- --ink-0: #14171F;
333
- --ink-25: #181B25;
334
- --ink-50: #1C2030; /* card surface */
335
- --ink-100: #232838;
336
- --ink-150: #2A3043;
337
- --ink-200: #353B52;
338
- --ink-300: #4A5168;
339
- --ink-400: #6B7187;
340
- --ink-500: #8B91A5;
341
- --ink-600: #B0B5C4;
342
- --ink-700: #D2D5DE;
343
- --ink-800: #E6E8ED;
344
- --ink-900: #F3F4F7;
345
- --ink-950: #FFFFFF;
346
-
347
- --surface-canvas: #0E101A; /* page background */
348
- --surface-raised: var(--ink-0); /* card surface */
349
- --surface-sunken: #0A0C14;
350
- --surface-inverse: var(--ink-700);
351
-
352
- --text-primary: #F3F4F7;
353
- --text-secondary: #C5C9D3;
354
- --text-tertiary: #8B91A5;
355
- --text-muted: #6B7187;
356
- --text-inverse: #14171F;
357
-
358
- --border-subtle: #232838;
359
- --border-default: #2A3043;
360
- --border-strong: #353B52;
361
-
362
- /* legacy AA aliases */
363
- --fg-1: var(--text-primary);
364
- --fg-2: var(--text-secondary);
365
- --fg-3: var(--text-tertiary);
366
- --fg-4: var(--text-muted);
367
- --bg-1: var(--surface-raised);
368
- --bg-2: var(--surface-canvas);
369
- --bg-3: var(--surface-sunken);
370
- --border-1: var(--border-strong);
371
-
372
- /* Soft chromatic backgrounds need to lift on dark — use translucent overlays
373
- so they tint instead of glow. */
374
- --primary-50: rgba(127,63,151,0.16);
375
- --primary-100: rgba(127,63,151,0.24);
376
- --magenta-50: rgba(212,28,89,0.16);
377
- --magenta-100: rgba(212,28,89,0.24);
378
- --blue-50: rgba(27,117,187,0.18);
379
- --blue-100: rgba(27,117,187,0.28);
380
- --success-50: rgba(31,157,107,0.18);
381
- --success-100: rgba(31,157,107,0.28);
382
- --warning-50: rgba(217,152,23,0.18);
383
- --warning-100: rgba(217,152,23,0.28);
384
- --danger-50: rgba(212,28,89,0.16);
385
- --danger-100: rgba(212,28,89,0.24);
386
- --info-50: rgba(27,117,187,0.18);
387
- --info-100: rgba(27,117,187,0.28);
388
-
389
- --shadow-xs: 0 1px 0 rgba(0,0,0,0.5);
390
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.4), 0 1px 1px rgba(0,0,0,0.3);
391
- --shadow-md: 0 4px 12px rgba(0,0,0,0.45), 0 2px 4px rgba(0,0,0,0.35);
392
- --shadow-lg: 0 12px 28px rgba(0,0,0,0.55), 0 4px 8px rgba(0,0,0,0.4);
393
- --shadow-xl: 0 24px 56px rgba(0,0,0,0.6), 0 8px 16px rgba(0,0,0,0.4);
394
- --shadow-2xl: 0 32px 72px rgba(0,0,0,0.7);
395
-
396
- --ring-focus: 0 0 0 4px rgba(46,126,191,0.45);
397
- --ring-error: 0 0 0 4px rgba(212,28,89,0.40);
398
- --shadow-focus: var(--ring-focus);
399
-
400
- color-scheme: dark;
401
- }
402
-
403
- /* =====================================================================
404
- ALTERNATE THEME — BLUE-LED PRIMARY
405
- <body data-theme="blue"> · pairs with light or dark mode.
406
- ===================================================================== */
407
- [data-theme="blue"] {
408
- --primary-50: var(--blue-50);
409
- --primary-100: var(--blue-100);
410
- --primary-200: var(--blue-200);
411
- --primary-300: var(--blue-300);
412
- --primary-400: var(--blue-400);
413
- --primary-500: var(--blue-500);
414
- --primary-600: var(--blue-600);
415
- --primary-700: var(--blue-700);
416
- --primary-800: var(--blue-800);
417
- --primary-900: var(--blue-900);
418
- --primary-950: var(--blue-950);
419
- --accent-500: var(--purple-500);
420
- --accent-600: var(--purple-600);
421
- --text-brand: var(--primary-600);
422
- --text-link: var(--primary-600);
423
- --ring-focus: 0 0 0 4px rgba(27,117,187,0.25);
424
- }
425
-
426
- /* =====================================================================
427
- BASE / RESET
428
- ===================================================================== */
429
- *, *::before, *::after { box-sizing: border-box; }
430
- html { -webkit-text-size-adjust: 100%; }
431
- body {
432
- margin: 0;
433
- font-family: var(--font-sans);
434
- font-size: var(--text-md);
435
- line-height: var(--lh-normal);
436
- color: var(--text-primary);
437
- background: var(--surface-canvas);
438
- -webkit-font-smoothing: antialiased;
439
- text-rendering: optimizeLegibility;
440
- }
441
- img, svg { display: block; max-width: 100%; }
442
- button { font: inherit; color: inherit; }
443
- a { color: var(--text-link); text-decoration: none; }
444
- a:hover { text-decoration: underline; }
445
- code, pre { font-family: var(--font-mono); }
446
-
447
- ::selection { background: var(--primary-200); color: var(--primary-900); }
448
- [data-mode="dark"] ::selection { background: rgba(127,63,151,0.45); color: #fff; }
449
-
450
- /* =====================================================================
451
- TYPE UTILITIES — opt-in semantic typography classes
452
- Headings stay 700–800 (Nunito). Body 400/500 (Inter). Numbers tabular.
453
- ===================================================================== */
454
-
455
- .aa-display {
456
- font-family: var(--font-display);
457
- font-weight: var(--fw-extrabold);
458
- font-size: var(--fs-display);
459
- line-height: var(--lh-tight);
460
- letter-spacing: var(--tracking-tight);
461
- color: var(--text-primary);
462
- margin: 0;
463
- }
464
- .aa-h1 {
465
- font-family: var(--font-display);
466
- font-weight: var(--fw-extrabold);
467
- font-size: var(--fs-h1);
468
- line-height: var(--lh-tight);
469
- letter-spacing: var(--tracking-tight);
470
- color: var(--text-primary);
471
- margin: 0;
472
- }
473
- .aa-h2 {
474
- font-family: var(--font-display);
475
- font-weight: var(--fw-bold);
476
- font-size: var(--fs-h2);
477
- line-height: var(--lh-snug);
478
- letter-spacing: var(--tracking-snug);
479
- color: var(--text-primary);
480
- margin: 0;
481
- }
482
- .aa-h3 {
483
- font-family: var(--font-display);
484
- font-weight: var(--fw-bold);
485
- font-size: var(--fs-h3);
486
- line-height: var(--lh-snug);
487
- color: var(--text-primary);
488
- margin: 0;
489
- }
490
- .aa-h4 {
491
- font-family: var(--font-body);
492
- font-weight: var(--fw-semibold);
493
- font-size: var(--fs-h4);
494
- line-height: var(--lh-snug);
495
- color: var(--text-primary);
496
- margin: 0;
497
- }
498
- .aa-body {
499
- font-family: var(--font-body);
500
- font-weight: var(--fw-regular);
501
- font-size: var(--fs-body);
502
- line-height: var(--lh-normal);
503
- color: var(--text-primary);
504
- }
505
- .aa-body-lg {
506
- font-family: var(--font-body);
507
- font-weight: var(--fw-regular);
508
- font-size: var(--fs-body-lg);
509
- line-height: var(--lh-relaxed);
510
- color: var(--text-primary);
511
- }
512
- .aa-small {
513
- font-family: var(--font-body);
514
- font-weight: var(--fw-regular);
515
- font-size: var(--fs-small);
516
- line-height: var(--lh-normal);
517
- color: var(--text-secondary);
518
- }
519
- .aa-micro {
520
- font-family: var(--font-body);
521
- font-weight: var(--fw-semibold);
522
- font-size: var(--fs-micro);
523
- line-height: var(--lh-normal);
524
- letter-spacing: var(--tracking-caps);
525
- text-transform: uppercase;
526
- color: var(--text-tertiary);
527
- }
528
- .aa-metric {
529
- font-family: var(--font-display);
530
- font-weight: var(--fw-extrabold);
531
- font-size: 2.25rem;
532
- line-height: 1.05;
533
- letter-spacing: var(--tracking-tight);
534
- font-variant-numeric: tabular-nums;
535
- color: var(--text-primary);
536
- }
537
- .aa-mono, .aa-code {
538
- font-family: var(--font-mono);
539
- font-size: 0.8125rem;
540
- font-variant-numeric: tabular-nums;
541
- }
542
- .aa-num {
543
- font-variant-numeric: tabular-nums;
544
- font-feature-settings: "tnum" 1, "lnum" 1;
545
- }
546
- .aa-eyebrow {
547
- display: inline-block;
548
- font-family: var(--font-body);
549
- font-size: var(--text-xs);
550
- font-weight: var(--fw-semibold);
551
- color: var(--primary-600);
552
- text-transform: uppercase;
553
- letter-spacing: var(--tracking-caps);
554
- }
555
- .aa-muted { color: var(--text-tertiary); }
556
-
557
- /* Brand gradient text — sparingly: hero numbers, the "Art" of AssetsArt. */
558
- .aa-gradient-text {
559
- background: var(--aa-gradient);
560
- -webkit-background-clip: text;
561
- background-clip: text;
562
- color: transparent;
563
- }
564
-
565
- /* =====================================================================
566
- ASSETSART DESIGN SYSTEM — COMPONENTS
567
- ---------------------------------------------------------------------
568
- Depends on `tokens.css`. Everything here is a primitive
569
- the portal and preview cards can lean on. Class prefix: `aa-`.
570
- Naming inspired by the Ketshopweb component layer for portability.
571
- ===================================================================== */
572
-
573
- /* ---------- Container ---------- */
574
- .aa-container {
575
- width: 100%;
576
- max-width: var(--container-2xl);
577
- margin-inline: auto;
578
- padding-inline: var(--space-6);
579
- }
580
-
581
- /* =====================================================================
582
- BUTTON
583
- Variants: primary · secondary · ghost · outline · danger · link
584
- Sizes: xs · sm · md · lg · xl
585
- ===================================================================== */
586
- .aa-btn {
587
- --_bg: var(--primary-600);
588
- --_bg-hover: var(--primary-700);
589
- --_bg-active: var(--primary-800);
590
- --_fg: #fff;
591
- --_border: transparent;
592
-
593
- display: inline-flex;
594
- align-items: center;
595
- justify-content: center;
596
- gap: var(--space-2);
597
- border: 1px solid var(--_border);
598
- background: var(--_bg);
599
- color: var(--_fg);
600
- font-family: var(--font-body);
601
- font-weight: var(--fw-semibold);
602
- font-size: var(--text-sm);
603
- line-height: 1;
604
- padding: 10px 16px;
605
- height: 38px;
606
- border-radius: var(--radius-md);
607
- cursor: pointer;
608
- white-space: nowrap;
609
- user-select: none;
610
- text-decoration: none;
611
- transition:
612
- background var(--dur-fast) var(--ease-standard),
613
- color var(--dur-fast) var(--ease-standard),
614
- border-color var(--dur-fast) var(--ease-standard),
615
- box-shadow var(--dur-fast) var(--ease-standard),
616
- transform var(--dur-fast) var(--ease-standard);
617
- }
618
- .aa-btn:hover { background: var(--_bg-hover); text-decoration: none; }
619
- .aa-btn:active { background: var(--_bg-active); transform: translateY(0.5px); }
620
- .aa-btn:focus-visible { outline: none; box-shadow: var(--ring-focus); }
621
- .aa-btn:disabled, .aa-btn[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; pointer-events: none; }
622
- .aa-btn svg { width: 16px; height: 16px; flex: none; }
623
-
624
- .aa-btn--secondary {
625
- --_bg: var(--surface-raised);
626
- --_bg-hover: var(--ink-50);
627
- --_bg-active: var(--ink-100);
628
- --_fg: var(--text-primary);
629
- --_border: var(--border-strong);
630
- }
631
- .aa-btn--ghost {
632
- --_bg: transparent;
633
- --_bg-hover: var(--ink-100);
634
- --_bg-active: var(--ink-150);
635
- --_fg: var(--text-secondary);
636
- --_border: transparent;
637
- }
638
- .aa-btn--outline {
639
- --_bg: transparent;
640
- --_bg-hover: var(--primary-50);
641
- --_bg-active: var(--primary-100);
642
- --_fg: var(--primary-500);
643
- --_border: var(--primary-500);
644
- }
645
- [data-mode="dark"] .aa-btn--outline { --_fg: var(--purple-300); --_border: var(--purple-400); }
646
- .aa-btn--danger {
647
- --_bg: var(--danger-600);
648
- --_bg-hover: var(--danger-700);
649
- --_bg-active: var(--magenta-800);
650
- }
651
- .aa-btn--link {
652
- --_bg: transparent; --_bg-hover: transparent; --_bg-active: transparent;
653
- --_fg: var(--primary-600); height: auto; padding: 0;
654
- }
655
- .aa-btn--link:hover { text-decoration: underline; }
656
-
657
- .aa-btn--xs { height: 26px; padding: 0 10px; font-size: var(--text-2xs); border-radius: var(--radius-sm); gap: 6px; }
658
- .aa-btn--xs svg { width: 14px; height: 14px; }
659
- .aa-btn--sm { height: 32px; padding: 0 12px; font-size: var(--text-xs); }
660
- .aa-btn--md { height: 38px; padding: 0 16px; font-size: var(--text-sm); }
661
- .aa-btn--lg { height: 44px; padding: 0 20px; font-size: var(--text-md); border-radius: var(--radius-lg); }
662
- .aa-btn--xl { height: 52px; padding: 0 26px; font-size: var(--text-base); border-radius: var(--radius-lg); }
663
- .aa-btn--xl svg { width: 18px; height: 18px; }
664
-
665
- .aa-btn--full { width: 100%; }
666
- .aa-btn--icon { width: 38px; padding: 0; }
667
- .aa-btn--icon.aa-btn--sm { width: 32px; }
668
- .aa-btn--icon.aa-btn--xs { width: 26px; }
669
-
670
- /* =====================================================================
671
- INPUT / TEXTAREA / SELECT
672
- ===================================================================== */
673
- .aa-field { display: flex; flex-direction: column; gap: 6px; }
674
- .aa-label {
675
- font-family: var(--font-body);
676
- font-size: var(--text-sm);
677
- font-weight: var(--fw-medium);
678
- color: var(--text-primary);
679
- }
680
- .aa-label__hint { color: var(--text-tertiary); font-weight: var(--fw-regular); }
681
- .aa-help { font-size: var(--text-xs); color: var(--text-tertiary); }
682
- .aa-help--error { color: var(--danger-600); }
683
-
684
- .aa-input, .aa-textarea, .aa-select {
685
- font: inherit;
686
- font-family: var(--font-body);
687
- font-size: var(--text-sm);
688
- color: var(--text-primary);
689
- background: var(--surface-raised);
690
- border: 1px solid var(--border-strong);
691
- border-radius: var(--radius-md);
692
- padding: 9px 12px;
693
- height: 38px;
694
- width: 100%;
695
- transition: border-color var(--dur-fast), box-shadow var(--dur-fast);
696
- }
697
- .aa-textarea { height: auto; min-height: 96px; resize: vertical; padding: 12px; line-height: var(--lh-normal); }
698
- .aa-input::placeholder, .aa-textarea::placeholder { color: var(--text-muted); }
699
- .aa-input:hover, .aa-textarea:hover, .aa-select:hover { border-color: var(--ink-300); }
700
- .aa-input:focus, .aa-textarea:focus, .aa-select:focus {
701
- outline: none; border-color: var(--primary-500); box-shadow: var(--ring-focus);
702
- }
703
- .aa-input[aria-invalid="true"], .aa-input.is-invalid {
704
- border-color: var(--danger-500);
705
- }
706
- .aa-input[aria-invalid="true"]:focus { box-shadow: var(--ring-error); }
707
- .aa-input:disabled, .aa-textarea:disabled {
708
- background: var(--ink-50); color: var(--text-muted); cursor: not-allowed;
709
- }
710
-
711
- .aa-input-group {
712
- display: flex; align-items: stretch;
713
- border: 1px solid var(--border-strong);
714
- border-radius: var(--radius-md);
715
- background: var(--surface-raised);
716
- transition: border-color var(--dur-fast), box-shadow var(--dur-fast);
717
- }
718
- .aa-input-group:focus-within { border-color: var(--primary-500); box-shadow: var(--ring-focus); }
719
- .aa-input-group .aa-input-addon {
720
- display: flex; align-items: center; padding: 0 12px;
721
- color: var(--text-muted); font-size: var(--text-sm);
722
- }
723
- .aa-input-group .aa-input-addon svg { width: 16px; height: 16px; }
724
- .aa-input-group .aa-input { border: none; background: transparent; box-shadow: none; }
725
-
726
- /* Checkbox / Radio */
727
- .aa-check, .aa-radio {
728
- appearance: none;
729
- width: 18px; height: 18px;
730
- border: 1.5px solid var(--border-strong);
731
- background: var(--surface-raised);
732
- display: inline-grid; place-content: center;
733
- cursor: pointer;
734
- transition: all var(--dur-fast) var(--ease-standard);
735
- flex: none;
736
- }
737
- .aa-check { border-radius: 5px; }
738
- .aa-radio { border-radius: 50%; }
739
- .aa-check:hover, .aa-radio:hover { border-color: var(--primary-500); }
740
- .aa-check:focus-visible, .aa-radio:focus-visible { outline: none; box-shadow: var(--ring-focus); }
741
- .aa-check:checked, .aa-radio:checked { background: var(--primary-600); border-color: var(--primary-600); }
742
- .aa-check:checked::before {
743
- content: ""; width: 10px; height: 10px;
744
- background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2 6l3 3 5-6' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>") center/contain no-repeat;
745
- }
746
- .aa-radio:checked::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: #fff; }
747
-
748
- /* Switch */
749
- .aa-switch {
750
- appearance: none; position: relative;
751
- width: 36px; height: 20px;
752
- background: var(--ink-200);
753
- border-radius: var(--radius-full);
754
- cursor: pointer;
755
- transition: background var(--dur-base) var(--ease-standard);
756
- flex: none;
757
- }
758
- .aa-switch::before {
759
- content: ""; position: absolute; top: 2px; left: 2px;
760
- width: 16px; height: 16px; border-radius: 50%; background: #fff;
761
- transition: transform var(--dur-base) var(--ease-spring);
762
- box-shadow: var(--shadow-xs);
763
- }
764
- .aa-switch:checked { background: var(--primary-600); }
765
- .aa-switch:checked::before { transform: translateX(16px); }
766
- .aa-switch:focus-visible { outline: none; box-shadow: var(--ring-focus); }
767
-
768
- /* =====================================================================
769
- CARD
770
- ===================================================================== */
771
- .aa-card {
772
- background: var(--surface-raised);
773
- border: 1px solid var(--border-subtle);
774
- border-radius: var(--radius-lg);
775
- box-shadow: var(--shadow-xs);
776
- overflow: hidden;
777
- }
778
- .aa-card--padded { padding: var(--space-6); }
779
- .aa-card--interactive {
780
- transition: transform var(--dur-base) var(--ease-standard),
781
- box-shadow var(--dur-base) var(--ease-standard);
782
- cursor: pointer;
783
- }
784
- .aa-card--interactive:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
785
- .aa-card__header { padding: var(--space-5) var(--space-6); border-bottom: 1px solid var(--border-subtle); }
786
- .aa-card__body { padding: var(--space-6); }
787
- .aa-card__footer { padding: var(--space-4) var(--space-6); border-top: 1px solid var(--border-subtle); background: var(--ink-25); }
788
-
789
- /* =====================================================================
790
- BADGE / PILL / CHIP
791
- ===================================================================== */
792
- .aa-badge {
793
- display: inline-flex; align-items: center; gap: 6px;
794
- padding: 3px 10px;
795
- font-family: var(--font-body);
796
- font-size: var(--text-2xs);
797
- font-weight: var(--fw-semibold);
798
- line-height: 1.4;
799
- border-radius: var(--radius-full);
800
- background: var(--ink-100);
801
- color: var(--text-secondary);
802
- border: 1px solid transparent;
803
- white-space: nowrap;
804
- }
805
- .aa-badge--solid { background: var(--primary-600); color: #fff; }
806
- .aa-badge--soft { background: var(--primary-50); color: var(--primary-700); }
807
- .aa-badge--outline { background: transparent; border-color: var(--border-strong); color: var(--text-secondary); }
808
- .aa-badge--success { background: var(--success-50); color: var(--success-700); }
809
- .aa-badge--warning { background: var(--warning-50); color: var(--warning-700); }
810
- .aa-badge--danger { background: var(--danger-50); color: var(--danger-700); }
811
- .aa-badge--info { background: var(--info-50); color: var(--info-700); }
812
- .aa-badge--brand { background: var(--aa-gradient); color: #fff; }
813
- .aa-badge--dot::before {
814
- content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor;
815
- }
816
-
817
- /* dark-mode pill foreground gets lifted */
818
- [data-mode="dark"] .aa-badge--success { color: #6BD9A4; }
819
- [data-mode="dark"] .aa-badge--warning { color: #F0C76A; }
820
- [data-mode="dark"] .aa-badge--danger { color: #F195B2; }
821
- [data-mode="dark"] .aa-badge--info { color: #7BB6E2; }
822
- [data-mode="dark"] .aa-badge--soft { color: #C9A4D8; }
823
-
824
- /* Status dot pill (used in tables) */
825
- .aa-pill {
826
- display: inline-flex; align-items: center; gap: 5px;
827
- padding: 2px 9px;
828
- font-family: var(--font-body);
829
- font-size: var(--text-3xs);
830
- font-weight: var(--fw-semibold);
831
- line-height: 1.5;
832
- border-radius: var(--radius-full);
833
- background: var(--ink-100);
834
- color: var(--text-secondary);
835
- white-space: nowrap;
836
- letter-spacing: 0.02em;
837
- }
838
- .aa-pill::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
839
- .aa-pill--ok { background: var(--success-50); color: var(--success-700); }
840
- .aa-pill--warn { background: var(--warning-50); color: var(--warning-700); }
841
- .aa-pill--err { background: var(--danger-50); color: var(--danger-700); }
842
- .aa-pill--info { background: var(--info-50); color: var(--info-700); }
843
- .aa-pill--muted { background: var(--ink-100); color: var(--text-tertiary); }
844
- .aa-pill--no-dot::before { display: none; }
845
-
846
- [data-mode="dark"] .aa-pill--ok { color: #6BD9A4; }
847
- [data-mode="dark"] .aa-pill--warn { color: #F0C76A; }
848
- [data-mode="dark"] .aa-pill--err { color: #F195B2; }
849
- [data-mode="dark"] .aa-pill--info { color: #7BB6E2; }
850
-
851
- /* =====================================================================
852
- TABLE
853
- ===================================================================== */
854
- .aa-table-wrap {
855
- border: 1px solid var(--border-subtle);
856
- border-radius: var(--radius-lg);
857
- overflow: hidden;
858
- background: var(--surface-raised);
859
- }
860
- .aa-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); }
861
- .aa-table thead th {
862
- text-align: left;
863
- font-family: var(--font-body);
864
- font-weight: var(--fw-semibold);
865
- font-size: var(--text-3xs);
866
- color: var(--text-tertiary);
867
- letter-spacing: var(--tracking-caps);
868
- text-transform: uppercase;
869
- padding: 10px 16px;
870
- background: var(--ink-25);
871
- border-bottom: 1px solid var(--border-default);
872
- white-space: nowrap;
873
- }
874
- .aa-table tbody td {
875
- padding: 13px 16px;
876
- color: var(--text-primary);
877
- border-bottom: 1px solid var(--border-subtle);
878
- vertical-align: middle;
879
- }
880
- .aa-table tbody tr:last-child td { border-bottom: none; }
881
- .aa-table tbody tr:hover td { background: var(--ink-25); }
882
- .aa-table--compact thead th { padding: 8px 14px; }
883
- .aa-table--compact tbody td { padding: 10px 14px; }
884
- .aa-table .num { text-align: right; font-variant-numeric: tabular-nums; }
885
- .aa-table .mono { font-family: var(--font-mono); font-size: var(--text-2xs); color: var(--text-tertiary); font-variant-numeric: tabular-nums; }
886
-
887
- /* =====================================================================
888
- TABS / SEGMENTED
889
- ===================================================================== */
890
- .aa-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border-default); }
891
- .aa-tab {
892
- appearance: none; background: transparent; border: none; cursor: pointer;
893
- padding: 12px 14px;
894
- font-family: var(--font-body);
895
- font-size: var(--text-sm);
896
- font-weight: var(--fw-medium);
897
- color: var(--text-tertiary);
898
- border-bottom: 2px solid transparent;
899
- margin-bottom: -1px;
900
- transition: color var(--dur-fast), border-color var(--dur-fast);
901
- }
902
- .aa-tab:hover { color: var(--text-primary); }
903
- .aa-tab[aria-selected="true"], .aa-tab.is-active {
904
- color: var(--primary-600); border-color: var(--primary-600); font-weight: var(--fw-semibold);
905
- }
906
- [data-mode="dark"] .aa-tab[aria-selected="true"],
907
- [data-mode="dark"] .aa-tab.is-active { color: var(--purple-300); border-color: var(--purple-400); }
908
-
909
- .aa-segmented {
910
- display: inline-flex; padding: 3px;
911
- background: var(--ink-100); border-radius: var(--radius-md);
912
- }
913
- .aa-segmented__item {
914
- appearance: none; background: transparent; border: none;
915
- padding: 6px 14px; border-radius: var(--radius-sm);
916
- font-family: var(--font-body);
917
- font-size: var(--text-xs); font-weight: var(--fw-semibold); color: var(--text-tertiary);
918
- cursor: pointer;
919
- transition: all var(--dur-fast);
920
- }
921
- .aa-segmented__item.is-active {
922
- background: var(--surface-raised); color: var(--text-primary); box-shadow: var(--shadow-xs);
923
- }
924
-
925
- /* =====================================================================
926
- ALERT / TOAST
927
- ===================================================================== */
928
- .aa-alert {
929
- display: flex; gap: 12px;
930
- padding: 14px 16px;
931
- border-radius: var(--radius-md);
932
- background: var(--ink-25);
933
- border: 1px solid var(--border-subtle);
934
- font-size: var(--text-sm);
935
- color: var(--text-primary);
936
- }
937
- .aa-alert__icon { flex: none; width: 20px; height: 20px; color: var(--text-tertiary); }
938
- .aa-alert__title { font-weight: var(--fw-semibold); }
939
- .aa-alert__body { color: var(--text-secondary); margin-top: 2px; }
940
- .aa-alert--info { background: var(--info-50); color: var(--info-700); border-color: rgba(27,117,187,0.25); }
941
- .aa-alert--info .aa-alert__icon { color: var(--info-600); }
942
- .aa-alert--success { background: var(--success-50); color: var(--success-700); border-color: rgba(31,157,107,0.25); }
943
- .aa-alert--success .aa-alert__icon { color: var(--success-600); }
944
- .aa-alert--warning { background: var(--warning-50); color: var(--warning-700); border-color: rgba(217,152,23,0.25); }
945
- .aa-alert--warning .aa-alert__icon { color: var(--warning-600); }
946
- .aa-alert--danger { background: var(--danger-50); color: var(--danger-700); border-color: rgba(212,28,89,0.25); }
947
- .aa-alert--danger .aa-alert__icon { color: var(--danger-600); }
948
-
949
- /* dark-mode alert text */
950
- [data-mode="dark"] .aa-alert--info { color: #9DC4E6; }
951
- [data-mode="dark"] .aa-alert--success { color: #93D6B0; }
952
- [data-mode="dark"] .aa-alert--warning { color: #EFCC74; }
953
- [data-mode="dark"] .aa-alert--danger { color: #F195B2; }
954
-
955
- /* =====================================================================
956
- AVATAR
957
- ===================================================================== */
958
- .aa-avatar {
959
- width: 36px; height: 36px;
960
- border-radius: 50%;
961
- background: var(--primary-100);
962
- color: var(--primary-700);
963
- display: inline-grid; place-items: center;
964
- font-family: var(--font-display);
965
- font-weight: var(--fw-bold);
966
- font-size: var(--text-xs);
967
- overflow: hidden;
968
- flex: none;
969
- }
970
- .aa-avatar img { width: 100%; height: 100%; object-fit: cover; }
971
- .aa-avatar--xs { width: 22px; height: 22px; font-size: var(--text-3xs); }
972
- .aa-avatar--sm { width: 28px; height: 28px; font-size: var(--text-3xs); }
973
- .aa-avatar--lg { width: 44px; height: 44px; font-size: var(--text-md); }
974
- .aa-avatar--xl { width: 64px; height: 64px; font-size: var(--text-lg); }
975
- [data-mode="dark"] .aa-avatar { color: var(--purple-200); }
976
-
977
- /* =====================================================================
978
- PROGRESS
979
- ===================================================================== */
980
- .aa-progress {
981
- height: 8px; background: var(--ink-100);
982
- border-radius: var(--radius-full); overflow: hidden;
983
- }
984
- .aa-progress__bar {
985
- height: 100%; background: var(--primary-600);
986
- border-radius: var(--radius-full);
987
- transition: width var(--dur-slow) var(--ease-standard);
988
- }
989
- .aa-progress--thin { height: 4px; }
990
- .aa-progress--brand .aa-progress__bar { background: var(--aa-gradient); }
991
-
992
- /* =====================================================================
993
- KPI CARD (dashboard tile)
994
- ===================================================================== */
995
- .aa-kpi {
996
- background: var(--surface-raised);
997
- border: 1px solid var(--border-subtle);
998
- border-radius: var(--radius-lg);
999
- padding: 16px 18px;
1000
- display: flex; flex-direction: column; gap: 8px;
1001
- }
1002
- .aa-kpi__label {
1003
- display: inline-flex; align-items: center; gap: 6px;
1004
- font-family: var(--font-body);
1005
- font-size: var(--text-3xs);
1006
- color: var(--text-tertiary);
1007
- font-weight: var(--fw-semibold);
1008
- text-transform: uppercase;
1009
- letter-spacing: var(--tracking-caps);
1010
- }
1011
- .aa-kpi__label svg { width: 13px; height: 13px; }
1012
- .aa-kpi__value {
1013
- font-family: var(--font-display);
1014
- font-size: 28px;
1015
- font-weight: var(--fw-extrabold);
1016
- color: var(--text-primary);
1017
- font-variant-numeric: tabular-nums;
1018
- letter-spacing: var(--tracking-tight);
1019
- line-height: 1.1;
1020
- }
1021
- .aa-kpi__delta {
1022
- display: inline-flex; align-items: center; gap: 4px;
1023
- font-size: var(--text-xs);
1024
- font-weight: var(--fw-semibold);
1025
- font-variant-numeric: tabular-nums;
1026
- }
1027
- .aa-kpi__delta--up { color: var(--success-600); }
1028
- .aa-kpi__delta--down { color: var(--danger-600); }
1029
- .aa-kpi__delta--neutral { color: var(--text-tertiary); }
1030
- [data-mode="dark"] .aa-kpi__delta--up { color: #6BD9A4; }
1031
- [data-mode="dark"] .aa-kpi__delta--down { color: #F195B2; }
1032
- .aa-kpi__meta {
1033
- display: inline-flex; align-items: center; gap: 6px;
1034
- font-size: var(--text-xs);
1035
- color: var(--text-tertiary);
1036
- }
1037
-
1038
- /* =====================================================================
1039
- APP SHELL (sidebar + topbar)
1040
- ===================================================================== */
1041
- .aa-app {
1042
- display: grid;
1043
- grid-template-columns: var(--sidebar-w) 1fr;
1044
- min-height: 100vh;
1045
- background: var(--surface-canvas);
1046
- color: var(--text-primary);
1047
- }
1048
- .aa-sidebar {
1049
- background: var(--surface-raised);
1050
- border-right: 1px solid var(--border-subtle);
1051
- display: flex; flex-direction: column;
1052
- position: sticky; top: 0; height: 100vh;
1053
- overflow-y: auto;
1054
- }
1055
- .aa-sidebar__brand {
1056
- padding: 16px 18px 14px;
1057
- display: flex; align-items: center; gap: 10px;
1058
- border-bottom: 1px solid var(--border-subtle);
1059
- }
1060
- .aa-sidebar__brand-mark {
1061
- width: 30px; height: 30px;
1062
- border-radius: 8px;
1063
- background: var(--aa-gradient);
1064
- flex: none;
1065
- display: grid; place-items: center;
1066
- color: #fff;
1067
- font-family: var(--font-display);
1068
- font-weight: var(--fw-extrabold);
1069
- font-size: 16px;
1070
- }
1071
- .aa-sidebar__brand-name {
1072
- font-family: var(--font-display);
1073
- font-weight: var(--fw-extrabold);
1074
- font-size: 14px;
1075
- line-height: 1.1;
1076
- color: var(--text-primary);
1077
- }
1078
- .aa-sidebar__brand-sub {
1079
- font-size: 10.5px;
1080
- color: var(--text-tertiary);
1081
- font-weight: var(--fw-medium);
1082
- margin-top: 1px;
1083
- }
1084
- .aa-sidebar__env {
1085
- font-size: 9.5px;
1086
- font-weight: var(--fw-bold);
1087
- padding: 2px 6px;
1088
- border-radius: 4px;
1089
- background: var(--success-50);
1090
- color: var(--success-700);
1091
- text-transform: uppercase;
1092
- letter-spacing: 0.08em;
1093
- margin-left: auto;
1094
- }
1095
- [data-mode="dark"] .aa-sidebar__env { color: #93D6B0; }
1096
-
1097
- .aa-sidebar__nav {
1098
- flex: 1;
1099
- padding: 10px 12px;
1100
- display: flex; flex-direction: column; gap: 2px;
1101
- }
1102
- .aa-sidebar__group-title {
1103
- font-family: var(--font-body);
1104
- font-size: 9.5px;
1105
- font-weight: var(--fw-bold);
1106
- color: var(--text-muted);
1107
- letter-spacing: 0.1em;
1108
- text-transform: uppercase;
1109
- padding: 14px 10px 6px;
1110
- }
1111
-
1112
- .aa-nav-item {
1113
- display: flex; align-items: center; gap: 10px;
1114
- padding: 8px 10px;
1115
- border-radius: var(--radius-md);
1116
- font-family: var(--font-body);
1117
- font-size: var(--text-xs);
1118
- font-weight: var(--fw-medium);
1119
- color: var(--text-secondary);
1120
- cursor: pointer;
1121
- transition: background var(--dur-fast), color var(--dur-fast);
1122
- border: none;
1123
- background: transparent;
1124
- width: 100%;
1125
- text-align: left;
1126
- text-decoration: none;
1127
- }
1128
- .aa-nav-item:hover { background: var(--ink-50); color: var(--text-primary); text-decoration: none; }
1129
- .aa-nav-item.is-active {
1130
- background: var(--primary-50);
1131
- color: var(--primary-700);
1132
- font-weight: var(--fw-semibold);
1133
- }
1134
- [data-mode="dark"] .aa-nav-item.is-active { color: #C9A4D8; }
1135
- .aa-nav-item svg { width: 16px; height: 16px; flex: none; stroke-width: 1.75; }
1136
- .aa-nav-item__count {
1137
- margin-left: auto;
1138
- font-family: var(--font-body);
1139
- font-size: 10.5px;
1140
- font-weight: var(--fw-bold);
1141
- padding: 1px 7px;
1142
- border-radius: var(--radius-full);
1143
- background: var(--ink-100);
1144
- color: var(--text-tertiary);
1145
- font-variant-numeric: tabular-nums;
1146
- }
1147
- .aa-nav-item.is-active .aa-nav-item__count { background: var(--primary-100); color: var(--primary-700); }
1148
- .aa-nav-item__count--alert { background: var(--danger-50); color: var(--danger-700); }
1149
- [data-mode="dark"] .aa-nav-item__count--alert { color: #F195B2; }
1150
-
1151
- .aa-sidebar__user {
1152
- padding: 12px;
1153
- border-top: 1px solid var(--border-subtle);
1154
- display: flex; align-items: center; gap: 10px;
1155
- }
1156
-
1157
- /* Main + topbar */
1158
- .aa-main { min-width: 0; display: flex; flex-direction: column; }
1159
- .aa-topbar {
1160
- height: var(--topbar-h);
1161
- padding: 0 24px;
1162
- border-bottom: 1px solid var(--border-subtle);
1163
- display: flex; align-items: center; gap: 16px;
1164
- background: var(--surface-raised);
1165
- position: sticky; top: 0; z-index: 10;
1166
- }
1167
- .aa-topbar__crumb {
1168
- display: flex; align-items: center; gap: 8px;
1169
- font-family: var(--font-body);
1170
- font-size: var(--text-xs);
1171
- color: var(--text-tertiary);
1172
- }
1173
- .aa-topbar__crumb b { color: var(--text-primary); font-weight: var(--fw-semibold); }
1174
- .aa-topbar__search {
1175
- margin-left: auto;
1176
- position: relative;
1177
- width: 280px;
1178
- }
1179
- .aa-topbar__search input {
1180
- height: 32px;
1181
- padding: 0 12px 0 32px;
1182
- font-family: var(--font-body);
1183
- font-size: var(--text-xs);
1184
- background: var(--ink-50);
1185
- border: 1px solid transparent;
1186
- border-radius: var(--radius-md);
1187
- width: 100%;
1188
- color: var(--text-primary);
1189
- }
1190
- .aa-topbar__search input::placeholder { color: var(--text-muted); }
1191
- .aa-topbar__search input:focus {
1192
- outline: none; border-color: var(--primary-500);
1193
- background: var(--surface-raised);
1194
- box-shadow: var(--ring-focus);
1195
- }
1196
- .aa-topbar__search svg {
1197
- position: absolute; left: 10px; top: 50%; transform: translateY(-50%);
1198
- width: 14px; height: 14px; color: var(--text-muted);
1199
- stroke: currentColor; fill: none; stroke-width: 2;
1200
- }
1201
- .aa-topbar__kbd {
1202
- position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
1203
- font-size: 10px; font-weight: var(--fw-bold);
1204
- font-family: var(--font-body);
1205
- color: var(--text-muted);
1206
- padding: 1px 5px; border-radius: 4px;
1207
- background: var(--surface-raised);
1208
- border: 1px solid var(--border-default);
1209
- }
1210
-
1211
- .aa-content { padding: 24px 32px 80px; flex: 1; width: 100%; }
1212
-
1213
- /* Page header */
1214
- .aa-page-header {
1215
- display: flex; justify-content: space-between; align-items: flex-end;
1216
- margin-bottom: 24px; gap: 16px; flex-wrap: wrap;
1217
- }
1218
- .aa-page-header__title {
1219
- font-family: var(--font-display);
1220
- font-size: 26px;
1221
- font-weight: var(--fw-extrabold);
1222
- margin: 0;
1223
- letter-spacing: var(--tracking-tight);
1224
- line-height: 1.15;
1225
- color: var(--text-primary);
1226
- }
1227
- .aa-page-header__desc {
1228
- font-family: var(--font-body);
1229
- font-size: var(--text-xs);
1230
- color: var(--text-tertiary);
1231
- margin-top: 4px;
1232
- }
1233
- .aa-page-header__actions { display: flex; gap: 8px; align-items: center; }
1234
-
1235
- /* Section card */
1236
- .aa-section {
1237
- background: var(--surface-raised);
1238
- border: 1px solid var(--border-subtle);
1239
- border-radius: var(--radius-lg);
1240
- margin-bottom: 20px;
1241
- overflow: hidden;
1242
- }
1243
- .aa-section__head {
1244
- padding: 14px 18px;
1245
- border-bottom: 1px solid var(--border-subtle);
1246
- display: flex; justify-content: space-between; align-items: center; gap: 12px;
1247
- flex-wrap: wrap;
1248
- }
1249
- .aa-section__title {
1250
- font-family: var(--font-display);
1251
- font-size: var(--text-sm);
1252
- font-weight: var(--fw-bold);
1253
- margin: 0;
1254
- display: flex; align-items: center; gap: 8px;
1255
- color: var(--text-primary);
1256
- }
1257
- .aa-section__title svg { color: var(--text-tertiary); }
1258
- .aa-section__desc {
1259
- font-size: var(--text-xs);
1260
- color: var(--text-tertiary);
1261
- margin-top: 2px;
1262
- }
1263
- .aa-section__body { padding: 18px; }
1264
- .aa-section__body--flush { padding: 0; }
1265
-
1266
- /* Toolbar */
1267
- .aa-toolbar {
1268
- display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
1269
- padding: 10px 18px;
1270
- border-bottom: 1px solid var(--border-subtle);
1271
- background: var(--ink-25);
1272
- }
1273
- .aa-toolbar__search {
1274
- position: relative; flex: 1; max-width: 320px; min-width: 200px;
1275
- }
1276
- .aa-toolbar__search input {
1277
- height: 30px; padding: 0 10px 0 30px;
1278
- font-family: var(--font-body);
1279
- font-size: var(--text-xs);
1280
- background: var(--surface-raised);
1281
- border: 1px solid var(--border-strong);
1282
- border-radius: var(--radius-md); width: 100%;
1283
- color: var(--text-primary);
1284
- }
1285
- .aa-toolbar__search input::placeholder { color: var(--text-muted); }
1286
- .aa-toolbar__search input:focus { outline: none; border-color: var(--primary-500); box-shadow: var(--ring-focus); }
1287
- .aa-toolbar__search svg {
1288
- position: absolute; left: 9px; top: 50%; transform: translateY(-50%);
1289
- width: 14px; height: 14px; color: var(--text-muted);
1290
- stroke: currentColor; fill: none; stroke-width: 2;
1291
- }
1292
- .aa-toolbar__filter {
1293
- height: 30px; padding: 0 10px;
1294
- font-family: var(--font-body);
1295
- font-size: var(--text-2xs); font-weight: var(--fw-semibold);
1296
- background: var(--surface-raised);
1297
- border: 1px solid var(--border-strong);
1298
- border-radius: var(--radius-md);
1299
- color: var(--text-primary);
1300
- cursor: pointer;
1301
- display: inline-flex; align-items: center; gap: 6px;
1302
- }
1303
- .aa-toolbar__filter:hover { border-color: var(--ink-300); }
1304
- .aa-toolbar__filter.is-active { border-color: var(--primary-500); background: var(--primary-50); color: var(--primary-700); }
1305
- [data-mode="dark"] .aa-toolbar__filter.is-active { color: #C9A4D8; }
1306
- .aa-toolbar__filter svg { width: 12px; height: 12px; stroke: currentColor; fill: none; stroke-width: 2; }
1307
-
1308
- /* Service / category chip */
1309
- .aa-chip {
1310
- display: inline-flex; align-items: center; gap: 6px;
1311
- padding: 3px 9px 3px 3px;
1312
- font-family: var(--font-body);
1313
- font-size: var(--text-2xs);
1314
- font-weight: var(--fw-medium);
1315
- background: var(--ink-50);
1316
- border: 1px solid var(--border-subtle);
1317
- border-radius: var(--radius-full);
1318
- color: var(--text-primary);
1319
- }
1320
- .aa-chip__icon {
1321
- width: 18px; height: 18px; border-radius: 50%;
1322
- display: grid; place-items: center;
1323
- font-size: 9.5px;
1324
- font-weight: var(--fw-bold);
1325
- color: #fff;
1326
- }
1327
-
1328
- /* Spark line (svg sparkline) */
1329
- .aa-spark { display: block; }
1330
-
1331
- /* Timeline */
1332
- .aa-timeline { display: flex; flex-direction: column; padding: 4px 0; }
1333
- .aa-timeline__row {
1334
- display: grid;
1335
- grid-template-columns: 86px 18px 1fr;
1336
- gap: 10px;
1337
- padding: 10px 18px;
1338
- font-size: var(--text-xs);
1339
- position: relative;
1340
- }
1341
- .aa-timeline__time {
1342
- color: var(--text-tertiary);
1343
- font-size: var(--text-3xs);
1344
- font-variant-numeric: tabular-nums;
1345
- padding-top: 3px;
1346
- }
1347
- .aa-timeline__dot {
1348
- width: 8px; height: 8px; border-radius: 50%;
1349
- background: var(--primary-500);
1350
- margin: 6px auto 0;
1351
- position: relative; z-index: 1;
1352
- box-shadow: 0 0 0 3px var(--surface-raised);
1353
- }
1354
- .aa-timeline__dot--ok { background: var(--success-500); }
1355
- .aa-timeline__dot--err { background: var(--danger-500); }
1356
- .aa-timeline__dot--warn { background: var(--warning-500); }
1357
- .aa-timeline__dot--muted { background: var(--ink-300); }
1358
- .aa-timeline__row::before {
1359
- content: ""; position: absolute; left: 105px; top: 0; bottom: 0;
1360
- width: 1px; background: var(--border-subtle);
1361
- }
1362
- .aa-timeline__row:first-child::before { top: 14px; }
1363
- .aa-timeline__row:last-child::before { bottom: auto; height: 14px; }
1364
- .aa-timeline__body strong { font-weight: var(--fw-semibold); }
1365
- .aa-timeline__meta { color: var(--text-tertiary); font-size: var(--text-3xs); margin-top: 2px; }
1366
-
1367
- /* Stat list (key/value rows) */
1368
- .aa-stat-list { display: flex; flex-direction: column; }
1369
- .aa-stat-list__row {
1370
- display: flex; justify-content: space-between; align-items: center;
1371
- font-size: var(--text-xs);
1372
- padding: 8px 0;
1373
- border-bottom: 1px dashed var(--border-subtle);
1374
- }
1375
- .aa-stat-list__row:last-child { border-bottom: none; }
1376
- .aa-stat-list__k { color: var(--text-tertiary); }
1377
- .aa-stat-list__v { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
1378
-
1379
- /* Helpers */
1380
- .aa-flex { display: flex; align-items: center; gap: 8px; }
1381
- .aa-between { justify-content: space-between; }
1382
- .aa-stack { display: flex; flex-direction: column; }
1383
- .aa-row { display: flex; flex-direction: row; align-items: center; }
1384
- .aa-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
1385
- .aa-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
1386
- .aa-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
1387
- .aa-w-full { width: 100%; }
1388
- .aa-divider { height: 1px; background: var(--border-default); border: 0; margin: var(--space-6) 0; }
1389
- .aa-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
1390
-
1391
- /* Icon utility — Lucide-compatible */
1392
- .aa-icon { width: 18px; height: 18px; stroke: currentColor; fill: none; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; flex: none; }
1393
- .aa-icon--sm { width: 14px; height: 14px; }
1394
- .aa-icon--lg { width: 22px; height: 22px; }
1395
- .aa-icon--xl { width: 32px; height: 32px; stroke-width: 1.5; }
1396
-
1397
- /* =====================================================================
1398
- POKÉDEX LAYER (.dex-*)
1399
- Replaces every inline style={{…}} from the HTML prototype — native
1400
- (jinja) routes can't use React style objects, so dynamic values arrive
1401
- as loader-computed style strings and everything else is a class here.
1402
- ===================================================================== */
1403
-
1404
- /* layout helpers (were inline in the prototype <style>) */
1405
- .grow { flex: 1; min-width: 0; }
1406
- .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1407
- .dex-code {
1408
- font-family: var(--font-mono);
1409
- font-size: 0.85em;
1410
- background: var(--surface-sunken);
1411
- padding: 1px 5px;
1412
- border-radius: var(--radius-xs);
1413
- }
1414
-
1415
- /* sidebar bits */
1416
- .dex-brand-avatar { background: var(--aa-gradient); color: #fff; }
1417
- .dex-user { font-size: var(--text-xs); }
1418
- .dex-user__name { font-weight: 600; color: var(--text-primary); }
1419
- .dex-user__host { color: var(--text-tertiary); }
1420
- .dex-crumb__root { color: var(--text-tertiary); }
1421
- .dex-crumb__sep { color: var(--text-muted); }
1422
- .dex-note { margin-bottom: 18px; }
1423
-
1424
- /* list grid + card */
1425
- .dex-grid {
1426
- display: grid;
1427
- grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
1428
- gap: 16px;
1429
- }
1430
- .dex-card {
1431
- padding: 0;
1432
- text-align: left;
1433
- display: flex;
1434
- flex-direction: column;
1435
- text-decoration: none;
1436
- color: inherit;
1437
- border: 1px solid var(--border-subtle);
1438
- }
1439
- .dex-card:hover { text-decoration: none; }
1440
- .dex-card__art {
1441
- position: relative;
1442
- aspect-ratio: 1 / 1;
1443
- background: var(--surface-sunken);
1444
- display: grid;
1445
- place-items: center;
1446
- overflow: hidden;
1447
- }
1448
- .dex-card__num {
1449
- position: absolute;
1450
- top: 10px;
1451
- left: 12px;
1452
- font-family: var(--font-mono);
1453
- font-size: var(--text-2xs);
1454
- font-weight: 600;
1455
- color: var(--text-muted);
1456
- font-variant-numeric: tabular-nums;
1457
- z-index: 1;
1458
- }
1459
- .dex-card__img {
1460
- width: 72%;
1461
- height: 72%;
1462
- object-fit: contain;
1463
- filter: drop-shadow(0 6px 10px rgba(0, 0, 0, 0.35));
1464
- }
1465
- .dex-card__body {
1466
- padding: 10px 14px 13px;
1467
- font-family: var(--font-display);
1468
- font-weight: 800;
1469
- font-size: var(--text-md);
1470
- color: var(--text-primary);
1471
- line-height: 1.2;
1472
- }
1473
-
1474
- /* pagination */
1475
- .dex-pager {
1476
- display: flex;
1477
- align-items: center;
1478
- justify-content: space-between;
1479
- margin-top: 24px;
1480
- gap: 12px;
1481
- flex-wrap: wrap;
1482
- }
1483
- .dex-pager__info { font-size: var(--text-xs); color: var(--text-tertiary); }
1484
- .dex-pager__nav { display: flex; gap: 8px; align-items: center; }
1485
- .dex-pager__page {
1486
- font-family: var(--font-mono);
1487
- font-size: var(--text-xs);
1488
- color: var(--text-secondary);
1489
- padding: 0 6px;
1490
- font-variant-numeric: tabular-nums;
1491
- }
1492
- .dex-pager__btn--off { opacity: 0.5; pointer-events: none; }
1493
-
1494
- /* detail */
1495
- .dex-back { margin-bottom: 16px; padding-left: 6px; }
1496
- .dex-detail-grid {
1497
- display: grid;
1498
- grid-template-columns: minmax(0, 380px) 1fr;
1499
- gap: 16px;
1500
- align-items: start;
1501
- }
1502
- .dex-detail-right { display: flex; flex-direction: column; gap: 16px; }
1503
- @media (max-width: 880px) {
1504
- .dex-detail-grid { grid-template-columns: 1fr; }
1505
- }
1506
-
1507
- .dex-hero { overflow: hidden; border: 1px solid var(--border-subtle); padding: 28px 24px 24px; }
1508
- .dex-hero__num {
1509
- font-family: var(--font-mono);
1510
- font-size: var(--text-sm);
1511
- font-weight: 600;
1512
- color: var(--text-tertiary);
1513
- font-variant-numeric: tabular-nums;
1514
- }
1515
- .dex-hero__name {
1516
- font-family: var(--font-display);
1517
- font-weight: 900;
1518
- font-size: var(--text-4xl);
1519
- margin: 2px 0 4px;
1520
- letter-spacing: var(--tracking-tight);
1521
- color: var(--text-primary);
1522
- }
1523
- .dex-hero__genus { font-size: var(--text-sm); color: var(--text-secondary); font-weight: 500; }
1524
- .dex-hero__art { display: grid; place-items: center; padding: 14px 0 6px; }
1525
- .dex-hero__img { width: min(260px, 70%); filter: drop-shadow(0 14px 22px rgba(0, 0, 0, 0.4)); }
1526
- .dex-hero__types { display: flex; gap: 8px; justify-content: center; margin: 0 0 16px; }
1527
-
1528
- /* type badge */
1529
- .dex-type {
1530
- display: inline-flex;
1531
- align-items: center;
1532
- padding: 4px 12px;
1533
- border-radius: var(--radius-pill);
1534
- font-family: var(--font-body);
1535
- font-weight: 700;
1536
- font-size: var(--text-2xs);
1537
- letter-spacing: 0.04em;
1538
- text-transform: uppercase;
1539
- color: #fff;
1540
- }
1541
- .dex-type--sm { padding: 2px 9px; font-size: var(--text-3xs); }
1542
-
1543
- /* measures + abilities + flavor */
1544
- .dex-flavor { margin: 0; font-size: var(--text-md); line-height: 1.6; color: var(--text-secondary); }
1545
- .dex-measures { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; margin-top: 18px; }
1546
- .dex-measure { background: var(--surface-sunken); border-radius: var(--radius-md); padding: 11px 12px; text-align: center; }
1547
- .dex-measure__v {
1548
- font-family: var(--font-display);
1549
- font-weight: 800;
1550
- font-size: var(--text-base);
1551
- color: var(--text-primary);
1552
- font-variant-numeric: tabular-nums;
1553
- }
1554
- .dex-measure__k {
1555
- font-size: var(--text-3xs);
1556
- color: var(--text-tertiary);
1557
- text-transform: uppercase;
1558
- letter-spacing: 0.06em;
1559
- font-weight: 600;
1560
- margin-top: 2px;
1561
- }
1562
- .dex-abilities { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 14px; }
1563
-
1564
- /* base stats */
1565
- .dex-stats { margin: 0; border: 1px solid var(--border-subtle); }
1566
- .dex-stats__total { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-tertiary); }
1567
- .dex-stats__body { display: flex; flex-direction: column; gap: 11px; }
1568
- .dex-statbar { display: grid; grid-template-columns: 52px 38px 1fr; align-items: center; gap: 12px; }
1569
- .dex-statbar__label {
1570
- font-size: var(--text-3xs);
1571
- font-weight: 700;
1572
- color: var(--text-tertiary);
1573
- text-transform: uppercase;
1574
- letter-spacing: 0.06em;
1575
- }
1576
- .dex-statbar__val {
1577
- font-family: var(--font-mono);
1578
- font-size: var(--text-xs);
1579
- font-weight: 600;
1580
- color: var(--text-primary);
1581
- font-variant-numeric: tabular-nums;
1582
- text-align: right;
1583
- }
1584
- .dex-statbar__track { height: 6px; background: var(--ink-100); border-radius: var(--radius-pill); overflow: hidden; }
1585
- .dex-statbar__fill { height: 100%; border-radius: var(--radius-pill); }
1586
- .dex-statbar__fill--hi { background: var(--success-500); }
1587
- .dex-statbar__fill--mid { background: var(--primary-500); }
1588
- .dex-statbar__fill--low { background: var(--warning-500); }
1589
- .dex-statbar__fill--min { background: var(--danger-500); }
1590
-
1591
- /* evolution chain */
1592
- .dex-evo { margin-top: 16px; border: 1px solid var(--border-subtle); }
1593
- .dex-evo__body { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: center; }
1594
- .dex-evo__stage { display: flex; align-items: center; gap: 8px; }
1595
- .dex-evo__sep { display: flex; flex-direction: column; align-items: center; gap: 2px; color: var(--text-muted); }
1596
- .dex-evo__arrow { font-size: 20px; line-height: 1; }
1597
- .dex-evo__lv { font-size: var(--text-3xs); font-weight: 700; color: var(--text-tertiary); }
1598
- .dex-evo__card {
1599
- padding: 14px 10px 11px;
1600
- width: 124px;
1601
- text-align: center;
1602
- border: 1px solid var(--border-subtle);
1603
- border-radius: var(--radius-lg);
1604
- background: var(--surface-raised);
1605
- text-decoration: none;
1606
- color: inherit;
1607
- display: block;
1608
- }
1609
- .dex-evo__card:hover { text-decoration: none; box-shadow: var(--shadow-md); }
1610
- .dex-evo__card--current { border: 1.5px solid var(--primary-500); background: var(--primary-50); }
1611
- .dex-evo__img { width: 72px; height: 72px; object-fit: contain; margin: 0 auto; }
1612
- .dex-evo__num { font-family: var(--font-mono); font-size: var(--text-3xs); color: var(--text-tertiary); margin-top: 4px; }
1613
- .dex-evo__name { font-weight: 700; font-size: var(--text-xs); color: var(--text-primary); }
1614
-
1615
- /* type chart (flat CSS grid) */
1616
- .dex-tc-legend { display: flex; gap: 18px; flex-wrap: wrap; margin-bottom: 16px; font-size: var(--text-xs); color: var(--text-secondary); }
1617
- .dex-tc-legend__item { display: inline-flex; align-items: center; gap: 6px; }
1618
- .dex-tc-scroll { overflow-x: auto; border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); background: var(--surface-raised); }
1619
- .dex-tc { display: grid; grid-template-columns: 58px repeat(18, minmax(30px, 1fr)); min-width: 700px; }
1620
- .dex-tc__row { display: contents; }
1621
- .dex-tc__corner {
1622
- font-size: 8px;
1623
- font-weight: 700;
1624
- color: var(--text-muted);
1625
- display: grid;
1626
- place-items: center;
1627
- padding: 4px;
1628
- text-align: center;
1629
- border-bottom: 1px solid var(--border-default);
1630
- border-right: 1px solid var(--border-default);
1631
- background: var(--ink-25);
1632
- }
1633
- .dex-tc__colhead, .dex-tc__rowhead {
1634
- font-size: var(--text-3xs);
1635
- font-weight: 800;
1636
- color: #fff;
1637
- display: grid;
1638
- place-items: center;
1639
- padding: 5px 2px;
1640
- text-transform: uppercase;
1641
- letter-spacing: 0.02em;
1642
- }
1643
- .dex-tc__cell {
1644
- display: grid;
1645
- place-items: center;
1646
- padding: 6px 2px;
1647
- min-height: 30px;
1648
- font-size: var(--text-2xs);
1649
- font-weight: 700;
1650
- border-bottom: 1px solid var(--border-subtle);
1651
- border-right: 1px solid var(--border-subtle);
1652
- color: var(--text-muted);
1653
- font-variant-numeric: tabular-nums;
1654
- }
1655
- .dex-tc__cell--super { background: var(--success-50); color: var(--success-700); }
1656
- .dex-tc__cell--weak { background: var(--danger-50); color: var(--danger-700); }
1657
- .dex-tc__cell--none { background: var(--ink-100); color: var(--text-muted); }
1658
- .dex-tc__swatch { min-height: auto; width: 22px; height: 22px; border-radius: 4px; border: none; }
1659
- [data-mode="dark"] .dex-tc__cell--super { color: #6BD9A4; }
1660
- [data-mode="dark"] .dex-tc__cell--weak { color: #F195B2; }
1661
-
1662
- /* not found */
1663
- .dex-notfound { display: grid; place-items: center; padding: 80px 20px; text-align: center; }
1664
- .dex-notfound__code { font-family: var(--font-display); font-weight: 900; font-size: var(--text-5xl); color: var(--ink-200); }
1665
- .dex-notfound__desc { color: var(--text-tertiary); font-size: var(--text-sm); margin-top: 8px; max-width: 420px; }
1666
-
1667
- /* per-type colours — keep in sync with lib/pokeapi.ts TYPE_COLOR (S5.4) */
1668
- .dex-type--normal, .dex-tc__colhead--normal, .dex-tc__rowhead--normal { background: var(--ink-400); }
1669
- .dex-type--fire, .dex-tc__colhead--fire, .dex-tc__rowhead--fire { background: var(--magenta-500); }
1670
- .dex-type--water, .dex-tc__colhead--water, .dex-tc__rowhead--water { background: var(--blue-500); }
1671
- .dex-type--grass, .dex-tc__colhead--grass, .dex-tc__rowhead--grass { background: var(--success-500); }
1672
- .dex-type--electric, .dex-tc__colhead--electric, .dex-tc__rowhead--electric { background: var(--warning-500); }
1673
- .dex-type--ice, .dex-tc__colhead--ice, .dex-tc__rowhead--ice { background: var(--viz-4); }
1674
- .dex-type--fighting, .dex-tc__colhead--fighting, .dex-tc__rowhead--fighting { background: var(--viz-3); }
1675
- .dex-type--poison, .dex-tc__colhead--poison, .dex-tc__rowhead--poison { background: var(--purple-600); }
1676
- .dex-type--ground, .dex-tc__colhead--ground, .dex-tc__rowhead--ground { background: var(--viz-7); }
1677
- .dex-type--flying, .dex-tc__colhead--flying, .dex-tc__rowhead--flying { background: var(--viz-5); }
1678
- .dex-type--psychic, .dex-tc__colhead--psychic, .dex-tc__rowhead--psychic { background: var(--purple-500); }
1679
- .dex-type--bug, .dex-tc__colhead--bug, .dex-tc__rowhead--bug { background: var(--viz-8); }
1680
- .dex-type--rock, .dex-tc__colhead--rock, .dex-tc__rowhead--rock { background: var(--ink-500); }
1681
- .dex-type--ghost, .dex-tc__colhead--ghost, .dex-tc__rowhead--ghost { background: var(--purple-700); }
1682
- .dex-type--dragon, .dex-tc__colhead--dragon, .dex-tc__rowhead--dragon { background: var(--viz-2); }
1683
- .dex-type--dark, .dex-tc__colhead--dark, .dex-tc__rowhead--dark { background: var(--ink-800); }
1684
- .dex-type--steel, .dex-tc__colhead--steel, .dex-tc__rowhead--steel { background: var(--ink-400); }
1685
- .dex-type--fairy, .dex-tc__colhead--fairy, .dex-tc__rowhead--fairy { background: var(--magenta-300); }
1686
-
1687
- .dex-hide { display: none !important; }
1688
-
1689
- /* ----------------------------------------------------------------------------
1690
- * SPA navigation preloader — a top progress bar rendered by the NavPreloader
1691
- * React ISLAND (components/NavPreloader.tsx) while brustjs/navigation reports
1692
- * phase === 'loading'. The island reads the nav store via useNav() and mounts
1693
- * this bar only during a navigation; the bar is fixed so it escapes the .aa-app
1694
- * grid and sits above the sticky topbar (z-index:10).
1695
- * ------------------------------------------------------------------------- */
1696
- .nav-preloader {
1697
- position: fixed;
1698
- inset: 0 0 auto 0;
1699
- height: 3px;
1700
- z-index: 9999;
1701
- overflow: hidden;
1702
- pointer-events: none;
1703
- }
1704
- .nav-preloader__bar {
1705
- height: 100%;
1706
- width: 40%;
1707
- background: var(--aa-gradient, #1B75BB);
1708
- animation: nav-preloader-slide 0.9s ease-in-out infinite;
1709
- }
1710
- @keyframes nav-preloader-slide {
1711
- from { transform: translateX(-110%); }
1712
- to { transform: translateX(360%); }
1
+ @import "tailwindcss";
2
+ @source "./**/*.{tsx,ts}";
3
+ @custom-variant dark (&:where([data-mode="dark"], [data-mode="dark"] *));
4
+ @theme {
5
+ --color-brand-50: oklch(0.97 0.02 264);
6
+ --color-brand-500: oklch(0.55 0.20 264);
7
+ --color-brand-600: oklch(0.49 0.20 264);
8
+ --color-brand-700: oklch(0.43 0.19 264);
1713
9
  }