@cs2dak/react 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/theme.css CHANGED
@@ -151,6 +151,55 @@
151
151
  background: linear-gradient(180deg, rgba(255, 122, 33, 0.2), rgba(255, 122, 33, 0.08));
152
152
  }
153
153
 
154
+ .dak-finding-panel {
155
+ display: grid;
156
+ gap: 9px;
157
+ padding: 14px;
158
+ border: 1px solid var(--dak-border-hi);
159
+ border-radius: 8px;
160
+ background: var(--dak-panel);
161
+ }
162
+
163
+ .dak-finding-head {
164
+ display: flex;
165
+ align-items: start;
166
+ justify-content: space-between;
167
+ gap: 12px;
168
+ }
169
+
170
+ .dak-finding-head small,
171
+ .dak-finding-meta,
172
+ .dak-limit-note {
173
+ color: var(--dak-fg-dim);
174
+ font-size: 11px;
175
+ }
176
+
177
+ .dak-finding-head h3,
178
+ .dak-finding-panel p {
179
+ margin: 0;
180
+ }
181
+
182
+ .dak-finding-head h3 {
183
+ margin-top: 3px;
184
+ font-size: 14px;
185
+ }
186
+
187
+ .dak-finding-meta {
188
+ display: flex;
189
+ flex-wrap: wrap;
190
+ gap: 10px;
191
+ }
192
+
193
+ .dak-limit-note {
194
+ margin: 0;
195
+ line-height: 1.45;
196
+ }
197
+
198
+ .dak-limit-note b {
199
+ margin-right: 6px;
200
+ color: var(--dak-fg-mid);
201
+ }
202
+
154
203
  .dak-leaderboard .dak-col-sortable {
155
204
  cursor: pointer;
156
205
  }
@@ -218,6 +267,11 @@
218
267
  font-size: 13px;
219
268
  }
220
269
 
270
+ .dak-table-scroll {
271
+ max-width: 100%;
272
+ overflow-x: auto;
273
+ }
274
+
221
275
  .dak-table th,
222
276
  .dak-table td {
223
277
  border-bottom: 1px solid var(--dak-border);
@@ -300,6 +354,213 @@
300
354
  border-radius: 50%;
301
355
  }
302
356
 
357
+ /* ── 队伍对比(TeamComparisonPanel) ── */
358
+
359
+ .dak-team-compare {
360
+ min-width: 0;
361
+ }
362
+
363
+ .dak-team-compare-grid {
364
+ display: grid;
365
+ grid-template-columns: minmax(180px, 0.9fr) minmax(200px, 1.2fr) minmax(180px, 0.9fr);
366
+ gap: 14px;
367
+ align-items: start;
368
+ }
369
+
370
+ .dak-team-side {
371
+ min-width: 0;
372
+ }
373
+
374
+ .dak-team-side h3 {
375
+ margin: 0 0 8px;
376
+ font-size: 13px;
377
+ font-weight: 700;
378
+ }
379
+
380
+ .dak-team-side table {
381
+ width: 100%;
382
+ border-collapse: collapse;
383
+ font-size: 12px;
384
+ }
385
+
386
+ .dak-team-side th,
387
+ .dak-team-side td {
388
+ padding: 5px 4px;
389
+ border-bottom: 1px solid var(--dak-border);
390
+ text-align: right;
391
+ white-space: nowrap;
392
+ }
393
+
394
+ .dak-team-side th:first-child,
395
+ .dak-team-side td:first-child {
396
+ text-align: left;
397
+ min-width: 60px;
398
+ }
399
+
400
+ .dak-team-side th {
401
+ color: var(--dak-fg-dim);
402
+ font-size: 10px;
403
+ text-transform: uppercase;
404
+ letter-spacing: 0.08em;
405
+ }
406
+
407
+ .dak-team-weapons,
408
+ .dak-team-economy {
409
+ display: flex;
410
+ flex-wrap: wrap;
411
+ gap: 4px;
412
+ margin-top: 8px;
413
+ }
414
+
415
+ .dak-team-weapons span,
416
+ .dak-team-economy span {
417
+ min-height: 22px;
418
+ display: inline-flex;
419
+ align-items: center;
420
+ gap: 4px;
421
+ padding: 0 7px;
422
+ border: 1px solid var(--dak-border);
423
+ border-radius: 3px;
424
+ background: var(--dak-bg-subtle);
425
+ color: var(--dak-fg-mid);
426
+ font-size: 11px;
427
+ }
428
+
429
+ .dak-team-weapons b,
430
+ .dak-team-economy b {
431
+ color: var(--dak-fg);
432
+ }
433
+
434
+ /* 雷达对比行 */
435
+ .dak-team-radar {
436
+ min-width: 0;
437
+ display: grid;
438
+ gap: 6px;
439
+ }
440
+
441
+ .dak-team-radar-row {
442
+ display: grid;
443
+ grid-template-columns: minmax(64px, 0.5fr) 44px minmax(0, 1fr) 44px 44px;
444
+ gap: 6px;
445
+ align-items: center;
446
+ font-size: 12px;
447
+ }
448
+
449
+ .dak-team-radar-row span {
450
+ color: var(--dak-fg-mid);
451
+ font-size: 11px;
452
+ overflow: hidden;
453
+ text-overflow: ellipsis;
454
+ white-space: nowrap;
455
+ }
456
+
457
+ .dak-team-radar-row b {
458
+ text-align: right;
459
+ font-family: var(--dak-mono);
460
+ font-variant-numeric: tabular-nums;
461
+ }
462
+
463
+ .dak-team-radar-row i {
464
+ display: block;
465
+ height: 7px;
466
+ border-radius: 4px;
467
+ background: linear-gradient(90deg, var(--dak-accent), var(--dak-accent-b));
468
+ min-width: 4%;
469
+ }
470
+
471
+ .dak-team-radar-row em {
472
+ font-style: normal;
473
+ color: var(--dak-fg-dim);
474
+ text-align: right;
475
+ font-family: var(--dak-mono);
476
+ font-size: 11px;
477
+ }
478
+
479
+ /* 选队下拉(A vs B) */
480
+ .dak-team-picker {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: 10px;
484
+ margin-bottom: 12px;
485
+ }
486
+
487
+ .dak-team-picker-vs {
488
+ color: var(--dak-fg-dim);
489
+ font-size: 11px;
490
+ letter-spacing: 0.12em;
491
+ }
492
+
493
+ .dak-team-select {
494
+ flex: 1;
495
+ min-width: 0;
496
+ height: 30px;
497
+ padding: 0 8px;
498
+ border: 1px solid var(--dak-border);
499
+ border-radius: 3px;
500
+ background: var(--dak-bg-subtle);
501
+ color: var(--dak-fg);
502
+ font: inherit;
503
+ font-size: 12px;
504
+ }
505
+
506
+ .dak-team-select:disabled {
507
+ opacity: 0.7;
508
+ }
509
+
510
+ /* 该队比赛列表(赛前侦察素材,可点跳回放) */
511
+ .dak-team-matches {
512
+ display: grid;
513
+ gap: 4px;
514
+ margin-top: 10px;
515
+ }
516
+
517
+ .dak-team-match {
518
+ display: grid;
519
+ grid-template-columns: auto minmax(0, 1fr) auto;
520
+ align-items: center;
521
+ gap: 8px;
522
+ padding: 5px 8px;
523
+ border: 1px solid var(--dak-border);
524
+ border-radius: 3px;
525
+ background: var(--dak-bg-subtle);
526
+ color: var(--dak-fg-mid);
527
+ cursor: pointer;
528
+ font: inherit;
529
+ font-size: 11px;
530
+ text-align: left;
531
+ }
532
+
533
+ .dak-team-match:hover:not(:disabled) {
534
+ color: var(--dak-fg);
535
+ border-color: var(--dak-border-hi);
536
+ background: var(--dak-accent-soft);
537
+ }
538
+
539
+ .dak-team-match:disabled {
540
+ cursor: default;
541
+ }
542
+
543
+ .dak-team-match-opp {
544
+ overflow: hidden;
545
+ text-overflow: ellipsis;
546
+ white-space: nowrap;
547
+ }
548
+
549
+ .dak-team-match small {
550
+ color: var(--dak-fg-dim);
551
+ font-variant-numeric: tabular-nums;
552
+ }
553
+
554
+ .dak-team-match-win {
555
+ color: var(--dak-pos, #4caf7d);
556
+ font-weight: 700;
557
+ }
558
+
559
+ .dak-team-match-loss {
560
+ color: var(--dak-neg, #d2685a);
561
+ font-weight: 700;
562
+ }
563
+
303
564
  .dak-muted {
304
565
  color: var(--dak-fg-mid);
305
566
  }
@@ -387,6 +648,20 @@
387
648
  overflow: hidden;
388
649
  }
389
650
 
651
+ .dak-radar-field-map {
652
+ background-color: #0f151d;
653
+ }
654
+
655
+ .dak-radar-field-map::after {
656
+ content: "";
657
+ position: absolute;
658
+ inset: 0;
659
+ z-index: 2;
660
+ pointer-events: none;
661
+ border: 1px solid rgba(255, 255, 255, 0.05);
662
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.35);
663
+ }
664
+
390
665
  /* ── Heatmap wrap: vertical layout (filters / radar / tuning) ── */
