brustjs 0.1.16-alpha → 0.1.18-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.
@@ -0,0 +1,1686 @@
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: dark-mode only. The design's [data-mode="dark"] selectors are
6
+ rewritten to .dark, set via <BrustPage className="dark"> (BrustPage
7
+ only sets <html class>, not arbitrary data-* attrs — see GAPS S8).
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
+ .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
+ .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
+ .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
+ .dark .aa-badge--success { color: #6BD9A4; }
819
+ .dark .aa-badge--warning { color: #F0C76A; }
820
+ .dark .aa-badge--danger { color: #F195B2; }
821
+ .dark .aa-badge--info { color: #7BB6E2; }
822
+ .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
+ .dark .aa-pill--ok { color: #6BD9A4; }
847
+ .dark .aa-pill--warn { color: #F0C76A; }
848
+ .dark .aa-pill--err { color: #F195B2; }
849
+ .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
+ .dark .aa-tab[aria-selected="true"],
907
+ .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
+ .dark .aa-alert--info { color: #9DC4E6; }
951
+ .dark .aa-alert--success { color: #93D6B0; }
952
+ .dark .aa-alert--warning { color: #EFCC74; }
953
+ .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
+ .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
+ .dark .aa-kpi__delta--up { color: #6BD9A4; }
1031
+ .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
+ .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
+ .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
+ .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
+ .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__corner {
1621
+ font-size: 8px;
1622
+ font-weight: 700;
1623
+ color: var(--text-muted);
1624
+ display: grid;
1625
+ place-items: center;
1626
+ padding: 4px;
1627
+ text-align: center;
1628
+ border-bottom: 1px solid var(--border-default);
1629
+ border-right: 1px solid var(--border-default);
1630
+ background: var(--ink-25);
1631
+ }
1632
+ .dex-tc__colhead, .dex-tc__rowhead {
1633
+ font-size: var(--text-3xs);
1634
+ font-weight: 800;
1635
+ color: #fff;
1636
+ display: grid;
1637
+ place-items: center;
1638
+ padding: 5px 2px;
1639
+ text-transform: uppercase;
1640
+ letter-spacing: 0.02em;
1641
+ }
1642
+ .dex-tc__cell {
1643
+ display: grid;
1644
+ place-items: center;
1645
+ padding: 6px 2px;
1646
+ min-height: 30px;
1647
+ font-size: var(--text-2xs);
1648
+ font-weight: 700;
1649
+ border-bottom: 1px solid var(--border-subtle);
1650
+ border-right: 1px solid var(--border-subtle);
1651
+ color: var(--text-muted);
1652
+ font-variant-numeric: tabular-nums;
1653
+ }
1654
+ .dex-tc__cell--super { background: var(--success-50); color: var(--success-700); }
1655
+ .dex-tc__cell--weak { background: var(--danger-50); color: var(--danger-700); }
1656
+ .dex-tc__cell--none { background: var(--ink-100); color: var(--text-muted); }
1657
+ .dex-tc__swatch { min-height: auto; width: 22px; height: 22px; border-radius: 4px; border: none; }
1658
+ .dark .dex-tc__cell--super { color: #6BD9A4; }
1659
+ .dark .dex-tc__cell--weak { color: #F195B2; }
1660
+
1661
+ /* not found */
1662
+ .dex-notfound { display: grid; place-items: center; padding: 80px 20px; text-align: center; }
1663
+ .dex-notfound__code { font-family: var(--font-display); font-weight: 900; font-size: var(--text-5xl); color: var(--ink-200); }
1664
+ .dex-notfound__desc { color: var(--text-tertiary); font-size: var(--text-sm); margin-top: 8px; max-width: 420px; }
1665
+
1666
+ /* per-type colours — keep in sync with lib/pokeapi.ts TYPE_COLOR (S5.4) */
1667
+ .dex-type--normal, .dex-tc__colhead--normal, .dex-tc__rowhead--normal { background: var(--ink-400); }
1668
+ .dex-type--fire, .dex-tc__colhead--fire, .dex-tc__rowhead--fire { background: var(--magenta-500); }
1669
+ .dex-type--water, .dex-tc__colhead--water, .dex-tc__rowhead--water { background: var(--blue-500); }
1670
+ .dex-type--grass, .dex-tc__colhead--grass, .dex-tc__rowhead--grass { background: var(--success-500); }
1671
+ .dex-type--electric, .dex-tc__colhead--electric, .dex-tc__rowhead--electric { background: var(--warning-500); }
1672
+ .dex-type--ice, .dex-tc__colhead--ice, .dex-tc__rowhead--ice { background: var(--viz-4); }
1673
+ .dex-type--fighting, .dex-tc__colhead--fighting, .dex-tc__rowhead--fighting { background: var(--viz-3); }
1674
+ .dex-type--poison, .dex-tc__colhead--poison, .dex-tc__rowhead--poison { background: var(--purple-600); }
1675
+ .dex-type--ground, .dex-tc__colhead--ground, .dex-tc__rowhead--ground { background: var(--viz-7); }
1676
+ .dex-type--flying, .dex-tc__colhead--flying, .dex-tc__rowhead--flying { background: var(--viz-5); }
1677
+ .dex-type--psychic, .dex-tc__colhead--psychic, .dex-tc__rowhead--psychic { background: var(--purple-500); }
1678
+ .dex-type--bug, .dex-tc__colhead--bug, .dex-tc__rowhead--bug { background: var(--viz-8); }
1679
+ .dex-type--rock, .dex-tc__colhead--rock, .dex-tc__rowhead--rock { background: var(--ink-500); }
1680
+ .dex-type--ghost, .dex-tc__colhead--ghost, .dex-tc__rowhead--ghost { background: var(--purple-700); }
1681
+ .dex-type--dragon, .dex-tc__colhead--dragon, .dex-tc__rowhead--dragon { background: var(--viz-2); }
1682
+ .dex-type--dark, .dex-tc__colhead--dark, .dex-tc__rowhead--dark { background: var(--ink-800); }
1683
+ .dex-type--steel, .dex-tc__colhead--steel, .dex-tc__rowhead--steel { background: var(--ink-400); }
1684
+ .dex-type--fairy, .dex-tc__colhead--fairy, .dex-tc__rowhead--fairy { background: var(--magenta-300); }
1685
+
1686
+ .dex-hide { display: none !important; }