@ntmats/hc-ui 0.3.0 → 0.5.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/dist/styles.css CHANGED
@@ -91,8 +91,8 @@
91
91
  }
92
92
 
93
93
  [data-hc-ds] .hc-ui-segmented__option:focus-visible {
94
- outline: 2px solid var(--hc-focus-ring);
95
- outline-offset: var(--hc-focus-ring-offset, 2px);
94
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
95
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
96
96
  }
97
97
 
98
98
  [data-hc-ds] .hc-ui-segmented__option:disabled { opacity: 0.48; cursor: not-allowed; }
@@ -182,8 +182,8 @@
182
182
  [data-hc-ds] :is(.hc-ui-button, .hc-ui-icon-button, .hc-ui-chip):active:not(:disabled) { transform: scale(0.97); }
183
183
 
184
184
  [data-hc-ds] :is(.hc-ui-button, .hc-ui-icon-button, .hc-ui-chip):focus-visible {
185
- outline: 2px solid var(--hc-focus-ring);
186
- outline-offset: var(--hc-focus-ring-offset, 2px);
185
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
186
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
187
187
  }
188
188
 
189
189
  [data-hc-ds] :is(.hc-ui-button__icon, .hc-ui-icon-button__icon, .hc-ui-chip__icon) { display: inline-flex; flex: 0 0 auto; }
@@ -230,6 +230,10 @@
230
230
  [data-hc-ds] .hc-ui-button:disabled { opacity: 0.4; cursor: default; }
231
231
  [data-hc-ds] .hc-ui-button { max-width: 100%; }
232
232
  [data-hc-ds] .hc-ui-button__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
233
+ /* `wrap`: the label breaks onto more lines and the button grows; the 8px block padding
234
+ keeps a single line at the size's height. */
235
+ [data-hc-ds] .hc-ui-button[data-wrap] { padding-block: var(--hc-space-2); white-space: normal; text-align: center; }
236
+ [data-hc-ds] .hc-ui-button[data-wrap] .hc-ui-button__label { overflow: visible; text-overflow: clip; overflow-wrap: anywhere; }
233
237
  [data-hc-ds] .hc-ui-button[aria-busy='true'] { cursor: progress; }
234
238
  [data-hc-ds] .hc-ui-button__spinner {
235
239
  flex: 0 0 auto;
@@ -367,7 +371,7 @@
367
371
  }
368
372
  [data-hc-ds] .hc-ui-chip__clear svg { display: block; }
369
373
  [data-hc-ds] .hc-ui-chip__clear:hover:not(:disabled) { color: var(--hc-color-text-primary); background-color: color-mix(in srgb, currentColor 18%, transparent); }
370
- [data-hc-ds] :is(.hc-ui-chip__main, .hc-ui-chip__clear):focus-visible { outline: 2px solid var(--hc-focus-ring); outline-offset: var(--hc-focus-ring-offset, 2px); }
374
+ [data-hc-ds] :is(.hc-ui-chip__main, .hc-ui-chip__clear):focus-visible { outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring); outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width)); }
371
375
  [data-hc-ds] .hc-ui-chip__clear:disabled, [data-hc-ds] button.hc-ui-chip__main:disabled { cursor: default; }
372
376
  [data-hc-ds] .hc-ui-chip[data-disabled] { opacity: 0.4; }
373
377
  /* Selected with a remove button: the contrast fill at xs (HCUI's active quick filter), the accent otherwise. */
@@ -531,13 +535,16 @@
531
535
  [data-hc-ds] .hc-ui-meter[data-track='none'][data-cap='round'] .hc-ui-meter__fill { border-radius: 0 var(--hc-radius-full) var(--hc-radius-full) 0; }
532
536
  [data-hc-ds] .hc-ui-meter[data-cap='square'] .hc-ui-meter__fill { border-radius: 0; }
533
537
  [data-hc-ds] .hc-ui-meter[data-tone='over'] .hc-ui-meter__fill { background-color: var(--hc-color-danger); }
534
- /* Drawn only above the limit, over the danger fill: in the text color it shows in both themes. */
538
+ /* Drawn only above the limit, over the danger fill: in the text color, with a 1px edge of
539
+ the surface on each side, so it stands apart from the red in both themes (dark on light,
540
+ light on dark) and from the track. */
535
541
  [data-hc-ds] .hc-ui-meter__limit {
536
542
  position: absolute;
537
543
  top: 0;
538
544
  bottom: 0;
539
545
  width: 2px;
540
546
  background-color: var(--hc-color-text-primary);
547
+ box-shadow: -1px 0 0 var(--hc-color-bg-surface), 1px 0 0 var(--hc-color-bg-surface);
541
548
  }
542
549
  [data-hc-ds] .hc-ui-meter[data-animated] .hc-ui-meter__fill { transition: width var(--hc-transition-base); }
543
550
 
@@ -611,8 +618,8 @@
611
618
  }
612
619
  [data-hc-ds] .hc-ui-checkbox__input:focus-visible { outline: none; }
613
620
  [data-hc-ds] .hc-ui-checkbox__input:focus-visible + .hc-ui-checkbox__box {
614
- outline: 2px solid var(--hc-focus-ring);
615
- outline-offset: var(--hc-focus-ring-offset, 2px);
621
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
622
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
616
623
  }
617
624
  [data-hc-ds] .hc-ui-checkbox__input:disabled + .hc-ui-checkbox__box {
618
625
  background-color: var(--hc-color-bg-muted);
@@ -630,7 +637,10 @@
630
637
  }
631
638
 
632
639
  /* Dialog — native <dialog> in the top layer. `sm` is HCUI's desktop confirmation
633
- (.desktop-confirm); `md` is HCUI's Sheet in its centered desktop form. */
640
+ (.desktop-confirm); `md` is HCUI's Sheet in its centered desktop form. Both have the
641
+ panel's look (decision of 2026-11-07): `shadow-modal`, the entry and exit animation and
642
+ the backdrop's fade, none under reduced motion. The backdrop is not blurred: the panel
643
+ is solid (blur only behind translucent surfaces). */
634
644
  [data-hc-ds] .hc-ui-dialog {
635
645
  box-sizing: border-box;
636
646
  width: min(400px, calc(100vw - 32px));
@@ -644,15 +654,21 @@
644
654
  background-color: var(--hc-color-bg-elevated);
645
655
  border: 0;
646
656
  border-radius: var(--hc-radius-lg);
657
+ box-shadow: var(--hc-shadow-modal);
647
658
  font-family: var(--hc-font-body);
648
659
  font-size: var(--hc-font-size-md);
649
660
  font-variation-settings: 'ROND' var(--hc-rond);
650
661
  line-height: var(--hc-line-height-md);
651
662
  outline: none;
663
+ animation: hc-ui-dialog-in var(--hc-dur-medium) var(--hc-ease-standard) both;
652
664
  }
653
665
  [data-hc-ds] .hc-ui-dialog[open] { display: grid; align-content: start; gap: var(--hc-space-2); }
654
- [data-hc-ds] .hc-ui-dialog::backdrop { background-color: var(--hc-color-bg-overlay); }
655
- [data-hc-ds] .hc-ui-dialog[data-closing] { pointer-events: none; }
666
+ [data-hc-ds] .hc-ui-dialog::backdrop {
667
+ background-color: var(--hc-color-bg-overlay);
668
+ animation: hc-ui-backdrop-in var(--hc-dur-medium) var(--hc-ease-standard) both;
669
+ }
670
+ [data-hc-ds] .hc-ui-dialog[data-closing] { pointer-events: none; animation: hc-ui-dialog-out var(--hc-dur-short) var(--hc-ease-emphasized-accel) forwards; }
671
+ [data-hc-ds] .hc-ui-dialog[data-closing]::backdrop { animation: hc-ui-backdrop-out var(--hc-dur-short) var(--hc-ease-standard) forwards; }
656
672
  [data-hc-ds] .hc-ui-dialog__header {
657
673
  display: flex;
658
674
  align-items: center;
@@ -694,17 +710,8 @@
694
710
  padding: 0;
695
711
  overflow: hidden;
696
712
  border-radius: var(--hc-radius-sheet);
697
- box-shadow: var(--hc-shadow-modal);
698
- animation: hc-ui-dialog-in var(--hc-dur-medium) var(--hc-ease-standard) both;
699
713
  }
700
714
  [data-hc-ds] .hc-ui-dialog[data-size='md'][open] { display: flex; flex-direction: column; gap: 0; }
701
- [data-hc-ds] .hc-ui-dialog[data-size='md']::backdrop {
702
- -webkit-backdrop-filter: blur(8px);
703
- backdrop-filter: blur(8px);
704
- animation: hc-ui-backdrop-in var(--hc-dur-medium) var(--hc-ease-standard) both;
705
- }
706
- [data-hc-ds] .hc-ui-dialog[data-size='md'][data-closing] { animation: hc-ui-dialog-out var(--hc-dur-short) var(--hc-ease-emphasized-accel) forwards; }
707
- [data-hc-ds] .hc-ui-dialog[data-size='md'][data-closing]::backdrop { animation: hc-ui-backdrop-out var(--hc-dur-short) var(--hc-ease-standard) forwards; }
708
715
  [data-hc-ds] .hc-ui-dialog[data-size='md'] .hc-ui-dialog__header { flex: 0 0 auto; padding: var(--hc-space-5) var(--hc-space-5) var(--hc-space-3); }
709
716
  [data-hc-ds] .hc-ui-dialog[data-size='md'] .hc-ui-dialog__title {
710
717
  font-size: var(--hc-font-size-xl);
@@ -747,10 +754,8 @@
747
754
  @media (prefers-reduced-motion: reduce) {
748
755
  [data-hc-ds] .hc-ui-dialog,
749
756
  [data-hc-ds] .hc-ui-dialog::backdrop,
750
- [data-hc-ds] .hc-ui-dialog[data-size='md'],
751
- [data-hc-ds] .hc-ui-dialog[data-size='md'][data-closing],
752
- [data-hc-ds] .hc-ui-dialog[data-size='md']::backdrop,
753
- [data-hc-ds] .hc-ui-dialog[data-size='md'][data-closing]::backdrop { animation: none; }
757
+ [data-hc-ds] .hc-ui-dialog[data-closing],
758
+ [data-hc-ds] .hc-ui-dialog[data-closing]::backdrop { animation: none; }
754
759
  }
755
760
 
756
761
  /* Sheet — a Dialog size="md" that, at the bottom, is HCUI's mobile Sheet (sheet-panel,
@@ -858,7 +863,7 @@
858
863
  }
859
864
  [data-hc-ds] .hc-ui-sheet-options__row {
860
865
  /* The ring goes inside, where the group's overflow does not cut it. */
861
- --hc-focus-ring-offset: -2px;
866
+ --hc-focus-ring-offset: calc(-1 * var(--hc-focus-ring-width));
862
867
  appearance: none;
863
868
  position: relative;
864
869
  display: flex;
@@ -896,8 +901,8 @@
896
901
  }
897
902
  [data-hc-ds] .hc-ui-sheet-options__row:active:not(:disabled)::after { opacity: 0.07; }
898
903
  [data-hc-ds] .hc-ui-sheet-options__row:focus-visible {
899
- outline: 2px solid var(--hc-focus-ring);
900
- outline-offset: var(--hc-focus-ring-offset, 2px);
904
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
905
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
901
906
  border-radius: var(--hc-radius-lg);
902
907
  }
903
908
  [data-hc-ds] .hc-ui-sheet-options__row:disabled { opacity: 0.4; cursor: default; }
@@ -915,22 +920,6 @@
915
920
  animation: hc-ui-check-in 260ms var(--hc-ease-pop);
916
921
  }
917
922
 
