@lagroon/inkwell-design-system 0.1.2

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,5160 @@
1
+ /* Inkwell design system — bundled styles. Generated by scripts/bundle-css.mjs. */
2
+ /* Generated from tokens/inkwell.tokens.json — do not edit by hand. Run: npm run tokens */
3
+
4
+ :root {
5
+ /* Ink scale — dark backgrounds and surfaces */
6
+ --ink-950: #040404;
7
+ --ink-940: #090909;
8
+ --ink-930: #0a0a0a;
9
+ --ink-900: #0d0d0d;
10
+ --ink-880: #101010;
11
+ --ink-850: #151515;
12
+
13
+ /* Cream scale — warm light text */
14
+ --cream-97: #fbf5ec;
15
+ --cream-95: #f4ede2;
16
+
17
+ /* Zinc — neutral secondary text */
18
+ --zinc-600: #a1a1aa;
19
+
20
+ /* Crimson — brand */
21
+ --crimson-900: #73000a;
22
+ --crimson-800: #940010;
23
+ --crimson-600: #c83f4a;
24
+
25
+ /* Steel — info / focus */
26
+ --steel-400: #6f8fb5;
27
+
28
+ /* Sage — success */
29
+ --sage-400: #7ab089;
30
+
31
+ /* Coral — danger */
32
+ --coral-500: #d56d57;
33
+ --coral-200: #ffb6a7;
34
+
35
+ /* Amber — warning */
36
+ --amber-400: #cfae43;
37
+
38
+ /* Alpha scales — overlays and borders (rgba literals; cannot reference other vars) */
39
+ --white-a3: rgba(255, 255, 255, 0.03);
40
+ --white-a5: rgba(255, 255, 255, 0.05);
41
+ --cream-a7: rgba(255, 238, 223, 0.07);
42
+ --cream-a8: rgba(255, 238, 223, 0.08);
43
+ --cream-a12: rgba(255, 238, 223, 0.12);
44
+ --cream-a16: rgba(255, 238, 223, 0.16);
45
+ --cream-a28: rgba(255, 238, 223, 0.28);
46
+ --steel-a20: rgba(111, 143, 181, 0.20);
47
+ --steel-a22: rgba(111, 143, 181, 0.22);
48
+ --steel-a30: rgba(111, 143, 181, 0.30);
49
+ --steel-a72: rgba(111, 143, 181, 0.72);
50
+ --black-a58: rgba(0, 0, 0, 0.58);
51
+
52
+ /* Typography — Tier 0: raw scale */
53
+ --font-size-2xs: 0.62rem;
54
+ --font-size-xs: 0.72rem;
55
+ --font-size-sm: 0.78rem;
56
+ --font-size-base: 0.84rem;
57
+ --font-size-md: 0.9rem;
58
+ --font-size-lg: 1.08rem;
59
+ --font-size-xl: 1.28rem;
60
+ --font-size-2xl: 1.55rem;
61
+ --font-size-3xl: 1.65rem;
62
+
63
+ /* Typography — Tier 1: semantic */
64
+ --font-size-badge: var(--font-size-2xs);
65
+ --font-size-caption: var(--font-size-xs);
66
+ --font-size-label-sm: var(--font-size-sm);
67
+ --font-size-label: var(--font-size-base);
68
+ --font-size-body: var(--font-size-md);
69
+ --font-size-heading-sm: var(--font-size-lg);
70
+ --font-size-heading: var(--font-size-xl);
71
+ --font-size-display: var(--font-size-2xl);
72
+ --font-size-rank: var(--font-size-3xl);
73
+
74
+ /* Font weight — Tier 0: raw scale */
75
+ --font-weight-regular: 400;
76
+ --font-weight-medium: 500;
77
+ --font-weight-semibold: 600;
78
+ --font-weight-bold: 700;
79
+ --font-weight-extrabold: 800;
80
+
81
+ /* Font weight — Tier 1: semantic */
82
+ --font-weight-label: var(--font-weight-semibold);
83
+ --font-weight-ui: var(--font-weight-bold);
84
+ --font-weight-display: var(--font-weight-extrabold);
85
+
86
+ /* Line height */
87
+ --line-height-none: 0;
88
+ --line-height-tight: 1;
89
+ --line-height-compact: 1.1;
90
+ --line-height-display: 1.05;
91
+ --line-height-heading: 1.2;
92
+ --line-height-label: 1.3;
93
+ --line-height-body: 1.5;
94
+
95
+ /* Motion */
96
+ --duration-fast: 120ms;
97
+ --duration-medium: 140ms;
98
+ --ease-default: ease;
99
+
100
+ /* Z-index layers */
101
+ --z-raised: 1;
102
+ --z-tooltip: 20;
103
+ --z-sticky: 30;
104
+ --z-nav: 35;
105
+ --z-overlay: 40;
106
+ --z-float: 50;
107
+ --z-modal-front: 60;
108
+ --z-modal-host: 80;
109
+
110
+ /* Spacing — extended steps */
111
+ --space-0-5: 2px;
112
+ --space-7: 28px;
113
+ --space-8: 32px;
114
+ --space-10: 40px;
115
+ --space-11: 44px;
116
+ --space-12: 48px;
117
+ --space-14: 56px;
118
+ --space-15: 60px;
119
+
120
+ /* Legacy aliases */
121
+ --shadow: 0 22px 54px rgba(0, 0, 0, 0.34);
122
+ --space-1: 4px;
123
+ --space-2: 8px;
124
+ --space-3: 12px;
125
+ --space-4: 16px;
126
+ --space-5: 20px;
127
+ --space-6: 24px;
128
+ --radius-none: 0;
129
+ --radius-sharp: 2px;
130
+ --radius-rounded: 12px;
131
+ --radius-pill: 999px;
132
+ --radius-device-frame: 28px;
133
+ --radius-dialog-prominent: 18px;
134
+ --radius-sheet-top: 2px 2px 0 0;
135
+ --mobile-nav-height: 64px;
136
+ --chevron-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9' fill='none'%3E%3Cpath d='M2 2.25L7 7L12 2.25' stroke='%23A1A1AA' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
137
+ --search-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a1a1aa' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='10' r='7'/%3E%3Cline x1='15' y1='15' x2='21' y2='21'/%3E%3C/svg%3E");
138
+ }
139
+
140
+ :root,
141
+ [data-theme="dark"] {
142
+ /* Tier 1: semantic tokens */
143
+ --color-bg-base: var(--ink-950);
144
+ --color-bg-canvas-alt: var(--ink-940);
145
+ --color-bg-canvas: var(--ink-930);
146
+ --color-surface-default: var(--ink-900);
147
+ --color-surface-raised: var(--ink-880);
148
+ --color-surface-active: var(--ink-850);
149
+ --color-text-primary: var(--cream-95);
150
+ --color-text-strong: var(--cream-97);
151
+ --color-text-secondary: var(--zinc-600);
152
+ --color-text-inverse: var(--ink-930);
153
+ --color-border-subtle: var(--cream-a8);
154
+ --color-border-default: var(--cream-a12);
155
+ --color-border-strong: var(--cream-a16);
156
+ --color-border-interactive: var(--cream-a28);
157
+ --color-overlay-soft: var(--white-a3);
158
+ --color-overlay-strong: var(--white-a5);
159
+ --color-hover-surface: var(--cream-a7);
160
+ --color-scrim: var(--black-a58);
161
+ --color-brand: var(--crimson-900);
162
+ --color-brand-hover: var(--crimson-800);
163
+ --color-brand-emphasis: var(--crimson-600);
164
+ --color-info: var(--steel-400);
165
+ --color-success: var(--sage-400);
166
+ --color-danger: var(--coral-500);
167
+ --color-danger-text: var(--coral-200);
168
+ --color-warning: var(--amber-400);
169
+ --color-focus-outline-soft: var(--steel-a22);
170
+ --color-focus-outline: var(--steel-a30);
171
+ --color-focus-ring: var(--steel-a72);
172
+ --color-brand-soft: color-mix(in srgb, var(--crimson-900) 18%, transparent);
173
+ --color-success-soft: color-mix(in srgb, var(--sage-400) 16%, transparent);
174
+ --color-warning-soft: color-mix(in srgb, var(--amber-400) 14%, transparent);
175
+ --color-danger-soft: color-mix(in srgb, var(--coral-500) 18%, transparent);
176
+ --color-info-soft: var(--steel-a20);
177
+
178
+ /* Tier 3: component tokens */
179
+ --button-primary-bg: var(--color-brand);
180
+ --button-primary-bg-hover: var(--color-brand-hover);
181
+ --button-primary-fg: var(--color-text-strong);
182
+ --button-secondary-bg: var(--color-overlay-soft);
183
+ --button-secondary-fg: var(--color-text-primary);
184
+ --button-secondary-border: var(--color-border-strong);
185
+ --button-danger-fg: var(--color-text-strong);
186
+ --nav-active-bg: var(--color-text-strong);
187
+ --nav-active-fg: var(--color-text-inverse);
188
+ --control-surface: var(--color-surface-raised);
189
+ --control-surface-active: var(--color-surface-active);
190
+ --control-overlay: var(--color-overlay-soft);
191
+ --control-overlay-strong: var(--color-overlay-strong);
192
+ --control-border: var(--color-border-default);
193
+ --control-border-strong: var(--color-border-strong);
194
+ --control-border-hover: var(--color-border-interactive);
195
+ --input-bg: var(--color-overlay-soft);
196
+ --input-border: var(--color-border-strong);
197
+ --input-focus-border: var(--color-info);
198
+ --modal-surface: var(--color-surface-raised);
199
+ --modal-border: var(--color-border-default);
200
+ --modal-scrim: var(--color-scrim);
201
+ --status-success-bg: var(--color-success-soft);
202
+ --status-success-fg: var(--color-success);
203
+ --status-warning-bg: var(--color-warning-soft);
204
+ --status-warning-fg: var(--color-warning);
205
+ --status-danger-bg: var(--color-danger-soft);
206
+ --status-danger-fg: var(--color-danger-text);
207
+ --toast-success-border: rgba(122, 176, 137, 0.32);
208
+ --toast-danger-border: rgba(198, 93, 52, 0.32);
209
+ --toast-warning-border: rgba(216, 166, 75, 0.34);
210
+ --preview-chrome-highlight: rgba(255, 238, 223, 0.02);
211
+ --preview-chrome-sheen: rgba(255, 255, 255, 0.035);
212
+ --notification-dot-bg: var(--color-brand);
213
+
214
+ /* Tier 3 continued: card, popover, banner, toast surface, pill, rank */
215
+ --color-surface-panel: color-mix(in srgb, var(--steel-400) 8%, var(--color-bg-canvas));
216
+ --card-surface: var(--color-surface-raised);
217
+ --card-border: var(--color-border-subtle);
218
+ --popover-surface: var(--color-surface-raised);
219
+ --popover-border: var(--color-border-default);
220
+ --popover-shadow: 0 18px 40px rgba(0, 0, 0, 0.38);
221
+ --banner-radius: var(--radius-sharp);
222
+ --banner-padding: 14px 16px;
223
+ --toast-bg: var(--color-surface-default);
224
+ --toast-fg: var(--color-text-primary);
225
+ --toast-border-success: var(--toast-success-border);
226
+ --toast-border-danger: var(--toast-danger-border);
227
+ --toast-border-warning: var(--toast-warning-border);
228
+ --pill-success-fg: var(--color-success);
229
+ --pill-warning-fg: var(--color-warning);
230
+ --pill-danger-fg: var(--color-danger-text);
231
+ --rank-accent: var(--color-brand);
232
+ --slot-bg: var(--color-overlay-soft);
233
+ --slot-bg-filled: var(--color-overlay-strong);
234
+ --nav-mobile-bg: rgba(13, 13, 13, 0.96);
235
+ --menu-item-bg-hover: var(--color-overlay-strong);
236
+ --menu-item-danger-hover: var(--color-danger-soft);
237
+ --selector-active-bg: var(--color-overlay-soft);
238
+ --selector-active-accent: var(--color-brand);
239
+
240
+ /* Legacy aliases */
241
+ --bg: var(--color-bg-base);
242
+ --surface: var(--color-surface-default);
243
+ --surface-strong: var(--color-surface-active);
244
+ --surface-soft: var(--color-overlay-soft);
245
+ --control-bg: var(--control-overlay);
246
+ --control-bg-strong: var(--control-overlay-strong);
247
+ --text: var(--color-text-primary);
248
+ --muted: var(--color-text-secondary);
249
+ --line: var(--color-border-strong);
250
+ --line-soft: var(--color-border-subtle);
251
+ --accent: var(--color-brand);
252
+ --accent-deep: var(--color-brand-hover);
253
+ --accent-readable: var(--color-brand-emphasis);
254
+ --accent-soft: var(--color-brand-soft);
255
+ --utility: var(--color-info);
256
+ --utility-soft: var(--color-info-soft);
257
+ --green: var(--color-success);
258
+ --danger: var(--color-danger);
259
+ --focus-ring: var(--color-focus-ring);
260
+ --hover-surface: var(--color-hover-surface);
261
+ }
262
+
263
+ /* Design tokens are generated into tokens.css from tokens/inkwell.tokens.json.
264
+ tokens.css is imported before this file (see .storybook/preview.jsx). Run: npm run tokens */
265
+
266
+ * {
267
+ box-sizing: border-box;
268
+ }
269
+
270
+ body {
271
+ margin: 0;
272
+ min-height: 100vh;
273
+ background: var(--color-bg-canvas);
274
+ color: var(--color-text-primary);
275
+ font-family: "Source Sans 3", sans-serif;
276
+ }
277
+
278
+ body.modal-open {
279
+ position: fixed;
280
+ inset: 0;
281
+ width: 100%;
282
+ overflow: hidden;
283
+ overscroll-behavior: none;
284
+ }
285
+
286
+ body[data-preview-mode="tablet"],
287
+ body[data-preview-mode="mobile"] {
288
+ background:
289
+ radial-gradient(circle at top, rgba(111, 143, 181, 0.12), transparent 32%),
290
+ var(--color-bg-canvas-alt);
291
+ }
292
+
293
+ body[data-preview-mode="mobile"] {
294
+ font-size: var(--font-size-md);
295
+ }
296
+
297
+ /* App shell / preview chrome */
298
+ .preview-toolbar {
299
+ position: sticky;
300
+ top: 0;
301
+ z-index: var(--z-float);
302
+ padding: var(--space-3) var(--space-4) 0;
303
+ }
304
+
305
+ .preview-toolbar-shell {
306
+ width: min(1220px, calc(100% - 32px));
307
+ display: flex;
308
+ align-items: center;
309
+ justify-content: space-between;
310
+ gap: var(--space-4);
311
+ margin: 0 auto;
312
+ padding: var(--space-3);
313
+ border: 1px solid var(--color-border-subtle);
314
+ border-radius: var(--radius-rounded);
315
+ background: color-mix(in srgb, var(--color-surface-raised) 92%, transparent);
316
+ box-shadow: var(--shadow);
317
+ backdrop-filter: blur(12px);
318
+ }
319
+
320
+ .preview-toolbar-copy {
321
+ display: grid;
322
+ gap: var(--space-0-5);
323
+ min-width: 0;
324
+ }
325
+
326
+ .preview-toolbar-copy strong {
327
+ font-family: "League Spartan", sans-serif;
328
+ }
329
+
330
+ .preview-toolbar-copy span {
331
+ color: var(--muted);
332
+ font-size: var(--font-size-md);
333
+ }
334
+
335
+ .preview-mode-group {
336
+ display: inline-flex;
337
+ align-items: center;
338
+ gap: var(--space-2);
339
+ flex-wrap: wrap;
340
+ }
341
+
342
+ .preview-mode-button {
343
+ cursor: pointer;
344
+ min-height: 38px;
345
+ padding: var(--space-2) var(--space-3);
346
+ border: 1px solid var(--color-border-strong);
347
+ border-radius: var(--radius-pill);
348
+ background: var(--control-surface);
349
+ color: var(--color-text-secondary);
350
+ font: inherit;
351
+ font-weight: var(--font-weight-bold);
352
+ }
353
+
354
+ .preview-mode-button.active {
355
+ background: var(--nav-active-bg);
356
+ color: var(--nav-active-fg);
357
+ }
358
+
359
+ .app-frame {
360
+ width: 100%;
361
+ container-type: inline-size;
362
+ container-name: app;
363
+ position: relative;
364
+ }
365
+
366
+ .modal-host {
367
+ position: absolute;
368
+ inset: 0;
369
+ z-index: var(--z-modal-host);
370
+ pointer-events: none;
371
+ }
372
+
373
+ .modal-host > .modal {
374
+ pointer-events: auto;
375
+ }
376
+
377
+ body[data-preview-mode="tablet"] .app-frame,
378
+ body[data-preview-mode="mobile"] .app-frame {
379
+ margin: var(--space-4) auto var(--space-8);
380
+ border: 1px solid color-mix(in srgb, var(--color-border-strong) 62%, transparent);
381
+ border-radius: var(--radius-device-frame);
382
+ overflow: hidden;
383
+ background: var(--color-bg-canvas);
384
+ box-shadow: 0 30px 70px rgba(0, 0, 0, 0.42);
385
+ }
386
+
387
+ body[data-preview-mode="tablet"] .app-frame {
388
+ width: min(768px, calc(100% - 32px));
389
+ max-height: min(1024px, calc(100vh - 120px));
390
+ }
391
+
392
+ body[data-preview-mode="mobile"] .app-frame {
393
+ width: min(390px, calc(100% - 24px));
394
+ height: min(844px, calc(100vh - 108px));
395
+ }
396
+
397
+ body[data-preview-mode="tablet"] .app-frame {
398
+ height: min(1024px, calc(100vh - 120px));
399
+ }
400
+
401
+ body[data-preview-mode="tablet"] .app-frame,
402
+ body[data-preview-mode="mobile"] .app-frame {
403
+ display: flex;
404
+ flex-direction: column;
405
+ }
406
+
407
+ body[data-preview-mode="tablet"] .app-frame::before,
408
+ body[data-preview-mode="mobile"] .app-frame::before {
409
+ content: "";
410
+ display: block;
411
+ flex: 0 0 12px;
412
+ background:
413
+ radial-gradient(circle at center, var(--color-border-strong) 0, var(--preview-chrome-highlight) 52%, transparent 60%),
414
+ linear-gradient(180deg, var(--preview-chrome-sheen), rgba(255, 255, 255, 0));
415
+ }
416
+
417
+ body[data-preview-mode="tablet"] .app-frame > *,
418
+ body[data-preview-mode="mobile"] .app-frame > * {
419
+ min-height: 0;
420
+ }
421
+
422
+ body[data-preview-mode="tablet"] .app-header,
423
+ body[data-preview-mode="mobile"] .app-header {
424
+ flex: 0 0 auto;
425
+ }
426
+
427
+ body[data-preview-mode="tablet"] .page-shell,
428
+ body[data-preview-mode="mobile"] .page-shell {
429
+ flex: 1 1 auto;
430
+ overflow-y: auto;
431
+ overscroll-behavior: contain;
432
+ scrollbar-width: none;
433
+ }
434
+
435
+ body[data-preview-mode="tablet"] .page-shell::-webkit-scrollbar,
436
+ body[data-preview-mode="mobile"] .page-shell::-webkit-scrollbar {
437
+ width: 0;
438
+ height: 0;
439
+ }
440
+
441
+ body[data-preview-mode="tablet"] .page-shell::-webkit-scrollbar-thumb,
442
+ body[data-preview-mode="mobile"] .page-shell::-webkit-scrollbar-thumb {
443
+ border-radius: var(--radius-pill);
444
+ background: color-mix(in srgb, var(--color-border-strong) 100%, transparent);
445
+ }
446
+
447
+ .page-shell {
448
+ width: min(1220px, calc(100% - 32px));
449
+ margin: 0 auto var(--space-10);
450
+ padding-top: var(--space-3);
451
+ display: flex;
452
+ flex-direction: column;
453
+ }
454
+
455
+ .page-shell > main {
456
+ order: 1;
457
+ }
458
+
459
+ .app-header {
460
+ position: sticky;
461
+ top: 0;
462
+ z-index: var(--z-sticky);
463
+ width: 100%;
464
+ margin-bottom: 0;
465
+ padding: 0;
466
+ background: color-mix(in srgb, var(--color-bg-canvas) 96%, transparent);
467
+ backdrop-filter: blur(14px);
468
+ border-bottom: 1px solid var(--color-border-strong);
469
+ }
470
+
471
+ body[data-preview-mode="tablet"] .preview-toolbar,
472
+ body[data-preview-mode="mobile"] .preview-toolbar {
473
+ top: 0;
474
+ }
475
+
476
+ body[data-preview-mode="tablet"] .app-header,
477
+ body[data-preview-mode="mobile"] .app-header {
478
+ top: 0;
479
+ }
480
+
481
+ .inline-actions,
482
+ .card-actions,
483
+ .workspace-meta,
484
+ .ballot-meta,
485
+ .results-meta,
486
+ .danger-actions {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: var(--space-3);
490
+ flex-wrap: wrap;
491
+ }
492
+
493
+ /* Card: padded content surface (see Card component). Borderless + raised by
494
+ default — the app's common look — with a space-3 internal rhythm. `outlined`
495
+ adds a subtle border on the default surface; `danger` flags destructive zones. */
496
+ .card {
497
+ display: flex;
498
+ flex-direction: column;
499
+ gap: var(--space-3);
500
+ padding: var(--space-4);
501
+ border-radius: var(--radius-sharp);
502
+ background: var(--color-surface-raised);
503
+ }
504
+
505
+ .card--outlined {
506
+ border: 1px solid var(--color-border-subtle);
507
+ background: var(--color-surface-default);
508
+ }
509
+
510
+ .card--danger {
511
+ border: 1px solid var(--color-danger-soft);
512
+ }
513
+
514
+ /* Badge: compact count / notification indicator (see Badge component).
515
+ Generalizes the app's nav notification dot; `--dot` is the bare indicator. */
516
+ .badge {
517
+ display: inline-flex;
518
+ align-items: center;
519
+ justify-content: center;
520
+ min-width: 18px;
521
+ height: 18px;
522
+ padding: 0 var(--space-1);
523
+ border-radius: var(--radius-pill);
524
+ font-size: var(--font-size-xs);
525
+ font-weight: var(--font-weight-bold);
526
+ /* line-height matches the badge height so numerals (no descender) sit
527
+ optically centered rather than riding high. */
528
+ line-height: 18px;
529
+ white-space: nowrap;
530
+ background: var(--color-brand);
531
+ color: var(--color-text-strong);
532
+ }
533
+
534
+ .badge--neutral {
535
+ background: var(--color-surface-active);
536
+ color: var(--color-text-secondary);
537
+ }
538
+
539
+ .badge--danger {
540
+ background: var(--color-danger);
541
+ color: var(--color-text-strong);
542
+ }
543
+
544
+ .badge--dot {
545
+ width: 10px;
546
+ min-width: 10px;
547
+ height: 10px;
548
+ padding: 0;
549
+ }
550
+
551
+ /* Tabs: segmented underline tab bar with a sliding indicator (see Tabs
552
+ component). Namespaced ink- to avoid the seeded generic tab classes. */
553
+ .ink-tabs {
554
+ position: relative;
555
+ display: flex;
556
+ gap: var(--space-2);
557
+ border-bottom: 1px solid var(--line);
558
+ }
559
+
560
+ .ink-tab {
561
+ position: relative;
562
+ min-height: 42px;
563
+ padding: var(--space-3) var(--space-4);
564
+ border: 0;
565
+ background: transparent;
566
+ color: var(--button-secondary-fg);
567
+ font: inherit;
568
+ font-weight: var(--font-weight-label);
569
+ white-space: nowrap;
570
+ cursor: pointer;
571
+ }
572
+
573
+ .ink-tab:hover,
574
+ .ink-tab--active {
575
+ color: var(--color-text-strong);
576
+ }
577
+
578
+ .ink-tab:focus-visible {
579
+ outline: 2px solid var(--color-focus-ring);
580
+ outline-offset: -2px;
581
+ border-radius: var(--radius-sharp);
582
+ }
583
+
584
+ .ink-tab:disabled {
585
+ opacity: 0.5;
586
+ cursor: not-allowed;
587
+ }
588
+
589
+ .ink-tab-indicator {
590
+ position: absolute;
591
+ bottom: -1px;
592
+ left: 0;
593
+ height: 2px;
594
+ background: var(--accent);
595
+ border-radius: 1px 1px 0 0;
596
+ transition: transform 200ms ease, width 200ms ease;
597
+ pointer-events: none;
598
+ }
599
+
600
+ /* Collapsible: a disclosure whose whole header is the toggle button. The
601
+ chevron sits in a 36px box that carries the hover-surface fill, so the
602
+ affordance reads as a contained control even though the full row is clickable. */
603
+ .collapsible-trigger {
604
+ display: flex;
605
+ align-items: center;
606
+ gap: var(--space-3);
607
+ width: 100%;
608
+ min-height: 64px;
609
+ padding: var(--space-3) 0;
610
+ border: 0;
611
+ background: transparent;
612
+ color: inherit;
613
+ font: inherit;
614
+ text-align: left;
615
+ cursor: pointer;
616
+ }
617
+
618
+ .collapsible-trigger:focus-visible {
619
+ outline: 2px solid var(--color-focus-ring);
620
+ outline-offset: -2px;
621
+ border-radius: var(--radius-sharp);
622
+ }
623
+
624
+ /* The chevron box mirrors the app's icon-only ghost button (36px square). It
625
+ fills with the shared hover-surface token whenever the row is hovered or
626
+ focused, keeping the visible affordance contained to the chevron. */
627
+ .collapsible-chevron-box {
628
+ flex-shrink: 0;
629
+ display: inline-flex;
630
+ align-items: center;
631
+ justify-content: center;
632
+ width: 36px;
633
+ min-width: 36px;
634
+ height: 36px;
635
+ border-radius: var(--radius-sharp);
636
+ color: var(--text);
637
+ transition: background-color var(--duration-fast) var(--ease-default);
638
+ }
639
+
640
+ .collapsible-trigger:hover .collapsible-chevron-box,
641
+ .collapsible-trigger:focus-visible .collapsible-chevron-box {
642
+ background: var(--hover-surface);
643
+ }
644
+
645
+ /* Opt-in divider: mirrors the app's stacked submission rows, which carry a
646
+ hairline border-bottom on the whole row (below any expanded content). */
647
+ .collapsible--divided {
648
+ border-bottom: 1px solid var(--line-soft);
649
+ }
650
+
651
+ .collapsible-main {
652
+ flex: 1;
653
+ min-width: 0;
654
+ display: grid;
655
+ gap: var(--space-1);
656
+ }
657
+
658
+ .collapsible-main > * {
659
+ overflow: hidden;
660
+ text-overflow: ellipsis;
661
+ white-space: nowrap;
662
+ }
663
+
664
+ .collapsible-meta {
665
+ color: var(--muted);
666
+ white-space: nowrap;
667
+ }
668
+
669
+ .collapsible-chevron {
670
+ color: currentColor;
671
+ transition: transform var(--duration-fast) var(--ease-default);
672
+ }
673
+
674
+ .collapsible-chevron--open {
675
+ transform: rotate(180deg);
676
+ }
677
+
678
+ .collapsible-content {
679
+ padding-bottom: var(--space-3);
680
+ }
681
+
682
+ /* Tooltip: a trigger with a popover shown above it on hover/focus (see Tooltip
683
+ component). Seeded from the app's info tooltip. The reveal is CSS-driven; the
684
+ component adds role="tooltip", aria-describedby, and Escape-to-dismiss. */
685
+ .info-tooltip {
686
+ position: relative;
687
+ display: inline-flex;
688
+ }
689
+
690
+ .info-tooltip-trigger {
691
+ width: 22px;
692
+ height: 22px;
693
+ min-height: 0;
694
+ padding: 0;
695
+ border-radius: var(--radius-pill);
696
+ border: 1px solid var(--line-soft);
697
+ background: transparent;
698
+ color: var(--muted);
699
+ font: inherit;
700
+ font-weight: var(--font-weight-bold);
701
+ line-height: var(--line-height-tight);
702
+ cursor: pointer;
703
+ }
704
+
705
+ .info-tooltip-trigger:focus-visible {
706
+ outline: 0;
707
+ border-color: var(--focus-ring);
708
+ box-shadow: 0 0 0 2px var(--color-focus-outline);
709
+ }
710
+
711
+ .info-tooltip-content {
712
+ /* --tip-tx/ty center the popover on its axis; --tip-from-x/y are the small
713
+ offset it animates in from. Placement rules below re-point these. */
714
+ --tip-tx: -50%;
715
+ --tip-ty: 0px;
716
+ --tip-from-x: 0px;
717
+ --tip-from-y: 4px;
718
+ position: absolute;
719
+ left: 50%;
720
+ bottom: calc(100% + var(--space-2));
721
+ z-index: var(--z-tooltip);
722
+ width: min(320px, 82vw);
723
+ padding: var(--space-3);
724
+ border-radius: var(--radius-sharp);
725
+ background: var(--color-surface-raised);
726
+ color: var(--text);
727
+ box-shadow: var(--shadow);
728
+ font-size: var(--font-size-base);
729
+ font-weight: var(--font-weight-medium);
730
+ line-height: var(--line-height-body);
731
+ opacity: 0;
732
+ pointer-events: none;
733
+ transform: translate(calc(var(--tip-tx) + var(--tip-from-x)), calc(var(--tip-ty) + var(--tip-from-y)));
734
+ transition: opacity var(--duration-fast) var(--ease-default), transform var(--duration-fast) var(--ease-default);
735
+ }
736
+
737
+ /* Placement: repoint the anchor and the center/offset vars. Default is top. */
738
+ .info-tooltip-content[data-placement="bottom"] {
739
+ top: calc(100% + var(--space-2));
740
+ bottom: auto;
741
+ --tip-from-y: -4px;
742
+ }
743
+
744
+ .info-tooltip-content[data-placement="left"] {
745
+ right: calc(100% + var(--space-2));
746
+ left: auto;
747
+ top: 50%;
748
+ bottom: auto;
749
+ --tip-tx: 0px;
750
+ --tip-ty: -50%;
751
+ --tip-from-x: 4px;
752
+ --tip-from-y: 0px;
753
+ }
754
+
755
+ .info-tooltip-content[data-placement="right"] {
756
+ left: calc(100% + var(--space-2));
757
+ right: auto;
758
+ top: 50%;
759
+ bottom: auto;
760
+ --tip-tx: 0px;
761
+ --tip-ty: -50%;
762
+ --tip-from-x: -4px;
763
+ --tip-from-y: 0px;
764
+ }
765
+
766
+ .info-tooltip:hover .info-tooltip-content,
767
+ .info-tooltip:focus-within .info-tooltip-content {
768
+ opacity: 1;
769
+ transform: translate(var(--tip-tx), var(--tip-ty));
770
+ }
771
+
772
+ /* Escape-to-dismiss: overrides the hover/focus reveal while set. Scoped to the
773
+ same states plus the attribute so it outranks the reveal by specificity
774
+ (rather than relying on source order). */
775
+ .info-tooltip[data-tooltip-dismissed]:hover .info-tooltip-content,
776
+ .info-tooltip[data-tooltip-dismissed]:focus-within .info-tooltip-content {
777
+ opacity: 0;
778
+ pointer-events: none;
779
+ transform: translate(calc(var(--tip-tx) + var(--tip-from-x)), calc(var(--tip-ty) + var(--tip-from-y)));
780
+ }
781
+
782
+ /* Divider: a thin hairline rule (see Divider component). Generalizes the app's
783
+ border-bottom row dividers and the split-button rule. Marginless — space it
784
+ with layout primitives. Namespaced (divider is a collision-prone name). */
785
+ .ink-divider {
786
+ width: 100%;
787
+ height: 0;
788
+ margin: 0;
789
+ border: 0;
790
+ border-top: 1px solid var(--line-soft);
791
+ }
792
+
793
+ .ink-divider--vertical {
794
+ /* Needs a flex/grid parent to give it a cross-axis height. Uses height:100%
795
+ rather than align-self:stretch — stretch requires the base's `height:0` to
796
+ stay as `auto`, and mixing them left the rule computing to 0. */
797
+ width: 0;
798
+ height: 100%;
799
+ border-top: 0;
800
+ border-left: 1px solid var(--line-soft);
801
+ }
802
+
803
+ .ink-divider--labeled {
804
+ display: flex;
805
+ align-items: center;
806
+ gap: var(--space-3);
807
+ width: 100%;
808
+ height: auto;
809
+ border: 0;
810
+ }
811
+
812
+ .ink-divider--labeled::before,
813
+ .ink-divider--labeled::after {
814
+ content: "";
815
+ flex: 1;
816
+ border-top: 1px solid var(--line-soft);
817
+ }
818
+
819
+ .ink-divider-label {
820
+ flex-shrink: 0;
821
+ color: var(--muted);
822
+ font-size: var(--font-size-sm);
823
+ white-space: nowrap;
824
+ }
825
+
826
+ /* Avatar: a compact image/initials identity mark (see Avatar component). Seeded
827
+ from the app's .header-account-avatar + .header-account-trigger pattern — a
828
+ 34px avatar with a 46px ring around it. The ring is drawn with outline+offset
829
+ so it doesn't affect the avatar's layout size. Namespaced (avatar is a
830
+ collision-prone name). */
831
+ .ink-avatar {
832
+ display: inline-flex;
833
+ align-items: center;
834
+ justify-content: center;
835
+ flex-shrink: 0;
836
+ width: 34px;
837
+ height: 34px;
838
+ overflow: hidden;
839
+ border-radius: var(--radius-pill);
840
+ background: color-mix(in srgb, var(--color-overlay-soft) 75%, transparent);
841
+ color: var(--text);
842
+ font-size: var(--font-size-sm);
843
+ font-weight: var(--font-weight-bold);
844
+ line-height: 1;
845
+ letter-spacing: 0.03em;
846
+ text-transform: uppercase;
847
+ user-select: none;
848
+ outline: 1px solid var(--control-border);
849
+ outline-offset: 4px;
850
+ transition: outline-color var(--duration-fast) var(--ease-default);
851
+ }
852
+
853
+ .ink-avatar--sm {
854
+ width: 26px;
855
+ height: 26px;
856
+ font-size: var(--font-size-xs);
857
+ outline-offset: 3px;
858
+ }
859
+
860
+ .ink-avatar--lg {
861
+ width: 44px;
862
+ height: 44px;
863
+ font-size: var(--font-size-base);
864
+ outline-offset: 5px;
865
+ }
866
+
867
+ .ink-avatar--square {
868
+ border-radius: var(--radius-sharp);
869
+ }
870
+
871
+ /* Optical centering: caps like "KL" sit high in the em-box; a small nudge
872
+ settles them into the visual center. Especially noticeable on the square
873
+ shape (the circle hides the asymmetry). */
874
+ .ink-avatar-initials {
875
+ transform: translateY(0.06em);
876
+ }
877
+
878
+ .ink-avatar-image {
879
+ display: block;
880
+ width: 100%;
881
+ height: 100%;
882
+ object-fit: cover;
883
+ }
884
+
885
+ /* Interactive avatar: wraps the avatar in a button that brightens the ring on
886
+ hover/focus, matching the app's .header-account-trigger. */
887
+ .ink-avatar-button {
888
+ display: inline-flex;
889
+ align-items: center;
890
+ justify-content: center;
891
+ padding: 0;
892
+ border: 0;
893
+ background: transparent;
894
+ color: inherit;
895
+ cursor: pointer;
896
+ border-radius: var(--radius-pill);
897
+ }
898
+
899
+ .ink-avatar-button:focus-visible {
900
+ outline: 0;
901
+ }
902
+
903
+ .ink-avatar-button:hover .ink-avatar,
904
+ .ink-avatar-button:focus-visible .ink-avatar {
905
+ outline-color: var(--control-border-hover);
906
+ }
907
+
908
+ .ink-avatar-button:focus-visible .ink-avatar {
909
+ box-shadow: 0 0 0 2px var(--color-focus-outline);
910
+ }
911
+
912
+ /* Table: semantic <table> primitive with sortable headers, sticky header, row
913
+ hover, and density presets. Namespaced .ink-table (generic name). */
914
+ .ink-table {
915
+ width: 100%;
916
+ border-collapse: collapse;
917
+ color: var(--text);
918
+ font-size: var(--font-size-base);
919
+ font-weight: var(--font-weight-medium);
920
+ line-height: var(--line-height-body);
921
+ }
922
+
923
+ .ink-table-caption {
924
+ padding: var(--space-2) var(--space-3);
925
+ color: var(--muted);
926
+ font-size: var(--font-size-sm);
927
+ text-align: start;
928
+ caption-side: top;
929
+ }
930
+
931
+ .ink-table thead th {
932
+ background: var(--color-surface-default);
933
+ color: var(--muted);
934
+ font-size: var(--font-size-sm);
935
+ text-transform: uppercase;
936
+ letter-spacing: 0.03em;
937
+ }
938
+
939
+ .ink-table th,
940
+ .ink-table td {
941
+ padding: var(--space-3) var(--space-3);
942
+ border-bottom: 1px solid var(--line-soft);
943
+ text-align: start;
944
+ vertical-align: middle;
945
+ }
946
+
947
+ .ink-table--compact th,
948
+ .ink-table--compact td {
949
+ padding: var(--space-2) var(--space-3);
950
+ }
951
+
952
+ .ink-table th[data-align="center"],
953
+ .ink-table td[data-align="center"] {
954
+ text-align: center;
955
+ }
956
+
957
+ .ink-table th[data-align="end"],
958
+ .ink-table td[data-align="end"] {
959
+ text-align: end;
960
+ }
961
+
962
+ /* Sticky header pins <thead> when the table's scroll container scrolls. The
963
+ base thead background above ensures the pinned row stays opaque over the
964
+ scrolled tbody. */
965
+ .ink-table--sticky thead th {
966
+ position: sticky;
967
+ top: 0;
968
+ z-index: 1;
969
+ }
970
+
971
+ /* Row hover: subtle surface fill on tbody rows. */
972
+ .ink-table--hoverable tbody tr {
973
+ transition: background-color var(--duration-fast) var(--ease-default);
974
+ }
975
+
976
+ .ink-table--hoverable tbody tr:hover {
977
+ background: var(--hover-surface);
978
+ }
979
+
980
+ /* Sortable header: the whole header cell is a button. */
981
+ .ink-table-sort-button {
982
+ display: inline-flex;
983
+ align-items: center;
984
+ gap: var(--space-1);
985
+ padding: 0;
986
+ border: 0;
987
+ background: transparent;
988
+ color: inherit;
989
+ font: inherit;
990
+ letter-spacing: inherit;
991
+ text-transform: inherit;
992
+ cursor: pointer;
993
+ }
994
+
995
+ .ink-table-sort-button:hover,
996
+ .ink-table-sort-button:focus-visible {
997
+ color: var(--text);
998
+ }
999
+
1000
+ .ink-table-sort-icon {
1001
+ flex-shrink: 0;
1002
+ color: var(--muted);
1003
+ opacity: 0.4;
1004
+ transition: transform var(--duration-fast) var(--ease-default),
1005
+ opacity var(--duration-fast) var(--ease-default);
1006
+ }
1007
+
1008
+ .ink-table-sort-icon--active {
1009
+ color: currentColor;
1010
+ opacity: 1;
1011
+ }
1012
+
1013
+ .ink-table-sort-icon--asc {
1014
+ transform: rotate(180deg);
1015
+ }
1016
+
1017
+ .ink-table-empty-row td {
1018
+ padding: var(--space-4) var(--space-3);
1019
+ color: var(--muted);
1020
+ text-align: center;
1021
+ }
1022
+
1023
+ /* List: a grid-based list of rows. Not a semantic table; content-flexible.
1024
+ Seeded from the app's .roster-table (grid rows with hairline dividers). */
1025
+ .ink-list {
1026
+ display: flex;
1027
+ flex-direction: column;
1028
+ width: 100%;
1029
+ }
1030
+
1031
+ .ink-list-row {
1032
+ display: grid;
1033
+ grid-template-columns: var(--ink-list-cols, 1fr);
1034
+ align-items: center;
1035
+ gap: var(--space-2);
1036
+ padding: var(--space-3) var(--space-4);
1037
+ }
1038
+
1039
+ .ink-list--compact .ink-list-row {
1040
+ padding: var(--space-2) var(--space-3);
1041
+ }
1042
+
1043
+ .ink-list--bordered .ink-list-row {
1044
+ border-bottom: 1px solid var(--line-soft);
1045
+ }
1046
+
1047
+ /* Last row's divider is redundant — the list itself sits inside a container. */
1048
+ .ink-list--bordered .ink-list-row:last-child {
1049
+ border-bottom: 0;
1050
+ }
1051
+
1052
+ /* Spinner: an indeterminate rotating loader (see Spinner component). Built as
1053
+ a 2px ring where one side is tinted, spinning continuously. Sizes and tones
1054
+ scale via modifier classes. Namespaced .ink-spinner. */
1055
+ .ink-spinner {
1056
+ display: inline-block;
1057
+ flex-shrink: 0;
1058
+ width: 20px;
1059
+ height: 20px;
1060
+ border-radius: var(--radius-pill);
1061
+ border: 2px solid color-mix(in srgb, var(--muted) 25%, transparent);
1062
+ border-top-color: var(--muted);
1063
+ animation: ink-spinner-rotate 720ms linear infinite;
1064
+ }
1065
+
1066
+ .ink-spinner--sm {
1067
+ width: 14px;
1068
+ height: 14px;
1069
+ border-width: 2px;
1070
+ }
1071
+
1072
+ .ink-spinner--lg {
1073
+ width: 28px;
1074
+ height: 28px;
1075
+ border-width: 3px;
1076
+ }
1077
+
1078
+ .ink-spinner--brand {
1079
+ border-color: color-mix(in srgb, var(--accent) 25%, transparent);
1080
+ border-top-color: var(--accent);
1081
+ }
1082
+
1083
+ .ink-spinner--current {
1084
+ border-color: color-mix(in srgb, currentColor 25%, transparent);
1085
+ border-top-color: currentColor;
1086
+ }
1087
+
1088
+ @keyframes ink-spinner-rotate {
1089
+ to { transform: rotate(360deg); }
1090
+ }
1091
+
1092
+ @media (prefers-reduced-motion: reduce) {
1093
+ .ink-spinner { animation-duration: 2s; }
1094
+ }
1095
+
1096
+ /* Skeleton: a placeholder block that shimmers while content loads. Uses a
1097
+ moving gradient background over a subtle surface fill. Text lines optionally
1098
+ stack via .ink-skeleton-lines. Always decorative (aria-hidden). */
1099
+ .ink-skeleton {
1100
+ display: inline-block;
1101
+ width: 100%;
1102
+ height: 1em;
1103
+ border-radius: var(--radius-sharp);
1104
+ background-color: color-mix(in srgb, var(--color-overlay-soft) 60%, transparent);
1105
+ background-image: linear-gradient(
1106
+ 90deg,
1107
+ transparent 0%,
1108
+ color-mix(in srgb, var(--color-overlay-soft) 55%, transparent) 40%,
1109
+ color-mix(in srgb, var(--color-overlay-soft) 55%, transparent) 60%,
1110
+ transparent 100%
1111
+ );
1112
+ background-size: 200% 100%;
1113
+ background-repeat: no-repeat;
1114
+ background-position: 200% 0;
1115
+ animation: ink-skeleton-shimmer 1400ms ease-in-out infinite;
1116
+ }
1117
+
1118
+ .ink-skeleton--circle {
1119
+ display: inline-block;
1120
+ border-radius: var(--radius-pill);
1121
+ }
1122
+
1123
+ .ink-skeleton--rect {
1124
+ display: block;
1125
+ }
1126
+
1127
+ .ink-skeleton-lines {
1128
+ display: grid;
1129
+ gap: var(--space-2);
1130
+ }
1131
+
1132
+ /* Text variant shares its color/motion but the container drives layout. */
1133
+ .ink-skeleton-lines .ink-skeleton {
1134
+ display: block;
1135
+ }
1136
+
1137
+ @keyframes ink-skeleton-shimmer {
1138
+ 0% { background-position: 200% 0; }
1139
+ 100% { background-position: -100% 0; }
1140
+ }
1141
+
1142
+ @media (prefers-reduced-motion: reduce) {
1143
+ .ink-skeleton {
1144
+ animation: none;
1145
+ background-image: none;
1146
+ }
1147
+ }
1148
+
1149
+ /* Progress: horizontal progress bar. Determinate value scales the fill via
1150
+ scaleX from left; indeterminate slides a partial bar back and forth. */
1151
+ .ink-progress {
1152
+ display: grid;
1153
+ gap: var(--space-1);
1154
+ width: 100%;
1155
+ }
1156
+
1157
+ .ink-progress-heading {
1158
+ display: flex;
1159
+ align-items: baseline;
1160
+ justify-content: space-between;
1161
+ gap: var(--space-3);
1162
+ color: var(--muted);
1163
+ font-size: var(--font-size-sm);
1164
+ }
1165
+
1166
+ .ink-progress-label {
1167
+ color: var(--text);
1168
+ }
1169
+
1170
+ .ink-progress-track {
1171
+ position: relative;
1172
+ overflow: hidden;
1173
+ width: 100%;
1174
+ height: 6px;
1175
+ border-radius: var(--radius-pill);
1176
+ background: color-mix(in srgb, var(--color-overlay-soft) 60%, transparent);
1177
+ }
1178
+
1179
+ .ink-progress--sm .ink-progress-track {
1180
+ height: 3px;
1181
+ }
1182
+
1183
+ .ink-progress-fill {
1184
+ position: absolute;
1185
+ inset: 0;
1186
+ transform-origin: left center;
1187
+ transform: scaleX(0);
1188
+ background: var(--accent);
1189
+ border-radius: inherit;
1190
+ transition: transform var(--duration-default, 200ms) var(--ease-default);
1191
+ }
1192
+
1193
+ .ink-progress--success .ink-progress-fill {
1194
+ background: var(--color-success, var(--accent));
1195
+ }
1196
+
1197
+ .ink-progress--danger .ink-progress-fill {
1198
+ background: var(--danger, var(--accent));
1199
+ }
1200
+
1201
+ /* Indeterminate: a partial bar slides across. transform-origin returns to
1202
+ left so scaleX doesn't fight the animation. */
1203
+ .ink-progress-fill--indeterminate {
1204
+ width: 40%;
1205
+ transform: none;
1206
+ animation: ink-progress-indeterminate 1400ms ease-in-out infinite;
1207
+ }
1208
+
1209
+ @keyframes ink-progress-indeterminate {
1210
+ 0% { transform: translateX(-100%); }
1211
+ 100% { transform: translateX(250%); }
1212
+ }
1213
+
1214
+ @media (prefers-reduced-motion: reduce) {
1215
+ .ink-progress-fill { transition: none; }
1216
+ .ink-progress-fill--indeterminate { animation-duration: 3s; }
1217
+ }
1218
+
1219
+ .provider-actions {
1220
+ align-items: stretch;
1221
+ }
1222
+
1223
+ .provider-button {
1224
+ min-width: 160px;
1225
+ }
1226
+
1227
+ .sign-in-panel .provider-actions {
1228
+ display: grid;
1229
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1230
+ gap: var(--space-3);
1231
+ margin-top: var(--space-4);
1232
+ }
1233
+
1234
+ .sign-in-panel .provider-button {
1235
+ width: 100%;
1236
+ min-width: 0;
1237
+ justify-content: center;
1238
+ }
1239
+
1240
+ .ink-popover-menu {
1241
+ position: relative;
1242
+ }
1243
+
1244
+ .header-account-avatar {
1245
+ display: inline-flex;
1246
+ align-items: center;
1247
+ justify-content: center;
1248
+ width: 34px;
1249
+ height: 34px;
1250
+ overflow: hidden;
1251
+ border-radius: var(--radius-pill);
1252
+ background: color-mix(in srgb, var(--color-overlay-soft) 75%, transparent);
1253
+ color: var(--color-text-primary);
1254
+ font-family: "League Spartan", sans-serif;
1255
+ font-size: var(--font-size-sm);
1256
+ font-weight: var(--font-weight-bold);
1257
+ letter-spacing: 0.03em;
1258
+ }
1259
+
1260
+ .header-account-avatar-image {
1261
+ display: block;
1262
+ width: 100%;
1263
+ height: 100%;
1264
+ object-fit: cover;
1265
+ }
1266
+
1267
+ .ink-popover-surface {
1268
+ position: absolute;
1269
+ top: calc(100% + 8px);
1270
+ right: 0;
1271
+ z-index: var(--z-overlay);
1272
+ display: none;
1273
+ min-width: 172px;
1274
+ max-width: min(220px, calc(100vw - 24px));
1275
+ padding: var(--space-2);
1276
+ border: 1px solid var(--popover-border);
1277
+ border-radius: var(--radius-sharp);
1278
+ background: color-mix(in srgb, var(--popover-surface) 98%, transparent);
1279
+ box-shadow: var(--popover-shadow);
1280
+ }
1281
+
1282
+ .ink-popover-menu.open .ink-popover-surface {
1283
+ display: grid;
1284
+ gap: var(--space-2);
1285
+ }
1286
+
1287
+ .ink-popover-item {
1288
+ width: 100%;
1289
+ min-height: 32px;
1290
+ display: grid;
1291
+ grid-template-columns: 14px minmax(0, 1fr);
1292
+ align-items: center;
1293
+ gap: var(--space-3);
1294
+ padding: var(--space-2) var(--space-3);
1295
+ border: 0;
1296
+ border-radius: var(--radius-sharp);
1297
+ background: transparent;
1298
+ color: var(--color-text-primary);
1299
+ font: inherit;
1300
+ text-align: left;
1301
+ cursor: pointer;
1302
+ }
1303
+
1304
+ .ink-popover-item:hover,
1305
+ .ink-popover-item:focus-visible {
1306
+ background: var(--color-overlay-strong);
1307
+ outline: none;
1308
+ }
1309
+
1310
+ .ink-popover-item-icon {
1311
+ width: 14px;
1312
+ height: 14px;
1313
+ display: inline-flex;
1314
+ align-items: center;
1315
+ justify-content: center;
1316
+ color: var(--muted);
1317
+ }
1318
+
1319
+ .ink-popover-item-icon svg {
1320
+ width: 14px;
1321
+ height: 14px;
1322
+ display: block;
1323
+ fill: none;
1324
+ stroke: currentColor;
1325
+ stroke-width: 1.35;
1326
+ stroke-linecap: round;
1327
+ stroke-linejoin: round;
1328
+ }
1329
+
1330
+ .ink-popover-item-label {
1331
+ min-width: 0;
1332
+ line-height: var(--line-height-heading);
1333
+ font-size: var(--font-size-base);
1334
+ font-weight: var(--font-weight-semibold);
1335
+ }
1336
+
1337
+ .ink-popover-item.danger {
1338
+ color: color-mix(in srgb, var(--text) 88%, var(--danger));
1339
+ }
1340
+
1341
+ .ink-popover-item.danger .ink-popover-item-icon {
1342
+ color: color-mix(in srgb, var(--muted) 62%, var(--danger));
1343
+ }
1344
+
1345
+ .ink-popover-item.danger:hover,
1346
+ .ink-popover-item.danger:focus-visible {
1347
+ background: var(--menu-item-danger-hover);
1348
+ }
1349
+
1350
+ .ink-popover-label {
1351
+ display: grid;
1352
+ gap: var(--space-0-5);
1353
+ padding: var(--space-1) var(--space-0-5) var(--space-2);
1354
+ border-bottom: 1px solid var(--color-border-subtle);
1355
+ }
1356
+
1357
+ .ink-popover-label strong {
1358
+ font-family: "League Spartan", sans-serif;
1359
+ font-size: var(--font-size-md);
1360
+ line-height: var(--line-height-display);
1361
+ }
1362
+
1363
+ .ink-popover-label span {
1364
+ color: var(--muted);
1365
+ font-size: var(--font-size-sm);
1366
+ line-height: var(--line-height-heading);
1367
+ }
1368
+
1369
+ .menu-item {
1370
+ width: 100%;
1371
+ display: grid;
1372
+ align-items: center;
1373
+ min-height: 32px;
1374
+ padding: var(--space-1) var(--space-2);
1375
+ border: 0;
1376
+ border-radius: var(--radius-sharp);
1377
+ background: transparent;
1378
+ color: var(--color-text-primary);
1379
+ font: inherit;
1380
+ font-size: var(--font-size-base);
1381
+ text-align: left;
1382
+ cursor: pointer;
1383
+ transition: background 0.1s;
1384
+ }
1385
+
1386
+ .menu-item:hover {
1387
+ background: var(--white-a5);
1388
+ }
1389
+
1390
+ .menu-item--icon {
1391
+ grid-template-columns: 16px minmax(0, 1fr);
1392
+ gap: var(--space-2);
1393
+ }
1394
+
1395
+ .menu-item-icon {
1396
+ display: inline-flex;
1397
+ align-items: center;
1398
+ justify-content: center;
1399
+ color: var(--color-text-secondary);
1400
+ font-size: 14px;
1401
+ line-height: 1;
1402
+ }
1403
+
1404
+ .menu-item-label {
1405
+ line-height: 1.2;
1406
+ }
1407
+
1408
+ .workspace-stats,
1409
+ .workspace-actions-row {
1410
+ display: flex;
1411
+ align-items: center;
1412
+ gap: var(--space-3);
1413
+ flex-wrap: wrap;
1414
+ }
1415
+
1416
+ .workspace-actions-row {
1417
+ justify-content: flex-end;
1418
+ }
1419
+
1420
+ .app-title,
1421
+ .panel h2,
1422
+ .workspace-title,
1423
+ .board-title,
1424
+ .summary-card h3,
1425
+ .result-row strong {
1426
+ margin: 0;
1427
+ font-family: "League Spartan", sans-serif;
1428
+ line-height: var(--line-height-display);
1429
+ }
1430
+
1431
+ .app-title {
1432
+ font-size: clamp(1.2rem, 2.4vw, 1.55rem);
1433
+ font-weight: var(--font-weight-bold);
1434
+ letter-spacing: 0.01em;
1435
+ }
1436
+
1437
+ .context-pill,
1438
+ .pill {
1439
+ display: inline-flex;
1440
+ align-items: center;
1441
+ min-height: 36px;
1442
+ padding: var(--space-2) var(--space-3);
1443
+ border-radius: var(--radius-pill);
1444
+ border: 1px solid var(--control-border);
1445
+ background: var(--control-surface);
1446
+ color: var(--color-text-secondary);
1447
+ font-weight: var(--font-weight-bold);
1448
+ }
1449
+
1450
+ .ink-popover-action:focus-visible,
1451
+ select:focus-visible {
1452
+ outline: 0;
1453
+ border-color: var(--color-focus-ring);
1454
+ box-shadow: 0 0 0 2px var(--color-focus-outline);
1455
+ }
1456
+
1457
+ select option {
1458
+ background: var(--color-surface-active);
1459
+ color: var(--color-text-primary);
1460
+ }
1461
+
1462
+ .ink-popover-action:hover {
1463
+ border-color: var(--control-border-hover);
1464
+ background-color: var(--control-surface-active);
1465
+ color: var(--color-text-primary);
1466
+ }
1467
+
1468
+ /* App shell / nav */
1469
+ .top-nav {
1470
+ display: flex;
1471
+ justify-content: center;
1472
+ margin: 0 0 var(--space-4);
1473
+ order: 0;
1474
+ }
1475
+
1476
+ .nav-track {
1477
+ display: inline-flex;
1478
+ gap: 2px;
1479
+ padding: 3px;
1480
+ background: var(--white-a5);
1481
+ border-radius: var(--radius-sharp);
1482
+ position: relative;
1483
+ }
1484
+
1485
+ .nav-slider {
1486
+ position: absolute;
1487
+ top: 3px;
1488
+ left: 3px;
1489
+ height: calc(100% - 6px);
1490
+ background: var(--nav-active-bg);
1491
+ border-radius: var(--radius-sharp);
1492
+ pointer-events: none;
1493
+ z-index: 0;
1494
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1),
1495
+ width 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1496
+ will-change: transform, width;
1497
+ }
1498
+
1499
+ /* Shared controls */
1500
+ .nav-button,
1501
+ .primary-button,
1502
+ .secondary-button,
1503
+ .ghost-button,
1504
+ .selector-button,
1505
+ .danger-button,
1506
+ .slot-button,
1507
+ .picker-team-button {
1508
+ cursor: pointer;
1509
+ border: 0;
1510
+ font: inherit;
1511
+ }
1512
+
1513
+ .nav-button {
1514
+ display: inline-flex;
1515
+ align-items: center;
1516
+ gap: 10px;
1517
+ padding: 9px 20px;
1518
+ border-radius: var(--radius-sharp);
1519
+ border: 0;
1520
+ background: transparent;
1521
+ color: rgba(244, 237, 226, 0.5);
1522
+ font-weight: var(--font-weight-bold);
1523
+ position: relative;
1524
+ z-index: 1;
1525
+ transition: color 0.2s;
1526
+ }
1527
+
1528
+ .nav-icon {
1529
+ display: inline-flex;
1530
+ align-items: center;
1531
+ justify-content: center;
1532
+ flex: 0 0 auto;
1533
+ }
1534
+
1535
+ .nav-icon svg {
1536
+ width: 18px;
1537
+ height: 18px;
1538
+ }
1539
+
1540
+ .nav-label {
1541
+ display: inline-flex;
1542
+ align-items: center;
1543
+ line-height: var(--line-height-tight);
1544
+ }
1545
+
1546
+ .nav-beta-label {
1547
+ display: inline-block;
1548
+ margin-left: var(--space-1);
1549
+ color: var(--color-warning);
1550
+ font-size: var(--font-size-2xs);
1551
+ font-weight: var(--font-weight-extrabold);
1552
+ text-transform: uppercase;
1553
+ }
1554
+
1555
+ .mobile-ballot-actions,
1556
+ .overview-results-compact {
1557
+ display: none;
1558
+ }
1559
+
1560
+ .ballot-task-switcher {
1561
+ position: relative;
1562
+ display: flex;
1563
+ gap: var(--space-2);
1564
+ width: 100%;
1565
+ padding: 0;
1566
+ border-bottom: 1px solid var(--line);
1567
+ background: transparent;
1568
+ }
1569
+
1570
+ .ballot-task-button {
1571
+ position: relative;
1572
+ flex: 0 1 auto;
1573
+ min-height: 42px;
1574
+ padding: var(--space-3) var(--space-4) calc(var(--space-3) + 3px);
1575
+ border: 0;
1576
+ border-radius: var(--radius-sharp);
1577
+ background: transparent;
1578
+ color: var(--button-secondary-fg);
1579
+ font: inherit;
1580
+ font-family: var(--font-display);
1581
+ font-weight: var(--font-weight-extrabold);
1582
+ white-space: nowrap;
1583
+ }
1584
+
1585
+ .ballot-task-button.active {
1586
+ color: var(--color-text-strong);
1587
+ }
1588
+
1589
+ .ballot-task-indicator {
1590
+ position: absolute;
1591
+ bottom: -1px;
1592
+ left: 0;
1593
+ height: 2px;
1594
+ background: var(--accent);
1595
+ border-radius: 1px 1px 0 0;
1596
+ transition: transform 200ms ease, width 200ms ease;
1597
+ pointer-events: none;
1598
+ }
1599
+
1600
+ .ballot-task-button:not(.active):hover {
1601
+ background: var(--color-hover-surface);
1602
+ color: var(--text);
1603
+ }
1604
+
1605
+ .ballot-task-button.active:hover {
1606
+ color: var(--color-text-strong);
1607
+ }
1608
+
1609
+ .nav-button.active {
1610
+ background: transparent;
1611
+ color: var(--nav-active-fg);
1612
+ }
1613
+
1614
+ .primary-button {
1615
+ background: var(--button-primary-bg);
1616
+ color: var(--button-primary-fg);
1617
+ }
1618
+
1619
+ .secondary-button {
1620
+ background: var(--button-secondary-bg);
1621
+ color: var(--button-secondary-fg);
1622
+ border: 1px solid var(--button-secondary-border);
1623
+ }
1624
+
1625
+ .ghost-button {
1626
+ background: transparent;
1627
+ color: var(--color-text-primary);
1628
+ }
1629
+
1630
+ .danger-button {
1631
+ background: var(--button-primary-bg);
1632
+ color: var(--button-danger-fg);
1633
+ }
1634
+
1635
+ .primary-button,
1636
+ .secondary-button,
1637
+ .ghost-button,
1638
+ .danger-button {
1639
+ border-radius: var(--radius-sharp);
1640
+ font-weight: var(--font-weight-bold);
1641
+ }
1642
+
1643
+ .primary-button,
1644
+ .secondary-button,
1645
+ .ghost-button,
1646
+ .danger-button {
1647
+ display: inline-flex;
1648
+ align-items: center;
1649
+ justify-content: center;
1650
+ gap: var(--space-2);
1651
+ min-height: 44px;
1652
+ padding: var(--space-3) var(--space-4);
1653
+ }
1654
+
1655
+ .button--xs {
1656
+ min-height: 28px;
1657
+ padding: var(--space-1) var(--space-2);
1658
+ font-size: var(--font-size-xs);
1659
+ gap: var(--space-1);
1660
+ }
1661
+
1662
+ .button--sm {
1663
+ min-height: 36px;
1664
+ padding: var(--space-2) var(--space-3);
1665
+ font-size: var(--font-size-sm);
1666
+ gap: var(--space-1);
1667
+ }
1668
+
1669
+ .button--lg {
1670
+ min-height: 52px;
1671
+ padding: var(--space-3) var(--space-5);
1672
+ font-size: var(--font-size-lg);
1673
+ }
1674
+
1675
+ .button--xl {
1676
+ min-height: 60px;
1677
+ padding: var(--space-4) var(--space-6);
1678
+ font-size: var(--font-size-lg);
1679
+ font-weight: var(--font-weight-extrabold);
1680
+ }
1681
+
1682
+ /* SplitButton */
1683
+ .split-button {
1684
+ display: inline-flex;
1685
+ align-items: stretch;
1686
+ position: relative;
1687
+ }
1688
+ .split-button-primary {
1689
+ display: inline-flex; align-items: center;
1690
+ padding: var(--space-3) var(--space-4); min-height: 44px;
1691
+ background: var(--button-primary-bg);
1692
+ color: var(--button-primary-fg);
1693
+ font: inherit;
1694
+ font-weight: var(--font-weight-bold); line-height: 1;
1695
+ border: 0; border-radius: var(--radius-sharp) 0 0 var(--radius-sharp);
1696
+ cursor: pointer; white-space: nowrap;
1697
+ transition: background 120ms ease;
1698
+ }
1699
+ .split-button-primary:hover { background: var(--button-primary-bg-hover); }
1700
+ .split-button-divider {
1701
+ width: 1px; background: rgba(255,238,223,0.18);
1702
+ flex-shrink: 0; align-self: stretch;
1703
+ }
1704
+ .split-button-chevron {
1705
+ display: inline-flex; align-items: center; justify-content: center;
1706
+ width: 40px; min-height: 44px;
1707
+ background: var(--button-primary-bg); color: var(--button-primary-fg);
1708
+ border: 0; border-radius: 0 var(--radius-sharp) var(--radius-sharp) 0;
1709
+ cursor: pointer; font-size: 15px;
1710
+ transition: background 120ms ease;
1711
+ }
1712
+ .split-button-chevron:hover { background: var(--button-primary-bg-hover); }
1713
+ .split-button-chevron svg { transition: transform 150ms ease; width: 20px; height: 20px; }
1714
+ .split-dropdown {
1715
+ position: absolute; top: calc(100% + 6px); right: 0;
1716
+ background: var(--ink-860, #131313);
1717
+ border: 1px solid var(--popover-border);
1718
+ border-radius: var(--radius-sharp); box-shadow: var(--popover-shadow);
1719
+ min-width: 280px; z-index: 50;
1720
+ padding: var(--space-1); display: grid; gap: 2px;
1721
+ }
1722
+ .split-dropdown-item {
1723
+ display: flex; align-items: flex-start; gap: var(--space-3);
1724
+ padding: var(--space-3) var(--space-4);
1725
+ background: transparent; border: 0; border-radius: var(--radius-sharp);
1726
+ cursor: pointer; text-align: left; width: 100%;
1727
+ transition: background 100ms ease;
1728
+ }
1729
+ .split-dropdown-item:hover { background: var(--menu-item-bg-hover); }
1730
+ .split-dropdown-icon {
1731
+ width: 30px; height: 30px; flex-shrink: 0; margin-top: 1px;
1732
+ border-radius: var(--radius-sharp);
1733
+ display: flex; align-items: center; justify-content: center; font-size: 16px;
1734
+ }
1735
+ .split-dropdown-label {
1736
+ display: block;
1737
+ font-family: "League Spartan", sans-serif; font-size: var(--font-size-md);
1738
+ font-weight: var(--font-weight-extrabold); color: var(--color-text-strong);
1739
+ line-height: 1.2; margin-bottom: 3px;
1740
+ }
1741
+ .split-dropdown-desc {
1742
+ display: block; font-size: var(--font-size-xs);
1743
+ color: var(--muted); line-height: 1.5;
1744
+ }
1745
+
1746
+ .selector-button,
1747
+ .slot-button,
1748
+ .picker-team-button {
1749
+ border: 1px solid var(--color-border-strong);
1750
+ }
1751
+
1752
+ .nav-badge {
1753
+ display: inline-flex;
1754
+ align-items: center;
1755
+ justify-content: center;
1756
+ width: 10px;
1757
+ height: 10px;
1758
+ min-width: 10px;
1759
+ padding: 0;
1760
+ border-radius: var(--radius-pill);
1761
+ background: var(--notification-dot-bg);
1762
+ color: transparent;
1763
+ font-size: 0;
1764
+ font-weight: var(--font-weight-bold);
1765
+ line-height: var(--line-height-none);
1766
+ }
1767
+
1768
+ /* Shared surfaces */
1769
+ .panel,
1770
+ .selector-button,
1771
+ .league-card,
1772
+ .summary-card,
1773
+ .round-card,
1774
+ .result-row,
1775
+ .picker-team-button,
1776
+ .slot-button,
1777
+ .team-selection-item {
1778
+ border: 1px solid var(--color-border-strong);
1779
+ border-radius: var(--radius-sharp);
1780
+ background: var(--color-surface-default);
1781
+ }
1782
+
1783
+ .team-selection-item.disabled {
1784
+ opacity: 0.28;
1785
+ cursor: default;
1786
+ }
1787
+
1788
+ .panel {
1789
+ border: 0;
1790
+ padding: var(--space-5);
1791
+ background: var(--color-surface-raised);
1792
+ }
1793
+
1794
+ #leagueWorkspace {
1795
+ display: flex;
1796
+ flex-direction: column;
1797
+ gap: var(--space-4);
1798
+ }
1799
+
1800
+ /* Shared layout rhythm */
1801
+ .grid,
1802
+ .stacked-form,
1803
+ .selector-list,
1804
+ .round-list,
1805
+ .results-list,
1806
+ .ballot-picker-list,
1807
+ .ballot-ranks,
1808
+ .team-selection-list,
1809
+ .settings-stack {
1810
+ display: grid;
1811
+ gap: var(--space-3);
1812
+ }
1813
+
1814
+ .results-list,
1815
+ .overview-preview-list {
1816
+ gap: var(--space-3);
1817
+ }
1818
+
1819
+ /* Layout primitives (Stack / Inline / Grid). Namespaced with ink- to avoid
1820
+ collision with the seeded generic classes above; the md/12px default rhythm
1821
+ matches the shared layout rhythm. */
1822
+ .ink-stack {
1823
+ display: flex;
1824
+ flex-direction: column;
1825
+ gap: var(--ink-stack-gap, var(--space-3));
1826
+ align-items: var(--ink-stack-align, stretch);
1827
+ }
1828
+
1829
+ .ink-inline {
1830
+ display: flex;
1831
+ flex-direction: row;
1832
+ gap: var(--ink-inline-gap, var(--space-3));
1833
+ align-items: var(--ink-inline-align, center);
1834
+ justify-content: var(--ink-inline-justify, flex-start);
1835
+ flex-wrap: var(--ink-inline-wrap, wrap);
1836
+ }
1837
+
1838
+ .ink-grid {
1839
+ display: grid;
1840
+ gap: var(--ink-grid-gap, var(--space-3));
1841
+ grid-template-columns: var(--ink-grid-columns, repeat(2, minmax(0, 1fr)));
1842
+ align-items: var(--ink-grid-align, stretch);
1843
+ }
1844
+
1845
+ .ballot-ranks {
1846
+ gap: 0;
1847
+ }
1848
+
1849
+ .admin-grid {
1850
+ grid-template-columns: 300px minmax(0, 1fr);
1851
+ align-items: start;
1852
+ }
1853
+
1854
+ .league-grid {
1855
+ display: grid;
1856
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1857
+ gap: var(--space-4);
1858
+ }
1859
+
1860
+ .dashboard-grid {
1861
+ display: grid;
1862
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1863
+ gap: var(--space-4);
1864
+ align-items: start;
1865
+ }
1866
+
1867
+ .summary-card,
1868
+ .round-card,
1869
+ .invite-card,
1870
+ .settings-card {
1871
+ padding: var(--space-4);
1872
+ border-color: var(--line-soft);
1873
+ }
1874
+
1875
+ .settings-stack .settings-card {
1876
+ padding: var(--space-4);
1877
+ gap: var(--space-3);
1878
+ }
1879
+
1880
+ .summary-card h3 {
1881
+ margin-bottom: var(--space-2);
1882
+ font-size: var(--font-size-xl);
1883
+ }
1884
+
1885
+ .eyebrow,
1886
+ .mini-label,
1887
+ .pill {
1888
+ text-transform: uppercase;
1889
+ letter-spacing: 0.08em;
1890
+ font-size: var(--font-size-xs);
1891
+ font-weight: var(--font-weight-bold);
1892
+ }
1893
+
1894
+ .eyebrow {
1895
+ color: var(--accent-readable);
1896
+ margin: 0 0 var(--space-3);
1897
+ }
1898
+
1899
+ .subtle,
1900
+ .helper-text,
1901
+ .summary-metric,
1902
+ .summary-status,
1903
+ .invite-link,
1904
+ .result-metric,
1905
+ .context-copy {
1906
+ color: var(--muted);
1907
+ }
1908
+
1909
+ .section-heading,
1910
+ .workspace-header {
1911
+ display: flex;
1912
+ align-items: center;
1913
+ justify-content: space-between;
1914
+ gap: var(--space-4);
1915
+ margin-bottom: var(--space-4);
1916
+ }
1917
+
1918
+ .workspace-title-row {
1919
+ display: flex;
1920
+ align-items: center;
1921
+ gap: var(--space-3);
1922
+ min-width: 0;
1923
+ }
1924
+
1925
+ .workspace-title-row .workspace-title {
1926
+ min-width: 0;
1927
+ }
1928
+
1929
+ .workspace-settings-button {
1930
+ width: 36px;
1931
+ min-width: 36px;
1932
+ min-height: 36px;
1933
+ padding: 0;
1934
+ font-size: 17px;
1935
+ }
1936
+
1937
+ .section-heading.compact {
1938
+ margin-bottom: var(--space-3);
1939
+ }
1940
+
1941
+ .workspace-header {
1942
+ margin-bottom: var(--space-4);
1943
+ }
1944
+
1945
+ .workspace-header--commissioner {
1946
+ flex-wrap: nowrap;
1947
+ }
1948
+
1949
+ .workspace-header--commissioner .workspace-title-row {
1950
+ flex: 1 1 auto;
1951
+ }
1952
+
1953
+ .workspace-header--commissioner .workspace-meta {
1954
+ min-width: 0;
1955
+ }
1956
+
1957
+ .field-grid {
1958
+ display: grid;
1959
+ gap: var(--space-3);
1960
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1961
+ }
1962
+
1963
+ /* Shared forms / controls */
1964
+ label {
1965
+ display: grid;
1966
+ gap: var(--space-2);
1967
+ font-weight: var(--font-weight-bold);
1968
+ color: var(--text);
1969
+ }
1970
+
1971
+ input,
1972
+ select,
1973
+ textarea {
1974
+ width: 100%;
1975
+ padding: var(--space-3) var(--space-4);
1976
+ border-radius: var(--radius-rounded);
1977
+ border: 1px solid var(--input-border);
1978
+ background: var(--input-bg);
1979
+ color: var(--color-text-primary);
1980
+ font: inherit;
1981
+ }
1982
+
1983
+ select {
1984
+ appearance: none;
1985
+ -webkit-appearance: none;
1986
+ -moz-appearance: none;
1987
+ padding-right: var(--space-11);
1988
+ background:
1989
+ var(--chevron-icon) calc(100% - 16px) center / 14px 9px no-repeat,
1990
+ var(--input-bg);
1991
+ }
1992
+
1993
+ select::-ms-expand {
1994
+ display: none;
1995
+ }
1996
+
1997
+ input:focus,
1998
+ select:focus,
1999
+ textarea:focus {
2000
+ outline: none;
2001
+ border-color: var(--input-focus-border);
2002
+ box-shadow: inset 0 0 0 1px var(--input-focus-border);
2003
+ }
2004
+
2005
+ input[type="search"] {
2006
+ padding-left: 38px;
2007
+ background:
2008
+ var(--search-icon) var(--space-3) center / 16px 16px no-repeat,
2009
+ var(--input-bg);
2010
+ }
2011
+
2012
+ input[type="search"]:hover {
2013
+ border-color: var(--control-border-hover);
2014
+ background:
2015
+ var(--search-icon) var(--space-3) center / 16px 16px no-repeat,
2016
+ color-mix(in srgb, var(--input-bg) 88%, var(--hover-surface));
2017
+ }
2018
+
2019
+ input:focus-visible,
2020
+ select:focus-visible,
2021
+ textarea:focus-visible {
2022
+ outline: 0;
2023
+ border-color: var(--color-focus-ring);
2024
+ box-shadow:
2025
+ inset 0 0 0 1px var(--input-focus-border),
2026
+ 0 0 0 2px var(--color-focus-outline-soft);
2027
+ }
2028
+
2029
+ textarea {
2030
+ resize: vertical;
2031
+ }
2032
+
2033
+ /* Form field primitives (FormField / TextInput / Textarea / Checkbox) */
2034
+ .field {
2035
+ display: grid;
2036
+ gap: var(--space-2);
2037
+ }
2038
+
2039
+ .field-label {
2040
+ width: auto;
2041
+ padding: 0;
2042
+ border: 0;
2043
+ background: none;
2044
+ font-size: 0.78rem;
2045
+ font-weight: 600;
2046
+ color: var(--muted);
2047
+ }
2048
+
2049
+ .field-required {
2050
+ color: var(--color-danger);
2051
+ }
2052
+
2053
+ .field-hint {
2054
+ margin: 0;
2055
+ font-size: 0.78rem;
2056
+ color: var(--muted);
2057
+ }
2058
+
2059
+ .field-error {
2060
+ margin: 0;
2061
+ font-size: 0.78rem;
2062
+ font-weight: 600;
2063
+ color: var(--color-danger);
2064
+ }
2065
+
2066
+ .input--invalid,
2067
+ .field--invalid .input,
2068
+ .field--invalid .textarea {
2069
+ border-color: var(--color-danger);
2070
+ }
2071
+
2072
+ .input--invalid:focus-visible,
2073
+ .field--invalid .input:focus-visible,
2074
+ .field--invalid .textarea:focus-visible {
2075
+ border-color: var(--color-danger);
2076
+ box-shadow:
2077
+ inset 0 0 0 1px var(--color-danger),
2078
+ 0 0 0 2px color-mix(in srgb, var(--color-danger) 35%, transparent);
2079
+ }
2080
+
2081
+ .checkbox {
2082
+ display: inline-flex;
2083
+ align-items: center;
2084
+ gap: var(--space-3);
2085
+ width: auto;
2086
+ padding: 0;
2087
+ border: 0;
2088
+ background: none;
2089
+ cursor: pointer;
2090
+ color: var(--color-text-primary);
2091
+ }
2092
+
2093
+ .checkbox-input {
2094
+ width: auto;
2095
+ margin: 0;
2096
+ cursor: pointer;
2097
+ accent-color: var(--color-danger);
2098
+ }
2099
+
2100
+ .checkbox-label {
2101
+ font-size: 0.9rem;
2102
+ line-height: 1.3;
2103
+ }
2104
+
2105
+ .checkbox--disabled {
2106
+ cursor: not-allowed;
2107
+ opacity: 0.55;
2108
+ }
2109
+
2110
+ .checkbox--disabled .checkbox-input {
2111
+ cursor: not-allowed;
2112
+ }
2113
+
2114
+ /* Custom Select component (.cselect) */
2115
+ .cselect {
2116
+ position: relative;
2117
+ width: 100%;
2118
+ }
2119
+
2120
+ .cselect-trigger {
2121
+ display: flex; align-items: center; gap: var(--space-2);
2122
+ width: 100%; min-height: 44px;
2123
+ padding: var(--space-3) var(--space-4);
2124
+ background: var(--input-bg);
2125
+ border: 1px solid var(--input-border);
2126
+ border-radius: var(--radius-rounded);
2127
+ color: var(--color-text-primary);
2128
+ font: inherit; font-size: var(--font-size-base);
2129
+ cursor: pointer; text-align: left;
2130
+ transition: border-color 100ms ease, background 100ms ease, box-shadow 100ms ease;
2131
+ }
2132
+ .cselect-trigger:hover {
2133
+ border-color: var(--control-border-hover);
2134
+ background: var(--color-overlay-strong);
2135
+ }
2136
+ .cselect.open .cselect-trigger,
2137
+ .cselect-trigger:focus-visible {
2138
+ outline: 0;
2139
+ border-color: var(--input-focus-border);
2140
+ box-shadow:
2141
+ inset 0 0 0 1px var(--input-focus-border),
2142
+ 0 0 0 2px var(--color-focus-outline-soft);
2143
+ }
2144
+ .cselect-trigger:disabled {
2145
+ opacity: 0.28;
2146
+ cursor: default;
2147
+ }
2148
+
2149
+ .cselect-value {
2150
+ flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2151
+ }
2152
+ .cselect-value.placeholder { color: var(--muted); }
2153
+
2154
+ .cselect-chevron {
2155
+ flex-shrink: 0; width: 20px; height: 20px; color: var(--muted);
2156
+ transition: transform 150ms ease;
2157
+ }
2158
+ .cselect.open .cselect-chevron { transform: rotate(180deg); }
2159
+
2160
+ .cselect-dropdown {
2161
+ position: absolute; top: calc(100% + 6px); left: 0; right: 0;
2162
+ background: var(--ink-860, #131313);
2163
+ border: 1px solid var(--popover-border);
2164
+ border-radius: var(--radius-sharp);
2165
+ box-shadow: var(--popover-shadow);
2166
+ z-index: var(--z-overlay);
2167
+ padding: var(--space-1);
2168
+ display: grid; gap: 2px;
2169
+ }
2170
+
2171
+ .cselect-option {
2172
+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
2173
+ padding: 10px var(--space-4);
2174
+ background: transparent; border: 0; border-radius: var(--radius-sharp);
2175
+ color: var(--color-text-primary);
2176
+ font: inherit; font-size: var(--font-size-base);
2177
+ cursor: pointer; text-align: left; width: 100%;
2178
+ transition: background 80ms ease;
2179
+ }
2180
+ .cselect-option:hover { background: var(--menu-item-bg-hover); }
2181
+ .cselect-option.selected { color: var(--color-text-strong); }
2182
+ .cselect-option .check-icon { font-size: 15px; color: var(--color-info); flex-shrink: 0; }
2183
+ .cselect-option--disabled,
2184
+ .cselect-option:disabled { opacity: 0.28; cursor: default; }
2185
+
2186
+ /* Control variant — for nav/toolbar contexts */
2187
+ .cselect--control {
2188
+ width: auto;
2189
+ }
2190
+ .cselect--control .cselect-trigger {
2191
+ min-height: 46px;
2192
+ border-radius: var(--radius-sharp);
2193
+ border-color: var(--control-border);
2194
+ background: var(--control-surface);
2195
+ color: var(--color-text-primary);
2196
+ font-size: var(--font-size-md);
2197
+ font-weight: var(--font-weight-bold);
2198
+ }
2199
+ .cselect--control .cselect-trigger:hover {
2200
+ border-color: var(--control-border-hover);
2201
+ background: var(--control-surface-active);
2202
+ }
2203
+
2204
+ .selector-button {
2205
+ width: 100%;
2206
+ text-align: left;
2207
+ min-height: 44px;
2208
+ padding: var(--space-2) var(--space-3);
2209
+ background: transparent;
2210
+ border-color: transparent;
2211
+ border-left: 2px solid transparent;
2212
+ }
2213
+
2214
+ .full-width-button {
2215
+ width: 100%;
2216
+ }
2217
+
2218
+ .selector-button.active {
2219
+ border-color: transparent;
2220
+ background: var(--selector-active-bg);
2221
+ border-left-color: var(--selector-active-accent);
2222
+ }
2223
+
2224
+ .selector-button:hover,
2225
+ .overview-summary-card:hover,
2226
+ .slot-button:hover,
2227
+ .picker-team-button:hover,
2228
+ .team-selection-item:hover {
2229
+ background: var(--hover-surface);
2230
+ }
2231
+
2232
+ .nav-button:not(.active):hover,
2233
+ .secondary-button:hover,
2234
+ .preview-mode-button:hover:not(.active) {
2235
+ border-color: var(--control-border-hover);
2236
+ background: var(--color-hover-surface);
2237
+ color: var(--color-text-primary);
2238
+ }
2239
+
2240
+ .ghost-button:hover {
2241
+ background: var(--color-hover-surface);
2242
+ color: var(--color-text-primary);
2243
+ }
2244
+
2245
+ .primary-button:hover,
2246
+ .danger-button:hover {
2247
+ background: var(--button-primary-bg-hover);
2248
+ }
2249
+
2250
+ .primary-button:disabled,
2251
+ .secondary-button:disabled,
2252
+ .ghost-button:disabled,
2253
+ .danger-button:disabled,
2254
+ .split-button-primary:disabled,
2255
+ .split-button-chevron:disabled {
2256
+ opacity: 0.28;
2257
+ cursor: default;
2258
+ }
2259
+
2260
+ .nav-button.active:hover,
2261
+ .preview-mode-button.active:hover {
2262
+ filter: brightness(0.96);
2263
+ }
2264
+
2265
+ .selector-button strong {
2266
+ color: var(--color-text-primary);
2267
+ }
2268
+
2269
+ .selector-button.active strong {
2270
+ color: var(--color-text-strong);
2271
+ }
2272
+
2273
+ .selector-button strong,
2274
+ .league-card strong,
2275
+ .round-card strong,
2276
+ .result-row strong,
2277
+ .invite-card strong {
2278
+ display: block;
2279
+ margin-bottom: var(--space-1);
2280
+ }
2281
+
2282
+ .pill.success {
2283
+ min-height: auto;
2284
+ padding: 0;
2285
+ border: 0;
2286
+ background: transparent;
2287
+ color: var(--pill-success-fg);
2288
+ }
2289
+
2290
+ .pill.warning {
2291
+ min-height: auto;
2292
+ padding: 0;
2293
+ border: 0;
2294
+ background: transparent;
2295
+ color: var(--pill-warning-fg);
2296
+ }
2297
+
2298
+ .pill.danger {
2299
+ min-height: auto;
2300
+ padding: 0;
2301
+ border: 0;
2302
+ background: transparent;
2303
+ color: var(--pill-danger-fg);
2304
+ }
2305
+
2306
+ .pill--meta {
2307
+ min-height: auto;
2308
+ padding: 4px var(--space-2);
2309
+ font-weight: var(--font-weight-medium);
2310
+ }
2311
+ .pill.open {
2312
+ border-color: var(--pill-success-fg);
2313
+ color: var(--pill-success-fg);
2314
+ }
2315
+
2316
+ .callout,
2317
+ .empty-state,
2318
+ .compact-card,
2319
+ .invite-card {
2320
+ padding: var(--space-4);
2321
+ border-radius: var(--radius-sharp);
2322
+ border: 1px solid var(--line-soft);
2323
+ background: var(--surface-strong);
2324
+ }
2325
+
2326
+ .compact-card,
2327
+ .invite-card,
2328
+ .round-card {
2329
+ border-color: transparent;
2330
+ background: var(--color-surface-raised);
2331
+ }
2332
+
2333
+ .dashboard-grid .compact-card,
2334
+ .round-card {
2335
+ border-radius: var(--radius-none);
2336
+ border: 0;
2337
+ border-bottom: 1px solid var(--line-soft);
2338
+ background: transparent;
2339
+ }
2340
+
2341
+ .overview-summary-card {
2342
+ cursor: pointer;
2343
+ font: inherit;
2344
+ color: var(--text);
2345
+ border: 0;
2346
+ background: var(--color-surface-raised);
2347
+ width: 100%;
2348
+ display: grid;
2349
+ align-content: start;
2350
+ gap: var(--space-2);
2351
+ padding: var(--space-4) var(--space-4);
2352
+ text-align: left;
2353
+ box-shadow: none;
2354
+ }
2355
+
2356
+ .overview-summary-card.active {
2357
+ background: var(--color-surface-active);
2358
+ border-left: 2px solid var(--color-brand);
2359
+ box-shadow: none;
2360
+ }
2361
+
2362
+ .overview-summary-card h3 {
2363
+ color: var(--text);
2364
+ margin-bottom: 0;
2365
+ }
2366
+
2367
+ .overview-summary-card .eyebrow {
2368
+ margin-bottom: var(--space-0-5);
2369
+ }
2370
+
2371
+ .overview-card-meta {
2372
+ display: grid;
2373
+ gap: 0;
2374
+ }
2375
+
2376
+ .overview-results-shell {
2377
+ display: grid;
2378
+ gap: var(--space-4);
2379
+ }
2380
+
2381
+ .overview-preview-list {
2382
+ display: grid;
2383
+ gap: var(--space-3);
2384
+ }
2385
+
2386
+ .overview-preview-row {
2387
+ display: grid;
2388
+ grid-template-columns: auto minmax(0, 1fr) auto;
2389
+ gap: var(--space-3);
2390
+ align-items: center;
2391
+ padding: var(--space-2) 0 var(--space-2) var(--space-3);
2392
+ border-left: 2px solid var(--rank-accent);
2393
+ border-bottom: 1px solid var(--line-soft);
2394
+ }
2395
+
2396
+ .overview-preview-row:last-child {
2397
+ border-bottom: 0;
2398
+ padding-bottom: 0;
2399
+ }
2400
+
2401
+ .overview-preview-rank {
2402
+ min-width: 30px;
2403
+ font-family: "League Spartan", sans-serif;
2404
+ font-size: var(--font-size-lg);
2405
+ font-weight: var(--font-weight-bold);
2406
+ color: var(--text);
2407
+ }
2408
+
2409
+ .overview-preview-copy {
2410
+ min-width: 0;
2411
+ }
2412
+
2413
+ .overview-preview-copy strong {
2414
+ display: block;
2415
+ margin-bottom: 0;
2416
+ overflow: hidden;
2417
+ text-overflow: ellipsis;
2418
+ white-space: nowrap;
2419
+ }
2420
+
2421
+ .mobile-result-points {
2422
+ display: none;
2423
+ }
2424
+
2425
+ .overview-preview-copy .subtle {
2426
+ white-space: nowrap;
2427
+ }
2428
+
2429
+ .overview-preview-row .mobile-result-points {
2430
+ justify-self: end;
2431
+ white-space: nowrap;
2432
+ }
2433
+
2434
+ .overview-summary-card .summary-metric,
2435
+ .overview-summary-card .summary-status {
2436
+ font-family: inherit;
2437
+ margin: 0;
2438
+ }
2439
+
2440
+ .overview-card-status {
2441
+ color: var(--muted);
2442
+ font-size: var(--font-size-base);
2443
+ font-weight: var(--font-weight-bold);
2444
+ line-height: var(--line-height-label);
2445
+ }
2446
+
2447
+ .overview-card-status.warning {
2448
+ color: var(--color-warning);
2449
+ }
2450
+
2451
+ .overview-card-status.positive {
2452
+ color: var(--green);
2453
+ }
2454
+
2455
+ .row-danger-actions {
2456
+ margin-top: var(--space-0-5);
2457
+ padding-top: var(--space-3);
2458
+ border-top: 1px solid var(--line-soft);
2459
+ }
2460
+
2461
+ .round-card .card-actions {
2462
+ margin-top: var(--space-2);
2463
+ }
2464
+
2465
+ /* Unified round rows */
2466
+ .unified-round-row {
2467
+ display: flex; align-items: center; gap: var(--space-3);
2468
+ padding: var(--space-3) var(--space-4);
2469
+ border-bottom: 1px solid var(--color-border-subtle);
2470
+ }
2471
+ .unified-round-row:last-child { border-bottom: 0; }
2472
+
2473
+ .round-list > .unified-round-row {
2474
+ padding-inline: 0;
2475
+ }
2476
+ .round-type-icon {
2477
+ width: 30px; height: 30px; flex-shrink: 0;
2478
+ border-radius: var(--radius-sharp);
2479
+ display: flex; align-items: center; justify-content: center; font-size: 16px;
2480
+ }
2481
+ .round-copy { flex: 1; min-width: 0; }
2482
+ .round-copy-name {
2483
+ font-family: "League Spartan", sans-serif;
2484
+ font-size: var(--font-size-md); font-weight: var(--font-weight-bold);
2485
+ color: var(--color-text-primary); line-height: var(--line-height-display);
2486
+ }
2487
+ .round-copy-meta { color: var(--muted); margin-top: 2px; }
2488
+ .round-row-actions { display: flex; gap: var(--space-1); flex-shrink: 0; align-items: center; }
2489
+
2490
+ .status-inline.open {
2491
+ color: var(--color-warning);
2492
+ }
2493
+
2494
+ .status-inline.published {
2495
+ color: var(--green);
2496
+ }
2497
+
2498
+ .league-card,
2499
+ .summary-card,
2500
+ .settings-card,
2501
+ .team-selection-item {
2502
+ border-color: var(--line-soft);
2503
+ }
2504
+
2505
+ .compact-callout {
2506
+ padding: var(--space-3) var(--space-4);
2507
+ }
2508
+
2509
+ .invite-link {
2510
+ display: inline-flex;
2511
+ align-items: center;
2512
+ gap: var(--space-2);
2513
+ margin-top: var(--space-2);
2514
+ max-width: 100%;
2515
+ flex-wrap: wrap;
2516
+ }
2517
+
2518
+ .invite-link-copy {
2519
+ display: flex;
2520
+ align-items: center;
2521
+ gap: var(--space-2);
2522
+ max-width: 100%;
2523
+ flex-wrap: wrap;
2524
+ }
2525
+
2526
+ .invite-link-actions {
2527
+ display: inline-flex;
2528
+ align-items: center;
2529
+ gap: var(--space-2);
2530
+ flex-wrap: wrap;
2531
+ }
2532
+
2533
+ .invite-link-text {
2534
+ color: var(--muted);
2535
+ overflow-wrap: anywhere;
2536
+ min-width: 0;
2537
+ }
2538
+
2539
+ .invite-link-text.active {
2540
+ color: var(--text);
2541
+ }
2542
+
2543
+ .invite-link-note {
2544
+ flex-basis: 100%;
2545
+ color: var(--muted);
2546
+ font-size: var(--font-size-xs);
2547
+ }
2548
+
2549
+ .invite-action-icon {
2550
+ line-height: var(--line-height-tight);
2551
+ }
2552
+
2553
+ .icon-button {
2554
+ cursor: pointer;
2555
+ width: auto;
2556
+ min-width: 0;
2557
+ min-height: 0;
2558
+ display: inline-flex;
2559
+ align-items: center;
2560
+ justify-content: center;
2561
+ padding: 0;
2562
+ border: 0;
2563
+ border-radius: var(--radius-none);
2564
+ background: transparent;
2565
+ color: var(--text);
2566
+ font: inherit;
2567
+ line-height: var(--line-height-tight);
2568
+ }
2569
+
2570
+ .league-selector-settings-button {
2571
+ min-width: 42px;
2572
+ min-height: 44px;
2573
+ padding: var(--space-2) var(--space-3);
2574
+ border: 1px solid transparent;
2575
+ border-radius: var(--radius-none);
2576
+ border-left: 1px solid rgba(255, 238, 223, 0.08);
2577
+ background: transparent;
2578
+ color: var(--muted);
2579
+ }
2580
+
2581
+ .league-selector-settings-button svg {
2582
+ width: 18px;
2583
+ height: 18px;
2584
+ fill: none;
2585
+ stroke: currentColor;
2586
+ stroke-width: 1.55;
2587
+ stroke-linecap: round;
2588
+ stroke-linejoin: round;
2589
+ }
2590
+
2591
+ .league-selector-row.active .league-selector-settings-button {
2592
+ border-color: transparent;
2593
+ background: rgba(255, 255, 255, 0.03);
2594
+ color: var(--text);
2595
+ }
2596
+
2597
+ .league-selector-settings-button:hover {
2598
+ background: var(--hover-surface);
2599
+ }
2600
+
2601
+ .league-selector-settings-button:active {
2602
+ background: rgba(255, 255, 255, 0.03);
2603
+ }
2604
+
2605
+ .invite-copy-button {
2606
+ min-height: 24px;
2607
+ line-height: var(--line-height-tight);
2608
+ }
2609
+
2610
+ .invite-copy-button span {
2611
+ line-height: var(--line-height-tight);
2612
+ }
2613
+
2614
+ .invite-ghost-button {
2615
+ min-height: 28px;
2616
+ padding: 5px 10px;
2617
+ border-radius: var(--radius-default);
2618
+ font-size: var(--font-size-xs);
2619
+ font-weight: var(--font-weight-semibold);
2620
+ line-height: 1;
2621
+ gap: 6px;
2622
+ white-space: nowrap;
2623
+ }
2624
+
2625
+ .invite-ghost-button svg {
2626
+ width: 13px;
2627
+ height: 13px;
2628
+ flex: 0 0 auto;
2629
+ }
2630
+
2631
+ .invite-ghost-button--md {
2632
+ min-height: 36px;
2633
+ padding: 8px 12px;
2634
+ font-size: var(--font-size-sm);
2635
+ gap: 8px;
2636
+ }
2637
+
2638
+ .invite-ghost-button--md svg {
2639
+ width: 14px;
2640
+ height: 14px;
2641
+ }
2642
+
2643
+ .icon-only-utility {
2644
+ width: 36px;
2645
+ min-width: 36px;
2646
+ min-height: 36px;
2647
+ justify-content: center;
2648
+ }
2649
+
2650
+ /* Icon button component */
2651
+ .icon-btn {
2652
+ display: inline-flex; align-items: center; justify-content: center;
2653
+ width: 36px; height: 36px; font-size: 17px;
2654
+ background: transparent; border: 0; border-radius: var(--radius-sharp);
2655
+ color: var(--muted);
2656
+ cursor: pointer; flex-shrink: 0;
2657
+ transition: background 100ms ease, color 100ms ease;
2658
+ }
2659
+ .icon-btn:hover {
2660
+ background: var(--color-overlay-strong);
2661
+ color: var(--color-text-primary);
2662
+ }
2663
+ .icon-btn:active { background: var(--white-a10, rgba(255,255,255,0.10)); }
2664
+ .icon-btn:focus-visible {
2665
+ outline: 0;
2666
+ box-shadow: 0 0 0 2px var(--color-focus-outline);
2667
+ }
2668
+ .icon-btn:disabled { opacity: 0.28; cursor: default; }
2669
+
2670
+ .icon-btn--sm { width: 28px; height: 28px; font-size: 15px; }
2671
+ .icon-btn--lg { width: 44px; height: 44px; font-size: 19px; }
2672
+
2673
+ /* Icon inside a text button scales with the button font */
2674
+ .primary-button svg,
2675
+ .secondary-button svg,
2676
+ .ghost-button svg,
2677
+ .danger-button svg { font-size: 1.1em; flex-shrink: 0; }
2678
+
2679
+ .top-gap {
2680
+ margin-top: var(--space-6);
2681
+ }
2682
+
2683
+ .admin-sidebar {
2684
+ display: grid;
2685
+ gap: 0;
2686
+ align-self: start;
2687
+ }
2688
+
2689
+ .sidebar-group + .sidebar-group {
2690
+ margin-top: var(--space-3);
2691
+ }
2692
+
2693
+ .sidebar-demo-group {
2694
+ display: grid;
2695
+ gap: var(--space-2);
2696
+ align-content: start;
2697
+ padding-bottom: var(--space-2);
2698
+ border-bottom: 1px solid var(--line-soft);
2699
+ }
2700
+
2701
+ .sidebar-create-group {
2702
+ padding-top: var(--space-3);
2703
+ border-top: 1px solid var(--line-soft);
2704
+ }
2705
+
2706
+ .sidebar-heading {
2707
+ margin-bottom: var(--space-0-5);
2708
+ }
2709
+
2710
+ .league-nav-row {
2711
+ gap: var(--space-0-5);
2712
+ }
2713
+
2714
+ .league-selector-row {
2715
+ display: grid;
2716
+ grid-template-columns: minmax(0, 1fr);
2717
+ gap: var(--space-2);
2718
+ align-items: stretch;
2719
+ }
2720
+
2721
+ .league-selector-row.active {
2722
+ grid-template-columns: minmax(0, 1fr) auto;
2723
+ }
2724
+
2725
+ .league-selector-row .selector-button {
2726
+ min-width: 0;
2727
+ }
2728
+
2729
+ .league-selector-settings-button {
2730
+ align-self: stretch;
2731
+ width: 36px;
2732
+ min-width: 36px;
2733
+ min-height: 44px;
2734
+ padding: 0;
2735
+ border: 0;
2736
+ border-left: 0;
2737
+ border-radius: var(--radius-none);
2738
+ background: var(--color-overlay-soft);
2739
+ color: var(--muted);
2740
+ transition: background-color var(--duration-medium) var(--ease-default), color var(--duration-medium) var(--ease-default);
2741
+ }
2742
+
2743
+ .league-selector-settings-button:hover {
2744
+ background: var(--hover-surface);
2745
+ color: var(--text);
2746
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
2747
+ }
2748
+
2749
+ .league-selector-settings-button:active {
2750
+ background: var(--color-overlay-soft);
2751
+ color: var(--text);
2752
+ box-shadow: none;
2753
+ }
2754
+
2755
+ .selector-list {
2756
+ gap: var(--space-1);
2757
+ }
2758
+
2759
+ .admin-sidebar .top-gap {
2760
+ margin-top: var(--space-2);
2761
+ }
2762
+
2763
+ .admin-sidebar .secondary-button.full-width-button {
2764
+ padding-block: var(--space-3);
2765
+ }
2766
+
2767
+ .sidebar-demo-group .eyebrow {
2768
+ margin-bottom: 0;
2769
+ }
2770
+
2771
+ .admin-sidebar .stacked-form {
2772
+ gap: var(--space-3);
2773
+ }
2774
+
2775
+ .admin-sidebar label {
2776
+ gap: var(--space-2);
2777
+ }
2778
+
2779
+ .hidden {
2780
+ display: none !important;
2781
+ }
2782
+
2783
+ .view {
2784
+ display: none;
2785
+ }
2786
+
2787
+ .view.active {
2788
+ display: block;
2789
+ }
2790
+
2791
+ .admin-shell.hidden {
2792
+ display: none !important;
2793
+ }
2794
+
2795
+ .status-banner {
2796
+ display: flex;
2797
+ align-items: center;
2798
+ justify-content: space-between;
2799
+ gap: var(--space-3);
2800
+ margin-bottom: var(--space-4);
2801
+ padding: var(--space-4) var(--space-4);
2802
+ border-radius: var(--radius-sharp);
2803
+ background: var(--status-success-bg);
2804
+ color: var(--status-success-fg);
2805
+ font-weight: var(--font-weight-bold);
2806
+ }
2807
+
2808
+ .status-banner.warning {
2809
+ background: var(--status-warning-bg);
2810
+ color: var(--status-warning-fg);
2811
+ }
2812
+
2813
+ .status-banner.error {
2814
+ background: var(--status-danger-bg);
2815
+ color: var(--status-danger-fg);
2816
+ }
2817
+
2818
+ .banner-dismiss {
2819
+ padding: 0;
2820
+ background: transparent;
2821
+ color: inherit;
2822
+ border: 0;
2823
+ font-size: var(--font-size-lg);
2824
+ }
2825
+
2826
+ .ballot-meta {
2827
+ display: flex;
2828
+ align-items: center;
2829
+ flex-wrap: wrap;
2830
+ margin: var(--space-2) 0 var(--space-3);
2831
+ gap: var(--space-2);
2832
+ }
2833
+
2834
+ .vote-callout {
2835
+ display: grid;
2836
+ gap: var(--space-2);
2837
+ }
2838
+
2839
+ .sign-in-panel {
2840
+ display: grid;
2841
+ width: min(100%, 620px);
2842
+ justify-self: start;
2843
+ gap: var(--space-3);
2844
+ padding: var(--space-5);
2845
+ border: 0;
2846
+ border-left: 2px solid var(--color-brand);
2847
+ border-radius: var(--radius-none);
2848
+ background: var(--color-surface-raised);
2849
+ }
2850
+
2851
+ .sign-in-panel strong {
2852
+ font-size: var(--font-size-lg);
2853
+ }
2854
+
2855
+ .sign-in-panel .subtle {
2856
+ max-width: 54ch;
2857
+ line-height: var(--line-height-body);
2858
+ }
2859
+
2860
+ .ballot-guidance {
2861
+ line-height: var(--line-height-body);
2862
+ }
2863
+
2864
+ .ballot-guidance strong {
2865
+ color: var(--text);
2866
+ }
2867
+
2868
+ .ballot-layout {
2869
+ display: grid;
2870
+ grid-template-columns: minmax(0, 1.22fr) minmax(280px, 0.78fr);
2871
+ gap: var(--space-4);
2872
+ align-items: start;
2873
+ }
2874
+
2875
+ .ballot-board-panel,
2876
+ .finder-panel {
2877
+ display: grid;
2878
+ gap: var(--space-3);
2879
+ padding: var(--space-4);
2880
+ border-radius: var(--radius-sharp);
2881
+ border: 0;
2882
+ background: var(--color-surface-raised);
2883
+ }
2884
+
2885
+ .finder-panel {
2886
+ background: var(--color-surface-raised);
2887
+ }
2888
+
2889
+ .rank-slot {
2890
+ display: grid;
2891
+ grid-template-columns: 64px minmax(0, 1fr) auto;
2892
+ gap: var(--space-2);
2893
+ align-items: center;
2894
+ min-height: 52px;
2895
+ padding: var(--space-0-5) 0;
2896
+ border-radius: var(--radius-none);
2897
+ border: 0;
2898
+ background: transparent;
2899
+ }
2900
+
2901
+ .rank-slot.filled .slot-button {
2902
+ background: var(--slot-bg-filled);
2903
+ }
2904
+
2905
+ .rank-slot.recommended {
2906
+ background: transparent;
2907
+ }
2908
+
2909
+ .rank-slot.recommended .slot-button {
2910
+ border-color: color-mix(in srgb, var(--color-warning) 34%, transparent);
2911
+ background: color-mix(in srgb, var(--color-warning) 8%, transparent);
2912
+ }
2913
+
2914
+ .rank-slot:has(.slot-button:focus-visible) {
2915
+ background: transparent;
2916
+ }
2917
+
2918
+ .rank-chip {
2919
+ display: inline-flex;
2920
+ align-items: center;
2921
+ justify-content: center;
2922
+ min-height: 42px;
2923
+ padding: var(--space-1) var(--space-3);
2924
+ border-radius: var(--radius-sharp);
2925
+ background: transparent;
2926
+ border-left: 2px solid var(--rank-accent);
2927
+ font-weight: var(--font-weight-bold);
2928
+ }
2929
+
2930
+ .slot-button {
2931
+ width: 100%;
2932
+ display: flex;
2933
+ align-items: center;
2934
+ text-align: left;
2935
+ min-height: 42px;
2936
+ padding: var(--space-2) var(--space-3);
2937
+ background: var(--slot-bg);
2938
+ color: var(--text);
2939
+ border-radius: var(--radius-sharp);
2940
+ border-color: transparent;
2941
+ }
2942
+
2943
+ .slot-button strong {
2944
+ margin: 0;
2945
+ overflow: hidden;
2946
+ text-overflow: ellipsis;
2947
+ white-space: nowrap;
2948
+ }
2949
+
2950
+ .rank-slot .inline-utility-button {
2951
+ justify-self: end;
2952
+ padding-right: var(--space-3);
2953
+ }
2954
+
2955
+ .empty-state--inline {
2956
+ padding: var(--space-2) 0;
2957
+ color: var(--muted);
2958
+ }
2959
+
2960
+ .inline-heading {
2961
+ display: inline-flex;
2962
+ align-items: center;
2963
+ gap: var(--space-2);
2964
+ }
2965
+
2966
+ .sr-only {
2967
+ position: absolute;
2968
+ width: 1px;
2969
+ height: 1px;
2970
+ padding: 0;
2971
+ margin: -1px;
2972
+ overflow: hidden;
2973
+ clip: rect(0, 0, 0, 0);
2974
+ white-space: nowrap;
2975
+ border: 0;
2976
+ }
2977
+
2978
+ .rank-clear-button {
2979
+ line-height: var(--line-height-tight);
2980
+ }
2981
+
2982
+ .section-heading-copy {
2983
+ max-width: 180px;
2984
+ text-align: right;
2985
+ line-height: var(--line-height-label);
2986
+ }
2987
+
2988
+ .ballot-sidecard,
2989
+ .settings-card {
2990
+ display: grid;
2991
+ gap: var(--space-3);
2992
+ }
2993
+
2994
+ .finder-panel .stacked-form {
2995
+ gap: var(--space-4);
2996
+ }
2997
+
2998
+ .finder-panel .ballot-finder-list {
2999
+ margin-top: var(--space-1);
3000
+ }
3001
+
3002
+ .ballot-finder-list .picker-team-button {
3003
+ border-color: transparent;
3004
+ }
3005
+
3006
+ /* In rank mode, the unnamed <span> wraps a rank chip <strong> + team detail <span> as inline siblings.
3007
+ Give them flex spacing so they don't appear concatenated. */
3008
+ .ballot-picker-list .picker-team-button > span:not(.picker-team-copy):not(.picker-team-state) {
3009
+ display: flex;
3010
+ gap: var(--space-2); /* intentional: does not snap cleanly to a single value */
3011
+ align-items: center;
3012
+ flex-wrap: wrap;
3013
+ }
3014
+
3015
+ #ballotPickerModal .picker-team-button,
3016
+ #ballotPickerModal .picker-team-button.selected {
3017
+ border-color: transparent;
3018
+ }
3019
+
3020
+ .mobile-ballot-actions {
3021
+ display: none;
3022
+ gap: var(--space-2);
3023
+ margin-top: var(--space-3);
3024
+ padding-top: var(--space-3);
3025
+ border-top: 1px solid var(--line);
3026
+ }
3027
+
3028
+ .mobile-ballot-actions--single {
3029
+ grid-template-columns: 1fr;
3030
+ }
3031
+
3032
+ .ballot-side-actions {
3033
+ display: grid;
3034
+ gap: var(--space-2);
3035
+ margin-top: var(--space-1);
3036
+ padding-top: var(--space-3);
3037
+ border-top: 1px solid var(--line);
3038
+ }
3039
+
3040
+ .ballot-finder-list {
3041
+ display: grid;
3042
+ gap: var(--space-2);
3043
+ max-height: 420px;
3044
+ overflow: auto;
3045
+ padding-right: var(--space-1);
3046
+ }
3047
+
3048
+ .finder-summary {
3049
+ display: flex;
3050
+ align-items: baseline;
3051
+ gap: var(--space-2);
3052
+ color: var(--muted);
3053
+ font-size: var(--font-size-md);
3054
+ }
3055
+
3056
+ .finder-summary strong {
3057
+ color: var(--text);
3058
+ font-family: "League Spartan", sans-serif;
3059
+ font-size: var(--font-size-lg);
3060
+ }
3061
+
3062
+ .picker-team-button {
3063
+ width: 100%;
3064
+ display: grid;
3065
+ gap: var(--space-1);
3066
+ align-items: center;
3067
+ padding: var(--space-2) var(--space-3);
3068
+ text-align: left;
3069
+ background: var(--control-bg);
3070
+ color: var(--text);
3071
+ border-radius: var(--radius-sharp);
3072
+ }
3073
+
3074
+ .picker-team-copy,
3075
+ .picker-team-state,
3076
+ .picker-team-button span {
3077
+ color: var(--muted);
3078
+ font-size: var(--font-size-base);
3079
+ letter-spacing: 0.03em;
3080
+ text-transform: uppercase;
3081
+ }
3082
+
3083
+ .picker-team-copy {
3084
+ display: block;
3085
+ }
3086
+
3087
+ .picker-team-copy strong {
3088
+ color: var(--text);
3089
+ }
3090
+
3091
+ .picker-team-coach {
3092
+ color: var(--muted);
3093
+ font-weight: var(--font-weight-regular);
3094
+ text-transform: none;
3095
+ letter-spacing: 0;
3096
+ font-size: var(--font-size-md);
3097
+ }
3098
+
3099
+ .picker-team-state.semantic-state {
3100
+ color: var(--green);
3101
+ }
3102
+
3103
+ .picker-team-button.selected {
3104
+ border-color: var(--line);
3105
+ background: var(--control-bg-strong);
3106
+ }
3107
+
3108
+ .picker-team-button.on-ballot {
3109
+ border-color: var(--line-soft);
3110
+ background: var(--color-overlay-soft);
3111
+ }
3112
+
3113
+ .picker-team-button.on-ballot .picker-team-copy strong,
3114
+ .picker-team-button.on-ballot .picker-team-coach,
3115
+ .picker-team-button.on-ballot .picker-team-state {
3116
+ color: color-mix(in srgb, var(--muted) 62%, var(--bg));
3117
+ }
3118
+
3119
+ .nav-button:focus-visible,
3120
+ .primary-button:focus-visible,
3121
+ .secondary-button:focus-visible,
3122
+ .ghost-button:focus-visible,
3123
+ .preview-mode-button:focus-visible,
3124
+ .inline-utility-button:focus-visible,
3125
+ .selector-button:focus-visible,
3126
+ .danger-button:focus-visible,
3127
+ .slot-button:focus-visible,
3128
+ .picker-team-button:focus-visible,
3129
+ .icon-button:focus-visible,
3130
+ .modal-close-button:focus-visible,
3131
+ .banner-dismiss:focus-visible,
3132
+ .toast button:focus-visible,
3133
+ .overview-summary-card:focus-visible,
3134
+ .info-tooltip-trigger:focus-visible,
3135
+ .team-selection-item:focus-within {
3136
+ outline: 0;
3137
+ border-color: var(--focus-ring);
3138
+ box-shadow: 0 0 0 2px var(--color-focus-outline);
3139
+ }
3140
+
3141
+ .board-footer-note {
3142
+ padding-top: var(--space-0-5);
3143
+ line-height: var(--line-height-body);
3144
+ }
3145
+
3146
+ .workspace-header > *,
3147
+ .workspace-meta > *,
3148
+ .workspace-stats > *,
3149
+ .workspace-actions-row > * {
3150
+ min-width: 0;
3151
+ }
3152
+
3153
+ .team-selection-list {
3154
+ max-height: 320px;
3155
+ overflow: auto;
3156
+ padding-right: var(--space-1);
3157
+ }
3158
+
3159
+ .team-selection-item {
3160
+ display: flex;
3161
+ align-items: center;
3162
+ gap: var(--space-3);
3163
+ padding: var(--space-3) var(--space-4);
3164
+ }
3165
+
3166
+ .team-selection-item input {
3167
+ width: auto;
3168
+ }
3169
+
3170
+ .team-selection-summary-strip {
3171
+ display: flex;
3172
+ align-items: center;
3173
+ min-height: 44px;
3174
+ padding: var(--space-3) var(--space-4);
3175
+ border: 1px solid var(--line-soft);
3176
+ border-radius: var(--radius-default);
3177
+ background: var(--control-overlay);
3178
+ }
3179
+
3180
+ .team-selection-summary-strip strong {
3181
+ color: var(--color-text-strong);
3182
+ }
3183
+
3184
+ .result-row {
3185
+ display: grid;
3186
+ grid-template-columns: 72px minmax(0, 1.25fr) minmax(0, 1.9fr);
3187
+ gap: var(--space-3);
3188
+ align-items: center;
3189
+ padding: var(--space-3) var(--space-2) var(--space-3) 0;
3190
+ border: 0;
3191
+ border-bottom: 1px solid var(--line-soft);
3192
+ border-radius: var(--radius-none);
3193
+ background: transparent;
3194
+ }
3195
+
3196
+ .result-row > * {
3197
+ min-width: 0;
3198
+ }
3199
+
3200
+ .result-row strong,
3201
+ .result-row .subtle {
3202
+ overflow-wrap: anywhere;
3203
+ word-break: break-word;
3204
+ }
3205
+
3206
+ .result-rank-block {
3207
+ display: grid;
3208
+ justify-items: start;
3209
+ gap: var(--space-1);
3210
+ padding-left: var(--space-4);
3211
+ border-left: 2px solid var(--rank-accent);
3212
+ }
3213
+
3214
+ .rank-number {
3215
+ font-family: "League Spartan", sans-serif;
3216
+ font-size: var(--font-size-3xl);
3217
+ font-weight: var(--font-weight-bold);
3218
+ }
3219
+
3220
+ .result-main {
3221
+ display: grid;
3222
+ gap: var(--space-1);
3223
+ }
3224
+
3225
+ .result-trend {
3226
+ color: var(--muted);
3227
+ line-height: var(--line-height-label);
3228
+ }
3229
+
3230
+ .inline-utility-button {
3231
+ cursor: pointer;
3232
+ min-height: 32px;
3233
+ padding: var(--space-1) 0;
3234
+ border: 0;
3235
+ background: transparent;
3236
+ color: var(--muted);
3237
+ font: inherit;
3238
+ font-weight: var(--font-weight-bold);
3239
+ line-height: var(--line-height-heading);
3240
+ }
3241
+
3242
+ .inline-utility-button:hover:not(:disabled) {
3243
+ color: var(--text);
3244
+ }
3245
+
3246
+ .inline-utility-button:disabled {
3247
+ opacity: 0.28;
3248
+ cursor: default;
3249
+ }
3250
+
3251
+ .results-board-header {
3252
+ display: flex;
3253
+ align-items: flex-end;
3254
+ justify-content: space-between;
3255
+ gap: var(--space-4);
3256
+ margin-bottom: var(--space-3);
3257
+ }
3258
+
3259
+ .results-board-intro {
3260
+ display: grid;
3261
+ gap: var(--space-2);
3262
+ }
3263
+
3264
+ .results-board-round {
3265
+ flex: 1 1 auto;
3266
+ min-width: 0;
3267
+ }
3268
+
3269
+ .results-round-context {
3270
+ font-size: var(--font-size-md);
3271
+ }
3272
+
3273
+ .results-controls {
3274
+ display: grid;
3275
+ grid-template-columns: minmax(0, 1fr);
3276
+ gap: var(--space-4);
3277
+ align-items: end;
3278
+ }
3279
+
3280
+ .results-title-select,
3281
+ .results-round-select {
3282
+ display: grid;
3283
+ gap: var(--space-2);
3284
+ }
3285
+
3286
+ .results-league-heading {
3287
+ display: grid;
3288
+ gap: var(--space-2);
3289
+ }
3290
+
3291
+ .results-league-heading h2 {
3292
+ margin: 0;
3293
+ color: var(--color-text-primary);
3294
+ font-family: var(--font-display);
3295
+ font-size: clamp(1.55rem, 2vw, 1.9rem);
3296
+ line-height: var(--line-height-tight);
3297
+ }
3298
+
3299
+ .results-title-select select {
3300
+ min-height: 62px;
3301
+ padding: var(--space-4) 54px var(--space-3) var(--space-4);
3302
+ border-radius: var(--radius-sharp);
3303
+ border-color: var(--color-border-strong);
3304
+ background:
3305
+ var(--chevron-icon) calc(100% - 18px) center / 14px 9px no-repeat,
3306
+ var(--color-surface-raised);
3307
+ color: var(--color-text-primary);
3308
+ font-family: "League Spartan", sans-serif;
3309
+ font-size: clamp(1.55rem, 2vw, 1.9rem);
3310
+ font-weight: var(--font-weight-bold);
3311
+ line-height: var(--line-height-tight);
3312
+ }
3313
+
3314
+ .results-round-select {
3315
+ justify-self: start;
3316
+ width: 100%;
3317
+ max-width: 320px;
3318
+ }
3319
+
3320
+ .results-round-select > span {
3321
+ color: var(--color-text-secondary);
3322
+ font-size: var(--font-size-sm);
3323
+ font-weight: var(--font-weight-bold);
3324
+ letter-spacing: 0.08em;
3325
+ text-transform: uppercase;
3326
+ }
3327
+
3328
+ .results-round-select select {
3329
+ min-height: 48px;
3330
+ padding-right: var(--space-11);
3331
+ border-radius: var(--radius-sharp);
3332
+ border-color: var(--color-border-strong);
3333
+ background:
3334
+ var(--chevron-icon) calc(100% - 16px) center / 14px 9px no-repeat,
3335
+ var(--color-surface-raised);
3336
+ }
3337
+
3338
+ .danger-copy {
3339
+ padding: var(--space-3) var(--space-4);
3340
+ }
3341
+
3342
+ .danger-zone-card {
3343
+ border: 1px solid var(--color-danger-soft);
3344
+ padding: 0;
3345
+ overflow: hidden;
3346
+ gap: 0;
3347
+ }
3348
+
3349
+ .danger-zone-header {
3350
+ padding: var(--space-2) var(--space-4);
3351
+ background: var(--color-danger-soft);
3352
+ border-bottom: 1px solid var(--color-danger-soft);
3353
+ }
3354
+
3355
+ .danger-zone-label {
3356
+ font-size: var(--font-size-2xs);
3357
+ font-weight: var(--font-weight-extrabold);
3358
+ letter-spacing: 0.09em;
3359
+ text-transform: uppercase;
3360
+ color: var(--color-danger-text);
3361
+ }
3362
+
3363
+ .danger-zone-body {
3364
+ display: grid;
3365
+ gap: var(--space-4);
3366
+ padding: var(--space-3) var(--space-4) var(--space-4);
3367
+ }
3368
+
3369
+ .result-metrics-grid {
3370
+ display: grid;
3371
+ grid-template-columns: repeat(3, auto);
3372
+ gap: var(--space-4);
3373
+ }
3374
+
3375
+ .result-metric {
3376
+ display: grid;
3377
+ gap: var(--space-1);
3378
+ padding: 0;
3379
+ border-radius: var(--radius-none);
3380
+ border: 0;
3381
+ background: transparent;
3382
+ }
3383
+
3384
+ .result-metric .mini-label {
3385
+ white-space: nowrap;
3386
+ }
3387
+
3388
+ .result-metric strong,
3389
+ .context-copy strong {
3390
+ display: block;
3391
+ color: var(--text);
3392
+ }
3393
+
3394
+ .results-meta {
3395
+ justify-content: flex-end;
3396
+ gap: var(--space-2);
3397
+ }
3398
+
3399
+ .results-share-action {
3400
+ min-width: 164px;
3401
+ min-height: 42px;
3402
+ padding-inline: var(--space-4);
3403
+ white-space: nowrap;
3404
+ }
3405
+
3406
+ .results-action-label--short {
3407
+ display: none;
3408
+ }
3409
+
3410
+ .results-action-icon {
3411
+ display: inline-flex;
3412
+ align-items: center;
3413
+ justify-content: center;
3414
+ width: 18px;
3415
+ height: 18px;
3416
+ flex: 0 0 auto;
3417
+ }
3418
+
3419
+ .results-action-icon svg {
3420
+ width: 18px;
3421
+ height: 18px;
3422
+ fill: none;
3423
+ stroke: currentColor;
3424
+ stroke-width: 1.9;
3425
+ stroke-linecap: round;
3426
+ stroke-linejoin: round;
3427
+ }
3428
+
3429
+ .results-share-action:disabled {
3430
+ opacity: 0.28;
3431
+ cursor: default;
3432
+ }
3433
+
3434
+ @container app (max-width: 1080px) {
3435
+ .results-controls {
3436
+ grid-template-columns: 1fr;
3437
+ }
3438
+
3439
+ .results-round-select {
3440
+ justify-self: start;
3441
+ max-width: none;
3442
+ }
3443
+ }
3444
+
3445
+ .workspace-context-card {
3446
+ display: grid;
3447
+ gap: var(--space-3);
3448
+ padding: var(--space-3) var(--space-4);
3449
+ background: var(--color-surface-default);
3450
+ border: 1px solid var(--color-border-subtle);
3451
+ border-radius: var(--radius-sharp);
3452
+ }
3453
+
3454
+ /* Modal system */
3455
+ .modal {
3456
+ position: fixed;
3457
+ inset: 0;
3458
+ z-index: var(--z-overlay);
3459
+ overflow-y: auto;
3460
+ padding: var(--space-6) 0;
3461
+ --modal-shell-width: min(580px, calc(100% - 24px));
3462
+ --modal-shell-max-height: calc(100vh - 48px);
3463
+ --modal-shell-padding: var(--space-4);
3464
+ --modal-heading-gap: var(--space-4);
3465
+ --modal-heading-margin: var(--space-4);
3466
+ --modal-heading-compact-margin: var(--space-3);
3467
+ --modal-eyebrow-margin: var(--space-3);
3468
+ --modal-grid-gap: var(--space-3);
3469
+ --modal-card-padding: var(--space-4);
3470
+ --modal-label-gap: var(--space-2);
3471
+ --modal-control-padding: var(--space-3) var(--space-4); /* intentional: snapped from 11px 14px */
3472
+ }
3473
+
3474
+ .modal-front {
3475
+ z-index: var(--z-modal-front);
3476
+ }
3477
+
3478
+ .modal-backdrop {
3479
+ position: absolute;
3480
+ inset: 0;
3481
+ background: var(--modal-scrim);
3482
+ }
3483
+
3484
+ .modal-card {
3485
+ position: relative;
3486
+ z-index: var(--z-raised);
3487
+ width: var(--modal-shell-width);
3488
+ max-height: var(--modal-shell-max-height);
3489
+ margin: 0 auto;
3490
+ overflow: hidden;
3491
+ border-radius: var(--radius-sharp);
3492
+ min-height: 0;
3493
+ }
3494
+
3495
+ .modal-card > * {
3496
+ min-height: 0;
3497
+ }
3498
+
3499
+ .modal-panel {
3500
+ padding: var(--modal-shell-padding);
3501
+ }
3502
+
3503
+ .modal-panel--compact {
3504
+ width: var(--modal-shell-width);
3505
+ }
3506
+
3507
+ .modal-panel--wide {
3508
+ width: var(--modal-wide-width, min(760px, calc(100% - 24px)));
3509
+ }
3510
+
3511
+ .modal-panel--settings {
3512
+ display: flex;
3513
+ flex-direction: column;
3514
+ }
3515
+
3516
+ .modal-close-button {
3517
+ width: 28px;
3518
+ min-width: 28px;
3519
+ min-height: 28px;
3520
+ padding: 0;
3521
+ display: inline-flex;
3522
+ align-items: center;
3523
+ justify-content: center;
3524
+ border: 0;
3525
+ background: transparent;
3526
+ font-size: var(--font-size-lg);
3527
+ line-height: var(--line-height-tight);
3528
+ color: var(--muted);
3529
+ }
3530
+
3531
+ .wide-modal,
3532
+ .modal-panel--wide {
3533
+ width: var(--modal-wide-width, min(760px, calc(100% - 24px)));
3534
+ max-height: var(--modal-shell-max-height);
3535
+ }
3536
+
3537
+ .modal .section-heading {
3538
+ gap: var(--modal-heading-gap);
3539
+ margin-bottom: var(--modal-heading-margin);
3540
+ flex: 0 0 auto;
3541
+ }
3542
+
3543
+ .modal .section-heading > div {
3544
+ display: grid;
3545
+ gap: var(--modal-label-gap);
3546
+ min-width: 0;
3547
+ flex: 1 1 auto;
3548
+ }
3549
+
3550
+ .modal .section-heading.compact {
3551
+ margin-bottom: var(--modal-heading-compact-margin);
3552
+ }
3553
+
3554
+ .modal .eyebrow {
3555
+ margin-bottom: 0;
3556
+ }
3557
+
3558
+ .modal .section-heading h2 {
3559
+ min-width: 0;
3560
+ }
3561
+
3562
+ .modal .dashboard-grid,
3563
+ .modal .field-grid {
3564
+ gap: var(--modal-grid-gap);
3565
+ }
3566
+
3567
+ .modal .settings-card,
3568
+ .modal .callout,
3569
+ .modal .compact-card,
3570
+ .modal .empty-state {
3571
+ padding: var(--modal-card-padding);
3572
+ }
3573
+
3574
+ .modal .danger-zone-card {
3575
+ padding: 0;
3576
+ gap: 0;
3577
+ }
3578
+
3579
+ .modal label {
3580
+ gap: var(--modal-label-gap);
3581
+ }
3582
+
3583
+ .modal input,
3584
+ .modal select,
3585
+ .modal textarea {
3586
+ padding: var(--modal-control-padding);
3587
+ }
3588
+
3589
+ .modal input[type="number"] {
3590
+ color-scheme: dark;
3591
+ }
3592
+
3593
+ .modal input[type="search"] {
3594
+ padding-left: 38px;
3595
+ }
3596
+
3597
+ .modal .cselect-trigger {
3598
+ border-radius: var(--radius-sharp);
3599
+ }
3600
+
3601
+ .modal,
3602
+ .modal .team-selection-list,
3603
+ .modal .ballot-picker-list,
3604
+ #settingsModalBody {
3605
+ color-scheme: dark;
3606
+ }
3607
+
3608
+ .modal-field-note {
3609
+ font-size: var(--font-size-sm);
3610
+ line-height: var(--line-height-body);
3611
+ color: var(--muted);
3612
+ }
3613
+
3614
+ #createLeagueModal .modal-card {
3615
+ display: flex;
3616
+ flex-direction: column;
3617
+ max-height: min(82vh, calc(100vh - 52px));
3618
+ }
3619
+
3620
+ #createLeagueModalForm {
3621
+ display: flex;
3622
+ flex: 1 1 auto;
3623
+ flex-direction: column;
3624
+ min-height: 0;
3625
+ }
3626
+
3627
+ .create-league-form-body {
3628
+ display: flex;
3629
+ flex: 1 1 auto;
3630
+ flex-direction: column;
3631
+ min-height: 0;
3632
+ gap: var(--space-3);
3633
+ overflow-y: auto;
3634
+ overscroll-behavior: contain;
3635
+ padding-right: var(--space-0-5);
3636
+ }
3637
+
3638
+ .create-league-teams-section {
3639
+ gap: var(--space-2);
3640
+ margin-top: var(--space-1);
3641
+ padding-top: var(--space-3);
3642
+ border-top: 1px solid var(--line-soft);
3643
+ }
3644
+
3645
+ .create-league-teams-section .section-heading.compact {
3646
+ margin-bottom: var(--space-2);
3647
+ }
3648
+
3649
+ .create-league-actions {
3650
+ flex: 0 0 auto;
3651
+ margin-top: var(--space-3);
3652
+ padding-top: var(--space-3);
3653
+ border-top: 1px solid var(--line-soft);
3654
+ }
3655
+
3656
+ /* Preview-only modal constraints */
3657
+ body[data-preview-mode="mobile"] .modal {
3658
+ position: absolute;
3659
+ inset: 12px 0 0;
3660
+ display: flex;
3661
+ align-items: flex-start;
3662
+ padding: var(--space-11) 0 0;
3663
+ --modal-shell-width: min(358px, calc(100% - 32px));
3664
+ --modal-shell-max-height: calc(100% - 56px);
3665
+ --modal-shell-padding: var(--space-3);
3666
+ --modal-heading-gap: var(--space-3);
3667
+ --modal-heading-margin: var(--space-3);
3668
+ --modal-heading-compact-margin: var(--space-3);
3669
+ --modal-eyebrow-margin: var(--space-2);
3670
+ --modal-grid-gap: var(--space-3);
3671
+ --modal-card-padding: var(--space-3);
3672
+ --modal-label-gap: var(--space-2);
3673
+ --modal-control-padding: var(--space-3) var(--space-3);
3674
+ }
3675
+
3676
+ body[data-preview-mode="mobile"] #dangerModal {
3677
+ align-items: center;
3678
+ padding: var(--space-6) 0;
3679
+ }
3680
+
3681
+ body[data-preview-mode="mobile"] #dangerModal .modal-card {
3682
+ width: min(330px, calc(100% - 40px));
3683
+ max-height: min(420px, calc(100% - 48px));
3684
+ margin: auto;
3685
+ }
3686
+
3687
+ body[data-preview-mode="mobile"] #roundModal,
3688
+ body[data-preview-mode="mobile"] #teamModal,
3689
+ body[data-preview-mode="mobile"] #ballotPickerModal {
3690
+ align-items: flex-end;
3691
+ padding: var(--space-14) 0 0;
3692
+ }
3693
+
3694
+ body[data-preview-mode="mobile"] #roundModal .modal-card,
3695
+ body[data-preview-mode="mobile"] #teamModal .modal-card,
3696
+ body[data-preview-mode="mobile"] #ballotPickerModal .modal-card {
3697
+ width: min(358px, calc(100% - 16px));
3698
+ align-self: flex-end;
3699
+ margin: 0 auto 0;
3700
+ border-radius: var(--radius-sheet-top);
3701
+ }
3702
+
3703
+ body[data-preview-mode="mobile"] #roundModal .modal-card,
3704
+ body[data-preview-mode="mobile"] #ballotPickerModal .modal-card {
3705
+ max-height: min(82%, calc(100% - 56px));
3706
+ overflow-y: auto;
3707
+ overscroll-behavior: contain;
3708
+ }
3709
+
3710
+ body[data-preview-mode="mobile"] #teamModal .modal-card {
3711
+ display: flex;
3712
+ flex-direction: column;
3713
+ max-height: min(84%, calc(100% - 52px));
3714
+ }
3715
+
3716
+ body[data-preview-mode="mobile"] #settingsModal .wide-modal,
3717
+ body[data-preview-mode="mobile"] .modal-panel--settings {
3718
+ --modal-wide-width: calc(100% - 8px);
3719
+ height: calc(100% - 24px);
3720
+ max-height: calc(100% - 24px);
3721
+ display: flex;
3722
+ flex-direction: column;
3723
+ }
3724
+
3725
+ body[data-preview-mode="mobile"] #settingsModal {
3726
+ inset: 12px 0 0;
3727
+ align-items: flex-end;
3728
+ padding: var(--space-3) 0 0;
3729
+ }
3730
+
3731
+ body[data-preview-mode="mobile"] #settingsModal .modal-card {
3732
+ width: calc(100% - 8px);
3733
+ max-height: calc(100% - 24px);
3734
+ align-self: flex-end;
3735
+ margin: 0 auto 0;
3736
+ border-radius: var(--radius-sheet-top);
3737
+ }
3738
+
3739
+ body[data-preview-mode="mobile"] #teamModalForm {
3740
+ display: flex;
3741
+ flex: 1 1 auto;
3742
+ flex-direction: column;
3743
+ min-height: 0;
3744
+ gap: var(--space-3);
3745
+ }
3746
+
3747
+ body[data-preview-mode="mobile"] #teamModalForm .team-selection-list {
3748
+ flex: 1 1 auto;
3749
+ min-height: 120px;
3750
+ max-height: none;
3751
+ }
3752
+
3753
+ body[data-preview-mode="mobile"] #teamModalForm .primary-button {
3754
+ margin-top: auto;
3755
+ }
3756
+
3757
+ body[data-preview-mode="mobile"] .modal .section-heading {
3758
+ position: relative;
3759
+ align-items: flex-start;
3760
+ padding-right: var(--space-7);
3761
+ }
3762
+
3763
+ body[data-preview-mode="mobile"] .modal .section-heading h2 {
3764
+ font-size: clamp(1.08rem, 4.8vw, 1.38rem);
3765
+ line-height: var(--line-height-compact);
3766
+ letter-spacing: 0.01em;
3767
+ font-weight: var(--font-weight-semibold);
3768
+ }
3769
+
3770
+ body[data-preview-mode="mobile"] .modal .dashboard-grid,
3771
+ body[data-preview-mode="mobile"] .modal .field-grid {
3772
+ grid-template-columns: 1fr;
3773
+ }
3774
+
3775
+ body[data-preview-mode="mobile"] .modal .dashboard-grid {
3776
+ gap: var(--space-3);
3777
+ }
3778
+
3779
+ body[data-preview-mode="mobile"] #settingsModalBody .settings-card,
3780
+ body[data-preview-mode="mobile"] #settingsModalBody .settings-stack .settings-card {
3781
+ padding: 0;
3782
+ gap: var(--space-2);
3783
+ border: 0;
3784
+ background: transparent;
3785
+ }
3786
+
3787
+ body[data-preview-mode="mobile"] #settingsModalBody {
3788
+ flex: 1 1 auto;
3789
+ min-height: 0;
3790
+ overflow: auto;
3791
+ padding-right: var(--space-0-5);
3792
+ scrollbar-width: none;
3793
+ }
3794
+
3795
+ body[data-preview-mode="mobile"] #settingsModalBody::-webkit-scrollbar,
3796
+ body[data-preview-mode="mobile"] .modal .ballot-picker-list::-webkit-scrollbar,
3797
+ body[data-preview-mode="mobile"] .modal .team-selection-list::-webkit-scrollbar {
3798
+ width: 0;
3799
+ height: 0;
3800
+ }
3801
+
3802
+ body[data-preview-mode="mobile"] .modal .ballot-picker-list,
3803
+ body[data-preview-mode="mobile"] .modal .team-selection-list,
3804
+ body[data-preview-mode="mobile"] #settingsModalBody {
3805
+ scrollbar-width: none;
3806
+ overscroll-behavior: contain;
3807
+ }
3808
+
3809
+ body[data-preview-mode="mobile"] .modal .modal-close-button {
3810
+ position: absolute;
3811
+ top: 0;
3812
+ right: 0;
3813
+ }
3814
+
3815
+ @media (max-width: 760px) {
3816
+ .modal {
3817
+ display: flex;
3818
+ align-items: flex-start;
3819
+ padding: var(--space-15) 0 0;
3820
+ }
3821
+
3822
+ .modal-card {
3823
+ width: var(--modal-shell-width);
3824
+ max-height: var(--modal-shell-max-height);
3825
+ margin: 0 auto;
3826
+ border-radius: var(--radius-sharp);
3827
+ }
3828
+
3829
+ .wide-modal,
3830
+ .modal-panel--wide {
3831
+ width: var(--modal-wide-width, var(--modal-shell-width));
3832
+ max-height: var(--modal-shell-max-height);
3833
+ margin: 0 auto;
3834
+ border-radius: var(--radius-sharp);
3835
+ }
3836
+
3837
+ #dangerModal {
3838
+ align-items: center;
3839
+ padding: var(--space-6) 0;
3840
+ }
3841
+
3842
+ #dangerModal .modal-card {
3843
+ width: min(330px, calc(100% - 40px));
3844
+ max-height: min(420px, calc(100vh - 48px));
3845
+ margin: auto;
3846
+ }
3847
+ }
3848
+
3849
+ .ballot-picker-list {
3850
+ max-height: min(52vh, 420px);
3851
+ overflow: auto;
3852
+ touch-action: pan-y;
3853
+ padding-right: var(--space-1);
3854
+ margin-top: var(--space-1);
3855
+ }
3856
+
3857
+ .toast-region {
3858
+ position: fixed;
3859
+ right: 18px;
3860
+ bottom: 18px;
3861
+ z-index: var(--z-float);
3862
+ display: grid;
3863
+ gap: var(--space-3);
3864
+ width: min(360px, calc(100% - 24px));
3865
+ }
3866
+
3867
+ .toast {
3868
+ display: flex;
3869
+ align-items: flex-start;
3870
+ justify-content: space-between;
3871
+ gap: var(--space-3);
3872
+ padding: var(--space-4) var(--space-4);
3873
+ border-radius: var(--radius-sharp);
3874
+ border: 1px solid var(--color-border-strong);
3875
+ background: var(--toast-bg);
3876
+ color: var(--toast-fg);
3877
+ box-shadow: var(--shadow);
3878
+ }
3879
+
3880
+ .toast.success {
3881
+ border-color: var(--toast-border-success);
3882
+ }
3883
+
3884
+ .toast.error {
3885
+ border-color: var(--toast-border-danger);
3886
+ }
3887
+
3888
+ .toast.warning {
3889
+ border-color: var(--toast-border-warning);
3890
+ }
3891
+
3892
+ .toast button {
3893
+ padding: 0;
3894
+ background: transparent;
3895
+ color: var(--muted);
3896
+ border: 0;
3897
+ }
3898
+
3899
+ @container app (max-width: 1080px) {
3900
+ .admin-grid,
3901
+ .dashboard-grid,
3902
+ .ballot-layout,
3903
+ .results-summary,
3904
+ .field-grid {
3905
+ grid-template-columns: 1fr;
3906
+ }
3907
+ }
3908
+
3909
+ @media (max-width: 760px) {
3910
+ .preview-toolbar {
3911
+ padding: var(--space-3) var(--space-3) 0;
3912
+ }
3913
+
3914
+ .preview-toolbar-shell {
3915
+ width: 100%;
3916
+ align-items: stretch;
3917
+ flex-direction: column;
3918
+ gap: var(--space-3);
3919
+ }
3920
+
3921
+ .preview-mode-group {
3922
+ width: 100%;
3923
+ }
3924
+
3925
+ .preview-mode-button {
3926
+ flex: 1 1 0;
3927
+ justify-content: center;
3928
+ text-align: center;
3929
+ }
3930
+ }
3931
+
3932
+ body[data-preview-mode="mobile"] .preview-toolbar {
3933
+ padding: var(--space-3) var(--space-3) 0;
3934
+ }
3935
+
3936
+ body[data-preview-mode="mobile"] .preview-toolbar-shell {
3937
+ width: 100%;
3938
+ align-items: stretch;
3939
+ flex-direction: column;
3940
+ gap: var(--space-3);
3941
+ }
3942
+
3943
+ body[data-preview-mode="mobile"] .preview-mode-group {
3944
+ width: 100%;
3945
+ }
3946
+
3947
+ body[data-preview-mode="mobile"] .preview-mode-button {
3948
+ flex: 1 1 0;
3949
+ justify-content: center;
3950
+ text-align: center;
3951
+ }
3952
+
3953
+ body[data-preview-mode="mobile"] .top-nav {
3954
+ position: sticky;
3955
+ left: auto;
3956
+ right: auto;
3957
+ width: auto;
3958
+ margin-top: auto;
3959
+ }
3960
+
3961
+ @container app (max-width: 760px) {
3962
+ .page-shell {
3963
+ width: 100%;
3964
+ margin: 0;
3965
+ padding-top: var(--space-3);
3966
+ padding-bottom: 0;
3967
+ flex: 1 1 auto;
3968
+ display: flex;
3969
+ flex-direction: column;
3970
+ min-height: 0;
3971
+ }
3972
+
3973
+ .page-shell > main {
3974
+ flex: 1 1 auto;
3975
+ display: flex;
3976
+ flex-direction: column;
3977
+ padding: 0 var(--space-3) calc(var(--mobile-nav-height) + var(--space-10));
3978
+ }
3979
+
3980
+ .page-shell > main > .view {
3981
+ flex: 1 0 auto;
3982
+ }
3983
+
3984
+ .section-heading,
3985
+ .workspace-header {
3986
+ align-items: stretch;
3987
+ grid-template-columns: 1fr;
3988
+ flex-direction: column;
3989
+ }
3990
+
3991
+ .workspace-header--commissioner {
3992
+ display: grid;
3993
+ grid-template-columns: minmax(0, 1fr) auto;
3994
+ grid-template-areas:
3995
+ "title settings"
3996
+ "meta meta";
3997
+ align-items: center;
3998
+ }
3999
+
4000
+ .workspace-header--commissioner .workspace-title-row {
4001
+ grid-area: title;
4002
+ min-width: 0;
4003
+ }
4004
+
4005
+ .workspace-header--commissioner .workspace-meta {
4006
+ grid-area: meta;
4007
+ width: 100%;
4008
+ }
4009
+
4010
+ .workspace-header--commissioner .workspace-settings-button {
4011
+ grid-area: settings;
4012
+ justify-self: end;
4013
+ }
4014
+
4015
+ .commissioner-section-heading {
4016
+ flex-direction: row;
4017
+ align-items: center;
4018
+ justify-content: space-between;
4019
+ }
4020
+
4021
+ .app-title {
4022
+ font-size: var(--font-size-md);
4023
+ max-width: none;
4024
+ line-height: var(--line-height-compact);
4025
+ }
4026
+
4027
+ .header-account-avatar {
4028
+ width: 28px;
4029
+ height: 28px;
4030
+ font-size: var(--font-size-xs);
4031
+ }
4032
+
4033
+ .ink-popover-surface {
4034
+ min-width: 156px;
4035
+ max-width: min(180px, calc(100vw - 20px));
4036
+ padding: var(--space-2);
4037
+ }
4038
+
4039
+ .ink-popover-action {
4040
+ min-height: 34px;
4041
+ padding: var(--space-2) 9px;
4042
+ font-size: var(--font-size-sm);
4043
+ }
4044
+
4045
+ .nav-track {
4046
+ display: flex;
4047
+ width: 100%;
4048
+ background: transparent;
4049
+ border-radius: 0;
4050
+ padding: 0;
4051
+ gap: 0;
4052
+ }
4053
+
4054
+ .nav-slider {
4055
+ display: none;
4056
+ }
4057
+
4058
+ .top-nav {
4059
+ order: 2;
4060
+ align-self: stretch;
4061
+ position: fixed;
4062
+ left: 0;
4063
+ right: 0;
4064
+ bottom: 0;
4065
+ z-index: var(--z-nav);
4066
+ display: flex;
4067
+ flex-wrap: nowrap;
4068
+ gap: 1px;
4069
+ width: 100%;
4070
+ margin: 0;
4071
+ padding: var(--space-1) var(--space-3) calc(var(--space-1) + env(safe-area-inset-bottom, 0));
4072
+ border-top: 1px solid var(--line);
4073
+ border-right: 0;
4074
+ border-bottom: 0;
4075
+ border-left: 0;
4076
+ border-radius: var(--radius-none);
4077
+ background: var(--nav-mobile-bg);
4078
+ backdrop-filter: blur(14px);
4079
+ box-shadow: none;
4080
+ }
4081
+
4082
+ .nav-button {
4083
+ position: relative;
4084
+ flex: 1 1 0;
4085
+ justify-content: center;
4086
+ min-height: 56px;
4087
+ min-width: 0;
4088
+ padding: var(--space-2) var(--space-0-5) var(--space-2);
4089
+ border: 0;
4090
+ border-radius: var(--radius-sharp);
4091
+ background: transparent;
4092
+ color: var(--muted);
4093
+ flex-direction: column;
4094
+ gap: var(--space-1);
4095
+ font-size: var(--font-size-2xs);
4096
+ letter-spacing: 0.01em;
4097
+ text-align: center;
4098
+ white-space: normal;
4099
+ }
4100
+
4101
+ .nav-button.active {
4102
+ background: transparent;
4103
+ color: var(--accent-readable);
4104
+ }
4105
+
4106
+ .nav-icon {
4107
+ display: inline-flex;
4108
+ align-items: center;
4109
+ justify-content: center;
4110
+ }
4111
+
4112
+ .nav-icon svg {
4113
+ width: 18px;
4114
+ height: 18px;
4115
+ }
4116
+
4117
+ .nav-label {
4118
+ display: block;
4119
+ justify-content: center;
4120
+ width: 100%;
4121
+ line-height: var(--line-height-display);
4122
+ text-align: center;
4123
+ }
4124
+
4125
+ .nav-beta-label {
4126
+ display: none;
4127
+ }
4128
+
4129
+ .vote-nav-button .nav-badge {
4130
+ position: absolute;
4131
+ top: 6px;
4132
+ right: calc(50% - 18px);
4133
+ }
4134
+
4135
+ .panel {
4136
+ padding: var(--space-3);
4137
+ }
4138
+
4139
+ .league-grid {
4140
+ grid-template-columns: 1fr;
4141
+ gap: var(--space-2);
4142
+ }
4143
+
4144
+ .overview-summary-card {
4145
+ gap: var(--space-1);
4146
+ padding: var(--space-3) var(--space-3);
4147
+ }
4148
+
4149
+ .overview-summary-card h3 {
4150
+ font-size: var(--font-size-md);
4151
+ line-height: var(--line-height-display);
4152
+ }
4153
+
4154
+ .overview-summary-card .eyebrow {
4155
+ margin-bottom: 0;
4156
+ font-size: var(--font-size-2xs);
4157
+ }
4158
+
4159
+ .overview-card-meta {
4160
+ display: none;
4161
+ }
4162
+
4163
+ .overview-results-compact {
4164
+ display: grid;
4165
+ gap: var(--space-2);
4166
+ }
4167
+
4168
+ .overview-results-compact-header {
4169
+ gap: var(--space-2);
4170
+ }
4171
+
4172
+ .overview-results-link {
4173
+ justify-content: center;
4174
+ min-height: 38px;
4175
+ padding: var(--space-2) var(--space-3);
4176
+ font-size: var(--font-size-base);
4177
+ }
4178
+
4179
+ .overview-results-compact-header .overview-results-link {
4180
+ display: none;
4181
+ }
4182
+
4183
+ .overview-preview-list .overview-results-link {
4184
+ margin-top: var(--space-1);
4185
+ }
4186
+
4187
+ .overview-results-expanded {
4188
+ display: none;
4189
+ }
4190
+
4191
+ .section-heading-copy {
4192
+ max-width: none;
4193
+ text-align: left;
4194
+ }
4195
+
4196
+ .ballot-meta {
4197
+ display: flex;
4198
+ align-items: center;
4199
+ flex-wrap: wrap;
4200
+ gap: var(--space-1);
4201
+ margin: var(--space-2) 0 var(--space-3);
4202
+ }
4203
+
4204
+ .ballot-layout {
4205
+ gap: 0;
4206
+ }
4207
+
4208
+ .ballot-board-panel {
4209
+ padding: var(--space-3);
4210
+ }
4211
+
4212
+ .finder-panel {
4213
+ display: none;
4214
+ }
4215
+
4216
+ .rank-slot {
4217
+ grid-template-columns: 48px minmax(0, 1fr) auto;
4218
+ gap: var(--space-2);
4219
+ align-items: center;
4220
+ padding: 0;
4221
+ }
4222
+
4223
+ .rank-chip {
4224
+ min-height: 40px;
4225
+ padding: var(--space-1) var(--space-2);
4226
+ font-size: var(--font-size-md);
4227
+ }
4228
+
4229
+ .slot-button {
4230
+ min-height: 40px;
4231
+ padding: var(--space-2) var(--space-3);
4232
+ font-size: var(--font-size-md);
4233
+ }
4234
+
4235
+ .rank-slot .inline-utility-button {
4236
+ grid-column: 3;
4237
+ justify-self: end;
4238
+ min-width: 36px;
4239
+ min-height: 36px;
4240
+ padding: 0;
4241
+ padding-right: 0;
4242
+ font-size: var(--font-size-md);
4243
+ }
4244
+
4245
+ .mobile-ballot-actions {
4246
+ display: grid;
4247
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4248
+ padding-bottom: calc(var(--mobile-nav-height) + var(--space-4));
4249
+ }
4250
+
4251
+ .mobile-ballot-actions--single {
4252
+ grid-template-columns: 1fr;
4253
+ }
4254
+
4255
+ #roundModal,
4256
+ #teamModal,
4257
+ #ballotPickerModal,
4258
+ #createLeagueModal {
4259
+ align-items: flex-end;
4260
+ padding: var(--space-14) 0 0;
4261
+ }
4262
+
4263
+ #roundModal .modal-card,
4264
+ #teamModal .modal-card,
4265
+ #ballotPickerModal .modal-card,
4266
+ #createLeagueModal .modal-card {
4267
+ width: calc(100% - 16px);
4268
+ align-self: flex-end;
4269
+ margin: 0 auto 0;
4270
+ border-radius: var(--radius-sheet-top);
4271
+ }
4272
+
4273
+ #roundModal .modal-card,
4274
+ #ballotPickerModal .modal-card,
4275
+ #createLeagueModal .modal-card {
4276
+ max-height: min(82vh, calc(100vh - 52px));
4277
+ display: flex;
4278
+ flex-direction: column;
4279
+ min-height: 0;
4280
+ }
4281
+
4282
+ #createLeagueModalForm {
4283
+ min-height: 0;
4284
+ padding-right: var(--space-0-5);
4285
+ }
4286
+
4287
+ #createLeagueModalForm {
4288
+ display: flex;
4289
+ flex-direction: column;
4290
+ overflow: hidden;
4291
+ }
4292
+
4293
+ .create-league-form-body {
4294
+ padding-right: 0;
4295
+ }
4296
+
4297
+ #createLeagueModalForm .create-league-actions {
4298
+ display: block;
4299
+ }
4300
+
4301
+ #teamModal .modal-card {
4302
+ display: flex;
4303
+ flex-direction: column;
4304
+ max-height: min(84vh, calc(100vh - 44px));
4305
+ }
4306
+
4307
+ .ballot-picker-modal-card {
4308
+ align-self: flex-end;
4309
+ width: calc(100% - 16px);
4310
+ max-height: min(82vh, calc(100vh - 52px));
4311
+ margin: auto auto 0;
4312
+ border-radius: var(--radius-sheet-top);
4313
+ }
4314
+
4315
+ .ballot-picker-modal-card .section-heading {
4316
+ margin-bottom: var(--space-3);
4317
+ }
4318
+
4319
+ .ballot-picker-modal-card .stacked-form {
4320
+ display: flex;
4321
+ flex: 1 1 auto;
4322
+ flex-direction: column;
4323
+ min-height: 0;
4324
+ gap: var(--space-3);
4325
+ }
4326
+
4327
+ .ballot-picker-modal-card .ballot-picker-list {
4328
+ flex: 1 1 auto;
4329
+ min-height: 0;
4330
+ max-height: min(56vh, 520px);
4331
+ overflow: auto;
4332
+ overscroll-behavior: contain;
4333
+ -webkit-overflow-scrolling: touch;
4334
+ margin-top: 0;
4335
+ padding-right: 0;
4336
+ }
4337
+
4338
+ .ballot-picker-list .picker-team-button,
4339
+ .ballot-picker-list .slot-button {
4340
+ touch-action: pan-y;
4341
+ }
4342
+
4343
+ .results-controls {
4344
+ gap: var(--space-3);
4345
+ }
4346
+
4347
+ .results-share-action {
4348
+ min-width: 0;
4349
+ }
4350
+
4351
+ .results-action-label--full {
4352
+ display: none;
4353
+ }
4354
+
4355
+ .results-action-label--short {
4356
+ display: inline;
4357
+ }
4358
+
4359
+ .results-title-select select {
4360
+ min-height: 48px;
4361
+ padding: var(--space-3) var(--space-11) var(--space-2) var(--space-3);
4362
+ font-size: clamp(1rem, 4.5vw, 1.22rem);
4363
+ }
4364
+
4365
+ .results-round-select > span {
4366
+ font-size: var(--font-size-xs);
4367
+ }
4368
+
4369
+ .results-board-header {
4370
+ align-items: stretch;
4371
+ flex-direction: column;
4372
+ gap: var(--space-2);
4373
+ margin-bottom: var(--space-0-5);
4374
+ }
4375
+
4376
+ #resultsBoard.top-gap {
4377
+ margin-top: var(--space-3);
4378
+ padding-top: var(--space-3);
4379
+ border-top: 1px solid var(--line-soft);
4380
+ }
4381
+
4382
+ .results-round-context {
4383
+ font-size: var(--font-size-base);
4384
+ }
4385
+
4386
+ .overview-preview-row {
4387
+ grid-template-columns: auto minmax(0, 1fr) auto;
4388
+ gap: var(--space-2);
4389
+ padding: var(--space-2) 0 var(--space-2) var(--space-2);
4390
+ }
4391
+
4392
+ .overview-preview-rank {
4393
+ min-width: 26px;
4394
+ font-size: var(--font-size-md);
4395
+ }
4396
+
4397
+ .overview-preview-copy strong {
4398
+ font-size: var(--font-size-md);
4399
+ margin-bottom: 1px;
4400
+ }
4401
+
4402
+ .overview-preview-copy .subtle {
4403
+ display: none;
4404
+ }
4405
+
4406
+ .overview-preview-row .mobile-result-points {
4407
+ font-size: var(--font-size-base);
4408
+ }
4409
+
4410
+ .results-meta {
4411
+ display: flex;
4412
+ flex-wrap: wrap;
4413
+ gap: var(--space-2);
4414
+ justify-content: space-between;
4415
+ width: 100%;
4416
+ margin-bottom: var(--space-2);
4417
+ }
4418
+
4419
+ .results-meta .results-share-action {
4420
+ flex: 1 1 132px;
4421
+ min-height: 44px;
4422
+ padding: var(--space-2) var(--space-3);
4423
+ text-align: center;
4424
+ }
4425
+
4426
+ .results-action-label--full {
4427
+ display: none;
4428
+ }
4429
+
4430
+ .results-action-label--short {
4431
+ display: inline;
4432
+ }
4433
+
4434
+ .result-row {
4435
+ grid-template-columns: auto minmax(0, 1fr) auto;
4436
+ gap: var(--space-3);
4437
+ align-items: center;
4438
+ padding: var(--space-2) 0 var(--space-2) var(--space-3);
4439
+ border-left: 2px solid var(--accent);
4440
+ }
4441
+
4442
+ .result-rank-block {
4443
+ display: block;
4444
+ min-width: 26px;
4445
+ gap: 0;
4446
+ padding-left: 0;
4447
+ border-left: 0;
4448
+ }
4449
+
4450
+ .rank-number {
4451
+ font-size: var(--font-size-md);
4452
+ }
4453
+
4454
+ .result-rank-block .mini-label,
4455
+ .result-trend,
4456
+ .result-metrics-grid {
4457
+ display: none;
4458
+ }
4459
+
4460
+ .result-main {
4461
+ display: block;
4462
+ min-width: 0;
4463
+ }
4464
+
4465
+ .result-main strong {
4466
+ min-width: 0;
4467
+ margin: 0;
4468
+ overflow: hidden;
4469
+ text-overflow: ellipsis;
4470
+ white-space: nowrap;
4471
+ font-size: var(--font-size-md);
4472
+ }
4473
+
4474
+ .mobile-result-points {
4475
+ display: inline-flex;
4476
+ flex: 0 0 auto;
4477
+ color: var(--muted);
4478
+ font-size: var(--font-size-base);
4479
+ font-weight: var(--font-weight-bold);
4480
+ justify-self: end;
4481
+ white-space: nowrap;
4482
+ }
4483
+
4484
+ .mini-label,
4485
+ .pill {
4486
+ font-size: var(--font-size-2xs);
4487
+ }
4488
+
4489
+ .section-heading {
4490
+ margin-bottom: var(--space-3);
4491
+ }
4492
+
4493
+ .section-heading h2,
4494
+ .board-title,
4495
+ .workspace-title {
4496
+ font-size: var(--font-size-lg);
4497
+ line-height: var(--line-height-compact);
4498
+ letter-spacing: 0.01em;
4499
+ font-weight: var(--font-weight-semibold);
4500
+ }
4501
+
4502
+ label,
4503
+ input,
4504
+ select,
4505
+ textarea,
4506
+ .helper-text,
4507
+ .subtle {
4508
+ font-size: var(--font-size-md);
4509
+ }
4510
+
4511
+ .league-nav-row {
4512
+ min-width: 0;
4513
+ padding: var(--space-2) var(--space-3);
4514
+ border: 1px solid transparent;
4515
+ border-left: 2px solid transparent;
4516
+ border-radius: var(--radius-none);
4517
+ background: transparent;
4518
+ }
4519
+
4520
+ .league-selector-row {
4521
+ grid-template-columns: minmax(0, 1fr) auto;
4522
+ gap: var(--space-1);
4523
+ }
4524
+
4525
+ .selector-list {
4526
+ display: grid;
4527
+ gap: var(--space-1);
4528
+ overflow: visible;
4529
+ padding-bottom: 0;
4530
+ }
4531
+
4532
+ .admin-sidebar {
4533
+ gap: var(--space-3);
4534
+ }
4535
+
4536
+ .sidebar-group + .sidebar-group {
4537
+ margin-top: 0;
4538
+ }
4539
+
4540
+ .sidebar-demo-group,
4541
+ .sidebar-create-group {
4542
+ padding-top: 0;
4543
+ padding-bottom: 0;
4544
+ border-top: 0;
4545
+ border-bottom: 0;
4546
+ }
4547
+
4548
+ .workspace-meta,
4549
+ .workspace-stats {
4550
+ justify-content: flex-start;
4551
+ min-width: 0;
4552
+ }
4553
+
4554
+ .workspace-title-row {
4555
+ width: 100%;
4556
+ align-items: center;
4557
+ }
4558
+
4559
+ .workspace-settings-button {
4560
+ width: 36px;
4561
+ justify-content: center;
4562
+ }
4563
+
4564
+ #authPanel .stacked-form {
4565
+ gap: var(--space-3);
4566
+ }
4567
+
4568
+ #authPanel .primary-button {
4569
+ margin-top: var(--space-1);
4570
+ }
4571
+
4572
+ #voteEntryPanel .compact-card,
4573
+ #voteEntryPanel .callout.vote-callout {
4574
+ padding: var(--space-3) var(--space-3);
4575
+ }
4576
+
4577
+ #voteEntryPanel .compact-card .eyebrow {
4578
+ margin-bottom: var(--space-0-5);
4579
+ }
4580
+
4581
+ #voteEntryPanel > .helper-text {
4582
+ margin: var(--space-2) 0 0;
4583
+ line-height: var(--line-height-body);
4584
+ }
4585
+
4586
+ #leagueSetupForm.top-gap {
4587
+ margin-top: var(--space-3);
4588
+ }
4589
+
4590
+ #leagueSetupForm {
4591
+ gap: var(--space-3);
4592
+ }
4593
+
4594
+ .workspace-header,
4595
+ .invite-link,
4596
+ .settings-card,
4597
+ .team-selection-item,
4598
+ .selector-button,
4599
+ .ghost-button,
4600
+ .secondary-button,
4601
+ .primary-button,
4602
+ .danger-button {
4603
+ min-width: 0;
4604
+ }
4605
+
4606
+ .panel,
4607
+ .settings-card,
4608
+ .workspace-context-card,
4609
+ .compact-card,
4610
+ .invite-card,
4611
+ .callout,
4612
+ .empty-state {
4613
+ width: 100%;
4614
+ max-width: 100%;
4615
+ }
4616
+
4617
+ .workspace-title,
4618
+ .invite-link-text,
4619
+ .selector-button strong {
4620
+ overflow: hidden;
4621
+ text-overflow: ellipsis;
4622
+ white-space: nowrap;
4623
+ }
4624
+
4625
+ .team-selection-item {
4626
+ flex-wrap: nowrap;
4627
+ gap: var(--space-3);
4628
+ padding: var(--space-3) var(--space-3);
4629
+ }
4630
+
4631
+ .team-selection-list {
4632
+ gap: 0;
4633
+ }
4634
+
4635
+ .invite-link {
4636
+ display: grid;
4637
+ align-items: start;
4638
+ }
4639
+
4640
+ .invite-link-text {
4641
+ white-space: normal;
4642
+ word-break: break-word;
4643
+ }
4644
+
4645
+ .invite-copy-button {
4646
+ display: inline-flex;
4647
+ align-items: center;
4648
+ gap: var(--space-2);
4649
+ min-height: 44px;
4650
+ padding: 0;
4651
+ }
4652
+
4653
+ .invite-copy-text {
4654
+ display: inline;
4655
+ font-size: var(--font-size-base);
4656
+ font-weight: var(--font-weight-bold);
4657
+ }
4658
+
4659
+ .modal .dashboard-grid,
4660
+ .modal .field-grid {
4661
+ grid-template-columns: 1fr;
4662
+ }
4663
+
4664
+ body:not([data-preview-mode]) .app-frame {
4665
+ min-height: 100svh;
4666
+ min-height: 100dvh;
4667
+ display: flex;
4668
+ flex-direction: column;
4669
+ }
4670
+
4671
+ body:not([data-preview-mode]) .app-frame > .page-shell {
4672
+ flex: 1 1 auto;
4673
+ min-height: 0;
4674
+ }
4675
+
4676
+ .modal {
4677
+ padding: max(72px, calc(env(safe-area-inset-top, 0px) + var(--space-6))) 0 0;
4678
+ --modal-shell-width: min(100% - 16px, 580px);
4679
+ --modal-shell-max-height: calc(100dvh - 36px);
4680
+ --modal-shell-padding: var(--space-3);
4681
+ --modal-heading-gap: var(--space-3);
4682
+ --modal-heading-margin: var(--space-3);
4683
+ --modal-heading-compact-margin: var(--space-3);
4684
+ --modal-eyebrow-margin: var(--space-2);
4685
+ --modal-grid-gap: var(--space-3);
4686
+ --modal-card-padding: var(--space-3);
4687
+ --modal-label-gap: var(--space-2);
4688
+ --modal-control-padding: var(--space-3) var(--space-3);
4689
+ }
4690
+
4691
+ #settingsModal .wide-modal,
4692
+ .modal-panel--settings {
4693
+ --modal-wide-width: calc(100% - 8px);
4694
+ height: calc(100vh - 24px);
4695
+ max-height: calc(100vh - 24px);
4696
+ display: flex;
4697
+ flex-direction: column;
4698
+ }
4699
+
4700
+ #settingsModal {
4701
+ align-items: flex-end;
4702
+ padding: max(72px, calc(env(safe-area-inset-top, 0px) + var(--space-6))) 0 0;
4703
+ }
4704
+
4705
+ #settingsModal .modal-card {
4706
+ width: calc(100% - 8px);
4707
+ max-height: calc(100dvh - 24px);
4708
+ align-self: flex-end;
4709
+ margin: 0 auto 0;
4710
+ border-radius: var(--radius-sheet-top);
4711
+ }
4712
+
4713
+ #teamModalForm {
4714
+ display: flex;
4715
+ flex: 1 1 auto;
4716
+ flex-direction: column;
4717
+ min-height: 0;
4718
+ gap: var(--space-3);
4719
+ }
4720
+
4721
+ #teamModalForm .team-selection-list {
4722
+ flex: 1 1 auto;
4723
+ min-height: 120px;
4724
+ max-height: none;
4725
+ }
4726
+
4727
+ #teamModalForm .primary-button {
4728
+ margin-top: auto;
4729
+ }
4730
+
4731
+ .modal .section-heading {
4732
+ position: relative;
4733
+ align-items: flex-start;
4734
+ padding-right: var(--space-7);
4735
+ }
4736
+
4737
+ .modal .section-heading h2 {
4738
+ font-size: clamp(1.08rem, 4.8vw, 1.38rem);
4739
+ line-height: var(--line-height-compact);
4740
+ letter-spacing: 0.01em;
4741
+ font-weight: var(--font-weight-semibold);
4742
+ }
4743
+
4744
+ .modal .dashboard-grid {
4745
+ gap: var(--space-3);
4746
+ }
4747
+
4748
+ #settingsModalBody .settings-card,
4749
+ #settingsModalBody .settings-stack .settings-card {
4750
+ padding: 0;
4751
+ gap: var(--space-2);
4752
+ border: 0;
4753
+ background: transparent;
4754
+ }
4755
+
4756
+ #settingsModalBody {
4757
+ flex: 1 1 auto;
4758
+ min-height: 0;
4759
+ overflow: auto;
4760
+ padding-right: var(--space-0-5);
4761
+ scrollbar-width: none;
4762
+ }
4763
+
4764
+ #settingsModalBody::-webkit-scrollbar,
4765
+ .modal .ballot-picker-list::-webkit-scrollbar,
4766
+ .modal .team-selection-list::-webkit-scrollbar {
4767
+ width: 0;
4768
+ height: 0;
4769
+ }
4770
+
4771
+ .modal .ballot-picker-list,
4772
+ .modal .team-selection-list,
4773
+ #settingsModalBody {
4774
+ scrollbar-width: none;
4775
+ overscroll-behavior: contain;
4776
+ }
4777
+
4778
+ .modal .modal-close-button {
4779
+ position: absolute;
4780
+ top: 4px;
4781
+ right: 0;
4782
+ }
4783
+ }
4784
+
4785
+ @container app (min-width: 761px) and (max-width: 920px) {
4786
+ .top-nav {
4787
+ gap: var(--space-2);
4788
+ }
4789
+
4790
+ .nav-button {
4791
+ padding: var(--space-3) var(--space-4);
4792
+ }
4793
+ }
4794
+
4795
+ /* ── Login Screen ─────────────────────────────────────────── */
4796
+
4797
+ .login-shell {
4798
+ display: grid;
4799
+ grid-template-columns: 1fr 500px;
4800
+ height: 100vh;
4801
+ background: var(--color-bg-base);
4802
+ color: var(--color-text-primary);
4803
+ font-family: var(--font-body);
4804
+ overflow: hidden;
4805
+ }
4806
+
4807
+ .login-hero {
4808
+ position: relative;
4809
+ display: flex;
4810
+ flex-direction: column;
4811
+ align-items: center;
4812
+ justify-content: center;
4813
+ gap: 0;
4814
+ padding-top: 60px;
4815
+ background: var(--color-bg-base);
4816
+ overflow: hidden;
4817
+ container-type: inline-size;
4818
+ container-name: login-hero;
4819
+ }
4820
+
4821
+ .login-logo {
4822
+ position: absolute;
4823
+ top: 28px;
4824
+ left: 32px;
4825
+ z-index: 10;
4826
+ }
4827
+
4828
+ .login-logo img {
4829
+ height: 40px;
4830
+ width: auto;
4831
+ display: block;
4832
+ }
4833
+
4834
+ .login-tagline {
4835
+ font-family: var(--font-display);
4836
+ font-weight: 800;
4837
+ font-size: clamp(32px, 6cqi, 60px);
4838
+ line-height: 1.05;
4839
+ letter-spacing: -0.01em;
4840
+ text-align: center;
4841
+ color: var(--color-text-strong);
4842
+ max-width: min(90%, 900px);
4843
+ position: relative;
4844
+ z-index: 1;
4845
+ margin: 0 0 -20px;
4846
+ }
4847
+
4848
+ .login-cta {
4849
+ color: var(--color-brand-emphasis);
4850
+ }
4851
+
4852
+ .hero-composition {
4853
+ position: relative;
4854
+ width: 980px;
4855
+ height: 580px;
4856
+ flex-shrink: 0;
4857
+ overflow: visible;
4858
+ transform-origin: top center;
4859
+ transform: scale(var(--hero-scale, 1));
4860
+ margin-bottom: calc((var(--hero-scale, 1) - 1) * 580px);
4861
+ }
4862
+
4863
+ @container login-hero (max-width: 880px) {
4864
+ .hero-composition { --hero-scale: 0.9; }
4865
+ }
4866
+
4867
+ @container login-hero (max-width: 750px) {
4868
+ .hero-composition { --hero-scale: 0.75; }
4869
+ }
4870
+
4871
+ @container login-hero (max-width: 620px) {
4872
+ .hero-composition { --hero-scale: 0.65; }
4873
+ }
4874
+
4875
+ .login-rankings-card {
4876
+ position: absolute;
4877
+ top: 80px;
4878
+ bottom: 80px;
4879
+ left: 90px;
4880
+ right: 90px;
4881
+ background: var(--color-surface-default);
4882
+ border: 1px solid var(--color-border-default);
4883
+ border-radius: var(--radius-default);
4884
+ overflow: hidden;
4885
+ z-index: 1;
4886
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.7), 0 4px 16px rgba(0, 0, 0, 0.4);
4887
+ display: flex;
4888
+ flex-direction: column;
4889
+ }
4890
+
4891
+ .lrc-header {
4892
+ display: flex;
4893
+ align-items: center;
4894
+ gap: 8px;
4895
+ padding: 10px 14px 8px;
4896
+ border-bottom: 1px solid var(--color-border-subtle);
4897
+ flex-shrink: 0;
4898
+ }
4899
+
4900
+ .lrc-trophy {
4901
+ font-size: 11px;
4902
+ color: var(--color-brand-emphasis);
4903
+ line-height: 1;
4904
+ flex-shrink: 0;
4905
+ }
4906
+
4907
+ .lrc-label {
4908
+ font-family: var(--font-display);
4909
+ font-weight: 700;
4910
+ font-size: 9px;
4911
+ letter-spacing: 0.1em;
4912
+ text-transform: uppercase;
4913
+ color: var(--color-text-secondary);
4914
+ }
4915
+
4916
+ .lrc-rows {
4917
+ flex: 1;
4918
+ display: flex;
4919
+ flex-direction: column;
4920
+ overflow: hidden;
4921
+ }
4922
+
4923
+ .lrc-row {
4924
+ display: grid;
4925
+ grid-template-columns: 42px 1fr auto;
4926
+ align-items: center;
4927
+ padding: 7px 14px;
4928
+ border-left: 2px solid transparent;
4929
+ border-bottom: 1px solid var(--color-border-subtle);
4930
+ flex: 1;
4931
+ }
4932
+
4933
+ .lrc-row:last-child {
4934
+ border-bottom: 0;
4935
+ }
4936
+
4937
+ .lrc-row--1st {
4938
+ border-left-color: var(--rank-accent);
4939
+ }
4940
+
4941
+ .lrc-row--2nd {
4942
+ border-left-color: rgba(115, 0, 10, 0.45);
4943
+ }
4944
+
4945
+ .lrc-rank {
4946
+ font-family: var(--font-display);
4947
+ font-weight: 800;
4948
+ font-size: 17px;
4949
+ color: var(--color-text-strong);
4950
+ line-height: 1;
4951
+ }
4952
+
4953
+ .lrc-rank-sub {
4954
+ font-size: 7px;
4955
+ letter-spacing: 0.1em;
4956
+ text-transform: uppercase;
4957
+ color: var(--color-text-secondary);
4958
+ font-weight: 600;
4959
+ }
4960
+
4961
+ .lrc-team {
4962
+ padding: 0 10px;
4963
+ }
4964
+
4965
+ .lrc-team-name {
4966
+ font-weight: 700;
4967
+ font-size: 11px;
4968
+ color: var(--color-text-strong);
4969
+ line-height: 1.2;
4970
+ }
4971
+
4972
+ .lrc-team-sub {
4973
+ font-size: 9px;
4974
+ color: var(--color-text-secondary);
4975
+ margin-top: 1px;
4976
+ }
4977
+
4978
+ .lrc-metrics {
4979
+ display: flex;
4980
+ gap: 14px;
4981
+ }
4982
+
4983
+ .lrc-metric {
4984
+ text-align: right;
4985
+ }
4986
+
4987
+ .lrc-metric-label {
4988
+ font-size: 7px;
4989
+ letter-spacing: 0.08em;
4990
+ text-transform: uppercase;
4991
+ color: var(--color-text-secondary);
4992
+ font-weight: 600;
4993
+ line-height: 1;
4994
+ }
4995
+
4996
+ .lrc-metric-val {
4997
+ font-family: var(--font-display);
4998
+ font-weight: 700;
4999
+ font-size: 13px;
5000
+ color: var(--color-text-primary);
5001
+ line-height: 1.2;
5002
+ }
5003
+
5004
+ @keyframes login-float {
5005
+ 0%, 100% { transform: rotate(var(--item-tilt, 0deg)) translateY(0); }
5006
+ 50% { transform: rotate(var(--item-tilt, 0deg)) translateY(-14px); }
5007
+ }
5008
+
5009
+ .login-orbit-item {
5010
+ position: absolute;
5011
+ width: 110px;
5012
+ height: 110px;
5013
+ display: flex;
5014
+ align-items: center;
5015
+ justify-content: center;
5016
+ z-index: 2;
5017
+ animation: login-float 4s ease-in-out infinite;
5018
+ }
5019
+
5020
+ @media (prefers-reduced-motion: reduce) {
5021
+ .login-orbit-item { animation: none; transform: rotate(var(--item-tilt, 0deg)); }
5022
+ }
5023
+
5024
+ .login-orbit-item img {
5025
+ width: 100%;
5026
+ height: 100%;
5027
+ object-fit: contain;
5028
+ image-rendering: pixelated;
5029
+ display: block;
5030
+ filter: drop-shadow(0 8px 20px rgba(0, 0, 0, 0.55));
5031
+ }
5032
+
5033
+ .login-panel {
5034
+ display: flex;
5035
+ align-items: center;
5036
+ justify-content: center;
5037
+ padding: 48px 40px;
5038
+ background: var(--color-bg-canvas);
5039
+ border-left: 1px solid var(--color-border-subtle);
5040
+ }
5041
+
5042
+ .login-panel-inner {
5043
+ display: flex;
5044
+ flex-direction: column;
5045
+ gap: 20px;
5046
+ width: 100%;
5047
+ }
5048
+
5049
+ .login-heading {
5050
+ display: flex;
5051
+ flex-direction: column;
5052
+ gap: 8px;
5053
+ }
5054
+
5055
+ .login-heading h1 {
5056
+ font-family: var(--font-display);
5057
+ font-weight: 800;
5058
+ font-size: 26px;
5059
+ letter-spacing: -0.01em;
5060
+ line-height: 1.1;
5061
+ color: var(--color-text-strong);
5062
+ }
5063
+
5064
+ .login-heading p {
5065
+ font-size: 14px;
5066
+ color: var(--color-text-secondary);
5067
+ line-height: 1.5;
5068
+ }
5069
+
5070
+ .login-provider-buttons {
5071
+ display: flex;
5072
+ flex-direction: column;
5073
+ gap: 10px;
5074
+ }
5075
+
5076
+ .login-provider-btn {
5077
+ display: flex;
5078
+ align-items: center;
5079
+ gap: 10px;
5080
+ width: 100%;
5081
+ padding: 11px 16px;
5082
+ background: var(--color-surface-raised);
5083
+ border: 1px solid var(--color-border-strong);
5084
+ border-radius: var(--radius-sharp);
5085
+ color: var(--color-text-primary);
5086
+ font-family: var(--font-body);
5087
+ font-size: 14px;
5088
+ font-weight: 600;
5089
+ cursor: pointer;
5090
+ text-align: left;
5091
+ transition: background 0.1s, border-color 0.1s;
5092
+ }
5093
+
5094
+ .login-provider-btn:hover {
5095
+ background: var(--color-surface-active);
5096
+ border-color: var(--color-border-interactive);
5097
+ }
5098
+
5099
+ .login-provider-btn i {
5100
+ font-size: 18px;
5101
+ color: var(--color-text-secondary);
5102
+ flex-shrink: 0;
5103
+ }
5104
+
5105
+ .login-footnote {
5106
+ font-size: 12px;
5107
+ color: var(--color-text-secondary);
5108
+ line-height: 1.6;
5109
+ }
5110
+
5111
+ @media (max-width: 760px) {
5112
+ .login-shell {
5113
+ grid-template-columns: 1fr;
5114
+ }
5115
+
5116
+ .login-hero {
5117
+ display: none;
5118
+ }
5119
+ }
5120
+
5121
+ .docs-stage,
5122
+ .guidance-stage,
5123
+ .foundation-stage {
5124
+ display: grid;
5125
+ gap: var(--space-6);
5126
+ }
5127
+
5128
+ .docs-card,
5129
+ .guidance-card,
5130
+ .foundation-card {
5131
+ padding: var(--space-6);
5132
+ border: 1px solid var(--color-border-default);
5133
+ border-radius: var(--radius-rounded);
5134
+ background: color-mix(in srgb, var(--color-surface-raised) 92%, transparent);
5135
+ box-shadow: var(--shadow);
5136
+ }
5137
+
5138
+ .swatch-grid,
5139
+ .token-grid,
5140
+ .specimen-grid {
5141
+ display: grid;
5142
+ gap: var(--space-4);
5143
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
5144
+ }
5145
+
5146
+ .swatch,
5147
+ .token-card,
5148
+ .specimen-card {
5149
+ padding: var(--space-4);
5150
+ border-radius: var(--radius-rounded);
5151
+ border: 1px solid var(--color-border-default);
5152
+ background: color-mix(in srgb, var(--color-overlay-soft) 85%, transparent);
5153
+ }
5154
+
5155
+ .specimen-card h3,
5156
+ .token-card h3 {
5157
+ margin: 0 0 var(--space-2);
5158
+ font-family: "Source Sans 3", sans-serif;
5159
+ font-size: var(--font-size-label);
5160
+ }