391
666
  .dak-heatmap-wrap {
392
667
  display: flex;
@@ -430,6 +705,11 @@
430
705
 
431
706
  .dak-sf-chip:hover { color: var(--dak-fg); border-color: rgba(255,255,255,0.24); }
432
707
 
708
+ .dak-sf-chip:disabled {
709
+ cursor: not-allowed;
710
+ opacity: 0.42;
711
+ }
712
+
433
713
  .dak-sf-chip-active {
434
714
  color: var(--dak-fg);
435
715
  border-color: rgba(255,255,255,0.35);
@@ -462,6 +742,27 @@
462
742
  accent-color: var(--dak-accent);
463
743
  }
464
744
 
745
+ .dak-radar-timebar {
746
+ grid-template-columns: auto minmax(0, 1fr) auto;
747
+ align-items: center;
748
+ }
749
+
750
+ .dak-radar-play-button {
751
+ width: 36px;
752
+ height: 36px;
753
+ }
754
+
755
+ .dak-radar-time-slider {
756
+ min-width: 0;
757
+ }
758
+
759
+ .dak-radar-time-meta {
760
+ color: var(--dak-fg-dim);
761
+ font-family: var(--dak-mono);
762
+ font-size: 11px;
763
+ white-space: nowrap;
764
+ }
765
+
465
766
  .dak-mode {
466
767
  display: inline-flex;
467
768
  align-items: center;
@@ -564,6 +865,19 @@
564
865
  background: rgba(255,255,255,0.10);
565
866
  }
566
867
 
868
+ .dak-empty-state {
869
+ display: grid;
870
+ gap: 8px;
871
+ min-height: 220px;
872
+ align-content: center;
873
+ text-align: center;
874
+ }
875
+
876
+ .dak-empty-state h2,
877
+ .dak-empty-state p {
878
+ margin: 0;
879
+ }
880
+
567
881
  .dak-radar-schematic {
568
882
  position: absolute;
569
883
  inset: 0;
@@ -721,6 +1035,16 @@
721
1035
  background: linear-gradient(to right, blue, cyan, lime, yellow, red);
722
1036
  }
723
1037
 
1038
+ .dak-legend-radar-field {
1039
+ width: 44px;
1040
+ height: 6px;
1041
+ border-radius: 999px;
1042
+ }
1043
+
1044
+ .dak-legend-radar-field {
1045
+ background: linear-gradient(to right, rgb(34,47,86), rgb(48,91,145), rgb(48,145,176), rgb(103,188,146), rgb(220,174,82), rgb(245,128,86));
1046
+ }
1047
+
724
1048
  .dak-legend-warm { display: none; }
725
1049
 
726
1050
  .dak-qa {
@@ -995,34 +1319,111 @@
995
1319
  height: 8px;
996
1320
  }
997
1321
 
998
- .dak-replay-stage {
999
- position: relative;
1000
- min-height: 520px;
1001
- overflow: hidden;
1322
+ .dak-rr-explain {
1323
+ display: grid;
1324
+ gap: 10px;
1325
+ margin-top: 12px;
1326
+ padding: 12px;
1002
1327
  border: 1px solid var(--dak-border);
1003
- border-radius: 4px;
1004
- background:
1005
- linear-gradient(rgba(238, 243, 248, 0.04) 1px, transparent 1px),
1006
- linear-gradient(90deg, rgba(238, 243, 248, 0.04) 1px, transparent 1px),
1007
- radial-gradient(circle at 50% 50%, rgba(73, 182, 255, 0.08), transparent 48%),
1008
- #07090d;
1009
- background-size: cover;
1010
- background-position: center;
1011
- background-repeat: no-repeat;
1328
+ border-radius: 8px;
1329
+ background: var(--dak-panel);
1012
1330
  }
1013
1331
 
1014
- .dak-replay-token {
1015
- position: absolute;
1016
- width: 26px;
1017
- height: 26px;
1018
- transform: translate(-50%, -50%);
1019
- display: grid;
1020
- place-items: center;
1021
- border: 2px solid rgba(238, 243, 248, 0.8);
1022
- border-radius: 999px;
1023
- color: #fff;
1024
- font-size: 9px;
1025
- font-weight: 900;
1332
+ .dak-rr-explain-head,
1333
+ .dak-rr-status {
1334
+ display: flex;
1335
+ align-items: center;
1336
+ gap: 10px;
1337
+ flex-wrap: wrap;
1338
+ }
1339
+
1340
+ .dak-rr-explain-head span {
1341
+ color: var(--dak-fg-mid);
1342
+ font-size: 12px;
1343
+ }
1344
+
1345
+ .dak-rr-explain-head small,
1346
+ .dak-rr-status span {
1347
+ color: var(--dak-fg-dim);
1348
+ font-size: 11px;
1349
+ }
1350
+
1351
+ .dak-rr-metric-groups {
1352
+ display: grid;
1353
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1354
+ gap: 12px;
1355
+ }
1356
+
1357
+ .dak-rr-metric-group h4 {
1358
+ margin: 0 0 6px;
1359
+ color: var(--dak-fg-mid);
1360
+ font-size: 11px;
1361
+ letter-spacing: 0.08em;
1362
+ text-transform: uppercase;
1363
+ }
1364
+
1365
+ .dak-rr-metric-row {
1366
+ display: grid;
1367
+ grid-template-columns: minmax(86px, 1fr) minmax(72px, 1.4fr) 48px;
1368
+ align-items: center;
1369
+ gap: 8px;
1370
+ min-height: 22px;
1371
+ color: var(--dak-fg-mid);
1372
+ font-size: 11px;
1373
+ }
1374
+
1375
+ .dak-rr-metric-track {
1376
+ height: 5px;
1377
+ overflow: hidden;
1378
+ border-radius: 99px;
1379
+ background: rgba(255, 255, 255, 0.08);
1380
+ }
1381
+
1382
+ .dak-rr-metric-track i {
1383
+ display: block;
1384
+ height: 100%;
1385
+ border-radius: inherit;
1386
+ background: linear-gradient(90deg, var(--dak-accent), var(--dak-accent-b));
1387
+ }
1388
+
1389
+ .dak-rr-metric-row b {
1390
+ text-align: right;
1391
+ color: var(--dak-fg);
1392
+ font-size: 11px;
1393
+ }
1394
+
1395
+ .dak-replay-stage {
1396
+ position: relative;
1397
+ /* 雷达图与回放坐标都以正方形为基准:强制 1:1 防止容器变窄时左右被裁剪 */
1398
+ aspect-ratio: 1 / 1;
1399
+ width: min(100%, calc(100vh - 240px));
1400
+ min-width: 320px;
1401
+ margin: 0 auto;
1402
+ overflow: hidden;
1403
+ border: 1px solid var(--dak-border);
1404
+ border-radius: 4px;
1405
+ background:
1406
+ linear-gradient(rgba(238, 243, 248, 0.04) 1px, transparent 1px),
1407
+ linear-gradient(90deg, rgba(238, 243, 248, 0.04) 1px, transparent 1px),
1408
+ radial-gradient(circle at 50% 50%, rgba(73, 182, 255, 0.08), transparent 48%),
1409
+ #07090d;
1410
+ background-size: 100% 100%;
1411
+ background-position: center;
1412
+ background-repeat: no-repeat;
1413
+ }
1414
+
1415
+ .dak-replay-token {
1416
+ position: absolute;
1417
+ width: 26px;
1418
+ height: 26px;
1419
+ transform: translate(-50%, -50%);
1420
+ display: grid;
1421
+ place-items: center;
1422
+ border: 2px solid rgba(238, 243, 248, 0.8);
1423
+ border-radius: 999px;
1424
+ color: #fff;
1425
+ font-size: 9px;
1426
+ font-weight: 900;
1026
1427
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.38);
1027
1428
  }
1028
1429
 
@@ -1047,67 +1448,49 @@
1047
1448
  text-transform: uppercase;
1048
1449
  }
1049
1450
 
1050
- .dak-workbench {
1051
- display: grid;
1052
- grid-template-columns: 238px minmax(0, 1fr);
1053
- gap: 14px;
1054
- align-items: start;
1055
- }
1056
-
1057
- .dak-workbench-sidebar {
1058
- position: sticky;
1059
- top: 12px;
1060
- min-width: 0;
1061
- }
1062
-
1063
- .dak-workbench-main {
1064
- min-width: 0;
1065
- }
1066
-
1067
- .dak-tabs {
1068
- display: grid;
1069
- gap: 7px;
1070
- margin: 0;
1071
- overflow: visible;
1451
+ /* 比赛工作台:顶部横向分段导航 + 单一全宽主区(一次一个视图,无重叠) */
1452
+ .dak-ws-nav {
1453
+ display: flex;
1454
+ flex-wrap: wrap;
1455
+ gap: 6px;
1456
+ padding: 6px;
1457
+ border: 1px solid var(--dak-border);
1458
+ border-radius: 10px;
1459
+ background: var(--dak-panel);
1072
1460
  }
1073
1461
 
1074
- .dak-tab {
1075
- width: 100%;
1076
- display: grid;
1077
- grid-template-columns: 24px minmax(0, 1fr);
1078
- grid-template-areas:
1079
- "icon label"
1080
- "icon detail";
1462
+ .dak-ws-navtab {
1463
+ display: inline-flex;
1081
1464
  align-items: center;
1082
- gap: 1px 9px;
1083
- min-height: 54px;
1084
- padding: 8px 10px;
1085
- text-align: left;
1465
+ gap: 6px;
1466
+ padding: 7px 14px;
1467
+ border: 1px solid transparent;
1468
+ border-radius: 7px;
1469
+ background: transparent;
1470
+ color: var(--dak-fg-dim);
1471
+ font-family: inherit;
1472
+ font-size: 13px;
1473
+ font-weight: 600;
1474
+ cursor: pointer;
1086
1475
  }
1087
1476
 
1088
- .dak-tab svg {
1089
- grid-area: icon;
1477
+ .dak-ws-navtab svg {
1478
+ flex: 0 0 auto;
1090
1479
  }
1091
1480
 
1092
- .dak-tab span {
1093
- grid-area: label;
1094
- min-width: 0;
1095
- overflow: hidden;
1096
- text-overflow: ellipsis;
1097
- white-space: nowrap;
1481
+ .dak-ws-navtab:hover {
1098
1482
  color: var(--dak-fg);
1099
- font-weight: 800;
1483
+ background: var(--dak-bg-subtle);
1484
+ }
1485
+
1486
+ .dak-ws-navtab-active {
1487
+ color: var(--dak-accent);
1488
+ border-color: var(--dak-accent);
1489
+ background: var(--dak-accent-soft, rgba(47, 224, 168, 0.08));
1100
1490
  }
1101
1491
 
1102
- .dak-tab small {
1103
- grid-area: detail;
1492
+ .dak-ws-main {
1104
1493
  min-width: 0;
1105
- overflow: hidden;
1106
- text-overflow: ellipsis;
1107
- white-space: nowrap;
1108
- color: var(--dak-fg-dim);
1109
- font-size: 10px;
1110
- font-family: var(--dak-mono);
1111
1494
  }
1112
1495
 
1113
1496
  .dak-tab:hover,
@@ -1238,493 +1621,1546 @@
1238
1621
 
1239
1622
  .dak-replay-layout {
1240
1623
  display: grid;
1241
- grid-template-columns: 300px minmax(0, 1fr) 260px;
1624
+ grid-template-columns: minmax(210px, 260px) minmax(520px, 1fr) minmax(210px, 260px);
1625
+ grid-template-areas:
1626
+ "controls controls controls"
1627
+ "roster-left stage roster-right";
1242
1628
  gap: 14px;
1243
1629
  align-items: start;
1244
1630
  }
1245
1631
 
1246
- .dak-playback {
1632
+ .dak-replay-controlbar {
1633
+ grid-area: controls;
1247
1634
  display: grid;
1248
- grid-template-columns: 42px 34px minmax(0, 1fr) 34px;
1249
- gap: 8px;
1635
+ grid-template-columns: 270px minmax(360px, 1fr) auto;
1636
+ gap: 12px;
1250
1637
  align-items: center;
1251
- margin: 14px 0 10px;
1252
- }
1253
-
1254
- .dak-play-button,
1255
- .dak-icon-button {
1256
- display: inline-grid;
1257
- place-items: center;
1638
+ padding: 10px;
1258
1639
  border: 1px solid var(--dak-border);
1259
1640
  border-radius: 4px;
1260
- cursor: pointer;
1261
- color: var(--dak-fg);
1262
- }
1263
-
1264
- .dak-play-button {
1265
- width: 42px;
1266
- height: 42px;
1267
- background: var(--dak-accent);
1268
- border-color: rgba(255, 122, 33, 0.78);
1269
- }
1270
-
1271
- .dak-icon-button {
1272
- width: 34px;
1273
- height: 34px;
1274
- background: var(--dak-bg-subtle);
1641
+ background: linear-gradient(180deg, rgba(238, 243, 248, 0.035), transparent), var(--dak-panel);
1275
1642
  }
1276
1643
 
1277
- .dak-scrubber {
1644
+ .dak-replay-round-nav {
1278
1645
  min-width: 0;
1279
- accent-color: var(--dak-accent);
1280
- cursor: pointer;
1646
+ display: grid;
1647
+ grid-template-columns: 34px minmax(0, 1fr) 34px;
1648
+ gap: 8px;
1649
+ align-items: center;
1281
1650
  }
1282
1651
 
1283
- .dak-speed-group {
1652
+ .dak-round-select-label {
1653
+ min-width: 0;
1284
1654
  display: grid;
1285
- grid-template-columns: repeat(4, minmax(0, 1fr));
1286
- gap: 6px;
1287
- margin-bottom: 12px;
1655
+ gap: 4px;
1656
+ color: var(--dak-fg-dim);
1657
+ font-family: var(--dak-mono);
1658
+ font-size: 10px;
1659
+ text-transform: uppercase;
1288
1660
  }
1289
1661
 
1290
- .dak-speed {
1291
- min-height: 30px;
1662
+ .dak-round-select {
1663
+ width: 100%;
1664
+ min-width: 0;
1665
+ height: 34px;
1666
+ padding: 0 9px;
1292
1667
  border: 1px solid var(--dak-border);
1293
1668
  border-radius: 4px;
1294
1669
  background: var(--dak-bg-subtle);
1295
- color: var(--dak-fg-mid);
1296
- cursor: pointer;
1670
+ color: var(--dak-fg);
1297
1671
  font: inherit;
1298
1672
  font-family: var(--dak-mono);
1299
- font-size: 12px;
1300
1673
  }
1301
1674
 
1302
- .dak-speed-active {
1303
- color: var(--dak-fg);
1304
- border-color: rgba(73, 182, 255, 0.62);
1305
- background: rgba(73, 182, 255, 0.13);
1675
+ .dak-replay-togglebar {
1676
+ grid-column: 1 / -1;
1677
+ display: grid;
1678
+ grid-template-columns: minmax(240px, 1fr) auto auto;
1679
+ gap: 10px;
1680
+ align-items: center;
1306
1681
  }
1307
1682
 
1308
- .dak-replay-meta {
1309
- display: grid;
1310
- grid-template-columns: 1fr;
1311
- gap: 8px;
1683
+ .dak-replay-statusline {
1684
+ min-width: 0;
1685
+ display: flex;
1686
+ align-items: center;
1687
+ justify-content: flex-end;
1688
+ gap: 10px;
1689
+ color: var(--dak-fg-mid);
1690
+ font-family: var(--dak-mono);
1691
+ font-size: 11px;
1312
1692
  }
1313
1693
 
1314
- .dak-replay-gridlines {
1315
- position: absolute;
1316
- inset: 0;
1317
- background:
1318
- linear-gradient(rgba(238, 243, 248, 0.05) 1px, transparent 1px),
1319
- linear-gradient(90deg, rgba(238, 243, 248, 0.05) 1px, transparent 1px);
1320
- background-size: 48px 48px;
1694
+ .dak-replay-clock {
1695
+ min-width: 104px;
1696
+ display: grid;
1697
+ grid-template-columns: auto auto;
1698
+ align-items: baseline;
1699
+ gap: 8px;
1700
+ padding: 5px 8px;
1701
+ border: 1px solid var(--dak-border-hi);
1702
+ border-radius: 3px;
1703
+ background: var(--dak-bg-subtle);
1321
1704
  }
1322
1705
 
1323
- .dak-replay-token {
1324
- transition: left 80ms linear, top 80ms linear, opacity 120ms ease;
1706
+ .dak-replay-clock span {
1707
+ color: var(--dak-fg-mid);
1708
+ font-family: var(--dak-font);
1709
+ font-size: 10px;
1325
1710
  }
1326
1711
 
1327
- .dak-replay-token::after {
1328
- content: "";
1329
- position: absolute;
1330
- top: -6px;
1331
- left: 50%;
1332
- width: 2px;
1333
- height: 7px;
1334
- background: rgba(238, 243, 248, 0.9);
1335
- transform: translateX(-50%);
1712
+ .dak-replay-clock strong {
1713
+ color: var(--dak-fg);
1714
+ font-size: 18px;
1715
+ font-variant-numeric: tabular-nums;
1716
+ line-height: 1;
1336
1717
  }
1337
1718
 
1338
- .dak-replay-token-dead {
1339
- opacity: 0.28;
1340
- filter: grayscale(1);
1719
+ .dak-replay-clock-bomb strong {
1720
+ color: var(--dak-danger);
1341
1721
  }
1342
1722
 
1343
- .dak-replay-token-flashed {
1344
- box-shadow: 0 0 0 3px rgba(255, 198, 77, 0.45), 0 8px 18px rgba(0, 0, 0, 0.38);
1723
+ .dak-replay-clock-round-end strong {
1724
+ color: var(--dak-warn);
1345
1725
  }
1346
1726
 
1347
- .dak-frame-player-list {
1348
- display: grid;
1349
- gap: 7px;
1350
- max-height: 620px;
1351
- overflow: auto;
1727
+ .dak-replay-techline {
1728
+ display: flex;
1729
+ flex-wrap: wrap;
1730
+ justify-content: flex-end;
1731
+ gap: 4px;
1352
1732
  }
1353
1733
 
1354
- .dak-frame-player-row {
1355
- display: grid;
1356
- grid-template-columns: 10px 18px minmax(0, 1fr) 52px;
1357
- gap: 8px;
1734
+ .dak-replay-techline span {
1735
+ min-height: 22px;
1736
+ display: inline-flex;
1358
1737
  align-items: center;
1359
- padding: 8px 9px;
1738
+ padding: 0 7px;
1360
1739
  border: 1px solid var(--dak-border);
1361
- border-radius: 4px;
1740
+ border-radius: 3px;
1362
1741
  background: var(--dak-bg-subtle);
1363
- font-size: 12px;
1742
+ white-space: nowrap;
1364
1743
  }
1365
1744
 
1366
- .dak-frame-player-name,
1367
- .dak-frame-player-row small {
1745
+ .dak-replay-stage-panel {
1746
+ grid-area: stage;
1368
1747
  min-width: 0;
1369
- overflow: hidden;
1370
- text-overflow: ellipsis;
1371
- white-space: nowrap;
1372
1748
  }
1373
1749
 
1374
- .dak-frame-player-num {
1375
- font-family: var(--dak-mono);
1376
- font-size: 10px;
1377
- font-weight: 800;
1378
- color: var(--dak-fg-dim);
1379
- text-align: center;
1750
+ .dak-replay-roster-panel {
1751
+ min-width: 0;
1380
1752
  }
1381
1753
 
1382
- .dak-frame-player-row small {
1383
- grid-column: 2 / 5;
1384
- color: var(--dak-fg-dim);
1385
- font-family: var(--dak-mono);
1754
+ .dak-replay-roster-left {
1755
+ grid-area: roster-left;
1386
1756
  }
1387
1757
 
1388
- .dak-frame-player-row-dead {
1389
- opacity: 0.38;
1758
+ .dak-replay-roster-right {
1759
+ grid-area: roster-right;
1390
1760
  }
1391
1761
 
1392
- .dak-hp-bar-wrap {
1393
- height: 6px;
1394
- background: rgba(238, 243, 248, 0.08);
1395
- border-radius: 3px;
1396
- overflow: hidden;
1762
+ .dak-replay-stage-head {
1763
+ display: flex;
1764
+ align-items: baseline;
1765
+ justify-content: space-between;
1766
+ margin-bottom: 8px;
1767
+ color: var(--dak-fg-mid);
1768
+ font-family: var(--dak-mono);
1769
+ font-size: 12px;
1397
1770
  }
1398
1771
 
1399
- .dak-hp-bar {
1400
- height: 100%;
1401
- border-radius: 3px;
1402
- transition: width 80ms linear, background 200ms ease;
1772
+ .dak-replay-stage-head span {
1773
+ color: var(--dak-fg);
1774
+ font-weight: 800;
1403
1775
  }
1404
1776
 
1405
- .dak-team-dot-teamA {
1777
+ .dak-playback {
1778
+ display: grid;
1779
+ grid-template-columns: 42px 34px minmax(0, 1fr) 34px;
1780
+ gap: 8px;
1781
+ align-items: center;
1782
+ margin: 0;
1783
+ }
1784
+
1785
+ .dak-play-button,
1786
+ .dak-icon-button {
1787
+ display: inline-grid;
1788
+ place-items: center;
1789
+ border: 1px solid var(--dak-border);
1790
+ border-radius: 4px;
1791
+ cursor: pointer;
1792
+ color: var(--dak-fg);
1793
+ }
1794
+
1795
+ .dak-play-button {
1796
+ width: 42px;
1797
+ height: 42px;
1406
1798
  background: var(--dak-accent);
1799
+ border-color: rgba(255, 122, 33, 0.78);
1407
1800
  }
1408
1801
 
1409
- .dak-team-dot-teamB {
1410
- background: var(--dak-accent-b);
1802
+ .dak-icon-button {
1803
+ width: 34px;
1804
+ height: 34px;
1805
+ background: var(--dak-bg-subtle);
1411
1806
  }
1412
1807
 
1413
- .dak-player-roundfacts {
1414
- display: grid;
1415
- grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
1416
- gap: 10px;
1417
- margin-top: 14px;
1418
- max-height: 560px;
1419
- overflow: auto;
1808
+ .dak-icon-button:disabled {
1809
+ opacity: 0.42;
1810
+ cursor: not-allowed;
1420
1811
  }
1421
1812
 
1422
- .dak-player-round-summary {
1423
- display: grid;
1424
- grid-template-columns: repeat(4, minmax(0, 1fr));
1425
- gap: 8px;
1426
- margin: 12px 0;
1813
+ .dak-scrubber {
1814
+ min-width: 0;
1815
+ accent-color: var(--dak-accent);
1816
+ cursor: pointer;
1427
1817
  }
1428
1818
 
1429
- .dak-player-round-card {
1819
+ /* v0.2:scrubber 上方的事件锚点(首杀/击杀/下包/拆包),点击跳帧 */
1820
+ .dak-scrubber-wrap {
1821
+ position: relative;
1822
+ flex: 1;
1430
1823
  min-width: 0;
1431
- display: grid;
1432
- gap: 9px;
1433
- padding: 11px;
1434
- border: 1px solid var(--dak-border);
1435
- border-radius: 4px;
1436
- background:
1437
- linear-gradient(180deg, rgba(73, 182, 255, 0.06), transparent 42%),
1438
- var(--dak-bg-subtle);
1824
+ display: flex;
1825
+ flex-direction: column;
1826
+ justify-content: flex-end;
1439
1827
  }
1440
1828
 
1441
- .dak-player-round-head {
1442
- display: grid;
1443
- grid-template-columns: auto minmax(0, 1fr) auto;
1444
- gap: 8px;
1445
- align-items: center;
1829
+ .dak-scrubber-wrap .dak-scrubber {
1830
+ width: 100%;
1446
1831
  }
1447
1832
 
1448
- .dak-player-round-head span:nth-child(2) {
1449
- min-width: 0;
1450
- overflow: hidden;
1451
- color: var(--dak-fg-mid);
1452
- text-overflow: ellipsis;
1453
- white-space: nowrap;
1454
- font-size: 12px;
1833
+ .dak-scrubber-anchors {
1834
+ position: relative;
1835
+ height: 10px;
1455
1836
  }
1456
1837
 
1457
- .dak-player-round-meta,
1458
- .dak-player-round-tags {
1459
- display: flex;
1460
- flex-wrap: wrap;
1461
- gap: 6px;
1838
+ .dak-scrubber-anchor {
1839
+ position: absolute;
1840
+ top: 0;
1841
+ width: 7px;
1842
+ height: 7px;
1843
+ padding: 0;
1844
+ border: none;
1845
+ border-radius: 50%;
1846
+ transform: translateX(-50%);
1847
+ cursor: pointer;
1848
+ background: var(--dak-text-dim);
1462
1849
  }
1463
1850
 
1464
- .dak-player-round-meta span,
1465
- .dak-player-round-tags span {
1466
- display: inline-flex;
1467
- align-items: center;
1468
- min-height: 22px;
1469
- padding: 0 7px;
1851
+ .dak-scrubber-anchor-firstkill { background: var(--dak-ok); }
1852
+ .dak-scrubber-anchor-kill { background: var(--dak-danger); }
1853
+ .dak-scrubber-anchor-bomb { background: var(--dak-warn); }
1854
+ .dak-scrubber-anchor-defuse { background: #4db8ff; }
1855
+
1856
+ /* v0.3:比赛报告导出按钮 */
1857
+ .dak-report-button {
1858
+ margin-top: 8px;
1859
+ background: transparent;
1470
1860
  border: 1px solid var(--dak-border);
1471
- border-radius: 3px;
1472
- background: rgba(9, 11, 15, 0.38);
1473
- color: var(--dak-fg-mid);
1474
- font-size: 11px;
1861
+ border-radius: 8px;
1862
+ color: var(--dak-text-dim, #8b97a5);
1863
+ font-size: 12px;
1864
+ padding: 4px 10px;
1865
+ cursor: pointer;
1475
1866
  }
1476
1867
 
1477
- .dak-player-round-tags span {
1868
+ .dak-report-button:hover {
1869
+ border-color: var(--dak-accent);
1478
1870
  color: var(--dak-accent);
1479
- border-color: rgba(255, 122, 33, 0.26);
1480
- background: rgba(255, 122, 33, 0.08);
1481
1871
  }
1482
1872
 
1483
- .dak-economy-legend {
1873
+ /* v0.2:回合筛选器 */
1874
+ .dak-round-filterbar {
1484
1875
  display: flex;
1485
1876
  flex-wrap: wrap;
1486
- gap: 8px 12px;
1487
- margin: 10px 0;
1488
- color: var(--dak-fg-mid);
1877
+ gap: 8px;
1878
+ margin-bottom: 12px;
1879
+ }
1880
+
1881
+ .dak-round-filter-select {
1882
+ background: var(--dak-bg-subtle);
1883
+ color: var(--dak-text);
1884
+ border: 1px solid var(--dak-border);
1885
+ border-radius: 8px;
1886
+ padding: 4px 8px;
1489
1887
  font-size: 12px;
1490
1888
  }
1491
1889
 
1492
- .dak-economy-legend span {
1493
- display: inline-flex;
1494
- align-items: center;
1495
- gap: 5px;
1890
+ /* v0.2:统计跳回放的可点击行/卡片 */
1891
+ .dak-timeline-row-link,
1892
+ .dak-player-round-card-link {
1893
+ cursor: pointer;
1496
1894
  }
1497
1895
 
1498
- .dak-economy-legend i {
1499
- width: 12px;
1500
- height: 12px;
1501
- display: block;
1502
- border: 1px solid var(--dak-border);
1503
- border-radius: 3px;
1896
+ .dak-timeline-row-link:hover,
1897
+ .dak-player-round-card-link:hover {
1898
+ background: rgba(47, 224, 168, 0.08);
1504
1899
  }
1505
1900
 
1506
- .dak-economy-rounds {
1507
- display: grid;
1508
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1509
- gap: 7px;
1510
- margin-top: 10px;
1901
+ /* v0.2:走位轨迹与击杀连线图层 */
1902
+ .dak-replay-playertrace {
1903
+ fill: none;
1904
+ stroke-width: 0.35;
1905
+ stroke-linejoin: round;
1906
+ opacity: 0.55;
1511
1907
  }
1512
1908
 
1513
- .dak-economy-round {
1909
+ .dak-replay-playertrace-teamA { stroke: var(--dak-team-a, #4db8ff); }
1910
+ .dak-replay-playertrace-teamB { stroke: var(--dak-team-b, #ff7a21); }
1911
+
1912
+ .dak-replay-killline {
1913
+ stroke: rgba(255, 92, 92, 0.85);
1914
+ stroke-width: 0.3;
1915
+ stroke-dasharray: 1.4 0.9;
1916
+ }
1917
+
1918
+ .dak-replay-killline-victim {
1919
+ fill: rgba(255, 92, 92, 0.9);
1920
+ }
1921
+
1922
+ .dak-speed-group {
1514
1923
  display: grid;
1515
- gap: 3px;
1516
- padding: 8px;
1924
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1925
+ gap: 6px;
1926
+ margin-bottom: 12px;
1927
+ }
1928
+
1929
+ .dak-speed {
1930
+ min-height: 30px;
1517
1931
  border: 1px solid var(--dak-border);
1518
1932
  border-radius: 4px;
1519
1933
  background: var(--dak-bg-subtle);
1520
- font-size: 11px;
1934
+ color: var(--dak-fg-mid);
1935
+ cursor: pointer;
1936
+ font: inherit;
1937
+ font-family: var(--dak-mono);
1938
+ font-size: 12px;
1521
1939
  }
1522
1940
 
1523
- .dak-economy-round b {
1941
+ .dak-speed-active {
1524
1942
  color: var(--dak-fg);
1525
- font-family: var(--dak-mono);
1943
+ border-color: rgba(73, 182, 255, 0.62);
1944
+ background: rgba(73, 182, 255, 0.13);
1526
1945
  }
1527
1946
 
1528
- .dak-economy-round span {
1529
- min-width: 0;
1530
- overflow: hidden;
1531
- color: var(--dak-fg-dim);
1532
- text-overflow: ellipsis;
1533
- white-space: nowrap;
1947
+ .dak-replay-meta {
1948
+ display: grid;
1949
+ grid-template-columns: repeat(3, minmax(70px, 1fr));
1950
+ gap: 6px;
1534
1951
  }
1535
1952
 
1536
- .dak-economy-round .dak-economy-winner {
1537
- color: var(--dak-ok);
1953
+ .dak-replay-gridlines {
1954
+ position: absolute;
1955
+ inset: 0;
1956
+ background:
1957
+ linear-gradient(rgba(238, 243, 248, 0.05) 1px, transparent 1px),
1958
+ linear-gradient(90deg, rgba(238, 243, 248, 0.05) 1px, transparent 1px);
1959
+ background-size: 48px 48px;
1538
1960
  }
1539
1961
 
1540
- .dak-economy-round-upset {
1541
- border-color: rgba(255, 198, 77, 0.4);
1542
- background: linear-gradient(135deg, rgba(255, 198, 77, 0.07), var(--dak-bg-subtle));
1962
+ .dak-replay-token {
1963
+ transition: left 80ms linear, top 80ms linear, opacity 120ms ease;
1543
1964
  }
1544
1965
 
1545
- .dak-economy-upsets {
1546
- display: flex;
1547
- flex-wrap: wrap;
1548
- align-items: center;
1549
- gap: 6px;
1550
- margin: 8px 0 4px;
1966
+ .dak-replay-token::after {
1967
+ content: "";
1968
+ position: absolute;
1969
+ top: -6px;
1970
+ left: 50%;
1971
+ width: 2px;
1972
+ height: 7px;
1973
+ background: rgba(238, 243, 248, 0.9);
1974
+ transform: translateX(-50%);
1551
1975
  }
1552
1976
 
1553
- .dak-upset-chip {
1554
- display: inline-flex;
1555
- align-items: center;
1556
- min-height: 22px;
1557
- padding: 0 8px;
1558
- border-radius: 3px;
1559
- font-size: 11px;
1560
- font-weight: 700;
1561
- border: 1px solid transparent;
1977
+ .dak-replay-token-dead {
1978
+ opacity: 0.28;
1979
+ filter: grayscale(1);
1562
1980
  }
1563
1981
 
1564
- .dak-upset-chip-eco { background: rgba(255,84,114,0.15); color: var(--dak-danger); border-color: rgba(255,84,114,0.3); }
1565
- .dak-upset-chip-semi { background: rgba(73,182,255,0.13); color: var(--dak-accent-b); border-color: rgba(73,182,255,0.28); }
1566
- .dak-upset-chip-force { background: rgba(255,122,33,0.13); color: var(--dak-accent); border-color: rgba(255,122,33,0.28); }
1567
-
1568
- .dak-upset-badge {
1569
- display: inline-flex;
1570
- align-items: center;
1571
- padding: 1px 5px;
1572
- border-radius: 2px;
1573
- font-size: 10px;
1574
- font-weight: 800;
1575
- white-space: nowrap;
1982
+ /* 双层地图:另一层的选手以幽灵态显示,可感知存在但不干扰当前层阅读 */
1983
+ .dak-replay-token-offlevel {
1984
+ opacity: 0.22;
1985
+ filter: grayscale(0.65);
1576
1986
  }
1577
1987
 
1578
- .dak-upset-badge-eco { background: rgba(255,84,114,0.18); color: var(--dak-danger); }
1579
- .dak-upset-badge-semi { background: rgba(73,182,255,0.16); color: var(--dak-accent-b); }
1580
- .dak-upset-badge-force { background: rgba(255,122,33,0.16); color: var(--dak-accent); }
1581
-
1582
- /* ── Kill feed overlay ──────────────────────────────────────────────────────── */
1583
-
1584
- .dak-killfeed {
1585
- position: absolute;
1586
- top: 10px;
1587
- right: 10px;
1588
- z-index: 5;
1589
- display: flex;
1590
- flex-direction: column;
1591
- gap: 3px;
1592
- pointer-events: none;
1593
- min-width: 0;
1594
- max-width: 260px;
1988
+ .dak-replay-token-flashed {
1989
+ box-shadow: 0 0 0 3px rgba(255, 198, 77, 0.45), 0 8px 18px rgba(0, 0, 0, 0.38);
1595
1990
  }
1596
1991
 
1597
- .dak-killfeed-row {
1598
- display: flex;
1599
- align-items: center;
1992
+ .dak-frame-player-list {
1993
+ display: grid;
1600
1994
  gap: 5px;
1601
- padding: 4px 8px;
1602
- background: rgba(9, 11, 15, 0.78);
1995
+ }
1996
+
1997
+ .dak-roster-board {
1998
+ display: grid;
1999
+ gap: 9px;
2000
+ padding: 10px;
1603
2001
  border: 1px solid var(--dak-border);
1604
- border-radius: 3px;
1605
- font-size: 11px;
1606
- white-space: nowrap;
1607
- overflow: hidden;
2002
+ border-radius: 4px;
2003
+ background:
2004
+ linear-gradient(180deg, rgba(238, 243, 248, 0.035), transparent 48%),
2005
+ var(--dak-panel);
1608
2006
  }
1609
2007
 
1610
- .dak-killfeed-name {
2008
+ .dak-roster-team {
2009
+ min-width: 0;
2010
+ display: grid;
2011
+ gap: 6px;
2012
+ }
2013
+
2014
+ .dak-roster-team-head {
2015
+ min-width: 0;
2016
+ display: grid;
2017
+ grid-template-columns: 10px minmax(0, 1fr) auto;
2018
+ gap: 7px;
2019
+ align-items: center;
2020
+ color: var(--dak-fg-dim);
2021
+ font-family: var(--dak-mono);
2022
+ font-size: 10px;
2023
+ text-transform: uppercase;
2024
+ }
2025
+
2026
+ .dak-roster-team-head b {
2027
+ color: var(--dak-fg);
2028
+ font-size: 12px;
2029
+ }
2030
+
2031
+ .dak-roster-team-head small {
2032
+ color: var(--dak-fg-dim);
2033
+ }
2034
+
2035
+ .dak-frame-player-row {
2036
+ display: grid;
2037
+ grid-template-columns: 22px minmax(0, 1fr);
2038
+ align-content: center;
2039
+ gap: 6px 10px;
2040
+ /* min-height 预留「名字 + 2 行 loadout + 血条」的空间:
2041
+ 逐帧道具增减时高度稳定(不跳动),罕见超长 loadout 才轻微增高,信息始终完整显示 */
2042
+ min-height: 82px;
2043
+ padding: 10px 12px;
2044
+ border: 1px solid var(--dak-border);
2045
+ border-radius: 6px;
2046
+ background: var(--dak-bg-subtle);
2047
+ font-size: 12px;
2048
+ }
2049
+
2050
+ .dak-frame-player-row .dak-frame-player-num {
2051
+ grid-column: 1;
2052
+ grid-row: 1 / -1;
2053
+ align-self: center;
2054
+ }
2055
+
2056
+ .dak-frame-player-row .dak-frame-player-name {
2057
+ grid-column: 2;
2058
+ grid-row: 1;
1611
2059
  font-weight: 700;
1612
- max-width: 80px;
2060
+ color: var(--dak-fg);
2061
+ }
2062
+
2063
+ .dak-frame-player-row .dak-frame-loadout {
2064
+ grid-column: 2;
2065
+ grid-row: 2;
2066
+ /* 预留 2 行高度:常见 loadout 不会让卡片忽高忽低 */
2067
+ min-height: 32px;
2068
+ align-content: flex-start;
2069
+ }
2070
+
2071
+ .dak-frame-player-row .dak-frame-weapon {
2072
+ grid-column: 2;
2073
+ grid-row: 2;
2074
+ min-height: 32px;
2075
+ }
2076
+
2077
+ .dak-frame-player-row .dak-hp-bar-wrap {
2078
+ grid-column: 2;
2079
+ grid-row: 3;
2080
+ width: 100%;
2081
+ align-self: center;
2082
+ }
2083
+
2084
+ .dak-frame-player-name,
2085
+ .dak-frame-player-row small {
2086
+ min-width: 0;
1613
2087
  overflow: hidden;
1614
2088
  text-overflow: ellipsis;
1615
- flex-shrink: 0;
2089
+ white-space: nowrap;
1616
2090
  }
1617
2091
 
1618
- .dak-killfeed-name-teamA { color: var(--dak-accent); }
1619
- .dak-killfeed-name-teamB { color: var(--dak-accent-b); }
1620
- .dak-killfeed-name-none { color: var(--dak-fg-dim); }
1621
-
1622
- .dak-killfeed-weapon {
1623
- color: var(--dak-fg-dim);
2092
+ .dak-frame-player-num {
1624
2093
  font-family: var(--dak-mono);
1625
2094
  font-size: 10px;
1626
- flex-shrink: 0;
2095
+ font-weight: 800;
2096
+ color: var(--dak-fg-dim);
2097
+ text-align: center;
1627
2098
  }
1628
2099
 
1629
- .dak-killfeed-victim {
1630
- color: var(--dak-fg-mid);
2100
+ .dak-frame-weapon {
2101
+ display: block;
2102
+ color: var(--dak-fg-dim);
2103
+ font-family: var(--dak-mono);
2104
+ font-size: 11px;
1631
2105
  min-width: 0;
1632
2106
  overflow: hidden;
1633
2107
  text-overflow: ellipsis;
1634
- flex: 1;
2108
+ white-space: nowrap;
1635
2109
  }
1636
2110
 
1637
- .dak-killfeed-badges {
2111
+ .dak-frame-loadout {
1638
2112
  display: flex;
1639
- gap: 3px;
1640
- flex-shrink: 0;
2113
+ flex-wrap: wrap;
2114
+ gap: 4px;
2115
+ min-width: 0;
2116
+ color: var(--dak-fg-dim);
2117
+ font-family: var(--dak-mono);
2118
+ font-size: 10px;
1641
2119
  }
1642
2120
 
1643
- .dak-kf-badge {
1644
- display: inline-flex;
1645
- align-items: center;
1646
- padding: 1px 4px;
1647
- border-radius: 2px;
1648
- font-size: 9px;
1649
- font-weight: 800;
1650
- font-style: normal;
1651
- text-transform: uppercase;
2121
+ .dak-frame-loadout span {
2122
+ flex: 0 0 auto;
2123
+ max-width: 92px;
2124
+ overflow: hidden;
2125
+ padding: 1px 5px;
2126
+ border: 1px solid rgba(238, 243, 248, 0.11);
2127
+ border-radius: 3px;
2128
+ background: rgba(9, 11, 15, 0.34);
2129
+ text-overflow: ellipsis;
2130
+ white-space: nowrap;
1652
2131
  }
1653
2132
 
1654
- .dak-kf-hs { background: rgba(255, 84, 114, 0.22); color: var(--dak-danger); }
1655
- .dak-kf-tr { background: rgba(255, 122, 33, 0.18); color: var(--dak-accent); }
1656
- .dak-kf-smk { background: rgba(162, 172, 184, 0.14); color: var(--dak-fg-mid); }
1657
- .dak-kf-ns { background: rgba(73, 182, 255, 0.16); color: var(--dak-accent-b); }
1658
- .dak-kf-fa { background: rgba(83, 215, 126, 0.18); color: var(--dak-ok); }
2133
+ .dak-frame-loadout .dak-frame-primary {
2134
+ color: var(--dak-fg);
2135
+ border-color: rgba(73, 182, 255, 0.28);
2136
+ background: rgba(73, 182, 255, 0.09);
2137
+ }
1659
2138
 
1660
- @media (max-width: 1080px) {
1661
- .dak-header,
1662
- .dak-grid,
1663
- .dak-grid-even,
1664
- .dak-selection-layout,
1665
- .dak-kpi-strip,
1666
- .dak-fact-grid,
1667
- .dak-workbench,
1668
- .dak-replay-layout {
1669
- grid-template-columns: 1fr;
1670
- }
2139
+ .dak-frame-loadout .dak-frame-current {
2140
+ color: var(--dak-warn);
2141
+ border-color: rgba(255, 198, 77, 0.28);
2142
+ background: rgba(255, 198, 77, 0.08);
2143
+ }
1671
2144
 
1672
- .dak-workbench-sidebar {
1673
- position: static;
1674
- }
2145
+ .dak-frame-player-row-dead {
2146
+ opacity: 0.38;
2147
+ }
1675
2148
 
1676
- .dak-tabs {
1677
- grid-template-columns: repeat(3, minmax(0, 1fr));
1678
- }
2149
+ .dak-hp-bar-wrap {
2150
+ /* 垂直叠层:HP 条(6px)+ 护甲条(2px),之间 1px 间隙,不重叠 */
2151
+ display: flex;
2152
+ flex-direction: column;
2153
+ gap: 1px;
2154
+ height: 9px;
2155
+ }
1679
2156
 
1680
- .dak-scoreblock {
1681
- text-align: left;
1682
- }
2157
+ .dak-hp-bar-track {
2158
+ flex: none;
2159
+ height: 6px;
2160
+ border-radius: 2px;
2161
+ background: rgba(238, 243, 248, 0.08);
2162
+ overflow: hidden;
2163
+ }
1683
2164
 
1684
- .dak-scoreline {
1685
- font-size: 34px;
1686
- }
2165
+ .dak-hp-bar {
2166
+ flex: none;
2167
+ height: 6px;
2168
+ border-radius: 2px;
2169
+ transition: width 80ms linear, background 200ms ease;
2170
+ }
1687
2171
 
1688
- .dak-title {
1689
- font-size: 32px;
1690
- }
2172
+ /* 护甲独立细条:在 HP 下方,不覆盖 */
2173
+ .dak-armor-bar {
2174
+ flex: none;
2175
+ height: 2px;
2176
+ border-radius: 1px;
2177
+ background: var(--dak-accent-b);
2178
+ transition: width 80ms linear;
2179
+ }
1691
2180
 
1692
- .dak-qa-row,
1693
- .dak-roundfact-row {
1694
- grid-template-columns: 1fr;
1695
- }
2181
+ .dak-team-dot-teamA {
2182
+ background: var(--dak-accent);
2183
+ }
1696
2184
 
1697
- .dak-player-round-summary {
1698
- grid-template-columns: repeat(2, minmax(0, 1fr));
1699
- }
2185
+ .dak-team-dot-teamB {
2186
+ background: var(--dak-accent-b);
1700
2187
  }
1701
2188
 
1702
- @media (max-width: 720px) {
1703
- .dak-workspace {
1704
- width: min(100vw - 18px, 1480px);
1705
- padding-top: 14px;
1706
- }
2189
+ .dak-player-roundfacts {
2190
+ display: grid;
2191
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
2192
+ gap: 10px;
2193
+ margin-top: 14px;
2194
+ max-height: 560px;
2195
+ overflow: auto;
2196
+ }
1707
2197
 
1708
- .dak-tabs,
1709
- .dak-kpi-strip,
1710
- .dak-speed-group,
1711
- .dak-heatmap-tuning {
1712
- grid-template-columns: 1fr;
1713
- }
2198
+ .dak-player-round-summary {
2199
+ display: grid;
2200
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2201
+ gap: 8px;
2202
+ margin: 12px 0;
2203
+ }
1714
2204
 
1715
- .dak-tab {
1716
- min-height: 46px;
1717
- }
2205
+ .dak-player-round-card {
2206
+ min-width: 0;
2207
+ display: grid;
2208
+ gap: 9px;
2209
+ padding: 11px;
2210
+ border: 1px solid var(--dak-border);
2211
+ border-radius: 4px;
2212
+ background:
2213
+ linear-gradient(180deg, rgba(73, 182, 255, 0.06), transparent 42%),
2214
+ var(--dak-bg-subtle);
2215
+ }
1718
2216
 
1719
- .dak-title {
1720
- font-size: 28px;
1721
- }
2217
+ .dak-player-round-head {
2218
+ display: grid;
2219
+ grid-template-columns: auto minmax(0, 1fr) auto;
2220
+ gap: 8px;
2221
+ align-items: center;
2222
+ }
1722
2223
 
1723
- .dak-replay-stage {
1724
- min-height: 380px;
1725
- }
2224
+ .dak-player-round-head span:nth-child(2) {
2225
+ min-width: 0;
2226
+ overflow: hidden;
2227
+ color: var(--dak-fg-mid);
2228
+ text-overflow: ellipsis;
2229
+ white-space: nowrap;
2230
+ font-size: 12px;
2231
+ }
1726
2232
 
1727
- .dak-player-round-summary {
1728
- grid-template-columns: 1fr;
1729
- }
2233
+ .dak-player-round-meta,
2234
+ .dak-player-round-tags {
2235
+ display: flex;
2236
+ flex-wrap: wrap;
2237
+ gap: 6px;
2238
+ }
2239
+
2240
+ .dak-player-round-meta span,
2241
+ .dak-player-round-tags span {
2242
+ display: inline-flex;
2243
+ align-items: center;
2244
+ min-height: 22px;
2245
+ padding: 0 7px;
2246
+ border: 1px solid var(--dak-border);
2247
+ border-radius: 3px;
2248
+ background: rgba(9, 11, 15, 0.38);
2249
+ color: var(--dak-fg-mid);
2250
+ font-size: 11px;
2251
+ }
2252
+
2253
+ .dak-player-round-tags span {
2254
+ color: var(--dak-accent);
2255
+ border-color: rgba(255, 122, 33, 0.26);
2256
+ background: rgba(255, 122, 33, 0.08);
2257
+ }
2258
+
2259
+ .dak-economy-legend {
2260
+ display: flex;
2261
+ flex-wrap: wrap;
2262
+ gap: 8px 12px;
2263
+ margin: 10px 0;
2264
+ color: var(--dak-fg-mid);
2265
+ font-size: 12px;
2266
+ }
2267
+
2268
+ .dak-economy-legend span {
2269
+ display: inline-flex;
2270
+ align-items: center;
2271
+ gap: 5px;
2272
+ }
2273
+
2274
+ .dak-economy-legend i {
2275
+ width: 12px;
2276
+ height: 12px;
2277
+ display: block;
2278
+ border: 1px solid var(--dak-border);
2279
+ border-radius: 3px;
2280
+ }
2281
+
2282
+ .dak-economy-rounds {
2283
+ display: grid;
2284
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
2285
+ gap: 7px;
2286
+ margin-top: 10px;
2287
+ }
2288
+
2289
+ .dak-economy-round {
2290
+ display: grid;
2291
+ gap: 3px;
2292
+ padding: 8px;
2293
+ border: 1px solid var(--dak-border);
2294
+ border-radius: 4px;
2295
+ background: var(--dak-bg-subtle);
2296
+ font-size: 11px;
2297
+ }
2298
+
2299
+ .dak-economy-round b {
2300
+ color: var(--dak-fg);
2301
+ font-family: var(--dak-mono);
2302
+ }
2303
+
2304
+ .dak-economy-round span {
2305
+ min-width: 0;
2306
+ overflow: hidden;
2307
+ color: var(--dak-fg-dim);
2308
+ text-overflow: ellipsis;
2309
+ white-space: nowrap;
2310
+ }
2311
+
2312
+ .dak-economy-round .dak-economy-winner {
2313
+ color: var(--dak-ok);
2314
+ }
2315
+
2316
+ .dak-economy-round-clickable {
2317
+ cursor: pointer;
2318
+ }
2319
+
2320
+ .dak-economy-round-clickable:hover {
2321
+ border-color: var(--dak-border-hi);
2322
+ background: var(--dak-panel);
2323
+ }
2324
+
2325
+ .dak-economy-round-upset {
2326
+ border-color: rgba(255, 198, 77, 0.4);
2327
+ background: linear-gradient(135deg, rgba(255, 198, 77, 0.07), var(--dak-bg-subtle));
2328
+ }
2329
+
2330
+ .dak-economy-upsets {
2331
+ display: flex;
2332
+ flex-wrap: wrap;
2333
+ align-items: center;
2334
+ gap: 6px;
2335
+ margin: 8px 0 4px;
2336
+ }
2337
+
2338
+ .dak-upset-chip {
2339
+ display: inline-flex;
2340
+ align-items: center;
2341
+ min-height: 22px;
2342
+ padding: 0 8px;
2343
+ border-radius: 3px;
2344
+ font-size: 11px;
2345
+ font-weight: 700;
2346
+ border: 1px solid transparent;
2347
+ }
2348
+
2349
+ .dak-upset-chip-eco { background: rgba(255,84,114,0.15); color: var(--dak-danger); border-color: rgba(255,84,114,0.3); }
2350
+ .dak-upset-chip-semi { background: rgba(73,182,255,0.13); color: var(--dak-accent-b); border-color: rgba(73,182,255,0.28); }
2351
+ .dak-upset-chip-force { background: rgba(255,122,33,0.13); color: var(--dak-accent); border-color: rgba(255,122,33,0.28); }
2352
+
2353
+ .dak-upset-badge {
2354
+ display: inline-flex;
2355
+ align-items: center;
2356
+ padding: 1px 5px;
2357
+ border-radius: 2px;
2358
+ font-size: 10px;
2359
+ font-weight: 800;
2360
+ white-space: nowrap;
2361
+ }
2362
+
2363
+ .dak-upset-badge-eco { background: rgba(255,84,114,0.18); color: var(--dak-danger); }
2364
+ .dak-upset-badge-semi { background: rgba(73,182,255,0.16); color: var(--dak-accent-b); }
2365
+ .dak-upset-badge-force { background: rgba(255,122,33,0.16); color: var(--dak-accent); }
2366
+
2367
+ /* ── Kill feed overlay ──────────────────────────────────────────────────────── */
2368
+
2369
+ .dak-killfeed {
2370
+ position: absolute;
2371
+ top: 10px;
2372
+ right: 10px;
2373
+ z-index: 5;
2374
+ display: flex;
2375
+ flex-direction: column;
2376
+ gap: 3px;
2377
+ pointer-events: none;
2378
+ min-width: 0;
2379
+ max-width: 260px;
2380
+ }
2381
+
2382
+ .dak-killfeed-row {
2383
+ display: flex;
2384
+ align-items: center;
2385
+ gap: 5px;
2386
+ padding: 4px 8px;
2387
+ background: rgba(9, 11, 15, 0.78);
2388
+ border: 1px solid var(--dak-border);
2389
+ border-radius: 3px;
2390
+ font-size: 11px;
2391
+ white-space: nowrap;
2392
+ overflow: hidden;
2393
+ }
2394
+
2395
+ .dak-killfeed-name {
2396
+ font-weight: 700;
2397
+ max-width: 80px;
2398
+ overflow: hidden;
2399
+ text-overflow: ellipsis;
2400
+ flex-shrink: 0;
2401
+ }
2402
+
2403
+ .dak-killfeed-name-teamA { color: var(--dak-accent); }
2404
+ .dak-killfeed-name-teamB { color: var(--dak-accent-b); }
2405
+ .dak-killfeed-name-none { color: var(--dak-fg-dim); }
2406
+
2407
+ .dak-killfeed-weapon {
2408
+ color: var(--dak-fg-dim);
2409
+ font-family: var(--dak-mono);
2410
+ font-size: 10px;
2411
+ flex-shrink: 0;
2412
+ }
2413
+
2414
+ .dak-killfeed-victim {
2415
+ color: var(--dak-fg-mid);
2416
+ min-width: 0;
2417
+ overflow: hidden;
2418
+ text-overflow: ellipsis;
2419
+ flex: 1;
2420
+ }
2421
+
2422
+ .dak-killfeed-badges {
2423
+ display: flex;
2424
+ gap: 3px;
2425
+ flex-shrink: 0;
2426
+ }
2427
+
2428
+ .dak-kf-badge {
2429
+ display: inline-flex;
2430
+ align-items: center;
2431
+ padding: 1px 4px;
2432
+ border-radius: 2px;
2433
+ font-size: 9px;
2434
+ font-weight: 800;
2435
+ font-style: normal;
2436
+ text-transform: uppercase;
2437
+ }
2438
+
2439
+ .dak-kf-hs { background: rgba(255, 84, 114, 0.22); color: var(--dak-danger); }
2440
+ .dak-kf-tr { background: rgba(255, 122, 33, 0.18); color: var(--dak-accent); }
2441
+ .dak-kf-smk { background: rgba(162, 172, 184, 0.14); color: var(--dak-fg-mid); }
2442
+ .dak-kf-ns { background: rgba(73, 182, 255, 0.16); color: var(--dak-accent-b); }
2443
+ .dak-kf-fa { background: rgba(83, 215, 126, 0.18); color: var(--dak-ok); }
2444
+ .dak-kf-wb { background: rgba(255, 198, 77, 0.18); color: var(--dak-warn); }
2445
+
2446
+ @media (max-width: 1080px) {
2447
+ .dak-header,
2448
+ .dak-grid,
2449
+ .dak-grid-even,
2450
+ .dak-selection-layout,
2451
+ .dak-kpi-strip,
2452
+ .dak-fact-grid,
2453
+ .dak-workbench,
2454
+ .dak-replay-layout {
2455
+ grid-template-columns: 1fr;
2456
+ }
2457
+
2458
+ .dak-workbench-sidebar {
2459
+ position: static;
2460
+ }
2461
+
2462
+ .dak-tabs {
2463
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2464
+ }
2465
+
2466
+ .dak-scoreblock {
2467
+ text-align: left;
2468
+ }
2469
+
2470
+ .dak-scoreline {
2471
+ font-size: 34px;
2472
+ }
2473
+
2474
+ .dak-title {
2475
+ font-size: 32px;
2476
+ }
2477
+
2478
+ .dak-qa-row,
2479
+ .dak-roundfact-row {
2480
+ grid-template-columns: 1fr;
2481
+ }
2482
+
2483
+ .dak-player-round-summary {
2484
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2485
+ }
2486
+
2487
+ .dak-replay-layout {
2488
+ grid-template-areas:
2489
+ "controls controls"
2490
+ "roster-left roster-right"
2491
+ "stage stage";
2492
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2493
+ }
2494
+
2495
+ .dak-replay-controlbar,
2496
+ .dak-replay-togglebar {
2497
+ grid-template-columns: 1fr;
2498
+ }
2499
+
2500
+ }
2501
+
2502
+ @media (max-width: 720px) {
2503
+ .dak-workspace {
2504
+ width: min(100vw - 18px, 1480px);
2505
+ padding-top: 14px;
2506
+ }
2507
+
2508
+ .dak-tabs,
2509
+ .dak-kpi-strip,
2510
+ .dak-speed-group,
2511
+ .dak-heatmap-tuning {
2512
+ grid-template-columns: 1fr;
2513
+ }
2514
+
2515
+ .dak-tab {
2516
+ min-height: 46px;
2517
+ }
2518
+
2519
+ .dak-title {
2520
+ font-size: 28px;
2521
+ }
2522
+
2523
+ .dak-replay-stage {
2524
+ width: 100%;
2525
+ }
2526
+
2527
+ .dak-roster-board {
2528
+ grid-template-columns: 1fr;
2529
+ }
2530
+
2531
+ .dak-replay-layout {
2532
+ grid-template-areas:
2533
+ "controls"
2534
+ "roster-left"
2535
+ "roster-right"
2536
+ "stage";
2537
+ grid-template-columns: 1fr;
2538
+ }
2539
+
2540
+ .dak-player-round-summary {
2541
+ grid-template-columns: 1fr;
2542
+ }
2543
+ }
2544
+
2545
+ /* ── 2D 回放:道具效果 / C4 ───────────────────────────────── */
2546
+
2547
+ .dak-replay-fx {
2548
+ position: absolute;
2549
+ transform: translate(-50%, -50%);
2550
+ border-radius: 50%;
2551
+ pointer-events: none;
2552
+ }
2553
+
2554
+ .dak-replay-fx-smoke {
2555
+ background: radial-gradient(circle, rgba(214, 222, 230, 0.55) 0%, rgba(214, 222, 230, 0.35) 65%, transparent 100%);
2556
+ border: 1px solid rgba(214, 222, 230, 0.42);
2557
+ box-shadow: inset 0 0 0 1px rgba(9, 11, 15, 0.42), 0 0 12px rgba(214, 222, 230, 0.18);
2558
+ }
2559
+
2560
+ .dak-replay-fx-smoke.dak-replay-fx-ct {
2561
+ border-color: color-mix(in srgb, var(--dak-accent-b) 72%, white 12%);
2562
+ box-shadow: inset 0 0 0 1px rgba(9, 11, 15, 0.45), 0 0 14px rgba(73, 182, 255, 0.34);
2563
+ }
2564
+
2565
+ .dak-replay-fx-smoke.dak-replay-fx-t {
2566
+ border-color: color-mix(in srgb, var(--dak-accent) 76%, white 10%);
2567
+ box-shadow: inset 0 0 0 1px rgba(9, 11, 15, 0.45), 0 0 14px rgba(255, 122, 33, 0.34);
2568
+ }
2569
+
2570
+ .dak-replay-fx-fire {
2571
+ background: radial-gradient(circle, rgba(255, 138, 61, 0.7) 0%, rgba(255, 84, 38, 0.4) 60%, transparent 100%);
2572
+ animation: dak-fx-flicker 0.5s ease-in-out infinite alternate;
2573
+ }
2574
+
2575
+ .dak-replay-fx-he {
2576
+ background: radial-gradient(circle, rgba(255, 233, 178, 0.9) 0%, rgba(255, 95, 110, 0.5) 55%, transparent 100%);
2577
+ animation: dak-fx-burst 0.7s ease-out forwards;
2578
+ }
2579
+
2580
+ .dak-replay-fx-flash {
2581
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.95) 0%, rgba(255, 246, 200, 0.4) 60%, transparent 100%);
2582
+ animation: dak-fx-burst 0.7s ease-out forwards;
2583
+ }
2584
+
2585
+ .dak-replay-fx-countdown {
2586
+ position: absolute;
2587
+ inset: 0;
2588
+ display: flex;
2589
+ align-items: center;
2590
+ justify-content: center;
2591
+ font-size: 9px;
2592
+ font-weight: 700;
2593
+ font-variant-numeric: tabular-nums;
2594
+ color: rgba(28, 34, 40, 0.85);
2595
+ text-shadow: 0 0 3px rgba(255, 255, 255, 0.7);
2596
+ }
2597
+
2598
+ .dak-replay-fx-decoy {
2599
+ background: radial-gradient(circle, rgba(111, 125, 138, 0.6) 0%, transparent 100%);
2600
+ }
2601
+
2602
+ @keyframes dak-fx-flicker {
2603
+ from { opacity: 0.75; }
2604
+ to { opacity: 1; }
2605
+ }
2606
+
2607
+ @keyframes dak-fx-burst {
2608
+ from { opacity: 1; scale: 0.4; }
2609
+ to { opacity: 0; scale: 1.15; }
2610
+ }
2611
+
2612
+ .dak-replay-projectile {
2613
+ position: absolute;
2614
+ width: 7px;
2615
+ height: 7px;
2616
+ transform: translate(-50%, -50%);
2617
+ border-radius: 50%;
2618
+ border: 1px solid #0b0e10;
2619
+ background: #eef3f8;
2620
+ pointer-events: none;
2621
+ }
2622
+
2623
+ .dak-replay-projectile-flashbang { background: #ffd84d; }
2624
+ .dak-replay-projectile-smoke { background: #9aa6b2; }
2625
+ .dak-replay-projectile-molotov,
2626
+ .dak-replay-projectile-incendiary { background: #ff8a3d; }
2627
+ .dak-replay-projectile-hegrenade { background: #ff5f6e; }
2628
+ .dak-replay-projectile-decoy { background: #6f7d8a; }
2629
+
2630
+ /* 道具飞行尾迹:随播放逐帧延伸,颜色与落点标记一致 */
2631
+ .dak-replay-trajectories {
2632
+ position: absolute;
2633
+ inset: 0;
2634
+ width: 100%;
2635
+ height: 100%;
2636
+ pointer-events: none;
2637
+ }
2638
+
2639
+ .dak-replay-trail {
2640
+ fill: none;
2641
+ stroke: #eef3f8;
2642
+ stroke-width: 1.5px;
2643
+ vector-effect: non-scaling-stroke;
2644
+ stroke-linecap: round;
2645
+ stroke-linejoin: round;
2646
+ opacity: 0.65;
2647
+ stroke-dasharray: 1.6 1.2;
2648
+ }
2649
+
2650
+ .dak-replay-trail-flashbang { stroke: #ffd84d; }
2651
+ .dak-replay-trail-smoke { stroke: #9aa6b2; }
2652
+ .dak-replay-trail-molotov,
2653
+ .dak-replay-trail-incendiary { stroke: #ff8a3d; }
2654
+ .dak-replay-trail-hegrenade { stroke: #ff5f6e; }
2655
+ .dak-replay-trail-decoy { stroke: #6f7d8a; }
2656
+
2657
+ .dak-replay-bomb {
2658
+ position: absolute;
2659
+ transform: translate(-50%, -50%);
2660
+ padding: 1px 5px;
2661
+ border-radius: 3px;
2662
+ font-size: 10px;
2663
+ font-weight: 700;
2664
+ letter-spacing: 0.04em;
2665
+ text-transform: uppercase;
2666
+ color: #0b0e10;
2667
+ background: var(--dak-warn, #f5a623);
2668
+ border: 1px solid #0b0e10;
2669
+ pointer-events: none;
2670
+ }
2671
+
2672
+ .dak-replay-bomb-armed { animation: dak-bomb-pulse 1s ease-in-out infinite; }
2673
+ .dak-replay-bomb-defused { background: var(--dak-ok, #38c87d); animation: none; }
2674
+ .dak-replay-bomb-exploding { animation: dak-fx-burst 1.2s ease-out forwards; }
2675
+ .dak-replay-bomb-exploded { opacity: 0.35; }
2676
+ .dak-replay-bomb-dropped {
2677
+ background: rgba(245, 166, 35, 0.55);
2678
+ border: 1px dashed #f5a623;
2679
+ animation: dak-bomb-blink 1.2s ease-in-out infinite;
2680
+ font-size: 9px;
2681
+ padding: 1px 5px;
2682
+ }
2683
+
2684
+ /* 地面掉落的拆弹器:蓝色虚线,与橙色 C4 区分。 */
2685
+ .dak-replay-defuser {
2686
+ position: absolute;
2687
+ transform: translate(-50%, -50%);
2688
+ border-radius: 3px;
2689
+ font-size: 9px;
2690
+ font-weight: 700;
2691
+ letter-spacing: 0.04em;
2692
+ text-transform: uppercase;
2693
+ color: #0b0e10;
2694
+ pointer-events: none;
2695
+ }
2696
+
2697
+ .dak-replay-defuser-dropped {
2698
+ background: rgba(77, 184, 255, 0.55);
2699
+ border: 1px dashed #4db8ff;
2700
+ animation: dak-bomb-blink 1.2s ease-in-out infinite;
2701
+ padding: 1px 5px;
2702
+ }
2703
+
2704
+ @keyframes dak-bomb-blink {
2705
+ 0%, 100% { opacity: 0.5; }
2706
+ 50% { opacity: 0.9; }
2707
+ }
2708
+
2709
+ @keyframes dak-bomb-pulse {
2710
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(245, 166, 35, 0.7); }
2711
+ 50% { box-shadow: 0 0 0 7px rgba(245, 166, 35, 0); }
2712
+ }
2713
+
2714
+ .dak-replay-token .dak-replay-c4-tag {
2715
+ background: var(--dak-warn, #f5a623);
2716
+ color: #0b0e10;
2717
+ }
2718
+
2719
+ /* ── 武器统计 / 对位 ─────────────────────────────────────── */
2720
+
2721
+ .dak-num {
2722
+ text-align: right;
2723
+ font-variant-numeric: tabular-nums;
2724
+ }
2725
+
2726
+ .dak-weapon-bar-cell {
2727
+ width: 120px;
2728
+ min-width: 80px;
2729
+ }
2730
+
2731
+ .dak-weapon-bar {
2732
+ height: 7px;
2733
+ border-radius: 999px;
2734
+ background: linear-gradient(90deg, var(--dak-accent), rgba(255, 122, 33, 0.35));
2735
+ }
2736
+
2737
+ .dak-duel-scroll {
2738
+ overflow-x: auto;
2739
+ }
2740
+
2741
+ .dak-duel-matrix {
2742
+ border-collapse: collapse;
2743
+ font-size: 12px;
2744
+ }
2745
+
2746
+ .dak-duel-matrix th,
2747
+ .dak-duel-matrix td {
2748
+ border: 1px solid var(--dak-border);
2749
+ padding: 0;
2750
+ }
2751
+
2752
+ .dak-duel-head {
2753
+ height: 110px;
2754
+ min-width: 30px;
2755
+ vertical-align: bottom;
2756
+ padding: 6px 4px;
2757
+ }
2758
+
2759
+ .dak-duel-head span {
2760
+ display: inline-block;
2761
+ max-height: 100px;
2762
+ overflow: hidden;
2763
+ writing-mode: vertical-rl;
2764
+ transform: rotate(180deg);
2765
+ font-weight: 600;
2766
+ white-space: nowrap;
2767
+ }
2768
+
2769
+ .dak-duel-rowhead {
2770
+ max-width: 140px;
2771
+ overflow: hidden;
2772
+ padding: 5px 8px;
2773
+ font-weight: 600;
2774
+ text-align: right;
2775
+ text-overflow: ellipsis;
2776
+ white-space: nowrap;
2777
+ }
2778
+
2779
+ .dak-duel-teamA {
2780
+ color: var(--dak-accent);
2781
+ }
2782
+
2783
+ .dak-duel-teamB {
2784
+ color: var(--dak-accent-b);
2785
+ }
2786
+
2787
+ .dak-duel-cell {
2788
+ width: 34px;
2789
+ height: 30px;
2790
+ text-align: center;
2791
+ font-family: var(--dak-mono);
2792
+ font-variant-numeric: tabular-nums;
2793
+ }
2794
+
2795
+ .dak-duel-cell-same {
2796
+ background: var(--dak-bg-subtle);
2797
+ color: var(--dak-fg-dim);
2798
+ }
2799
+
2800
+ /* ── 原语(EmptyState / MetricInfo / EvidenceLink) ───────────────── */
2801
+
2802
+ .dak-empty {
2803
+ display: flex;
2804
+ flex-direction: column;
2805
+ align-items: center;
2806
+ gap: 10px;
2807
+ padding: 80px 24px;
2808
+ border: 1px dashed var(--dak-border-hi);
2809
+ border-radius: 3px;
2810
+ text-align: center;
2811
+ }
2812
+
2813
+ .dak-empty-mark {
2814
+ font-size: 34px;
2815
+ color: var(--dak-accent);
2816
+ }
2817
+
2818
+ .dak-empty h2 {
2819
+ margin: 0;
2820
+ font-size: 18px;
2821
+ }
2822
+
2823
+ .dak-empty p {
2824
+ margin: 0;
2825
+ max-width: 460px;
2826
+ color: var(--dak-fg-mid);
2827
+ font-size: 13px;
2828
+ line-height: 1.6;
2829
+ }
2830
+
2831
+ .dak-empty-error h2 {
2832
+ color: var(--dak-danger);
2833
+ }
2834
+
2835
+ /* ⓘ 口径说明 */
2836
+ .dak-info {
2837
+ position: relative;
2838
+ display: inline-block;
2839
+ margin-left: 4px;
2840
+ color: var(--dak-fg-dim);
2841
+ font-size: 11px;
2842
+ cursor: help;
2843
+ }
2844
+
2845
+ .dak-info-tip {
2846
+ position: absolute;
2847
+ left: 50%;
2848
+ bottom: calc(100% + 6px);
2849
+ transform: translateX(-50%) translateY(2px);
2850
+ z-index: 30;
2851
+ width: max-content;
2852
+ max-width: 300px;
2853
+ padding: 8px 10px;
2854
+ border: 1px solid var(--dak-border);
2855
+ border-radius: 2px;
2856
+ background: var(--dak-bg-subtle);
2857
+ color: var(--dak-fg);
2858
+ box-shadow: 0 12px 32px rgba(0, 0, 0, .35);
2859
+ font-size: 12px;
2860
+ line-height: 1.45;
2861
+ white-space: normal;
2862
+ text-transform: none;
2863
+ letter-spacing: normal;
2864
+ opacity: 0;
2865
+ pointer-events: none;
2866
+ transition: opacity .12s ease, transform .12s ease;
2867
+ }
2868
+
2869
+ .dak-info:hover .dak-info-tip,
2870
+ .dak-info:focus-visible .dak-info-tip {
2871
+ opacity: 1;
2872
+ transform: translateX(-50%) translateY(0);
2873
+ }
2874
+
2875
+ .dak-evidence {
2876
+ background: var(--dak-panel);
2877
+ border: 1px solid var(--dak-border);
2878
+ border-radius: 2px;
2879
+ color: var(--dak-accent);
2880
+ font-size: 12px;
2881
+ padding: 4px 8px;
2882
+ cursor: pointer;
2883
+ }
2884
+
2885
+ .dak-evidence:hover:not(:disabled) {
2886
+ border-color: var(--dak-border-hi);
2887
+ background: var(--dak-panel-hi);
2888
+ }
2889
+
2890
+ .dak-evidence:disabled {
2891
+ opacity: 0.45;
2892
+ cursor: default;
2893
+ }
2894
+
2895
+ /* ── Map roles ───────────────────────────────────────────────────────── */
2896
+ .dak-role-panel { display: grid; min-width: 0; gap: 12px; }
2897
+ .dak-role-panel .dak-table th,
2898
+ .dak-role-panel .dak-table td { white-space: normal; }
2899
+ .dak-role-panel .dak-info-tip {
2900
+ right: 0;
2901
+ left: auto;
2902
+ transform: translateY(2px);
2903
+ }
2904
+ .dak-role-panel .dak-info:hover .dak-info-tip,
2905
+ .dak-role-panel .dak-info:focus-visible .dak-info-tip { transform: translateY(0); }
2906
+ .dak-role-head { display: flex; align-items: start; justify-content: space-between; gap: 12px; }
2907
+ .dak-role-head h3 { margin: 0; }
2908
+ .dak-role-head p, .dak-role-note { margin: 4px 0 0; color: var(--dak-fg-dim); font-size: 12px; line-height: 1.5; }
2909
+ .dak-role-summary, .dak-role-declarations, .dak-role-evidence { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; color: var(--dak-fg-mid); font-size: 12px; }
2910
+ .dak-role-summary b, .dak-role-declarations b, .dak-role-evidence b { color: var(--dak-fg); }
2911
+ .dak-role-tag, .dak-role-status { border: 1px solid var(--dak-border); border-radius: 2px; padding: 2px 6px; font-size: 11px; }
2912
+ .dak-role-status-ready { color: var(--dak-ok); }
2913
+ .dak-role-status-mixed { color: var(--dak-warn); }
2914
+ .dak-role-status-insufficient, .dak-role-status-unknown { color: var(--dak-fg-dim); }
2915
+
2916
+ /* ── Event Bracket(瑞士轮 + 淘汰赛,DOM + SVG 双模式) ─────────────────── */
2917
+
2918
+ .dak-bracket-diagram {
2919
+ overflow-x: auto;
2920
+ margin: 10px 0 16px;
2921
+ border: 1px solid var(--dak-border);
2922
+ border-radius: 7px;
2923
+ background: var(--dak-bg);
2924
+ }
2925
+
2926
+ .dak-bracket-diagram svg {
2927
+ display: block;
2928
+ }
2929
+
2930
+ .dak-bracket-edge {
2931
+ fill: none;
2932
+ stroke: var(--dak-accent);
2933
+ stroke-width: 2;
2934
+ }
2935
+
2936
+ .dak-bracket-edge-loss {
2937
+ stroke: var(--dak-fg-dim);
2938
+ stroke-dasharray: 5 4;
2939
+ }
2940
+
2941
+ .dak-bracket-box {
2942
+ fill: var(--dak-panel);
2943
+ stroke: var(--dak-border-hi);
2944
+ }
2945
+
2946
+ .dak-bracket-box-title,
2947
+ .dak-bracket-box-match {
2948
+ fill: var(--dak-fg);
2949
+ font-family: var(--dak-sans);
2950
+ font-size: 12px;
2951
+ }
2952
+
2953
+ .dak-bracket-lane-separator {
2954
+ stroke: var(--dak-border);
2955
+ stroke-width: 1;
2956
+ }
2957
+
2958
+ .dak-bracket-lane-label {
2959
+ fill: var(--dak-fg-mid);
2960
+ font-family: var(--dak-sans);
2961
+ font-size: 12px;
2962
+ font-weight: 600;
2963
+ }
2964
+
2965
+ .dak-bracket-box-match {
2966
+ fill: var(--dak-fg-dim);
2967
+ font-size: 10px;
2968
+ }
2969
+
2970
+ .dak-bracket-round,
2971
+ .dak-bracket-links {
2972
+ display: grid;
2973
+ gap: 8px;
2974
+ }
2975
+
2976
+ .dak-bracket-node {
2977
+ border: 1px solid var(--dak-border);
2978
+ border-radius: 7px;
2979
+ background: var(--dak-panel);
2980
+ padding: 10px;
2981
+ }
2982
+
2983
+ .dak-bracket-links {
2984
+ color: var(--dak-fg-dim);
2985
+ font-size: 11px;
2986
+ }
2987
+
2988
+ .dak-eb {
2989
+ display: flex;
2990
+ gap: 18px;
2991
+ align-items: stretch;
2992
+ overflow-x: auto;
2993
+ padding: 6px 2px 12px;
2994
+ }
2995
+
2996
+ .dak-eb-col {
2997
+ display: flex;
2998
+ flex-direction: column;
2999
+ min-width: 210px;
3000
+ align-self: stretch;
3001
+ }
3002
+
3003
+ .dak-eb-col-body {
3004
+ flex: 1;
3005
+ display: flex;
3006
+ flex-direction: column;
3007
+ justify-content: center;
3008
+ gap: 10px;
3009
+ }
3010
+
3011
+ .dak-eb-elim {
3012
+ align-items: stretch;
3013
+ }
3014
+
3015
+ .dak-eb-elim-col .dak-eb-col-body {
3016
+ justify-content: space-evenly;
3017
+ }
3018
+
3019
+ .dak-eb-elim-matches {
3020
+ display: flex;
3021
+ flex-direction: column;
3022
+ gap: 14px;
3023
+ flex: 1;
3024
+ }
3025
+
3026
+ .dak-eb-col-head {
3027
+ font-size: 11px;
3028
+ font-weight: 800;
3029
+ letter-spacing: .1em;
3030
+ text-transform: uppercase;
3031
+ color: var(--dak-fg-mid);
3032
+ }
3033
+
3034
+ .dak-eb-group {
3035
+ display: flex;
3036
+ flex-direction: column;
3037
+ gap: 6px;
3038
+ }
3039
+
3040
+ .dak-eb-group-head {
3041
+ font-family: var(--dak-mono);
3042
+ font-size: 12px;
3043
+ font-weight: 700;
3044
+ color: var(--dak-fg-dim);
3045
+ }
3046
+
3047
+ .dak-eb-box {
3048
+ display: grid;
3049
+ gap: 1px;
3050
+ border: 1px solid var(--dak-border);
3051
+ border-radius: 7px;
3052
+ background: var(--dak-panel);
3053
+ overflow: hidden;
3054
+ text-align: left;
3055
+ width: 100%;
3056
+ padding: 0;
3057
+ }
3058
+
3059
+ .dak-eb-box-click {
3060
+ cursor: pointer;
3061
+ }
3062
+
3063
+ .dak-eb-box-click:hover {
3064
+ border-color: var(--dak-border-hi);
3065
+ }
3066
+
3067
+ .dak-eb-box-sel {
3068
+ border-color: var(--dak-accent);
3069
+ }
3070
+
3071
+ .dak-eb-team {
3072
+ display: flex;
3073
+ justify-content: space-between;
3074
+ align-items: center;
3075
+ gap: 8px;
3076
+ padding: 6px 9px;
3077
+ font-size: 13px;
3078
+ color: var(--dak-fg-mid);
3079
+ background: var(--dak-panel);
3080
+ }
3081
+
3082
+ .dak-eb-team b {
3083
+ font-family: var(--dak-mono);
3084
+ color: var(--dak-fg);
3085
+ }
3086
+
3087
+ .dak-eb-win {
3088
+ color: var(--dak-fg);
3089
+ font-weight: 700;
3090
+ border-left: 3px solid var(--dak-ok);
3091
+ }
3092
+
3093
+ .dak-eb-lose {
3094
+ color: var(--dak-fg-dim);
3095
+ border-left: 3px solid var(--dak-danger);
3096
+ }
3097
+
3098
+ .dak-eb-date {
3099
+ padding: 3px 9px;
3100
+ font-size: 10px;
3101
+ color: var(--dak-fg-dim);
3102
+ border-top: 1px solid var(--dak-border);
3103
+ }
3104
+
3105
+ .dak-eb-box-empty {
3106
+ padding: 12px 9px;
3107
+ border-style: dashed;
3108
+ color: var(--dak-fg-dim);
3109
+ font-size: 12px;
3110
+ cursor: pointer;
3111
+ }
3112
+
3113
+ .dak-eb-box-empty:hover {
3114
+ border-color: var(--dak-accent);
3115
+ color: var(--dak-accent);
3116
+ }
3117
+
3118
+ .dak-eb-add {
3119
+ border: 1px dashed var(--dak-border-hi);
3120
+ border-radius: 7px;
3121
+ background: transparent;
3122
+ color: var(--dak-fg-dim);
3123
+ font-size: 11px;
3124
+ padding: 5px;
3125
+ cursor: pointer;
3126
+ }
3127
+
3128
+ .dak-eb-add:hover {
3129
+ border-color: var(--dak-accent);
3130
+ color: var(--dak-accent);
3131
+ }
3132
+
3133
+ .dak-eb-outcomes {
3134
+ gap: 14px;
3135
+ }
3136
+
3137
+ .dak-eb-outcome {
3138
+ display: flex;
3139
+ flex-direction: column;
3140
+ gap: 4px;
3141
+ padding: 10px;
3142
+ border-radius: 7px;
3143
+ }
3144
+
3145
+ .dak-eb-advanced {
3146
+ background: color-mix(in srgb, var(--dak-ok) 14%, transparent);
3147
+ border: 1px solid color-mix(in srgb, var(--dak-ok) 40%, transparent);
3148
+ }
3149
+
3150
+ .dak-eb-eliminated {
3151
+ background: color-mix(in srgb, var(--dak-danger) 12%, transparent);
3152
+ border: 1px solid color-mix(in srgb, var(--dak-danger) 38%, transparent);
3153
+ }
3154
+
3155
+ .dak-eb-outcome-row {
3156
+ display: flex;
3157
+ justify-content: space-between;
3158
+ gap: 10px;
3159
+ font-size: 12px;
3160
+ color: var(--dak-fg);
3161
+ }
3162
+
3163
+ .dak-eb-outcome-row b {
3164
+ font-family: var(--dak-mono);
3165
+ color: var(--dak-fg-mid);
1730
3166
  }