918
- /* SheetOptions variant="list" — HCUI's mobile sort sheet (.sort-button__option): plain
919
- 48px rows with a line under each, 560 weight and 720 once chosen, a 20px check in the text color. */
920
- [data-hc-ds] .hc-ui-sheet-options[data-variant='list'] { background-color: transparent; border-radius: 0; box-shadow: none; }
921
- [data-hc-ds] .hc-ui-sheet-options[data-variant='list'] .hc-ui-sheet-options__row,
922
- [data-hc-ds] .hc-ui-sheet-options[data-variant='list'] .hc-ui-sheet-options__row + .hc-ui-sheet-options__row {
923
- min-height: 48px;
924
- padding: 0;
925
- font-size: var(--hc-font-size-md);
926
- font-weight: 560;
927
- line-height: var(--hc-line-height-md);
928
- box-shadow: inset 0 -1px 0 var(--hc-color-border);
929
- }
930
- [data-hc-ds] .hc-ui-sheet-options[data-variant='list'] .hc-ui-sheet-options__row[data-selected] .hc-ui-sheet-options__label { font-weight: 720; }
931
- [data-hc-ds] .hc-ui-sheet-options[data-variant='list'] .hc-ui-sheet-options__row:focus-visible { border-radius: var(--hc-radius-xs); }
932
- [data-hc-ds] .hc-ui-sheet-options[data-variant='list'] .hc-ui-sheet-options__check { color: var(--hc-color-text-primary); animation: none; }
933
-
934
923
  /* SheetChips — wrapping Chips with radio semantics. */
935
924
  [data-hc-ds] .hc-ui-sheet-chips { display: flex; flex-wrap: wrap; gap: var(--hc-space-2); }
936
925
 
@@ -1020,8 +1009,8 @@
1020
1009
  [data-hc-ds] .hc-ui-menu__item[data-danger]:hover:not(:disabled) { color: var(--hc-color-danger); }
1021
1010
  [data-hc-ds] .hc-ui-menu__item:disabled { color: var(--hc-color-text-muted); cursor: default; }
1022
1011
  [data-hc-ds] .hc-ui-menu__item:focus-visible {
1023
- outline: 2px solid var(--hc-focus-ring);
1024
- outline-offset: var(--hc-focus-ring-offset, 3px);
1012
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
1013
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
1025
1014
  }
1026
1015
  [data-hc-ds] .hc-ui-menu__text { min-width: 0; }
1027
1016
  [data-hc-ds] .hc-ui-menu__hint {
@@ -1101,6 +1090,7 @@
1101
1090
  background: transparent;
1102
1091
  color: inherit;
1103
1092
  font: inherit;
1093
+ font-variation-settings: 'ROND' var(--hc-rond);
1104
1094
  cursor: pointer;
1105
1095
  -webkit-tap-highlight-color: transparent;
1106
1096
  }
@@ -1116,8 +1106,8 @@
1116
1106
  text-align: start;
1117
1107
  }
1118
1108
  [data-hc-ds] :is(.hc-ui-table__sort, .hc-ui-table__row-button):focus-visible {
1119
- outline: 2px solid var(--hc-focus-ring);
1120
- outline-offset: var(--hc-focus-ring-offset, 3px);
1109
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
1110
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
1121
1111
  }
1122
1112
 
1123
1113
  /* PageHeader — HCUI's desktop page heading (`.desktop-page-heading`): 22px semibold title on a
@@ -1260,6 +1250,7 @@
1260
1250
  padding: var(--hc-space-1) var(--hc-space-2);
1261
1251
  border-radius: var(--hc-radius-xs);
1262
1252
  font: inherit;
1253
+ font-variation-settings: 'ROND' var(--hc-rond);
1263
1254
  }
1264
1255
  [data-hc-ds] .hc-ui-panel-header__close {
1265
1256
  display: grid;
@@ -1272,8 +1263,8 @@
1272
1263
  }
1273
1264
  [data-hc-ds] :is(.hc-ui-panel-header__step, .hc-ui-panel-header__close):hover { background: var(--hc-color-bg-muted); color: var(--hc-color-text-primary); }
1274
1265
  [data-hc-ds] :is(.hc-ui-panel-header__step, .hc-ui-panel-header__close):focus-visible {
1275
- outline: 2px solid var(--hc-focus-ring);
1276
- outline-offset: var(--hc-focus-ring-offset, 3px);
1266
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
1267
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
1277
1268
  }
1278
1269
 
1279
1270
  /* ListRow — HCUI's `list-row` mixin: a full-width button row with a translucent veil on hover
@@ -1316,8 +1307,8 @@
1316
1307
  [data-hc-ds] .hc-ui-list-row:active:not(:disabled)::after { opacity: 0.07; }
1317
1308
  [data-hc-ds] .hc-ui-list-row:focus-visible {
1318
1309
  border-radius: var(--hc-radius-lg);
1319
- outline: 2px solid var(--hc-focus-ring);
1320
- outline-offset: var(--hc-focus-ring-offset, -2px);
1310
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
1311
+ outline-offset: var(--hc-focus-ring-offset, calc(-1 * var(--hc-focus-ring-width)));
1321
1312
  }
1322
1313
  @media (prefers-reduced-motion: reduce) {
1323
1314
  [data-hc-ds] .hc-ui-list-row::after { transition: none; }
@@ -1325,7 +1316,7 @@
1325
1316
 
1326
1317
  /* CommandPalette — HCUI's desktop ⌘K (.command-palette): 640px wide, at most 560px tall,
1327
1318
  12vh from the top, a 1px border, `shadow-soft`, no blur and no animation. The backdrop
1328
- is `bg-overlay` unless `--hc-command-palette-backdrop` says otherwise (HCUI: 28% black). */
1319
+ is the `bg-scrim` token (HCUI's 28% black) unless `--hc-command-palette-backdrop` says otherwise. */
1329
1320
  [data-hc-ds] .hc-ui-command-palette {
1330
1321
  box-sizing: border-box;
1331
1322
  width: min(640px, calc(100vw - 32px));
@@ -1344,7 +1335,7 @@
1344
1335
  line-height: var(--hc-line-height-md);
1345
1336
  outline: none;
1346
1337
  }
1347
- [data-hc-ds] .hc-ui-command-palette::backdrop { background: var(--hc-command-palette-backdrop, var(--hc-color-bg-overlay)); }
1338
+ [data-hc-ds] .hc-ui-command-palette::backdrop { background: var(--hc-command-palette-backdrop, var(--hc-color-bg-scrim)); }
1348
1339
  [data-hc-ds] .hc-ui-command-palette__box { display: flex; flex-direction: column; max-height: inherit; }
1349
1340
  [data-hc-ds] .hc-ui-command-palette__field {
1350
1341
  display: flex;
@@ -1399,14 +1390,15 @@
1399
1390
  background: transparent;
1400
1391
  color: inherit;
1401
1392
  font: inherit;
1393
+ font-variation-settings: 'ROND' var(--hc-rond);
1402
1394
  text-align: left;
1403
1395
  cursor: pointer;
1404
1396
  -webkit-tap-highlight-color: transparent;
1405
1397
  }
1406
1398
  [data-hc-ds] .hc-ui-command-palette__item[aria-selected='true'] { background: var(--hc-color-bg-muted); }
1407
1399
  [data-hc-ds] .hc-ui-command-palette__item:focus-visible {
1408
- outline: 2px solid var(--hc-focus-ring);
1409
- outline-offset: var(--hc-focus-ring-offset, -2px);
1400
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
1401
+ outline-offset: var(--hc-focus-ring-offset, calc(-1 * var(--hc-focus-ring-width)));
1410
1402
  }
1411
1403
  [data-hc-ds] .hc-ui-command-palette__icon {
1412
1404
  display: grid;
@@ -1441,3 +1433,1233 @@
1441
1433
  font-size: var(--hc-font-size-2xs);
1442
1434
  }
1443
1435
  [data-hc-ds] .hc-ui-command-palette__footer .hc-ui-command-palette__kbd { margin-right: 2px; }
1436
+
1437
+ /* ==========================================================================
1438
+ HeroClix game pieces — HCUI's src/heroclix-ui, as it is. Colors that stay the
1439
+ same in both themes (the dial paper, the dark outlines, the translucent rings
1440
+ of the symbols) are HeroClix tokens; black symbols turn white or gray through
1441
+ the `filter-symbol-*` tokens.
1442
+ ========================================================================== */
1443
+
1444
+ /* Border-box sizing, as HCUI's global rule, inside every piece. */
1445
+ [data-hc-ds] :is(.hc-ui-mini-dial, .hc-ui-power-icon, .hc-ui-special-icon, .hc-ui-equipment-icon, .hc-ui-combat-dial),
1446
+ [data-hc-ds] :is(.hc-ui-mini-dial, .hc-ui-power-icon, .hc-ui-special-icon, .hc-ui-equipment-icon, .hc-ui-combat-dial) :is(*, ::before, ::after),
1447
+ [data-hc-ds] .hc-ui-combat-dial::before,
1448
+ [data-hc-ds] .hc-ui-combat-dial::after { box-sizing: border-box; }
1449
+
1450
+ /* MiniDialView — HCUI `.mini-dial`. The cell size is `--hc-mini-dial-cell` (7px),
1451
+ set on the dial or any ancestor; the top margin has zero specificity. */
1452
+ :where([data-hc-ds] .hc-ui-mini-dial) { margin-top: 5px; }
1453
+ [data-hc-ds] .hc-ui-mini-dial {
1454
+ display: grid;
1455
+ grid-auto-rows: var(--hc-mini-dial-cell, 7px);
1456
+ gap: 1px;
1457
+ width: fit-content;
1458
+ max-width: 100%;
1459
+ padding: 2px;
1460
+ overflow: hidden;
1461
+ border-radius: 3px;
1462
+ background-color: var(--hc-color-bg-muted);
1463
+ }
1464
+ [data-hc-ds] .hc-ui-mini-dial__cell { display: block; border-radius: 1.5px; }
1465
+ /* In play: past clicks fade and the current one is outlined. */
1466
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-past] { opacity: .22; }
1467
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-round] { border-radius: 50%; }
1468
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-now] { outline: 1.5px solid var(--hc-color-danger); }
1469
+ /* No power: the paper. Special power: the paper with a dark 1px ring (thicker
1470
+ rings swallow the paper in 5–7px cells). Both themes. */
1471
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-empty] { background-color: var(--hc-color-dial-paper); }
1472
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-special] {
1473
+ background-color: var(--hc-color-dial-paper);
1474
+ box-shadow: inset 0 0 0 1px var(--hc-color-dial-outline);
1475
+ }
1476
+
1477
+ /* PowerIconView and StatGlyphView — HCUI `.power-icon` and `.stat-glyph`. */
1478
+ [data-hc-ds] .hc-ui-power-icon {
1479
+ display: inline-flex;
1480
+ align-items: center;
1481
+ justify-content: center;
1482
+ flex-shrink: 0;
1483
+ border-radius: var(--hc-radius-full);
1484
+ box-shadow: inset 0 0 0 1px var(--hc-color-symbol-outline);
1485
+ }
1486
+ [data-hc-ds] .hc-ui-power-icon__glyph {
1487
+ display: block;
1488
+ width: 60%;
1489
+ height: 60%;
1490
+ object-fit: contain;
1491
+ }
1492
+ /* The symbol is black; inverted it turns white, for contrast on dark colors. */
1493
+ [data-hc-ds] .hc-ui-power-icon__glyph[data-invert] { filter: var(--hc-filter-symbol-light); }
1494
+ /* The black symbol turns neutral gray (dial legend). */
1495
+ [data-hc-ds] .hc-ui-stat-glyph {
1496
+ display: inline-block;
1497
+ flex-shrink: 0;
1498
+ object-fit: contain;
1499
+ filter: var(--hc-filter-symbol-muted);
1500
+ }
1501
+
1502
+ /* SpecialIconView — HCUI `.sp-icon`. */
1503
+ [data-hc-ds] .hc-ui-special-icon {
1504
+ position: relative;
1505
+ display: inline-flex;
1506
+ flex-shrink: 0;
1507
+ box-sizing: border-box;
1508
+ border: 1px solid var(--hc-color-symbol-outline-strong);
1509
+ }
1510
+ [data-hc-ds] :is(.hc-ui-special-icon__bg, .hc-ui-special-icon__glyph) {
1511
+ position: absolute;
1512
+ inset: 0;
1513
+ box-sizing: border-box;
1514
+ width: 100%;
1515
+ height: 100%;
1516
+ object-fit: contain;
1517
+ }
1518
+ /* Keeps the circle's edge visible even on white. */
1519
+ [data-hc-ds] .hc-ui-special-icon__bg {
1520
+ border-radius: var(--hc-radius-full);
1521
+ box-shadow: inset 0 0 0 1.5px var(--hc-color-symbol-outline-soft);
1522
+ }
1523
+ [data-hc-ds] .hc-ui-special-icon__glyph { padding: 22%; }
1524
+
1525
+ /* EquipmentIcon — HCUI `.equip-icon`: a white diamond on the purple power. */
1526
+ [data-hc-ds] .hc-ui-equipment-icon {
1527
+ display: inline-flex;
1528
+ align-items: center;
1529
+ justify-content: center;
1530
+ flex-shrink: 0;
1531
+ border-radius: var(--hc-radius-full);
1532
+ background-color: var(--hc-power-purple);
1533
+ box-shadow: inset 0 0 0 1px var(--hc-color-symbol-outline);
1534
+ }
1535
+ [data-hc-ds] .hc-ui-equipment-icon path { fill: var(--hc-color-symbol-light); }
1536
+
1537
+ /* AvatarView — HCUI `img.avatar-os`, `img.avatar-sq`, `img.avatar-sq--fit` and
1538
+ `img.default-avatar--fallback`. Without `size` the caller's class sizes and crops
1539
+ it (the defaults below have zero specificity); the shapes win over that class. */
1540
+ :where([data-hc-ds] .hc-ui-avatar) { display: block; box-sizing: border-box; max-width: 100%; }
1541
+ [data-hc-ds] .hc-ui-avatar[data-sized] {
1542
+ width: var(--hc-avatar-size);
1543
+ height: var(--hc-avatar-size);
1544
+ object-fit: cover;
1545
+ }
1546
+ [data-hc-ds] .hc-ui-avatar[data-sized][data-shape='round'] { border-radius: 50%; }
1547
+ /* One-shot: the landscape proportion of the search (avatar width, height ÷ 1.42, proportional corners). */
1548
+ [data-hc-ds] .hc-ui-avatar[data-shape='card'] {
1549
+ height: auto;
1550
+ aspect-ratio: 1.42 / 1;
1551
+ border-radius: 13.6% / 19.4%;
1552
+ object-fit: cover;
1553
+ }
1554
+ /* Maps fill the square; terrain markers show whole, fitted by width or height. */
1555
+ [data-hc-ds] .hc-ui-avatar:is([data-shape='square'], [data-shape='square-fit']) {
1556
+ aspect-ratio: 1 / 1;
1557
+ border-radius: 21%;
1558
+ object-fit: cover;
1559
+ }
1560
+ [data-hc-ds] .hc-ui-avatar[data-shape='square-fit'] { object-fit: contain; background-color: var(--hc-color-bg-muted); }
1561
+ [data-hc-ds] .hc-ui-avatar[data-fallback] { background-color: var(--hc-color-bg-muted); }
1562
+
1563
+ /* CombatDialView — HCUI `.combat-dial`. `--hc-dial-bleed` (and `--hc-dial-bleed-end`)
1564
+ is the container's padding, so the tracks run to the panel's edge;
1565
+ `--hc-dial-surface` is the fill behind the sticky legend. */
1566
+ [data-hc-ds] .hc-ui-combat-dial,
1567
+ [data-hc-ds] .hc-ui-combat-dial * { font-variation-settings: 'ROND' var(--hc-rond); }
1568
+ [data-hc-ds] .hc-ui-combat-dial__header {
1569
+ display: flex;
1570
+ flex-direction: column;
1571
+ gap: var(--hc-space-3);
1572
+ }
1573
+ [data-hc-ds] .hc-ui-combat-dial__header-top {
1574
+ display: flex;
1575
+ align-items: center;
1576
+ justify-content: space-between;
1577
+ flex-wrap: wrap;
1578
+ gap: var(--hc-space-3);
1579
+ }
1580
+ /* HCUI's `eyebrow`. */
1581
+ [data-hc-ds] :is(.hc-ui-combat-dial__label, .hc-ui-combat-dial__status) {
1582
+ font-family: var(--hc-font-display);
1583
+ font-weight: 620;
1584
+ font-stretch: 125%;
1585
+ font-size: var(--hc-font-size-2xs);
1586
+ line-height: var(--hc-line-height-xs);
1587
+ letter-spacing: 0.07em;
1588
+ text-transform: uppercase;
1589
+ }
1590
+ [data-hc-ds] .hc-ui-combat-dial__label { color: var(--hc-color-text-muted); letter-spacing: var(--hc-letter-spacing-wide); }
1591
+ [data-hc-ds] .hc-ui-combat-dial__status {
1592
+ display: inline-flex;
1593
+ align-items: center;
1594
+ gap: var(--hc-space-2);
1595
+ font-weight: var(--hc-font-weight-semibold);
1596
+ color: var(--hc-color-text-secondary);
1597
+ }
1598
+ [data-hc-ds] .hc-ui-combat-dial__status-ko { color: var(--hc-color-danger); }
1599
+
1600
+ /* Point value chips, on one line that scrolls sideways. */
1601
+ [data-hc-ds] .hc-ui-combat-dial__points {
1602
+ display: flex;
1603
+ align-items: center;
1604
+ flex-wrap: nowrap;
1605
+ gap: var(--hc-space-2);
1606
+ margin-inline: calc(var(--hc-dial-bleed, 0px) * -1) calc(var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px)) * -1);
1607
+ padding: var(--hc-space-2) 0;
1608
+ /* Condensed as HCUI's numbers (its `__points` rule); the chips inherit it. */
1609
+ font-stretch: 86%;
1610
+ -webkit-overflow-scrolling: touch;
1611
+ }
1612
+ [data-hc-ds] .hc-ui-combat-dial__points > .hc-ui-combat-dial__chip:first-child { margin-left: var(--hc-dial-bleed, 0px); }
1613
+ [data-hc-ds] .hc-ui-combat-dial__points > .hc-ui-combat-dial__chip:last-child { margin-right: var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px)); }
1614
+ [data-hc-ds] .hc-ui-combat-dial__chip {
1615
+ appearance: none;
1616
+ position: relative;
1617
+ display: inline-flex;
1618
+ align-items: center;
1619
+ gap: var(--hc-space-2);
1620
+ min-height: var(--hc-control-height-chip);
1621
+ margin: 0;
1622
+ padding: 0 14px;
1623
+ border: none;
1624
+ border-radius: var(--hc-radius-full);
1625
+ background-color: var(--hc-color-bg-surface);
1626
+ color: var(--hc-color-text-primary);
1627
+ font: inherit;
1628
+ font-family: var(--hc-font-body);
1629
+ font-weight: var(--hc-font-weight-semibold);
1630
+ font-size: var(--hc-font-size-sm);
1631
+ font-variation-settings: 'ROND' var(--hc-rond);
1632
+ white-space: nowrap;
1633
+ box-shadow: inset 0 0 0 1px var(--hc-color-border-strong);
1634
+ cursor: pointer;
1635
+ -webkit-tap-highlight-color: transparent;
1636
+ touch-action: manipulation;
1637
+ transition-property: transform, background-color, box-shadow, color, opacity;
1638
+ transition-duration: var(--hc-dur-short);
1639
+ transition-timing-function: var(--hc-ease-standard);
1640
+ }
1641
+ /* HCUI's state layer: a veil of the text color on hover (with a mouse) and press. */
1642
+ [data-hc-ds] .hc-ui-combat-dial__chip::after {
1643
+ content: '';
1644
+ position: absolute;
1645
+ inset: 0;
1646
+ border-radius: inherit;
1647
+ background-color: currentColor;
1648
+ opacity: 0;
1649
+ pointer-events: none;
1650
+ transition: opacity var(--hc-dur-short) var(--hc-ease-standard);
1651
+ }
1652
+ @media (hover: hover) {
1653
+ [data-hc-ds] .hc-ui-combat-dial__chip:hover:not(:disabled)::after { opacity: 0.05; }
1654
+ }
1655
+ [data-hc-ds] .hc-ui-combat-dial__chip:active:not(:disabled)::after { opacity: 0.09; }
1656
+ [data-hc-ds] .hc-ui-combat-dial__chip:hover:not(:disabled) { background-color: var(--hc-color-bg-muted); }
1657
+ [data-hc-ds] .hc-ui-combat-dial__chip:active:not(:disabled) { transform: scale(0.97); }
1658
+ [data-hc-ds] .hc-ui-combat-dial__chip:disabled { cursor: default; opacity: 0.75; }
1659
+ [data-hc-ds] .hc-ui-combat-dial__chip[aria-pressed='true'] {
1660
+ background-color: var(--hc-color-bg-muted);
1661
+ box-shadow: inset 0 0 0 1.5px var(--hc-dial-chip-color, var(--hc-color-success));
1662
+ }
1663
+ [data-hc-ds] .hc-ui-combat-dial__chip-bar {
1664
+ display: inline-block;
1665
+ flex-shrink: 0;
1666
+ width: 2px;
1667
+ height: 16px;
1668
+ border-radius: var(--hc-radius-full);
1669
+ background-color: var(--hc-dial-chip-color, var(--hc-color-success));
1670
+ }
1671
+ [data-hc-ds] :is(.hc-ui-combat-dial__chip-value, .hc-ui-combat-dial__chip-clicks) { color: inherit; font-size: var(--hc-font-size-sm); }
1672
+ [data-hc-ds] .hc-ui-combat-dial__chip-clicks { opacity: 0.8; }
1673
+ [data-hc-ds] .hc-ui-combat-dial__chip[aria-pressed='true'] .hc-ui-combat-dial__chip-clicks { opacity: 0.92; }
1674
+ [data-hc-ds] .hc-ui-combat-dial__chip[aria-pressed='true'] .hc-ui-combat-dial__chip-value { color: var(--hc-color-text-primary); }
1675
+
1676
+ /* The dial track: one row that scrolls sideways (hidden scrollbar). */
1677
+ [data-hc-ds] .hc-ui-combat-dial__grid-wrap {
1678
+ position: relative;
1679
+ margin-inline: calc(var(--hc-dial-bleed, 0px) * -1) calc(var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px)) * -1);
1680
+ padding: var(--hc-space-4) 0;
1681
+ }
1682
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap) { overflow-x: auto; scrollbar-width: none; }
1683
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar { display: none; }
1684
+ /* With a mouse on HCUI's desktop (960px and up) the tracks show a thin 8px bar,
1685
+ whose thumb appears while the pointer is over the track or focus is inside it;
1686
+ the negative margin gives the bar's height back to the layout. */
1687
+ @media (min-width: 960px) and (hover: hover) and (forced-colors: none) {
1688
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap) {
1689
+ overflow: scroll hidden;
1690
+ margin-block-end: -8px;
1691
+ scrollbar-width: auto;
1692
+ }
1693
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar { display: block; width: 8px; height: 8px; }
1694
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar-track { margin: var(--hc-space-3); background: transparent; }
1695
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar-thumb {
1696
+ min-width: var(--hc-space-8);
1697
+ border: 2px solid transparent;
1698
+ border-radius: var(--hc-radius-full);
1699
+ background: transparent padding-box;
1700
+ }
1701
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap):is(:hover, :has(:focus-visible))::-webkit-scrollbar-thumb {
1702
+ background-color: color-mix(in srgb, var(--hc-color-text-primary) 26%, transparent);
1703
+ }
1704
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar-thumb:is(:hover, :active) {
1705
+ border-width: 1px;
1706
+ background-color: color-mix(in srgb, var(--hc-color-text-primary) 46%, transparent);
1707
+ }
1708
+ /* Without ::-webkit-scrollbar (Firefox) the system's thin bar takes no room to give back. */
1709
+ @supports not selector(::-webkit-scrollbar) {
1710
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap) {
1711
+ margin-block-end: 0;
1712
+ scrollbar-width: thin;
1713
+ scrollbar-color: transparent transparent;
1714
+ }
1715
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap):is(:hover, :has(:focus-visible)) {
1716
+ scrollbar-color: color-mix(in srgb, var(--hc-color-text-primary) 26%, transparent) transparent;
1717
+ }
1718
+ }
1719
+ }
1720
+ [data-hc-ds] .hc-ui-combat-dial__grid {
1721
+ display: flex;
1722
+ align-items: stretch;
1723
+ gap: 8px;
1724
+ min-width: max-content;
1725
+ padding-right: var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px));
1726
+ }
1727
+ [data-hc-ds] .hc-ui-combat-dial__col {
1728
+ position: relative;
1729
+ display: grid;
1730
+ grid-template-rows: repeat(5, 40px);
1731
+ gap: 8px;
1732
+ margin: 0;
1733
+ padding: 0;
1734
+ border: none;
1735
+ border-radius: 0;
1736
+ background: transparent;
1737
+ color: inherit;
1738
+ font: inherit;
1739
+ font-variation-settings: 'ROND' var(--hc-rond);
1740
+ cursor: pointer;
1741
+ -webkit-tap-highlight-color: transparent;
1742
+ touch-action: manipulation;
1743
+ transition: transform var(--hc-transition-fast), box-shadow var(--hc-transition-fast);
1744
+ }
1745
+ /* The legend stays put and covers the bleed: nothing shows to its left. */
1746
+ [data-hc-ds] .hc-ui-combat-dial__col[data-kind='legend'] {
1747
+ position: sticky;
1748
+ left: 0;
1749
+ z-index: 4;
1750
+ padding-left: var(--hc-dial-bleed, 0px);
1751
+ padding-right: var(--hc-space-2);
1752
+ color: var(--hc-color-text-secondary);
1753
+ background: var(--hc-dial-surface, var(--hc-color-bg-surface));
1754
+ }
1755
+ [data-hc-ds] .hc-ui-combat-dial__col[data-kind='click']:hover { background-color: var(--hc-color-bg-muted-2); }
1756
+ /* Clicks outside the selected point value fade. */
1757
+ [data-hc-ds] .hc-ui-combat-dial__col[data-dimmed] { opacity: 0.32; filter: saturate(0.7); }
1758
+ /* Starting line: a colored bar at the left edge of the point value's first click. */
1759
+ [data-hc-ds] .hc-ui-combat-dial__col[data-start]::before {
1760
+ content: '';
1761
+ position: absolute;
1762
+ top: 48px;
1763
+ bottom: 0;
1764
+ left: -5px;
1765
+ width: 2px;
1766
+ border-radius: 2px;
1767
+ background-color: var(--hc-dial-start-color, var(--hc-color-success));
1768
+ }
1769
+ [data-hc-ds] .hc-ui-combat-dial__col[data-current] {
1770
+ background-color: var(--hc-color-bg-muted-2);
1771
+ box-shadow: inset 0 3px 0 0 var(--hc-color-accent);
1772
+ }
1773
+ [data-hc-ds] .hc-ui-combat-dial__col[data-kind='ko'] { color: var(--hc-color-danger); }
1774
+ [data-hc-ds] .hc-ui-combat-dial[data-static] .hc-ui-combat-dial__col[data-kind='click'] { cursor: default; }
1775
+ [data-hc-ds] .hc-ui-combat-dial__cell {
1776
+ appearance: none;
1777
+ display: flex;
1778
+ align-items: center;
1779
+ justify-content: center;
1780
+ width: 40px;
1781
+ height: 40px;
1782
+ margin: 0;
1783
+ padding: 0;
1784
+ border: none;
1785
+ border-radius: 2px;
1786
+ background: transparent;
1787
+ color: inherit;
1788
+ font: inherit;
1789
+ font-variation-settings: 'ROND' var(--hc-rond);
1790
+ cursor: pointer;
1791
+ -webkit-tap-highlight-color: transparent;
1792
+ touch-action: manipulation;
1793
+ }
1794
+ [data-hc-ds] .hc-ui-combat-dial__cell:focus-visible {
1795
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
1796
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
1797
+ }
1798
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-round] { border-radius: 50%; }
1799
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='legend'] { color: var(--hc-color-text-secondary); }
1800
+ /* HCUI's `mono-value`. */
1801
+ [data-hc-ds] :is(.hc-ui-combat-dial__cell:is([data-kind='number'], [data-kind='value']), .hc-ui-combat-dial__range) {
1802
+ font-family: var(--hc-font-display);
1803
+ font-weight: 640;
1804
+ font-stretch: 86%;
1805
+ font-variant-numeric: tabular-nums;
1806
+ }
1807
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='number'] { font-size: var(--hc-font-size-sm); color: var(--hc-color-text-muted); }
1808
+ [data-hc-ds] .hc-ui-combat-dial__col[data-current] .hc-ui-combat-dial__cell[data-kind='number'] { color: var(--hc-color-text-primary); font-weight: var(--hc-font-weight-bold); }
1809
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='value'] {
1810
+ font-size: var(--hc-font-size-md);
1811
+ font-weight: var(--hc-font-weight-bold);
1812
+ color: var(--hc-color-text-primary);
1813
+ background-color: transparent;
1814
+ }
1815
+ /* Special powers: a dark outline, as on the printed card. The cell is the paper in
1816
+ both themes, so the fixed outline shows in light and dark. */
1817
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-outlined] { box-shadow: inset 0 0 0 2px var(--hc-color-dial-outline); }
1818
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='ko'] {
1819
+ font-family: var(--hc-font-display);
1820
+ font-weight: 620;
1821
+ font-stretch: 125%;
1822
+ font-size: var(--hc-font-size-sm);
1823
+ line-height: var(--hc-line-height-xs);
1824
+ letter-spacing: 0.07em;
1825
+ text-transform: uppercase;
1826
+ color: var(--hc-color-danger);
1827
+ }
1828
+ /* Cells with a tip grow their hit area by half the gap on each side (about 48px),
1829
+ without changing their 40px look; neighbors split the gap. */
1830
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-tip] { position: relative; cursor: pointer; }
1831
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-tip]::after { content: ''; position: absolute; inset: -4px; }
1832
+ [data-hc-ds] .hc-ui-combat-dial__special-icon { width: 20px; height: 20px; object-fit: contain; }
1833
+ /* Range (number) and targets (bolts) in the top legend cell. */
1834
+ [data-hc-ds] .hc-ui-combat-dial__rangebox { flex-direction: column; gap: 1px; }
1835
+ [data-hc-ds] .hc-ui-combat-dial__range { font-size: var(--hc-font-size-md); line-height: 1; color: var(--hc-color-text-primary); }
1836
+ [data-hc-ds] .hc-ui-combat-dial__bolts { display: inline-flex; align-items: center; gap: 2px; }
1837
+ /* `max-width` lets the bolts squeeze into the printed card's 28px legend, as in HCUI. */
1838
+ [data-hc-ds] .hc-ui-combat-dial__bolt { width: auto; max-width: 100%; height: 16px; object-fit: contain; filter: var(--hc-filter-symbol-muted); }
1839
+
1840
+ /* `density="compact"`: HCUI's compact dial of the unit view on phones, for dense lists:
1841
+ 34px cells and rows, 6px gaps, 13px numbers, 18px special icons and tighter point chips.
1842
+ The printed presentation keeps its own measures. */
1843
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__header { gap: var(--hc-space-1); }
1844
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__points { gap: var(--hc-space-1); padding: var(--hc-space-1) 0; }
1845
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__chip { gap: var(--hc-space-2); padding: var(--hc-space-2); border-radius: var(--hc-radius-lg); }
1846
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__grid-wrap { padding: var(--hc-space-2) 0 var(--hc-space-1); }
1847
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__grid { gap: 6px; }
1848
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__col { grid-template-rows: repeat(5, 34px); gap: 6px; }
1849
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__col[data-start]::before { top: 40px; }
1850
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__cell { width: 34px; height: 34px; }
1851
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__cell[data-tip]::after { inset: -3px; }
1852
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) :is(.hc-ui-combat-dial__cell[data-kind='value'], .hc-ui-combat-dial__range) { font-size: var(--hc-font-size-sm); }
1853
+ [data-hc-ds] .hc-ui-combat-dial[data-density='compact']:not([data-presentation='printed']) .hc-ui-combat-dial__special-icon { width: 18px; height: 18px; }
1854
+
1855
+ /* `presentation="printed"`: the physical card's dial, at HCUnits' measures (20px
1856
+ cells, 23px between clicks, 24px between rows); the white legend sits on the
1857
+ card's dark window. Its numbers use the `font` shorthand, with ROND right after it
1858
+ (`--hc-rond`, which the card sets to 0). */
1859
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__grid-wrap {
1860
+ display: flex;
1861
+ flex-direction: column;
1862
+ gap: 4px;
1863
+ margin-block-end: 0;
1864
+ padding: 0;
1865
+ overflow: visible;
1866
+ }
1867
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__grid { gap: 3px; min-width: 0; }
1868
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col { grid-template-rows: repeat(5, 20px); gap: 4px; }
1869
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='click']:hover { background: none; }
1870
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='legend'] {
1871
+ position: static;
1872
+ width: 28px;
1873
+ padding: 0;
1874
+ background: none;
1875
+ color: var(--hc-color-dial-legend-printed);
1876
+ }
1877
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-start]::before { top: 22px; bottom: -2px; left: -2px; width: 2px; border-radius: 0; }
1878
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-current] { background: none; box-shadow: none; }
1879
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-dimmed] { opacity: .45; filter: none; }
1880
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell { width: 20px; height: 20px; border-radius: 0; }
1881
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-round] { border-radius: 50%; }
1882
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='legend'] .hc-ui-combat-dial__cell { width: 28px; color: var(--hc-color-dial-legend-printed); }
1883
+ /* Condensed, so two digits fit the 20px cell; no tracking, so they stay centered. */
1884
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-kind='value'] {
1885
+ font: 600 17px/1 var(--hc-font-body);
1886
+ font-variation-settings: 'ROND' var(--hc-rond);
1887
+ font-stretch: 50%;
1888
+ letter-spacing: 0;
1889
+ font-variant-numeric: tabular-nums;
1890
+ }
1891
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-outlined] { box-shadow: inset 0 0 0 2px var(--hc-color-dial-outline-printed); }
1892
+ /* Top numbers and KO in red with a paper outline, as on the card. */
1893
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell:is([data-kind='number'], [data-kind='ko']) {
1894
+ color: var(--hc-color-dial-number-printed);
1895
+ background: none;
1896
+ -webkit-text-stroke: 3px var(--hc-color-dial-paper);
1897
+ paint-order: stroke fill;
1898
+ font-family: var(--hc-font-body);
1899
+ font-stretch: 75%;
1900
+ }
1901
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-kind='number'] { font-size: 16px; font-weight: 800; font-stretch: 62%; letter-spacing: 0; }
1902
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-kind='ko'] { font-size: 15px; font-weight: 800; letter-spacing: -1px; text-transform: uppercase; }
1903
+ /* Only play marks the click: a red circle over the number, like a pen on the card. */
1904
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-current] .hc-ui-combat-dial__cell[data-kind='number'] {
1905
+ color: var(--hc-color-dial-number-printed);
1906
+ background: var(--hc-color-dial-paper);
1907
+ -webkit-text-stroke: 0;
1908
+ border-radius: 50%;
1909
+ box-shadow: 0 0 0 2px var(--hc-color-dial-number-printed);
1910
+ }
1911
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-tip]::after { inset: -2px -1.5px; }
1912
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__rangebox { flex-direction: row; gap: 0; align-items: center; }
1913
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__range { margin-right: 2px; color: var(--hc-color-dial-legend-printed); font: 300 14px/1 var(--hc-font-body); font-variation-settings: 'ROND' var(--hc-rond); }
1914
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__bolt { height: 14px; margin-right: -1px; filter: var(--hc-filter-symbol-light); }
1915
+ /* The legend symbols are 18px tall at their own width, at most 26px, and white. */
1916
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='legend'] .hc-ui-stat-glyph {
1917
+ width: auto;
1918
+ max-width: 26px;
1919
+ height: 18px;
1920
+ filter: var(--hc-filter-symbol-light);
1921
+ }
1922
+
1923
+ @media (prefers-reduced-motion: reduce) {
1924
+ [data-hc-ds] :is(.hc-ui-combat-dial__chip, .hc-ui-combat-dial__chip::after, .hc-ui-combat-dial__col) { transition: none; }
1925
+ [data-hc-ds] .hc-ui-combat-dial__chip:active:not(:disabled) { transform: none; }
1926
+ }
1927
+
1928
+ /* PhysicalCardView — HCUI `.physical-cards`: the printed card in HCUnits' format,
1929
+ 375×525 px with absolute positions, scaled to the panel's width. HCUI's fonts
1930
+ (Google Sans Flex, condensed in the titles) with the original card's sizes and
1931
+ positions. The paper and ink follow the theme (`color-card-*`, `filter-card-*`,
1932
+ `blend-card-*`, `opacity-card-*`); seals, dial cells and symbols keep their
1933
+ official colors; the black and white printed parts are the same in both themes. */
1934
+ [data-hc-ds] .hc-ui-physical-cards {
1935
+ display: flex;
1936
+ flex-wrap: wrap;
1937
+ justify-content: center;
1938
+ gap: 16px;
1939
+ width: 100%;
1940
+ min-width: 0;
1941
+ grid-column: 1 / -1;
1942
+ }
1943
+ /* HCUI's global rules the card counts on, inside the card only and at zero
1944
+ specificity: border-box, block images and SVGs that never pass their box, no
1945
+ heading or paragraph margin, words that break only when they overflow, the
1946
+ slightly condensed titles. Upright letters, as on the printed card: the card
1947
+ sets `--hc-rond` to 0, so the printed dial inside reads it too. */
1948
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus),
1949
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus) *,
1950
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus) *::before,
1951
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus) *::after { box-sizing: border-box; }
1952
+ :where([data-hc-ds] .hc-ui-physical-card) :is(img, svg) { display: block; max-width: 100%; }
1953
+ :where([data-hc-ds] .hc-ui-physical-card) :is(h2, h3, p) { margin: 0; }
1954
+ :where([data-hc-ds] .hc-ui-physical-card) :is(p, span, h2, h3) { overflow-wrap: break-word; }
1955
+ :where([data-hc-ds] .hc-ui-physical-card) :is(h2, h3, .hc-ui-physical-card__title, .hc-ui-physical-card__bystander-name) { font-stretch: 92%; }
1956
+ [data-hc-ds] .hc-ui-physical-card { --hc-rond: 0; }
1957
+ [data-hc-ds] .hc-ui-physical-card,
1958
+ [data-hc-ds] .hc-ui-physical-card * { font-variation-settings: 'ROND' var(--hc-rond); }
1959
+
1960
+ [data-hc-ds] .hc-ui-physical-card-slot {
1961
+ flex: none;
1962
+ width: calc(var(--hc-card-width) * var(--hc-card-scale));
1963
+ height: calc(var(--hc-card-height) * var(--hc-card-scale));
1964
+ }
1965
+ [data-hc-ds] .hc-ui-physical-card-tilt { width: 100%; height: 100%; }
1966
+ [data-hc-ds] .hc-ui-physical-card {
1967
+ position: relative;
1968
+ width: var(--hc-card-width);
1969
+ height: var(--hc-card-height);
1970
+ overflow: hidden;
1971
+ transform: scale(var(--hc-card-scale));
1972
+ transform-origin: top left;
1973
+ border-radius: 15px;
1974
+ background: var(--hc-color-card-paper);
1975
+ box-shadow: var(--hc-color-card-edge) 0 0 2px;
1976
+ color: var(--hc-color-card-ink);
1977
+ font-family: var(--hc-font-body);
1978
+ text-align: left;
1979
+ user-select: text;
1980
+ }
1981
+ [data-hc-ds] .hc-ui-physical-card img { user-select: none; }
1982
+ /* Paper grain: gray noise in tiles, static, no blur. Under the dial (z-index 2),
1983
+ so the official cell colors do not change. The SVG namespace is percent-encoded:
1984
+ the package source carries no web address. */
1985
+ [data-hc-ds] .hc-ui-physical-card::after {
1986
+ content: '';
1987
+ position: absolute;
1988
+ inset: 0;
1989
+ z-index: 1;
1990
+ pointer-events: none;
1991
+ background: url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E") 0 0 / 200px 200px;
1992
+ opacity: var(--hc-opacity-card-grain);
1993
+ mix-blend-mode: var(--hc-blend-card-grain);
1994
+ }
1995
+ /* The backgrounds come from the app, as gray images: the filter takes them to the
1996
+ paper's tone in each theme, with no seam where the image ends. */
1997
+ [data-hc-ds] :is(.hc-ui-physical-card__bg, .hc-ui-physical-card__legacy, .hc-ui-physical-card__rarity, .hc-ui-physical-card__dial-bg) { position: absolute; left: 0; pointer-events: none; }
1998
+ [data-hc-ds] .hc-ui-physical-card__bg[data-side='front'] { top: 0; width: 375px; filter: var(--hc-filter-card-background); }
1999
+ [data-hc-ds] .hc-ui-physical-card__bg[data-side='back'] { bottom: 75px; width: 375px; filter: var(--hc-filter-card-background); }
2000
+ [data-hc-ds] .hc-ui-physical-card__legacy { top: 0; width: 375px; opacity: 0.2; filter: saturate(0.6); }
2001
+ [data-hc-ds] .hc-ui-physical-card__rarity { left: auto; right: 0; top: 0; width: 80px; }
2002
+ [data-hc-ds] .hc-ui-physical-card__dial-bg { bottom: 0; width: 100%; filter: var(--hc-filter-card-background); }
2003
+ [data-hc-ds] .hc-ui-physical-card__team-up { position: absolute; inset: 0 0 auto; height: 70px; background: var(--hc-color-card-team-up); }
2004
+
2005
+ /* Header: name and team abilities, with the keywords or the object's type below. */
2006
+ [data-hc-ds] .hc-ui-physical-card__header { position: absolute; left: 10px; top: 2px; width: 305px; }
2007
+ [data-hc-ds] .hc-ui-physical-card__header[data-team-up] { --hc-color-card-ink: var(--hc-color-card-print-white); }
2008
+ [data-hc-ds] .hc-ui-physical-card__title { display: flex; align-items: center; height: 30px; overflow: hidden; white-space: nowrap; color: var(--hc-color-card-ink); }
2009
+ [data-hc-ds] .hc-ui-physical-card h2 {
2010
+ margin: 0 5px 0 0;
2011
+ font-family: var(--hc-font-display);
2012
+ font-weight: 900;
2013
+ font-stretch: 40%;
2014
+ font-size: 24px;
2015
+ line-height: 1;
2016
+ letter-spacing: 0.2px;
2017
+ color: inherit;
2018
+ white-space: nowrap;
2019
+ }
2020
+ [data-hc-ds] .hc-ui-physical-card__ability {
2021
+ appearance: none;
2022
+ position: relative;
2023
+ display: grid;
2024
+ place-items: center;
2025
+ flex: none;
2026
+ width: 20px;
2027
+ height: 20px;
2028
+ margin: 0 0 0 1px;
2029
+ padding: 0;
2030
+ border: none;
2031
+ border-radius: 50%;
2032
+ background: var(--hc-color-card-print-black);
2033
+ color: var(--hc-color-card-print-white);
2034
+ font: inherit;
2035
+ font-variation-settings: 'ROND' var(--hc-rond);
2036
+ cursor: pointer;
2037
+ -webkit-tap-highlight-color: transparent;
2038
+ touch-action: manipulation;
2039
+ }
2040
+ /* A hit area larger than the 20px symbol. */
2041
+ [data-hc-ds] .hc-ui-physical-card__ability::after { content: ''; position: absolute; inset: -6px -1px; }
2042
+ [data-hc-ds] .hc-ui-physical-card__ability img { position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; }
2043
+ [data-hc-ds] .hc-ui-physical-card__gear { width: 20px; height: 20px; margin-left: 1px; }
2044
+ [data-hc-ds] .hc-ui-physical-card__header-line {
2045
+ position: absolute;
2046
+ top: 26px;
2047
+ left: 0;
2048
+ display: flex;
2049
+ align-items: center;
2050
+ width: 305px;
2051
+ height: 32px;
2052
+ margin: 0;
2053
+ color: var(--hc-color-card-ink);
2054
+ line-height: 1;
2055
+ /* Slanted by the font's axis: less than the italic the browser would fake. */
2056
+ font-variation-settings: 'ROND' var(--hc-rond), 'slnt' -7;
2057
+ font-weight: 600;
2058
+ }
2059
+ [data-hc-ds] .hc-ui-physical-card__header-line[data-kind='keywords'] { font-size: 12px; font-weight: 500; font-stretch: 80%; }
2060
+ [data-hc-ds] .hc-ui-physical-card__header-line[data-kind='type'] { font-size: 16px; font-stretch: 70%; }
2061
+
2062
+ /* Collection number and set symbol over the rarity seal. */
2063
+ [data-hc-ds] .hc-ui-physical-card__collection {
2064
+ position: absolute;
2065
+ top: 15px;
2066
+ right: 3px;
2067
+ width: 65px;
2068
+ display: flex;
2069
+ flex-direction: column;
2070
+ align-items: center;
2071
+ }
2072
+ [data-hc-ds] .hc-ui-physical-card__collection strong {
2073
+ font: 800 20px/1 var(--hc-font-display);
2074
+ font-variation-settings: 'ROND' var(--hc-rond);
2075
+ font-stretch: 62%;
2076
+ min-height: 19px;
2077
+ color: var(--hc-color-card-print-white);
2078
+ -webkit-text-stroke: 3px var(--hc-color-card-print-black);
2079
+ paint-order: stroke fill;
2080
+ }
2081
+ [data-hc-ds] .hc-ui-physical-card__set { width: 34px; height: 34px; object-fit: contain; }
2082
+ [data-hc-ds] .hc-ui-physical-card__dimensions {
2083
+ position: absolute;
2084
+ top: 85px;
2085
+ right: 5px;
2086
+ display: grid;
2087
+ place-items: center;
2088
+ width: 20px;
2089
+ height: 20px;
2090
+ border-radius: 10px;
2091
+ background: var(--hc-color-card-print-black);
2092
+ color: var(--hc-color-card-print-white);
2093
+ font-size: 11px;
2094
+ }
2095
+ [data-hc-ds] .hc-ui-physical-card__dimensions[data-oval] { width: 28px; height: 18px; border-radius: 9px; }
2096
+
2097
+ /* Text columns: the front (its height follows the dial) and the back's two. */
2098
+ [data-hc-ds] .hc-ui-physical-card__table {
2099
+ position: absolute;
2100
+ overflow: hidden;
2101
+ font-size: 13px;
2102
+ line-height: 1.4;
2103
+ color: var(--hc-color-card-ink-soft);
2104
+ }
2105
+ [data-hc-ds] .hc-ui-physical-card__table[data-column='front'] { left: 5px; right: 5px; top: 75px; height: var(--hc-card-front-table-height); }
2106
+ [data-hc-ds] .hc-ui-physical-card__table:is([data-column='left'], [data-column='right']) { top: 10px; width: 49%; height: var(--hc-card-back-table-height); }
2107
+ [data-hc-ds] .hc-ui-physical-card__table[data-column='left'] { left: 5px; }
2108
+ [data-hc-ds] .hc-ui-physical-card__table[data-column='right'] { right: 3px; }
2109
+
2110
+ /* The portrait (the app's image, with this class) or the object's token. */
2111
+ [data-hc-ds] .hc-ui-physical-card__token {
2112
+ float: right;
2113
+ display: block;
2114
+ width: 150px;
2115
+ height: 150px;
2116
+ margin: 10px 0 5px 5px;
2117
+ shape-outside: circle();
2118
+ border-radius: 50%;
2119
+ object-fit: cover;
2120
+ overflow: hidden;
2121
+ background: var(--hc-color-card-token-placeholder);
2122
+ }
2123
+ [data-hc-ds] .hc-ui-physical-card__table[data-small-token] .hc-ui-physical-card__token { width: 134px; height: 134px; }
2124
+ [data-hc-ds] .hc-ui-physical-card__token img { width: 100%; height: 100%; object-fit: cover; }
2125
+ /* Objects: a ring in the color of the object's size. */
2126
+ [data-hc-ds] .hc-ui-physical-card__token[data-object] img { border-radius: 50%; outline: 8px solid var(--hc-card-object-color, transparent); outline-offset: -8px; }
2127
+
2128
+ /* Bystander: a replica of the 195px physical token (HCUnits' `largeCardBystander*`
2129
+ and `smallCard*`). The token has its own colors and does not follow the theme. */
2130
+ [data-hc-ds] .hc-ui-physical-card__bystander { display: flex; justify-content: center; }
2131
+ [data-hc-ds] .hc-ui-physical-card__bystander-token { position: relative; flex: none; width: 195px; height: 195px; color: var(--hc-color-card-print-white); }
2132
+ [data-hc-ds] .hc-ui-physical-card__bystander-clip { position: relative; width: 195px; height: 195px; border-radius: 50%; overflow: hidden; }
2133
+ [data-hc-ds] .hc-ui-physical-card__bystander-art {
2134
+ position: absolute;
2135
+ inset: 0;
2136
+ border: 7px solid var(--hc-color-card-print-black);
2137
+ border-radius: 50%;
2138
+ background: var(--hc-color-card-print-black);
2139
+ overflow: hidden;
2140
+ }
2141
+ /* The art's window: a gray cut-out to the right of the dial's stripe. */
2142
+ [data-hc-ds] .hc-ui-physical-card__bystander-window {
2143
+ position: absolute;
2144
+ left: 30px;
2145
+ top: 40px;
2146
+ right: 0;
2147
+ bottom: 16px;
2148
+ background: var(--hc-color-card-token-placeholder);
2149
+ overflow: hidden;
2150
+ }
2151
+ [data-hc-ds] .hc-ui-physical-card__bystander-window img { position: absolute; left: -35px; top: -45px; width: 195px; max-width: none; height: 195px; }
2152
+ [data-hc-ds] .hc-ui-physical-card__bystander-stripe {
2153
+ position: absolute;
2154
+ left: 23px;
2155
+ top: 46px;
2156
+ width: 72px;
2157
+ height: 126px;
2158
+ border: 5px solid var(--hc-color-card-print-black);
2159
+ border-left: 0;
2160
+ border-radius: 0 15px 20px 0;
2161
+ background: var(--hc-color-card-print-white);
2162
+ transform: skew(15deg);
2163
+ }
2164
+ [data-hc-ds] .hc-ui-physical-card__bystander-symbols { position: absolute; left: 7px; top: 47px; }
2165
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab {
2166
+ position: absolute;
2167
+ top: 0;
2168
+ height: 24px;
2169
+ border-radius: 0 10px 12px 0 / 0 12px 12px 0;
2170
+ background: var(--hc-color-card-print-black);
2171
+ }
2172
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab img { position: absolute; right: 7px; top: 2px; width: 18px; height: 18px; filter: var(--hc-filter-symbol-light); }
2173
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='range'] { width: 73px; }
2174
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='speed'] { width: 35px; top: 24px; }
2175
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='attack'] { width: 43px; top: 48px; }
2176
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='defense'] { width: 51px; top: 72px; }
2177
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='damage'] { width: 59px; top: 96px; }
2178
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='range'] span { position: absolute; right: 58px; top: 4px; font: 300 11px/1.2 var(--hc-font-body); font-variation-settings: 'ROND' var(--hc-rond); }
2179
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='range'] img.hc-ui-physical-card__bystander-bolt { right: auto; top: 6px; width: 6px; height: 12px; }
2180
+ [data-hc-ds] .hc-ui-physical-card__bystander-name {
2181
+ position: absolute;
2182
+ left: 45px;
2183
+ top: 2px;
2184
+ display: flex;
2185
+ align-items: center;
2186
+ justify-content: center;
2187
+ width: 105px;
2188
+ height: 45px;
2189
+ font: 500 13px/1 var(--hc-font-body);
2190
+ font-variation-settings: 'ROND' var(--hc-rond);
2191
+ font-stretch: 80%;
2192
+ text-align: center;
2193
+ }
2194
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities {
2195
+ position: absolute;
2196
+ top: 50px;
2197
+ left: 30px;
2198
+ display: flex;
2199
+ align-items: center;
2200
+ justify-content: flex-end;
2201
+ gap: 2px;
2202
+ width: 48px;
2203
+ height: 20px;
2204
+ }
2205
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities .hc-ui-physical-card__ability { width: 14px; height: 14px; margin: 0; background: none; }
2206
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities .hc-ui-physical-card__ability img { top: 0; left: 0; width: 14px; height: 14px; }
2207
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities .hc-ui-physical-card__ability svg { display: none; }
2208
+ [data-hc-ds] .hc-ui-physical-card__bystander-trait { width: 18px; height: 18px; margin-top: -3px; filter: var(--hc-filter-symbol-light); }
2209
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra {
2210
+ position: absolute;
2211
+ left: 80px;
2212
+ bottom: 2px;
2213
+ display: flex;
2214
+ align-items: center;
2215
+ justify-content: center;
2216
+ width: 40px;
2217
+ font: 500 14px/1 var(--hc-font-body);
2218
+ font-variation-settings: 'ROND' var(--hc-rond);
2219
+ }
2220
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra img { width: 20px; height: 20px; filter: var(--hc-filter-symbol-light); }
2221
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra[data-kind='passengers'] img { width: auto; height: auto; margin-right: 5px; }
2222
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra[data-kind='construct'] img { width: 18px; height: auto; }
2223
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved { position: absolute; left: 97px; top: 97px; }
2224
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved > :is(img, button) { position: absolute; width: 18px; height: 18px; }
2225
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved-ability {
2226
+ appearance: none;
2227
+ margin: 0;
2228
+ padding: 0;
2229
+ border: none;
2230
+ border-radius: 50%;
2231
+ background: transparent;
2232
+ color: inherit;
2233
+ font: inherit;
2234
+ font-variation-settings: 'ROND' var(--hc-rond);
2235
+ cursor: pointer;
2236
+ -webkit-tap-highlight-color: transparent;
2237
+ touch-action: manipulation;
2238
+ }
2239
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved-ability img { display: block; width: 18px; height: 18px; }
2240
+ [data-hc-ds] .hc-ui-physical-card__bystander-dial { position: absolute; left: 48px; top: 72px; }
2241
+ [data-hc-ds] .hc-ui-physical-card__bystander-value {
2242
+ position: absolute;
2243
+ display: flex;
2244
+ align-items: center;
2245
+ justify-content: center;
2246
+ box-sizing: border-box;
2247
+ width: 18px;
2248
+ height: 18px;
2249
+ margin: 2px;
2250
+ padding: 0;
2251
+ /* Without a power color the cell is the white stripe itself (dark theme too). */
2252
+ background-color: var(--hc-color-dial-paper);
2253
+ color: var(--hc-color-card-print-black);
2254
+ /* The card's dial, in proportion to the 18px cell. */
2255
+ font: 600 16px/1 var(--hc-font-body);
2256
+ font-variation-settings: 'ROND' var(--hc-rond);
2257
+ font-stretch: 50%;
2258
+ letter-spacing: 0;
2259
+ font-variant-numeric: tabular-nums;
2260
+ }
2261
+ [data-hc-ds] .hc-ui-physical-card__bystander-value[data-special] { box-shadow: inset 0 0 0 2px var(--hc-color-dial-outline-printed); }
2262
+ [data-hc-ds] .hc-ui-physical-card__bystander-value[data-tip] {
2263
+ appearance: none;
2264
+ border: none;
2265
+ cursor: pointer;
2266
+ -webkit-tap-highlight-color: transparent;
2267
+ touch-action: manipulation;
2268
+ }
2269
+ /* A hit area larger than the 18px square. */
2270
+ [data-hc-ds] .hc-ui-physical-card__bystander-value[data-tip]::after { content: ''; position: absolute; inset: -3px; }
2271
+ [data-hc-ds] :is(.hc-ui-physical-card__ability, .hc-ui-physical-card__bystander-improved-ability, .hc-ui-physical-card__bystander-value[data-tip], .hc-ui-physical-card__improved, .hc-ui-physical-card__point):focus-visible {
2272
+ outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring);
2273
+ outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width));
2274
+ }
2275
+
2276
+ [data-hc-ds] .hc-ui-physical-card__terrain-art { display: block; max-width: min(360px, 100%); max-height: 335px; margin: 5px auto 0; }
2277
+
2278
+ /* Rules: tapping the paragraph copies it (`onCopy`). */
2279
+ [data-hc-ds] .hc-ui-physical-card__rule { overflow-wrap: anywhere; }
2280
+ [data-hc-ds] .hc-ui-physical-card__rule h3 {
2281
+ display: flex;
2282
+ align-items: center;
2283
+ gap: 3px;
2284
+ min-height: 22px;
2285
+ margin: 0 0 1px;
2286
+ font: 700 16px/1.1 var(--hc-font-display);
2287
+ font-variation-settings: 'ROND' var(--hc-rond);
2288
+ font-stretch: 65%;
2289
+ text-transform: uppercase;
2290
+ color: var(--hc-color-card-ink);
2291
+ }
2292
+ /* As in HCUI's detailed view: without the icon's square border; the symbol's own
2293
+ white circle is the ring, as on HCUnits. */
2294
+ [data-hc-ds] .hc-ui-physical-card__rule h3 .hc-ui-special-icon { flex: none; border: none; }
2295
+ [data-hc-ds] .hc-ui-physical-card__rule h3 .hc-ui-special-icon__bg { box-shadow: none; }
2296
+ [data-hc-ds] .hc-ui-physical-card__rule p { margin: 0 0 2px 5px; white-space: pre-line; }
2297
+ /* HCUI's `.copyable`: no selection, a quick fade while pressed. */
2298
+ [data-hc-ds] .hc-ui-physical-card__copy {
2299
+ cursor: pointer;
2300
+ -webkit-user-select: none;
2301
+ user-select: none;
2302
+ -webkit-tap-highlight-color: transparent;
2303
+ transition: opacity var(--hc-transition-fast);
2304
+ }
2305
+ [data-hc-ds] .hc-ui-physical-card__copy:active { opacity: 0.6; }
2306
+ [data-hc-ds] .hc-ui-physical-card__keyphrase { min-height: 22px; display: flex; align-items: center; font: 700 16px/1.1 var(--hc-font-display); font-variation-settings: 'ROND' var(--hc-rond); font-stretch: 75%; color: var(--hc-color-card-ink); }
2307
+ [data-hc-ds] .hc-ui-physical-card__relic { margin: 0; }
2308
+
2309
+ /* Improved abilities right above the dial's window. */
2310
+ [data-hc-ds] .hc-ui-physical-card__improved-row { position: absolute; left: 18px; display: flex; gap: 2px; }
2311
+ [data-hc-ds] .hc-ui-physical-card__improved-group { display: contents; }
2312
+ [data-hc-ds] :is(.hc-ui-physical-card__improved-kind, .hc-ui-physical-card__improved) {
2313
+ width: 30px;
2314
+ height: 30px;
2315
+ border-radius: 50%;
2316
+ box-shadow: 0 0 6px 2px var(--hc-color-card-print-white);
2317
+ margin-right: 2px;
2318
+ }
2319
+ [data-hc-ds] .hc-ui-physical-card__improved {
2320
+ appearance: none;
2321
+ margin: 0;
2322
+ padding: 0;
2323
+ border: none;
2324
+ background: transparent;
2325
+ color: inherit;
2326
+ font: inherit;
2327
+ font-variation-settings: 'ROND' var(--hc-rond);
2328
+ cursor: pointer;
2329
+ -webkit-tap-highlight-color: transparent;
2330
+ touch-action: manipulation;
2331
+ }
2332
+ [data-hc-ds] .hc-ui-physical-card__improved img { display: block; width: 30px; height: 30px; }
2333
+
2334
+ /* Above the shine: the cell colors do not change on hover. */
2335
+ [data-hc-ds] .hc-ui-physical-card__dial { position: absolute; left: 10px; bottom: 10px; z-index: 2; }
2336
+ [data-hc-ds] .hc-ui-physical-card__shine { display: none; }
2337
+
2338
+ /* Points on the black bar right of the dial; pressing one changes the point value. */
2339
+ [data-hc-ds] .hc-ui-physical-card__points {
2340
+ position: absolute;
2341
+ right: 15px;
2342
+ display: flex;
2343
+ flex-direction: column;
2344
+ align-items: flex-end;
2345
+ font-stretch: 86%;
2346
+ }
2347
+ [data-hc-ds] .hc-ui-physical-card__points[data-table='normal'] { top: 386px; }
2348
+ [data-hc-ds] .hc-ui-physical-card__points[data-table='long'] { top: 266px; }
2349
+ [data-hc-ds] .hc-ui-physical-card__points[data-table='short'] { bottom: 35px; }
2350
+ [data-hc-ds] .hc-ui-physical-card__point {
2351
+ appearance: none;
2352
+ margin: 0;
2353
+ padding: 0;
2354
+ border: none;
2355
+ background: transparent;
2356
+ color: inherit;
2357
+ font: 600 18px/23px var(--hc-font-display);
2358
+ font-variation-settings: 'ROND' var(--hc-rond);
2359
+ font-stretch: 75%;
2360
+ font-variant-numeric: tabular-nums;
2361
+ text-align: right;
2362
+ cursor: pointer;
2363
+ -webkit-tap-highlight-color: transparent;
2364
+ touch-action: manipulation;
2365
+ }
2366
+ [data-hc-ds] .hc-ui-physical-card__point:disabled { cursor: default; opacity: 1; }
2367
+ [data-hc-ds] .hc-ui-physical-card__point[data-active] { text-decoration: underline 2px; text-underline-offset: 3px; }
2368
+ [data-hc-ds] .hc-ui-physical-card__object-points {
2369
+ position: absolute;
2370
+ left: 15px;
2371
+ bottom: 10px;
2372
+ font: 20px var(--hc-font-mono);
2373
+ font-variation-settings: 'ROND' var(--hc-rond);
2374
+ color: var(--hc-color-card-print-white);
2375
+ text-shadow: -1px -1px 0 var(--hc-color-card-print-black), 1px -1px 0 var(--hc-color-card-print-black), -1px 1px 0 var(--hc-color-card-print-black), 1px 1px 0 var(--hc-color-card-print-black);
2376
+ }
2377
+
2378
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial {
2379
+ position: absolute;
2380
+ bottom: 0;
2381
+ left: 94px;
2382
+ display: grid;
2383
+ grid-template-columns: repeat(3, 62px);
2384
+ grid-template-rows: 43px 30px;
2385
+ width: 188px;
2386
+ height: 80px;
2387
+ border-radius: 40px 40px 0 0;
2388
+ background: linear-gradient(to right, var(--hc-color-card-terrain-panel), var(--hc-color-card-terrain-panel) 28%, var(--hc-color-card-terrain-panel-groove) 31%, var(--hc-color-card-terrain-panel) 37%, var(--hc-color-card-terrain-panel) 65%, var(--hc-color-card-terrain-panel-groove) 68%, var(--hc-color-card-terrain-panel) 74%);
2389
+ color: var(--hc-color-card-print-black);
2390
+ text-align: center;
2391
+ }
2392
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial span { align-self: end; font: 700 24px/1 var(--hc-font-display); font-variation-settings: 'ROND' var(--hc-rond); }
2393
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial img { height: 22px; vertical-align: middle; }
2394
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial b { font: 700 24px/30px var(--hc-font-display); font-variation-settings: 'ROND' var(--hc-rond); font-stretch: 75%; letter-spacing: -1px; }
2395
+
2396
+ [data-hc-ds] .hc-ui-physical-card__back-bar {
2397
+ position: absolute;
2398
+ left: 0;
2399
+ bottom: 0;
2400
+ width: 375px;
2401
+ height: 75px;
2402
+ padding: 10px 10px 0;
2403
+ background: var(--hc-color-card-print-black);
2404
+ color: var(--hc-color-card-print-white);
2405
+ font-size: 12px;
2406
+ line-height: 19px;
2407
+ }
2408
+ [data-hc-ds] .hc-ui-physical-card__back-bar p { margin: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
2409
+ [data-hc-ds] .hc-ui-physical-card__back-bar b { font-size: 10px; font-weight: 700; }
2410
+
2411
+ /* 3D effect: by the mouse on the desktop and by the motion sensor only in the
2412
+ phone's focus view. Without a mouse over the card or a sensor reading there is
2413
+ no transform here; `[data-tilt]` is set by the view while it moves. */
2414
+ @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
2415
+ [data-hc-ds] .hc-ui-physical-card-tilt { transition: transform 0.18s ease-out; }
2416
+ [data-hc-ds] .hc-ui-physical-card { transition: box-shadow 0.18s ease-out; }
2417
+ [data-hc-ds] :is(.hc-ui-physical-card__token, .hc-ui-physical-card__terrain-art, .hc-ui-physical-card__bystander-token, .hc-ui-physical-card__header) { transition: translate 0.18s ease-out; }
2418
+ [data-hc-ds] .hc-ui-physical-card__shine {
2419
+ display: block;
2420
+ position: absolute;
2421
+ inset: 0;
2422
+ z-index: 1;
2423
+ opacity: 0;
2424
+ pointer-events: none;
2425
+ background: radial-gradient(circle at var(--hc-card-shine-at, 50% 50%), var(--hc-color-card-shine), transparent 60%);
2426
+ mix-blend-mode: var(--hc-blend-card-shine);
2427
+ transition: opacity 0.18s ease-out;
2428
+ }
2429
+ [data-hc-ds] .hc-ui-physical-card-slot[data-tilt] .hc-ui-physical-card { box-shadow: var(--hc-color-card-edge) 0 0 2px, var(--hc-color-card-lift) 0 14px 28px -10px; }
2430
+ [data-hc-ds] .hc-ui-physical-card-slot[data-tilt] .hc-ui-physical-card__shine { opacity: 1; }
2431
+ /* The front column lets the portrait pass the edge a little instead of cutting it. */
2432
+ [data-hc-ds] .hc-ui-physical-card-slot[data-tilt] .hc-ui-physical-card__table[data-column='front'] { overflow: clip; overflow-clip-margin: 5px; }
2433
+ }
2434
+ @media (hover: none) and (pointer: coarse) and (prefers-reduced-motion: no-preference) {
2435
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] .hc-ui-physical-card__shine {
2436
+ display: block;
2437
+ position: absolute;
2438
+ inset: 0;
2439
+ z-index: 1;
2440
+ opacity: 0;
2441
+ pointer-events: none;
2442
+ background: radial-gradient(circle at var(--hc-card-shine-at, 50% 50%), var(--hc-color-card-shine), transparent 60%);
2443
+ mix-blend-mode: var(--hc-blend-card-shine);
2444
+ transition: opacity 0.18s ease-out;
2445
+ }
2446
+ /* The sensor is already smoothed and updates every frame: no transition. */
2447
+ [data-hc-ds] .hc-ui-physical-cards[data-focus][data-tilt] .hc-ui-physical-card { box-shadow: var(--hc-color-card-edge) 0 0 2px, var(--hc-color-card-lift) 0 14px 28px -10px; }
2448
+ [data-hc-ds] .hc-ui-physical-cards[data-focus][data-tilt] .hc-ui-physical-card__shine { opacity: 1; }
2449
+ [data-hc-ds] .hc-ui-physical-cards[data-focus][data-tilt] .hc-ui-physical-card__table[data-column='front'] { overflow: clip; overflow-clip-margin: 5px; }
2450
+ [data-hc-ds] .hc-ui-physical-cards[data-focus][data-tilt] .hc-ui-physical-card-tilt { will-change: transform; }
2451
+ }
2452
+ /* Holding the card opens the focus view: no text selection and no image menu. */
2453
+ @media (hover: none) and (pointer: coarse) {
2454
+ [data-hc-ds] .hc-ui-physical-cards {
2455
+ -webkit-user-select: none;
2456
+ user-select: none;
2457
+ -webkit-touch-callout: none;
2458
+ }
2459
+ [data-hc-ds] .hc-ui-physical-cards img { -webkit-touch-callout: none; }
2460
+ [data-hc-ds] .hc-ui-physical-card { -webkit-user-select: none; user-select: none; }
2461
+ /* Outside the focus view the grain stays without blending, which weighs on
2462
+ phones with several cards mounted. */
2463
+ [data-hc-ds] .hc-ui-physical-cards:not([data-focus]) .hc-ui-physical-card::after {
2464
+ opacity: var(--hc-opacity-card-grain-flat);
2465
+ mix-blend-mode: normal;
2466
+ }
2467
+ }
2468
+
2469
+ /* PhysicalCardFocusView — HCUI `.card-focus`. The blurred background was asked for
2470
+ by HCUI and applies only here: the view has no panel of its own, so the dimmed,
2471
+ translucent backdrop is the surface the card floats on (the exception to "no blur
2472
+ behind solid surfaces"). */
2473
+ [data-hc-ds] .hc-ui-card-focus {
2474
+ position: fixed;
2475
+ inset: 0;
2476
+ width: 100%;
2477
+ max-width: none;
2478
+ height: 100%;
2479
+ max-height: none;
2480
+ margin: 0;
2481
+ padding: calc(env(safe-area-inset-top, 0px) + 16px) 8px calc(max(env(safe-area-inset-bottom, 0px), var(--hc-space-3)) + 8px);
2482
+ border: 0;
2483
+ background: none;
2484
+ color: var(--hc-color-text-primary);
2485
+ overscroll-behavior: contain;
2486
+ touch-action: none;
2487
+ }
2488
+ [data-hc-ds] .hc-ui-card-focus[open] { display: flex; align-items: center; justify-content: center; }
2489
+ /* Darker than the overlay token, so the card stands out. Above ~24px of blur
2490
+ Chromium shows sharp edges and text behind again. */
2491
+ [data-hc-ds] .hc-ui-card-focus::backdrop {
2492
+ background-color: var(--hc-color-card-focus-backdrop);
2493
+ -webkit-backdrop-filter: blur(22px);
2494
+ backdrop-filter: blur(22px);
2495
+ }
2496
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
2497
+ [data-hc-ds] .hc-ui-card-focus::backdrop { background-color: var(--hc-color-bg-elevated); }
2498
+ }
2499
+ [data-hc-ds] .hc-ui-card-focus__actions {
2500
+ grid-row: 2;
2501
+ display: flex;
2502
+ justify-content: center;
2503
+ gap: 12px;
2504
+ margin-top: 24px;
2505
+ }
2506
+ /* Quiet: the card is what shows. The outline Button keeps its border and only
2507
+ gets the surface fill, which that variant leaves transparent. */
2508
+ [data-hc-ds] .hc-ui-card-focus .hc-ui-card-focus__actions .hc-ui-button[data-variant] { background-color: var(--hc-color-bg-surface); }
2509
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] {
2510
+ display: grid;
2511
+ justify-items: center;
2512
+ gap: 0;
2513
+ animation: hc-ui-card-focus-in 0.24s ease-out both;
2514
+ }
2515
+ /* Front and backs in the same place: flipping turns both faces together, swapping
2516
+ halfway, with the card edge-on. `backface-visibility` is not enough: the back
2517
+ face showed mirrored during the first half of the turn. */
2518
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot {
2519
+ grid-area: 1 / 1;
2520
+ transform: perspective(1400px) rotateY(0deg);
2521
+ transition: transform 0.5s ease-in-out, visibility 0s 0.25s;
2522
+ }
2523
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot[data-away] { visibility: hidden; pointer-events: none; }
2524
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot[data-side='front'][data-away] { transform: perspective(1400px) rotateY(-180deg); }
2525
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot[data-side='back'][data-away] { transform: perspective(1400px) rotateY(180deg); }
2526
+ @keyframes hc-ui-card-focus-in {
2527
+ from { opacity: 0; transform: scale(0.94); }
2528
+ to { opacity: 1; transform: scale(1); }
2529
+ }
2530
+
2531
+ @media (prefers-reduced-motion: reduce) {
2532
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] { animation: none; }
2533
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot { transition: none; }
2534
+ [data-hc-ds] .hc-ui-physical-card__copy { transition: none; }
2535
+ }
2536
+
2537
+ /* Map — HCUI `.map-board`, `.map-tooltip`, `.map-swatch`, `.map-scene__legend` and
2538
+ `.map-environment`. The board's white, the selection's shading and the swatch's
2539
+ text are HeroClix tokens, the same in both themes; the environment's black line
2540
+ icons turn light in the dark theme (`filter-map-environment-icon`). */
2541
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-swatch, .hc-ui-map-legend, .hc-ui-map-environment),
2542
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) *,
2543
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) *::before,
2544
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) *::after { box-sizing: border-box; }
2545
+ /* ROND everywhere, and HCUI's long words that break only when they overflow. */
2546
+ [data-hc-ds] :is(.hc-ui-map-tooltip, .hc-ui-map-swatch, .hc-ui-map-legend, .hc-ui-map-environment),
2547
+ [data-hc-ds] :is(.hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) * { font-variation-settings: 'ROND' var(--hc-rond); }
2548
+ :where([data-hc-ds] :is(.hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment)) span,
2549
+ :where([data-hc-ds]) :is(.hc-ui-map-swatch, .hc-ui-map-environment) { overflow-wrap: break-word; }
2550
+ /* Square corners: the map is a board with its grid and labels up to the edge. The
2551
+ hcmaps canvas draws on white, in both themes. */
2552
+ [data-hc-ds] .hc-ui-map-board {
2553
+ position: relative;
2554
+ width: 100%;
2555
+ box-shadow: var(--hc-shadow-card);
2556
+ background-color: var(--hc-color-map-board);
2557
+ cursor: crosshair;
2558
+ }
2559
+ [data-hc-ds] .hc-ui-map-board:focus-visible { outline: var(--hc-focus-ring-width) solid var(--hc-focus-ring); outline-offset: var(--hc-focus-ring-offset, var(--hc-focus-ring-width)); }
2560
+ [data-hc-ds] .hc-ui-map-board canvas {
2561
+ display: block;
2562
+ width: 100%;
2563
+ height: auto;
2564
+ }
2565
+ [data-hc-ds] .hc-ui-map-board[data-loading] {
2566
+ aspect-ratio: 2 / 3;
2567
+ background-color: var(--hc-color-bg-muted-2);
2568
+ background-image: linear-gradient(var(--hc-color-border) 1px, transparent 1px), linear-gradient(90deg, var(--hc-color-border) 1px, transparent 1px);
2569
+ background-size: 12.5% 12.5%;
2570
+ }
2571
+ /* Read by screen readers only. */
2572
+ [data-hc-ds] .hc-ui-map-board__status {
2573
+ position: absolute;
2574
+ width: 1px;
2575
+ height: 1px;
2576
+ padding: 0;
2577
+ margin: -1px;
2578
+ overflow: hidden;
2579
+ clip: rect(0, 0, 0, 0);
2580
+ white-space: nowrap;
2581
+ border: 0;
2582
+ }
2583
+ [data-hc-ds] .hc-ui-map-board__selection {
2584
+ position: absolute;
2585
+ inset: 0;
2586
+ display: block;
2587
+ width: 100%;
2588
+ max-width: 100%;
2589
+ height: 100%;
2590
+ pointer-events: none;
2591
+ }
2592
+ [data-hc-ds] .hc-ui-map-board__selection rect { fill: var(--hc-color-map-selection); stroke: var(--hc-color-map-selection-edge); stroke-width: .07; }
2593
+ [data-hc-ds] .hc-ui-map-board__selection line { stroke: var(--hc-color-map-selection-line); stroke-width: .14; stroke-linecap: round; }
2594
+
2595
+ /* MapSwatch: the board's square, with the terrain's fill and border, in both themes. */
2596
+ [data-hc-ds] .hc-ui-map-swatch {
2597
+ display: inline-flex;
2598
+ align-items: center;
2599
+ justify-content: center;
2600
+ flex: 0 0 auto;
2601
+ width: 16px;
2602
+ height: 16px;
2603
+ border: 2px solid;
2604
+ border-radius: 3px;
2605
+ font-size: 10px;
2606
+ font-weight: var(--hc-font-weight-bold);
2607
+ line-height: 1;
2608
+ color: var(--hc-color-map-swatch-text);
2609
+ }
2610
+ [data-hc-ds] .hc-ui-map-swatch[data-light-text] { color: var(--hc-color-map-swatch-text-light); }
2611
+ [data-hc-ds] .hc-ui-map-swatch[data-wall] { height: 5px; border-width: 0; border-radius: 1px; outline: 1px solid var(--hc-color-border-strong); }
2612
+
2613
+ [data-hc-ds] .hc-ui-map-tooltip {
2614
+ position: fixed;
2615
+ z-index: var(--hc-z-tooltip);
2616
+ pointer-events: none;
2617
+ width: max-content;
2618
+ max-width: min(320px, calc(100vw - 16px));
2619
+ padding: var(--hc-space-3);
2620
+ border: 1px solid var(--hc-color-border-strong);
2621
+ border-radius: var(--hc-radius-md);
2622
+ background: var(--hc-color-bg-elevated);
2623
+ color: var(--hc-color-text-primary);
2624
+ box-shadow: var(--hc-shadow-card);
2625
+ font-size: var(--hc-font-size-xs);
2626
+ line-height: var(--hc-line-height-md);
2627
+ }
2628
+ /* HCUI's slightly condensed titles, at zero specificity. */
2629
+ :where([data-hc-ds] .hc-ui-map-tooltip__title) { font-stretch: 92%; }
2630
+ [data-hc-ds] .hc-ui-map-tooltip__title { display: flex; align-items: center; gap: var(--hc-space-2); margin-bottom: var(--hc-space-2); font-size: var(--hc-font-size-sm); font-weight: var(--hc-font-weight-bold); }
2631
+ [data-hc-ds] .hc-ui-map-tooltip__squares { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: var(--hc-space-3); }
2632
+ [data-hc-ds] .hc-ui-map-tooltip__square { display: flex; flex-direction: column; gap: var(--hc-space-1); min-width: 0; color: var(--hc-color-text-secondary); }
2633
+ [data-hc-ds] .hc-ui-map-tooltip__square + .hc-ui-map-tooltip__square { padding-left: var(--hc-space-3); border-left: 1px solid var(--hc-color-border); }
2634
+ [data-hc-ds] .hc-ui-map-tooltip__coordinate { color: var(--hc-color-text-primary); font-weight: var(--hc-font-weight-bold); }
2635
+ [data-hc-ds] .hc-ui-map-tooltip__row { display: flex; align-items: center; gap: var(--hc-space-2); min-height: 18px; }
2636
+ [data-hc-ds] .hc-ui-map-tooltip__row[data-kind='terrain'] { color: var(--hc-color-text-primary); }
2637
+ [data-hc-ds] .hc-ui-map-tooltip__note { color: var(--hc-color-text-secondary); }
2638
+ [data-hc-ds] .hc-ui-map-tooltip .hc-ui-map-environment__item { gap: var(--hc-space-2); }
2639
+ [data-hc-ds] .hc-ui-map-tooltip .hc-ui-map-environment img { width: 16px; height: 16px; }
2640
+
2641
+ /* MapLegendView: the icons follow the text's size. */
2642
+ [data-hc-ds] .hc-ui-map-legend {
2643
+ display: flex;
2644
+ flex-wrap: wrap;
2645
+ align-items: center;
2646
+ gap: var(--hc-space-1) var(--hc-space-3);
2647
+ margin-top: var(--hc-space-2);
2648
+ font-size: var(--hc-font-size-xs);
2649
+ line-height: var(--hc-line-height-md);
2650
+ color: var(--hc-color-text-secondary);
2651
+ }
2652
+ [data-hc-ds] .hc-ui-map-legend .hc-ui-map-environment img { width: 16px; height: 16px; }
2653
+ [data-hc-ds] .hc-ui-map-legend__key { display: inline-flex; align-items: center; gap: var(--hc-space-1); }
2654
+
2655
+ [data-hc-ds] .hc-ui-map-environment {
2656
+ display: inline-flex;
2657
+ align-items: center;
2658
+ flex-wrap: wrap;
2659
+ gap: var(--hc-space-2);
2660
+ color: var(--hc-color-text-secondary);
2661
+ font-size: var(--hc-font-size-xs);
2662
+ line-height: var(--hc-line-height-md);
2663
+ }
2664
+ [data-hc-ds] .hc-ui-map-environment__item { display: inline-flex; align-items: center; gap: var(--hc-space-1); white-space: nowrap; }
2665
+ [data-hc-ds] .hc-ui-map-environment img { display: block; flex-shrink: 0; width: 18px; max-width: 100%; height: 18px; filter: var(--hc-filter-map-environment-icon); }