@ntmats/hc-ui 0.2.0 → 0.4.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
@@ -22,6 +22,16 @@
22
22
  border-radius: var(--hc-radius-md);
23
23
  box-shadow: var(--hc-shadow-float);
24
24
  }
25
+ /* HCUI's `surface` mixin: surface fill in both themes, the card ring and soft shadow
26
+ (no border), 20px corners; 24px with radius="xl" (HCUI's card-surface). */
27
+ [data-hc-ds] .hc-ui-surface[data-tone='card'] {
28
+ background: var(--hc-color-bg-surface);
29
+ border-radius: var(--hc-radius-lg);
30
+ box-shadow: var(--hc-shadow-card);
31
+ }
32
+ [data-hc-ds] .hc-ui-surface:not([data-tone='page'], [data-tone='main'])[data-radius='md'] { border-radius: var(--hc-radius-md); }
33
+ [data-hc-ds] .hc-ui-surface:not([data-tone='page'], [data-tone='main'])[data-radius='lg'] { border-radius: var(--hc-radius-lg); }
34
+ [data-hc-ds] .hc-ui-surface:not([data-tone='page'], [data-tone='main'])[data-radius='xl'] { border-radius: var(--hc-radius-xl); }
25
35
 
26
36
  /* Visual reference: HCUI segmented track (3px inset, 2px gap, raised knob). */
27
37
  [data-hc-ds] .hc-ui-segmented {
@@ -90,6 +100,64 @@
90
100
  [data-hc-ds] .hc-ui-segmented__icon svg { display: block; width: 18px; height: 18px; }
91
101
  [data-hc-ds] .hc-ui-segmented__label { overflow: hidden; text-overflow: ellipsis; }
92
102
 
103
+ /* Equal width: one grid column (or row) per option, as wide as the widest, or as
104
+ --hc-segmented-option-width (the `optionWidth` prop). */
105
+ [data-hc-ds] .hc-ui-segmented[data-equal-width] {
106
+ display: inline-grid;
107
+ grid-auto-flow: column;
108
+ grid-auto-columns: var(--hc-segmented-option-width, minmax(0, 1fr));
109
+ }
110
+ [data-hc-ds] .hc-ui-segmented[data-equal-width][data-orientation='vertical'] {
111
+ grid-auto-flow: row;
112
+ grid-auto-columns: auto;
113
+ grid-auto-rows: minmax(0, 1fr);
114
+ }
115
+
116
+ /* Sliding knob — HCUI's point cost toggle (`.point-cost-toggle`): no gap, one knob
117
+ that moves its own width with a pop, 34px options (a 40px track), 12px/600 labels,
118
+ muted until chosen, and the whole track shrinks on press. */
119
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide'] {
120
+ position: relative;
121
+ isolation: isolate;
122
+ gap: 0;
123
+ transition: transform var(--hc-dur-short) var(--hc-ease-standard);
124
+ }
125
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide']:has(.hc-ui-segmented__option:active:not(:disabled)) { transform: scale(0.97); }
126
+ [data-hc-ds] .hc-ui-segmented__indicator {
127
+ position: absolute;
128
+ z-index: -1;
129
+ top: 3px;
130
+ left: 3px;
131
+ width: calc((100% - 6px) / var(--hc-segmented-count, 1));
132
+ height: calc(100% - 6px);
133
+ background-color: var(--hc-color-bg-surface);
134
+ border-radius: var(--hc-radius-full);
135
+ box-shadow: var(--hc-shadow-knob);
136
+ transform: translateX(calc(var(--hc-segmented-index, 0) * 100%));
137
+ transition: transform 260ms var(--hc-ease-pop), background-color var(--hc-transition-base);
138
+ pointer-events: none;
139
+ }
140
+ [data-hc-ds] .hc-ui-segmented[data-orientation='vertical'] .hc-ui-segmented__indicator {
141
+ width: calc(100% - 6px);
142
+ height: calc((100% - 6px) / var(--hc-segmented-count, 1));
143
+ transform: translateY(calc(var(--hc-segmented-index, 0) * 100%));
144
+ }
145
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide'] .hc-ui-segmented__option {
146
+ min-height: 34px;
147
+ padding: 0 var(--hc-space-2);
148
+ color: var(--hc-color-text-muted);
149
+ font-size: var(--hc-font-size-xs);
150
+ font-weight: var(--hc-font-weight-semibold);
151
+ font-stretch: normal;
152
+ transition: color var(--hc-transition-base);
153
+ }
154
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide'][data-density='compact'] .hc-ui-segmented__option { min-height: 32px; }
155
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide'] .hc-ui-segmented__option[data-selected] {
156
+ color: var(--hc-color-text-primary);
157
+ background: transparent;
158
+ box-shadow: none;
159
+ }
160
+
93
161
  /* Shared by Button, IconButton and Chip: reset, touch and press feedback. */
94
162
  [data-hc-ds] :is(.hc-ui-button, .hc-ui-icon-button, .hc-ui-chip) {
95
163
  appearance: none;
@@ -188,7 +256,22 @@
188
256
  [data-hc-ds] .hc-ui-icon-button[data-tone='secondary'] { color: var(--hc-color-text-secondary); }
189
257
  /* 36px keeps a 44px touch target; the veil stays clipped to the circle. */
190
258
  [data-hc-ds] .hc-ui-icon-button[data-size='sm']::before { content: ''; position: absolute; inset: -4px; }
259
+ /* Fills: surface (HCUI's mobile theme button: surface, card ring and shadow) and ghost
260
+ (HCUI's desktop utilities: no fill, muted fill and primary text on hover). */
261
+ [data-hc-ds] .hc-ui-icon-button[data-variant='surface'] { background-color: var(--hc-color-bg-surface); box-shadow: var(--hc-shadow-card); }
262
+ [data-hc-ds] .hc-ui-icon-button[data-variant='outline'] { background-color: var(--hc-color-bg-surface); box-shadow: inset 0 0 0 1px var(--hc-color-border); }
263
+ [data-hc-ds] .hc-ui-icon-button[data-variant='ghost'] { background-color: transparent; }
264
+ @media (hover: hover) {
265
+ [data-hc-ds] .hc-ui-icon-button[data-variant='ghost']:hover:not(:disabled, [aria-pressed='true']) { color: var(--hc-color-text-primary); background-color: var(--hc-color-bg-muted); }
266
+ }
267
+ [data-hc-ds] .hc-ui-icon-button[data-shape='rounded'] { border-radius: var(--hc-radius-sm); }
191
268
  [data-hc-ds] .hc-ui-icon-button[aria-pressed='true'] { color: var(--hc-color-text-inverse); background-color: var(--hc-color-accent); }
269
+ /* iconKey: the new icon turns in (HCUI's theme sun and moon). */
270
+ [data-hc-ds] .hc-ui-icon-button__icon[data-swap] { animation: hc-ui-icon-swap 360ms var(--hc-ease-pop) both; }
271
+ @keyframes hc-ui-icon-swap {
272
+ from { opacity: 0; transform: rotate(-60deg) scale(0.6); }
273
+ to { opacity: 1; transform: rotate(0) scale(1); }
274
+ }
192
275
  [data-hc-ds] .hc-ui-icon-button:disabled { opacity: 0.4; cursor: default; }
193
276
 
194
277
  /* Chip — HCUI chip / chip-active. */
@@ -206,11 +289,144 @@
206
289
  }
207
290
  @media (hover: hover) {
208
291
  [data-hc-ds] .hc-ui-chip:hover:not(:disabled) { background-color: var(--hc-color-bg-muted); }
209
- [data-hc-ds] .hc-ui-chip[aria-pressed='true']:hover:not(:disabled) { background-color: var(--hc-color-accent); }
292
+ [data-hc-ds] .hc-ui-chip:is([aria-pressed='true'], [aria-checked='true']):hover:not(:disabled) { background-color: var(--hc-color-accent); }
210
293
  }
211
- [data-hc-ds] .hc-ui-chip[aria-pressed='true'] { color: var(--hc-color-text-inverse); background-color: var(--hc-color-accent); box-shadow: none; }
294
+ /* Selected: a toggle (aria-pressed) or the chosen radio of a SheetChips (aria-checked). */
295
+ [data-hc-ds] .hc-ui-chip:is([aria-pressed='true'], [aria-checked='true']) { color: var(--hc-color-text-inverse); background-color: var(--hc-color-accent); box-shadow: none; }
212
296
  [data-hc-ds] .hc-ui-chip:disabled { opacity: 0.4; cursor: default; }
213
297
 
298
+ /* Chip as a filter (HCUI's .desktop-filter-bar__pill, .desktop-sort__trigger,
299
+ .quick-filters__chip and .rules-results__pill): count, badge, chevron, applied and
300
+ open rings, sizes, the quiet variant and the remove button. */
301
+ [data-hc-ds] .hc-ui-chip__count { color: var(--hc-color-text-secondary); font-weight: var(--hc-font-weight-regular); }
302
+ [data-hc-ds] .hc-ui-chip__badge {
303
+ display: grid;
304
+ place-items: center;
305
+ box-sizing: border-box;
306
+ min-width: 18px;
307
+ height: 18px;
308
+ padding: 0 var(--hc-space-1);
309
+ color: var(--hc-color-bg-surface);
310
+ background-color: var(--hc-color-text-primary);
311
+ border-radius: var(--hc-radius-full);
312
+ font-size: var(--hc-font-size-2xs);
313
+ font-variant-numeric: tabular-nums;
314
+ }
315
+ [data-hc-ds] .hc-ui-chip__chevron { display: inline-flex; flex: 0 0 auto; }
316
+ [data-hc-ds] .hc-ui-chip__chevron svg { display: block; }
317
+ /* Applied filter, or the trigger of an open popup: a 1.5px ring (the selected fill below wins). */
318
+ [data-hc-ds] .hc-ui-chip:is([data-applied], [aria-expanded='true']):not([aria-pressed='true'], [aria-checked='true'], [data-selected]) { box-shadow: inset 0 0 0 1.5px var(--hc-color-text-primary); }
319
+ /* Line height `normal`, as HCUI's filter pills: on 2x screens 18px moves the text by half a pixel. */
320
+ [data-hc-ds] .hc-ui-chip[data-size='sm'] { padding: 0 var(--hc-space-3); font-size: var(--hc-font-size-xs); line-height: normal; }
321
+ [data-hc-ds] .hc-ui-chip[data-size='xs'] {
322
+ gap: var(--hc-space-1);
323
+ min-height: 26px;
324
+ height: 26px;
325
+ padding: 0 var(--hc-space-2);
326
+ background-color: var(--hc-color-bg-muted);
327
+ box-shadow: none;
328
+ font-size: var(--hc-font-size-2xs);
329
+ }
330
+ [data-hc-ds] .hc-ui-chip[data-size='xs']:is([data-applied], [aria-expanded='true']):not([aria-pressed='true'], [aria-checked='true'], [data-selected]) { box-shadow: inset 0 0 0 1.5px var(--hc-color-text-primary); }
331
+ /* Quiet: HCUI's rule filter pills, lighter until applied. */
332
+ [data-hc-ds] .hc-ui-chip[data-variant='quiet'] {
333
+ gap: 5px;
334
+ padding: 0 13px;
335
+ color: var(--hc-color-text-secondary);
336
+ box-shadow: inset 0 0 0 1px var(--hc-color-border);
337
+ font-weight: 560;
338
+ }
339
+ [data-hc-ds] .hc-ui-chip[data-variant='quiet'][data-applied] { color: var(--hc-color-text-primary); box-shadow: inset 0 0 0 1.5px var(--hc-color-text-primary); font-weight: 720; }
340
+ [data-hc-ds] .hc-ui-chip[data-variant='quiet'] .hc-ui-chip__badge { padding: 0 5px; font-weight: var(--hc-font-weight-bold); font-variant-numeric: normal; line-height: 18px; }
341
+ /* With a remove button: the span is the pill and holds two plain buttons. */
342
+ [data-hc-ds] .hc-ui-chip[data-clearable] { cursor: default; }
343
+ [data-hc-ds] .hc-ui-chip[data-clearable][data-size='xs'] { gap: 2px; padding: 0 2px 0 var(--hc-space-2); max-width: 100%; }
344
+ [data-hc-ds] :is(.hc-ui-chip__main, .hc-ui-chip__clear) {
345
+ appearance: none;
346
+ margin: 0;
347
+ padding: 0;
348
+ color: inherit;
349
+ background: transparent;
350
+ border: 0;
351
+ font: inherit;
352
+ font-variation-settings: inherit;
353
+ cursor: pointer;
354
+ -webkit-tap-highlight-color: transparent;
355
+ touch-action: manipulation;
356
+ }
357
+ [data-hc-ds] .hc-ui-chip__main { display: inline-flex; align-items: center; gap: inherit; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
358
+ [data-hc-ds] span.hc-ui-chip__main { display: block; cursor: inherit; }
359
+ [data-hc-ds] .hc-ui-chip__clear {
360
+ display: grid;
361
+ flex: 0 0 auto;
362
+ place-items: center;
363
+ width: 20px;
364
+ height: 20px;
365
+ color: var(--hc-color-text-secondary);
366
+ border-radius: var(--hc-radius-full);
367
+ }
368
+ [data-hc-ds] .hc-ui-chip__clear svg { display: block; }
369
+ [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); }
371
+ [data-hc-ds] .hc-ui-chip__clear:disabled, [data-hc-ds] button.hc-ui-chip__main:disabled { cursor: default; }
372
+ [data-hc-ds] .hc-ui-chip[data-disabled] { opacity: 0.4; }
373
+ /* Selected with a remove button: the contrast fill at xs (HCUI's active quick filter), the accent otherwise. */
374
+ [data-hc-ds] .hc-ui-chip[data-clearable][data-selected],
375
+ [data-hc-ds] .hc-ui-chip[data-clearable][data-selected]:hover { color: var(--hc-color-text-inverse); background-color: var(--hc-color-accent); box-shadow: none; }
376
+ [data-hc-ds] .hc-ui-chip[data-size='xs']:is([aria-pressed='true'], [aria-checked='true'], [data-selected]),
377
+ [data-hc-ds] .hc-ui-chip[data-size='xs']:is([aria-pressed='true'], [aria-checked='true'], [data-selected]):hover { color: var(--hc-color-text-on-contrast); background-color: var(--hc-color-bg-contrast); }
378
+ [data-hc-ds] .hc-ui-chip:is([aria-pressed='true'], [aria-checked='true'], [data-selected]) .hc-ui-chip__count { color: inherit; }
379
+ [data-hc-ds] .hc-ui-chip[data-selected] .hc-ui-chip__clear { color: inherit; }
380
+
381
+ /* FilterBar — a row of filters with start, end and footer slots (HCUI's .desktop-filter-bar,
382
+ .desktop-filter-bar--sheet and .quick-filters). Placement stays with the caller. */
383
+ [data-hc-ds] .hc-ui-filter-bar { box-sizing: border-box; min-width: 0; }
384
+ [data-hc-ds] .hc-ui-filter-bar[data-sticky] {
385
+ position: sticky;
386
+ top: var(--hc-filter-bar-top, 0px);
387
+ z-index: 3;
388
+ padding-block: var(--hc-space-2);
389
+ background-color: var(--hc-color-bg-surface);
390
+ }
391
+ [data-hc-ds] .hc-ui-filter-bar__line { display: flex; align-items: center; gap: var(--hc-space-2); min-width: 0; }
392
+ [data-hc-ds] :is(.hc-ui-filter-bar__start, .hc-ui-filter-bar__end) { display: flex; flex: 0 0 auto; align-items: center; gap: var(--hc-space-2); }
393
+ [data-hc-ds] .hc-ui-filter-bar__end { margin-inline-start: auto; }
394
+ [data-hc-ds] .hc-ui-filter-bar__row { display: flex; flex: 1 1 auto; flex-wrap: wrap; align-items: center; gap: var(--hc-space-2); min-width: 0; }
395
+ [data-hc-ds] .hc-ui-filter-bar[data-density='compact'] .hc-ui-filter-bar__row { gap: var(--hc-space-1); }
396
+ [data-hc-ds] .hc-ui-filter-bar__footer { margin-top: var(--hc-space-2); }
397
+ /* One line that scrolls sideways. 4px of padding above and below, taken back by the margin,
398
+ keep focus rings from being cut without changing the layout. */
399
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='scroll'] .hc-ui-filter-bar__row {
400
+ flex-wrap: nowrap;
401
+ order: 1;
402
+ flex-basis: 100%;
403
+ margin: -4px calc(-1 * var(--hc-filter-bar-bleed, 0px));
404
+ padding: 4px var(--hc-filter-bar-bleed, 0px);
405
+ overflow-x: auto;
406
+ scroll-padding-inline: var(--hc-filter-bar-bleed, 0px);
407
+ scrollbar-width: none;
408
+ }
409
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='scroll'] .hc-ui-filter-bar__row::-webkit-scrollbar { display: none; }
410
+ /* There is no room beside the slots: they share the first line (the start one grows, as a
411
+ search field) and the filters scroll on their own line under them. */
412
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='scroll'] .hc-ui-filter-bar__line { flex-wrap: wrap; }
413
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='scroll'] .hc-ui-filter-bar__start { flex: 1 1 auto; min-width: 0; }
414
+ @media (max-width: 959.98px) {
415
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='auto'] .hc-ui-filter-bar__row {
416
+ flex-wrap: nowrap;
417
+ order: 1;
418
+ flex-basis: 100%;
419
+ margin: -4px calc(-1 * var(--hc-filter-bar-bleed, 0px));
420
+ padding: 4px var(--hc-filter-bar-bleed, 0px);
421
+ overflow-x: auto;
422
+ scroll-padding-inline: var(--hc-filter-bar-bleed, 0px);
423
+ scrollbar-width: none;
424
+ }
425
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='auto'] .hc-ui-filter-bar__row::-webkit-scrollbar { display: none; }
426
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='auto'] .hc-ui-filter-bar__line { flex-wrap: wrap; }
427
+ [data-hc-ds] .hc-ui-filter-bar[data-layout='auto'] .hc-ui-filter-bar__start { flex: 1 1 auto; min-width: 0; }
428
+ }
429
+
214
430
  /* Field — HCUI field. One focus ring, on the pill, never on the inner input. */
215
431
  [data-hc-ds] .hc-ui-field { display: grid; align-content: start; gap: var(--hc-space-1); min-width: 0; font-family: var(--hc-font-body); font-variation-settings: 'ROND' var(--hc-rond); }
216
432
  [data-hc-ds] .hc-ui-field__label { color: var(--hc-color-text-secondary); font-size: var(--hc-font-size-sm); font-weight: var(--hc-font-weight-medium); line-height: var(--hc-line-height-sm); }
@@ -279,9 +495,2148 @@
279
495
 
280
496
  @media (prefers-reduced-motion: reduce) {
281
497
  [data-hc-ds] .hc-ui-segmented__option { transition: none; }
498
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide'] .hc-ui-segmented__option { transition: none; }
499
+ [data-hc-ds] :is(.hc-ui-segmented[data-indicator='slide'], .hc-ui-segmented__indicator) { transition: none; }
500
+ [data-hc-ds] .hc-ui-segmented[data-indicator='slide']:has(.hc-ui-segmented__option:active:not(:disabled)) { transform: none; }
501
+ [data-hc-ds] .hc-ui-icon-button__icon[data-swap] { animation: none; }
282
502
  [data-hc-ds] :is(.hc-ui-button, .hc-ui-icon-button, .hc-ui-chip) { transition: none; }
283
503
  [data-hc-ds] .hc-ui-field__control { transition: none; }
284
504
  [data-hc-ds] .hc-ui-button__spinner { animation: none; }
285
505
  [data-hc-ds] :is(.hc-ui-button, .hc-ui-icon-button, .hc-ui-chip):active:not(:disabled) { transform: none; }
286
506
  :where([data-hc-ds] .hc-ui-skeleton) { animation: none; }
287
507
  }
508
+
509
+ /* Meter — HCUI's bars of points against the limit: the mobile team bar (3px, no
510
+ track, `team-bar__meter`), the desktop sidebar draft (4px, `desktop-sidebar__meter`)
511
+ and the team rules bar (5px, square fill, limit line, `team-rules__bar`).
512
+ Display and position have zero specificity: the caller places it (absolute, grid). */
513
+ :where([data-hc-ds] .hc-ui-meter) { position: relative; display: block; }
514
+ [data-hc-ds] .hc-ui-meter {
515
+ height: 4px;
516
+ overflow: hidden;
517
+ background-color: var(--hc-color-bg-muted);
518
+ border-radius: var(--hc-radius-full);
519
+ }
520
+ [data-hc-ds] .hc-ui-meter[data-thickness='3'] { height: 3px; }
521
+ [data-hc-ds] .hc-ui-meter[data-thickness='5'] { height: 5px; }
522
+ [data-hc-ds] .hc-ui-meter[data-track='border'] { background-color: var(--hc-color-border); }
523
+ [data-hc-ds] .hc-ui-meter[data-track='none'] { overflow: visible; background-color: transparent; border-radius: 0; }
524
+ [data-hc-ds] .hc-ui-meter__fill {
525
+ display: block;
526
+ height: 100%;
527
+ background-color: var(--hc-color-text-primary);
528
+ border-radius: inherit;
529
+ }
530
+ /* Without a track the fill starts flush with the edge and rounds only its end. */
531
+ [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
+ [data-hc-ds] .hc-ui-meter[data-cap='square'] .hc-ui-meter__fill { border-radius: 0; }
533
+ [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. */
535
+ [data-hc-ds] .hc-ui-meter__limit {
536
+ position: absolute;
537
+ top: 0;
538
+ bottom: 0;
539
+ width: 2px;
540
+ background-color: var(--hc-color-text-primary);
541
+ }
542
+ [data-hc-ds] .hc-ui-meter[data-animated] .hc-ui-meter__fill { transition: width var(--hc-transition-base); }
543
+
544
+ @media (prefers-reduced-motion: reduce) {
545
+ [data-hc-ds] .hc-ui-meter[data-animated] .hc-ui-meter__fill { transition: none; }
546
+ }
547
+
548
+ /* Checkbox — HCUI Checkbox. The native input sits transparently over the box. */
549
+ [data-hc-ds] .hc-ui-checkbox {
550
+ --hc-checkbox-size: 20px;
551
+ --hc-checkbox-radius: 6px;
552
+ --hc-checkbox-icon: 14px;
553
+ position: relative;
554
+ display: inline-grid;
555
+ flex: 0 0 auto;
556
+ place-items: center;
557
+ width: var(--hc-checkbox-size);
558
+ height: var(--hc-checkbox-size);
559
+ vertical-align: middle;
560
+ }
561
+ [data-hc-ds] .hc-ui-checkbox[data-size='sm'] {
562
+ --hc-checkbox-size: 16px;
563
+ --hc-checkbox-radius: 5px;
564
+ --hc-checkbox-icon: 12px;
565
+ }
566
+ [data-hc-ds] .hc-ui-checkbox__input {
567
+ position: absolute;
568
+ inset: 0;
569
+ width: 100%;
570
+ height: 100%;
571
+ margin: 0;
572
+ opacity: 0;
573
+ cursor: pointer;
574
+ }
575
+ [data-hc-ds] .hc-ui-checkbox__input:disabled { cursor: not-allowed; }
576
+ [data-hc-ds] .hc-ui-checkbox__box {
577
+ display: grid;
578
+ place-items: center;
579
+ width: 100%;
580
+ height: 100%;
581
+ border-radius: var(--hc-checkbox-radius);
582
+ background-color: var(--hc-color-bg-surface);
583
+ box-shadow: inset 0 0 0 1.5px var(--hc-color-text-muted);
584
+ color: var(--hc-color-text-inverse);
585
+ pointer-events: none;
586
+ transition: background-color var(--hc-transition-fast), box-shadow var(--hc-transition-fast);
587
+ }
588
+ [data-hc-ds] :is(.hc-ui-checkbox__mark, .hc-ui-checkbox__mixed) {
589
+ display: block;
590
+ grid-area: 1 / 1;
591
+ width: var(--hc-checkbox-icon);
592
+ height: var(--hc-checkbox-icon);
593
+ visibility: hidden;
594
+ }
595
+ @media (hover: hover) {
596
+ [data-hc-ds] .hc-ui-checkbox__input:hover:not(:disabled) + .hc-ui-checkbox__box,
597
+ [data-hc-ds] label:hover .hc-ui-checkbox__input:not(:disabled) + .hc-ui-checkbox__box { box-shadow: inset 0 0 0 1.5px var(--hc-color-text-primary); }
598
+ }
599
+ [data-hc-ds] .hc-ui-checkbox__input:is(:checked, :indeterminate) + .hc-ui-checkbox__box {
600
+ background-color: var(--hc-color-accent);
601
+ box-shadow: none;
602
+ }
603
+ [data-hc-ds] .hc-ui-checkbox__input:checked:not(:indeterminate) + .hc-ui-checkbox__box .hc-ui-checkbox__mark,
604
+ [data-hc-ds] .hc-ui-checkbox__input:indeterminate + .hc-ui-checkbox__box .hc-ui-checkbox__mixed {
605
+ visibility: visible;
606
+ animation: hc-ui-check-in 200ms var(--hc-ease-pop);
607
+ }
608
+ @keyframes hc-ui-check-in {
609
+ from { transform: scale(0.4); opacity: 0; }
610
+ to { transform: scale(1); opacity: 1; }
611
+ }
612
+ [data-hc-ds] .hc-ui-checkbox__input:focus-visible { outline: none; }
613
+ [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);
616
+ }
617
+ [data-hc-ds] .hc-ui-checkbox__input:disabled + .hc-ui-checkbox__box {
618
+ background-color: var(--hc-color-bg-muted);
619
+ box-shadow: inset 0 0 0 1.5px var(--hc-color-text-disabled);
620
+ }
621
+ [data-hc-ds] .hc-ui-checkbox__input:disabled:is(:checked, :indeterminate) + .hc-ui-checkbox__box {
622
+ background-color: var(--hc-color-text-disabled);
623
+ box-shadow: none;
624
+ }
625
+
626
+ @media (prefers-reduced-motion: reduce) {
627
+ [data-hc-ds] .hc-ui-checkbox__box { transition: none; }
628
+ [data-hc-ds] .hc-ui-checkbox__input:checked:not(:indeterminate) + .hc-ui-checkbox__box .hc-ui-checkbox__mark,
629
+ [data-hc-ds] .hc-ui-checkbox__input:indeterminate + .hc-ui-checkbox__box .hc-ui-checkbox__mixed { animation: none; }
630
+ }
631
+
632
+ /* 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. */
634
+ [data-hc-ds] .hc-ui-dialog {
635
+ box-sizing: border-box;
636
+ width: min(400px, calc(100vw - 32px));
637
+ max-width: none;
638
+ max-height: calc(100dvh - var(--hc-space-9));
639
+ margin: auto;
640
+ padding: var(--hc-space-5);
641
+ overflow: auto;
642
+ overscroll-behavior: contain;
643
+ color: var(--hc-color-text-primary);
644
+ background-color: var(--hc-color-bg-elevated);
645
+ border: 0;
646
+ border-radius: var(--hc-radius-lg);
647
+ font-family: var(--hc-font-body);
648
+ font-size: var(--hc-font-size-md);
649
+ font-variation-settings: 'ROND' var(--hc-rond);
650
+ line-height: var(--hc-line-height-md);
651
+ outline: none;
652
+ }
653
+ [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; }
656
+ [data-hc-ds] .hc-ui-dialog__header {
657
+ display: flex;
658
+ align-items: center;
659
+ justify-content: space-between;
660
+ gap: var(--hc-space-3);
661
+ min-width: 0;
662
+ }
663
+ [data-hc-ds] .hc-ui-dialog__title {
664
+ min-width: 0;
665
+ margin: 0;
666
+ color: var(--hc-color-text-primary);
667
+ font-family: var(--hc-font-display);
668
+ font-size: var(--hc-font-size-lg);
669
+ font-weight: var(--hc-font-weight-semibold);
670
+ /* As HCUI's confirmation title, whose `font` shorthand resets the stretch; ROND stays. */
671
+ font-stretch: normal;
672
+ font-variation-settings: 'ROND' var(--hc-rond);
673
+ line-height: normal;
674
+ }
675
+ [data-hc-ds] .hc-ui-dialog__body { display: grid; gap: var(--hc-space-2); min-width: 0; }
676
+ [data-hc-ds] .hc-ui-dialog__description {
677
+ margin: 0;
678
+ color: var(--hc-color-text-secondary);
679
+ font-size: var(--hc-font-size-sm);
680
+ line-height: 1.45;
681
+ }
682
+ [data-hc-ds] .hc-ui-dialog__actions {
683
+ display: flex;
684
+ flex-wrap: wrap;
685
+ justify-content: flex-end;
686
+ gap: var(--hc-space-2);
687
+ margin-top: var(--hc-space-3);
688
+ }
689
+ /* HCUI's confirmation buttons are 38px, between Button sm (36) and md (44). */
690
+ [data-hc-ds] .hc-ui-dialog[data-size='sm'] .hc-ui-dialog__actions .hc-ui-button[data-size='sm'] { min-height: 38px; }
691
+
692
+ [data-hc-ds] .hc-ui-dialog[data-size='md'] {
693
+ width: min(440px, calc(100vw - 2 * var(--hc-space-6)));
694
+ padding: 0;
695
+ overflow: hidden;
696
+ 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
+ }
700
+ [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
+ [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
+ [data-hc-ds] .hc-ui-dialog[data-size='md'] .hc-ui-dialog__title {
710
+ font-size: var(--hc-font-size-xl);
711
+ font-weight: 720;
712
+ font-stretch: 88%;
713
+ line-height: var(--hc-line-height-xl);
714
+ font-variation-settings: 'ROND' var(--hc-rond);
715
+ letter-spacing: var(--hc-letter-spacing-snug);
716
+ }
717
+ [data-hc-ds] .hc-ui-dialog[data-size='md'] .hc-ui-dialog__body {
718
+ display: flex;
719
+ flex: 1 1 auto;
720
+ flex-direction: column;
721
+ gap: var(--hc-space-5);
722
+ min-height: 0;
723
+ padding: var(--hc-space-1) var(--hc-space-5) var(--hc-space-5);
724
+ overflow-y: auto;
725
+ overscroll-behavior: contain;
726
+ }
727
+ [data-hc-ds] .hc-ui-dialog[data-size='md'] .hc-ui-dialog__actions {
728
+ flex: 0 0 auto;
729
+ flex-wrap: nowrap;
730
+ margin: 0;
731
+ padding: var(--hc-space-3) var(--hc-space-5) var(--hc-space-5);
732
+ box-shadow: 0 -1px 0 var(--hc-color-border);
733
+ }
734
+ [data-hc-ds] .hc-ui-dialog[data-size='md'] .hc-ui-dialog__actions > * { flex: 1 1 0; }
735
+
736
+ @keyframes hc-ui-dialog-in {
737
+ from { opacity: 0; transform: translateY(8px) scale(0.97); }
738
+ to { opacity: 1; transform: translateY(0) scale(1); }
739
+ }
740
+ @keyframes hc-ui-dialog-out {
741
+ from { opacity: 1; transform: scale(1); }
742
+ to { opacity: 0; transform: scale(0.97); }
743
+ }
744
+ @keyframes hc-ui-backdrop-in { from { opacity: 0; } to { opacity: 1; } }
745
+ @keyframes hc-ui-backdrop-out { from { opacity: 1; } to { opacity: 0; } }
746
+
747
+ @media (prefers-reduced-motion: reduce) {
748
+ [data-hc-ds] .hc-ui-dialog,
749
+ [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; }
754
+ }
755
+
756
+ /* Sheet — a Dialog size="md" that, at the bottom, is HCUI's mobile Sheet (sheet-panel,
757
+ sheet-host, sheet-header): full width, top corners rounded, grabber, safe area,
758
+ rising entry. `auto` is at the bottom below 960px, HCUI's cut. `--hc-sheet-drag`
759
+ tells the drag gesture where the sheet is, so no script reads the width. */
760
+ /* [data-presentation] lifts it above the Dialog's own md width. */
761
+ [data-hc-ds] .hc-ui-sheet[data-presentation] {
762
+ --hc-sheet-drag: off;
763
+ width: min(var(--hc-sheet-width, 440px), calc(100vw - 2 * var(--hc-space-6)));
764
+ }
765
+ [data-hc-ds] .hc-ui-sheet[data-presentation='bottom'] {
766
+ --hc-sheet-drag: on;
767
+ width: 100%;
768
+ max-width: none;
769
+ max-height: calc(100dvh - var(--hc-space-7) - env(safe-area-inset-top, 0px));
770
+ margin: auto 0 0;
771
+ padding-bottom: max(env(safe-area-inset-bottom, 0px), var(--hc-space-3));
772
+ border-radius: var(--hc-radius-sheet) var(--hc-radius-sheet) 0 0;
773
+ touch-action: pan-y;
774
+ animation: hc-ui-sheet-up var(--hc-dur-large) var(--hc-ease-sheet) both;
775
+ transition: height 320ms var(--hc-ease-sheet), max-height 320ms var(--hc-ease-sheet);
776
+ }
777
+ [data-hc-ds] .hc-ui-sheet[data-presentation='bottom']::before {
778
+ content: '';
779
+ position: absolute;
780
+ top: 6px;
781
+ left: 50%;
782
+ z-index: 2;
783
+ display: block;
784
+ width: 36px;
785
+ height: 5px;
786
+ margin: 0 auto 0 -18px;
787
+ border-radius: var(--hc-radius-full);
788
+ background-color: var(--hc-color-border-strong);
789
+ }
790
+ [data-hc-ds] .hc-ui-sheet[data-presentation='bottom'] .hc-ui-dialog__header { padding-top: var(--hc-space-6); }
791
+ /* Full height, after a drag up from the grabber or header. */
792
+ [data-hc-ds] .hc-ui-sheet[data-presentation='bottom'][data-expanded] {
793
+ height: calc(100dvh - env(safe-area-inset-top, 0px) - 8px);
794
+ max-height: calc(100dvh - env(safe-area-inset-top, 0px) - 8px);
795
+ border-radius: 20px 20px 0 0;
796
+ }
797
+ [data-hc-ds] .hc-ui-sheet[data-presentation='bottom'][data-closing] { animation: hc-ui-sheet-down var(--hc-dur-medium) var(--hc-ease-emphasized-accel) forwards; }
798
+
799
+ @media (max-width: 959.98px) {
800
+ [data-hc-ds] .hc-ui-sheet[data-presentation='auto'] {
801
+ --hc-sheet-drag: on;
802
+ width: 100%;
803
+ max-width: none;
804
+ max-height: calc(100dvh - var(--hc-space-7) - env(safe-area-inset-top, 0px));
805
+ margin: auto 0 0;
806
+ padding-bottom: max(env(safe-area-inset-bottom, 0px), var(--hc-space-3));
807
+ border-radius: var(--hc-radius-sheet) var(--hc-radius-sheet) 0 0;
808
+ touch-action: pan-y;
809
+ animation: hc-ui-sheet-up var(--hc-dur-large) var(--hc-ease-sheet) both;
810
+ transition: height 320ms var(--hc-ease-sheet), max-height 320ms var(--hc-ease-sheet);
811
+ }
812
+ [data-hc-ds] .hc-ui-sheet[data-presentation='auto']::before {
813
+ content: '';
814
+ position: absolute;
815
+ top: 6px;
816
+ left: 50%;
817
+ z-index: 2;
818
+ display: block;
819
+ width: 36px;
820
+ height: 5px;
821
+ margin: 0 auto 0 -18px;
822
+ border-radius: var(--hc-radius-full);
823
+ background-color: var(--hc-color-border-strong);
824
+ }
825
+ [data-hc-ds] .hc-ui-sheet[data-presentation='auto'] .hc-ui-dialog__header { padding-top: var(--hc-space-6); }
826
+ [data-hc-ds] .hc-ui-sheet[data-presentation='auto'][data-expanded] {
827
+ height: calc(100dvh - env(safe-area-inset-top, 0px) - 8px);
828
+ max-height: calc(100dvh - env(safe-area-inset-top, 0px) - 8px);
829
+ border-radius: 20px 20px 0 0;
830
+ }
831
+ [data-hc-ds] .hc-ui-sheet[data-presentation='auto'][data-closing] { animation: hc-ui-sheet-down var(--hc-dur-medium) var(--hc-ease-emphasized-accel) forwards; }
832
+ }
833
+
834
+ /* Closing by drag: the backdrop fades with the sheet instead of waiting for the exit. */
835
+ [data-hc-ds] .hc-ui-sheet.hc-ui-dialog[data-dismissing]::backdrop { opacity: 0; transition: opacity 220ms ease; }
836
+ [data-hc-ds] .hc-ui-sheet.hc-ui-dialog[data-dismissing][data-closing]::backdrop { animation: none; }
837
+
838
+ @keyframes hc-ui-sheet-up {
839
+ from { transform: translateY(100%); }
840
+ to { transform: translateY(0); }
841
+ }
842
+ @keyframes hc-ui-sheet-down {
843
+ from { transform: translateY(0); }
844
+ to { transform: translateY(100%); }
845
+ }
846
+
847
+ /* SheetOptions — HCUI's sheet-options: rows with a check on a card-like group. */
848
+ [data-hc-ds] .hc-ui-sheet-options {
849
+ display: flex;
850
+ /* Never shrinks in the sheet's flex body: a long list scrolls with the body. HCUI's
851
+ shrinks and cuts the rows that do not fit, out of reach. */
852
+ flex: 0 0 auto;
853
+ flex-direction: column;
854
+ overflow: hidden;
855
+ background-color: var(--hc-color-bg-muted-2);
856
+ border-radius: var(--hc-radius-lg);
857
+ box-shadow: var(--hc-shadow-card);
858
+ }
859
+ [data-hc-ds] .hc-ui-sheet-options__row {
860
+ /* The ring goes inside, where the group's overflow does not cut it. */
861
+ --hc-focus-ring-offset: -2px;
862
+ appearance: none;
863
+ position: relative;
864
+ display: flex;
865
+ align-items: center;
866
+ gap: var(--hc-space-3);
867
+ box-sizing: border-box;
868
+ width: 100%;
869
+ min-height: 52px;
870
+ margin: 0;
871
+ padding: var(--hc-space-2) var(--hc-space-4);
872
+ color: var(--hc-color-text-primary);
873
+ font: inherit;
874
+ font-variation-settings: 'ROND' var(--hc-rond);
875
+ text-align: left;
876
+ background: transparent;
877
+ border: 0;
878
+ cursor: pointer;
879
+ -webkit-tap-highlight-color: transparent;
880
+ touch-action: manipulation;
881
+ }
882
+ [data-hc-ds] .hc-ui-sheet-options__row + .hc-ui-sheet-options__row { box-shadow: inset 0 1px 0 var(--hc-color-border); }
883
+ /* State layer: a veil on hover and press. */
884
+ [data-hc-ds] .hc-ui-sheet-options__row::after {
885
+ content: '';
886
+ position: absolute;
887
+ inset: 0;
888
+ border-radius: inherit;
889
+ background-color: currentColor;
890
+ opacity: 0;
891
+ pointer-events: none;
892
+ transition: opacity var(--hc-dur-short) var(--hc-ease-standard);
893
+ }
894
+ @media (hover: hover) {
895
+ [data-hc-ds] .hc-ui-sheet-options__row:hover:not(:disabled)::after { opacity: 0.04; }
896
+ }
897
+ [data-hc-ds] .hc-ui-sheet-options__row:active:not(:disabled)::after { opacity: 0.07; }
898
+ [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);
901
+ border-radius: var(--hc-radius-lg);
902
+ }
903
+ [data-hc-ds] .hc-ui-sheet-options__row:disabled { opacity: 0.4; cursor: default; }
904
+ [data-hc-ds] .hc-ui-sheet-options__icon { display: inline-flex; flex: 0 0 auto; color: var(--hc-color-text-secondary); }
905
+ [data-hc-ds] .hc-ui-sheet-options__icon svg { display: block; }
906
+ [data-hc-ds] .hc-ui-sheet-options__text { display: flex; flex: 1 1 auto; flex-direction: column; min-width: 0; }
907
+ [data-hc-ds] .hc-ui-sheet-options__label { font-size: var(--hc-font-size-md); }
908
+ [data-hc-ds] .hc-ui-sheet-options__row[data-selected] .hc-ui-sheet-options__label { font-weight: var(--hc-font-weight-semibold); }
909
+ [data-hc-ds] .hc-ui-sheet-options__hint { color: var(--hc-color-text-muted); font-size: var(--hc-font-size-sm); }
910
+ [data-hc-ds] .hc-ui-sheet-options__check {
911
+ display: inline-flex;
912
+ flex: 0 0 auto;
913
+ width: 20px;
914
+ color: var(--hc-color-brand);
915
+ animation: hc-ui-check-in 260ms var(--hc-ease-pop);
916
+ }
917
+
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
+ /* SheetChips — wrapping Chips with radio semantics. */
935
+ [data-hc-ds] .hc-ui-sheet-chips { display: flex; flex-wrap: wrap; gap: var(--hc-space-2); }
936
+
937
+ @media (prefers-reduced-motion: reduce) {
938
+ [data-hc-ds] .hc-ui-sheet[data-presentation],
939
+ [data-hc-ds] .hc-ui-sheet[data-presentation][data-closing] { animation: none; transition: none; }
940
+ [data-hc-ds] .hc-ui-sheet.hc-ui-dialog[data-dismissing]::backdrop { transition: none; }
941
+ [data-hc-ds] .hc-ui-sheet-options__row::after { transition: none; }
942
+ [data-hc-ds] .hc-ui-sheet-options__check { animation: none; }
943
+ }
944
+
945
+ /* Menu and Popover — popups anchored to their trigger. The menu is HCUI's
946
+ .desktop-sort__menu and the popover HCUI's .team-rules__popover. No motion:
947
+ both appear at once, as in HCUI. */
948
+ :where([data-hc-ds] .hc-ui-popup-anchor) { position: relative; display: inline-flex; vertical-align: middle; }
949
+ :where([data-hc-ds] .hc-ui-portal) { display: contents; }
950
+
951
+ [data-hc-ds] .hc-ui-menu,
952
+ [data-hc-ds] .hc-ui-popover {
953
+ position: absolute;
954
+ box-sizing: border-box;
955
+ display: grid;
956
+ margin: 0;
957
+ font-family: var(--hc-font-body);
958
+ font-size: var(--hc-font-size-xs);
959
+ font-style: normal;
960
+ text-align: start;
961
+ text-transform: none;
962
+ font-variation-settings: 'ROND' var(--hc-rond);
963
+ border: 1px solid var(--hc-color-border);
964
+ outline: none;
965
+ }
966
+ [data-hc-ds] .hc-ui-menu[data-side='bottom'],
967
+ [data-hc-ds] .hc-ui-popover[data-side='bottom'] { top: calc(100% + var(--hc-space-1)); }
968
+ [data-hc-ds] .hc-ui-menu[data-side='top'],
969
+ [data-hc-ds] .hc-ui-popover[data-side='top'] { bottom: calc(100% + var(--hc-space-1)); }
970
+ [data-hc-ds] .hc-ui-menu[data-align='end'],
971
+ [data-hc-ds] .hc-ui-popover[data-align='end'] { right: 0; }
972
+ [data-hc-ds] .hc-ui-menu[data-align='start'],
973
+ [data-hc-ds] .hc-ui-popover[data-align='start'] { left: 0; }
974
+ /* In a portal the coordinates come inline; above page layers, below toasts. */
975
+ [data-hc-ds] .hc-ui-menu[data-portal],
976
+ [data-hc-ds] .hc-ui-popover[data-portal] { position: fixed; z-index: var(--hc-z-tooltip); }
977
+
978
+ [data-hc-ds] .hc-ui-menu {
979
+ z-index: 5;
980
+ width: 200px;
981
+ padding: var(--hc-space-2);
982
+ background-color: var(--hc-color-bg-surface);
983
+ border-radius: var(--hc-radius-md);
984
+ box-shadow: var(--hc-shadow-soft);
985
+ }
986
+ [data-hc-ds] .hc-ui-menu__group { display: grid; }
987
+ [data-hc-ds] .hc-ui-menu__item {
988
+ appearance: none;
989
+ display: flex;
990
+ align-items: center;
991
+ justify-content: space-between;
992
+ gap: var(--hc-space-2);
993
+ box-sizing: border-box;
994
+ min-width: 0;
995
+ min-height: 36px;
996
+ margin: 0;
997
+ padding: var(--hc-space-1) var(--hc-space-2);
998
+ color: var(--hc-color-text-secondary);
999
+ font-family: var(--hc-font-body);
1000
+ font-size: var(--hc-font-size-xs);
1001
+ font-weight: var(--hc-font-weight-medium);
1002
+ font-style: normal;
1003
+ font-stretch: normal;
1004
+ /* As HCUI's font shorthand: no inherited numeric or other variants (tabular figures). */
1005
+ font-variant: normal;
1006
+ font-variation-settings: 'ROND' var(--hc-rond);
1007
+ line-height: normal;
1008
+ letter-spacing: normal;
1009
+ text-align: left;
1010
+ text-transform: none;
1011
+ background: transparent;
1012
+ border: 0;
1013
+ border-radius: var(--hc-radius-xs);
1014
+ cursor: pointer;
1015
+ -webkit-tap-highlight-color: transparent;
1016
+ }
1017
+ [data-hc-ds] .hc-ui-menu__item:hover:not(:disabled) { color: var(--hc-color-text-primary); background-color: var(--hc-color-bg-muted-2); }
1018
+ [data-hc-ds] .hc-ui-menu__item[aria-checked='true'] { color: var(--hc-color-text-primary); font-weight: var(--hc-font-weight-semibold); }
1019
+ [data-hc-ds] .hc-ui-menu__item[data-danger],
1020
+ [data-hc-ds] .hc-ui-menu__item[data-danger]:hover:not(:disabled) { color: var(--hc-color-danger); }
1021
+ [data-hc-ds] .hc-ui-menu__item:disabled { color: var(--hc-color-text-muted); cursor: default; }
1022
+ [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);
1025
+ }
1026
+ [data-hc-ds] .hc-ui-menu__text { min-width: 0; }
1027
+ [data-hc-ds] .hc-ui-menu__hint {
1028
+ display: block;
1029
+ margin-top: 1px;
1030
+ color: var(--hc-color-text-muted);
1031
+ font-size: var(--hc-font-size-2xs);
1032
+ font-weight: var(--hc-font-weight-medium);
1033
+ white-space: normal;
1034
+ }
1035
+ [data-hc-ds] .hc-ui-menu__icon,
1036
+ [data-hc-ds] .hc-ui-menu__check { display: inline-flex; flex: 0 0 auto; }
1037
+ [data-hc-ds] .hc-ui-menu__icon svg,
1038
+ [data-hc-ds] .hc-ui-menu__check svg { display: block; flex: 0 0 auto; }
1039
+ [data-hc-ds] .hc-ui-menu__separator { height: 1px; margin: var(--hc-space-1) 0; background-color: var(--hc-color-border); }
1040
+ [data-hc-ds] .hc-ui-menu__label {
1041
+ padding: var(--hc-space-1) var(--hc-space-2);
1042
+ color: var(--hc-color-text-muted);
1043
+ font-size: var(--hc-font-size-xs);
1044
+ font-weight: var(--hc-font-weight-regular);
1045
+ line-height: var(--hc-line-height-md);
1046
+ }
1047
+
1048
+ [data-hc-ds] .hc-ui-popover {
1049
+ z-index: 7;
1050
+ gap: var(--hc-space-2);
1051
+ width: 300px;
1052
+ max-height: min(460px, 70vh);
1053
+ padding: var(--hc-space-3);
1054
+ overflow-y: auto;
1055
+ color: var(--hc-color-text-primary);
1056
+ font-weight: var(--hc-font-weight-regular);
1057
+ line-height: var(--hc-line-height-md);
1058
+ background-color: var(--hc-color-bg-elevated);
1059
+ border-radius: var(--hc-radius-lg);
1060
+ box-shadow: var(--hc-shadow-float);
1061
+ }
1062
+
1063
+ /* Table — HCUI's desktop Meta table (`.meta-table`): 13px tabular figures, an 11px muted header
1064
+ with a line under it, 4px 8px cells and a line under each row, the muted-2 hover. */
1065
+ [data-hc-ds] .hc-ui-table {
1066
+ width: 100%;
1067
+ border-collapse: collapse;
1068
+ color: var(--hc-color-text-primary);
1069
+ font-size: var(--hc-font-size-sm);
1070
+ font-variant-numeric: tabular-nums;
1071
+ font-variation-settings: 'ROND' var(--hc-rond);
1072
+ }
1073
+ [data-hc-ds] .hc-ui-table :is(th, td) { box-sizing: border-box; }
1074
+ [data-hc-ds] .hc-ui-table thead th {
1075
+ padding: var(--hc-space-2);
1076
+ background: var(--hc-color-bg-surface);
1077
+ box-shadow: inset 0 -1px 0 var(--hc-color-border);
1078
+ color: var(--hc-color-text-muted);
1079
+ font-size: var(--hc-font-size-2xs);
1080
+ font-weight: var(--hc-font-weight-medium);
1081
+ white-space: nowrap;
1082
+ }
1083
+ [data-hc-ds] .hc-ui-table[data-sticky-header] thead th { position: sticky; top: var(--hc-table-sticky-top, 0px); z-index: 2; }
1084
+ [data-hc-ds] .hc-ui-table tbody tr { border-bottom: 1px solid var(--hc-color-border); }
1085
+ [data-hc-ds] .hc-ui-table tbody tr:hover { background: var(--hc-color-bg-muted-2); }
1086
+ [data-hc-ds] .hc-ui-table[data-clickable] tbody tr { cursor: pointer; }
1087
+ [data-hc-ds] .hc-ui-table tbody tr[data-selected] { background: var(--hc-color-bg-muted); }
1088
+ [data-hc-ds] .hc-ui-table tbody :is(th, td) { padding: var(--hc-space-1) var(--hc-space-2); font-weight: inherit; }
1089
+ [data-hc-ds] .hc-ui-table tbody td { white-space: nowrap; }
1090
+ [data-hc-ds] .hc-ui-table :is(th, td)[data-align='start'] { text-align: start; }
1091
+ [data-hc-ds] .hc-ui-table :is(th, td)[data-align='center'] { text-align: center; }
1092
+ [data-hc-ds] .hc-ui-table :is(th, td)[data-align='end'] { text-align: end; }
1093
+ [data-hc-ds] .hc-ui-table :is(th, td)[data-numeric] { font-variant-numeric: tabular-nums; }
1094
+ [data-hc-ds] .hc-ui-table :is(th, td)[data-tone='muted'] { color: var(--hc-color-text-muted); }
1095
+ [data-hc-ds] .hc-ui-table :is(th, td)[data-tone='secondary'] { color: var(--hc-color-text-secondary); }
1096
+ [data-hc-ds] :is(.hc-ui-table__sort, .hc-ui-table__row-button) {
1097
+ appearance: none;
1098
+ margin: 0;
1099
+ padding: 0;
1100
+ border: 0;
1101
+ background: transparent;
1102
+ color: inherit;
1103
+ font: inherit;
1104
+ cursor: pointer;
1105
+ -webkit-tap-highlight-color: transparent;
1106
+ }
1107
+ [data-hc-ds] .hc-ui-table__sort { display: inline-flex; align-items: center; gap: 2px; }
1108
+ [data-hc-ds] .hc-ui-table__sort:hover { color: var(--hc-color-text-primary); }
1109
+ [data-hc-ds] .hc-ui-table__sort > svg { flex-shrink: 0; }
1110
+ [data-hc-ds] .hc-ui-table__row-button {
1111
+ display: flex;
1112
+ align-items: center;
1113
+ gap: var(--hc-space-3);
1114
+ width: 100%;
1115
+ min-width: 0;
1116
+ text-align: start;
1117
+ }
1118
+ [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);
1121
+ }
1122
+
1123
+ /* PageHeader — HCUI's desktop page heading (`.desktop-page-heading`): 22px semibold title on a
1124
+ 27.5px line pulled up 4px (the font's inner space), a 40px row, actions at the end. */
1125
+ [data-hc-ds] .hc-ui-page-header {
1126
+ display: flex;
1127
+ flex-wrap: wrap;
1128
+ align-items: flex-start;
1129
+ justify-content: space-between;
1130
+ gap: var(--hc-space-4);
1131
+ box-sizing: border-box;
1132
+ min-width: 0;
1133
+ min-height: 40px;
1134
+ }
1135
+ [data-hc-ds] .hc-ui-page-header__title {
1136
+ min-width: 0;
1137
+ min-height: 27.5px;
1138
+ margin: -4px 0 0;
1139
+ color: var(--hc-color-text-primary);
1140
+ font: var(--hc-font-weight-semibold) 22px/27.5px var(--hc-font-display);
1141
+ /* The `font` shorthand resets `font-variation-settings`: ROND comes back right after it. */
1142
+ font-variation-settings: 'ROND' var(--hc-rond);
1143
+ letter-spacing: -0.02em;
1144
+ }
1145
+ [data-hc-ds] .hc-ui-page-header__count {
1146
+ margin-left: var(--hc-space-1);
1147
+ color: var(--hc-color-text-muted);
1148
+ font: var(--hc-font-size-sm) var(--hc-font-body);
1149
+ font-variation-settings: 'ROND' var(--hc-rond);
1150
+ font-variant-numeric: tabular-nums;
1151
+ letter-spacing: 0;
1152
+ }
1153
+ [data-hc-ds] .hc-ui-page-header__actions { display: flex; align-items: center; gap: var(--hc-space-2); }
1154
+ [data-hc-ds] .hc-ui-page-header[data-visually-hidden] {
1155
+ position: absolute;
1156
+ width: 1px;
1157
+ height: 1px;
1158
+ min-height: 0;
1159
+ margin: 0;
1160
+ overflow: hidden;
1161
+ clip-path: inset(50%);
1162
+ white-space: nowrap;
1163
+ }
1164
+
1165
+ /* PanelHeader — `bar`: HCUI's desktop context panel header (`.desktop-context__header`);
1166
+ `section`: HCUI's section heading (`section-title`, `.home-dash__head`). */
1167
+ [data-hc-ds] .hc-ui-panel-header {
1168
+ display: flex;
1169
+ align-items: center;
1170
+ box-sizing: border-box;
1171
+ min-width: 0;
1172
+ color: var(--hc-color-text-primary);
1173
+ font-variation-settings: 'ROND' var(--hc-rond);
1174
+ }
1175
+ [data-hc-ds] .hc-ui-panel-header[data-variant='bar'] {
1176
+ gap: var(--hc-space-2);
1177
+ min-height: 52px;
1178
+ padding: var(--hc-space-2) var(--hc-space-3) var(--hc-space-2) var(--hc-space-4);
1179
+ border-bottom: 1px solid var(--hc-color-border);
1180
+ }
1181
+ /* Zero specificity: the gap and a minimum height are the caller's layout (HCUI's desktop home uses 8px and 44px). */
1182
+ :where([data-hc-ds] .hc-ui-panel-header[data-variant='section']) { gap: var(--hc-space-3); }
1183
+ [data-hc-ds] :is(.hc-ui-panel-header__text, .hc-ui-panel-header__trail) { flex: 1; min-width: 0; }
1184
+ [data-hc-ds] .hc-ui-panel-header__text { display: grid; }
1185
+ [data-hc-ds] .hc-ui-panel-header__trail {
1186
+ display: flex;
1187
+ align-items: center;
1188
+ gap: var(--hc-space-1);
1189
+ color: var(--hc-color-text-muted);
1190
+ font-size: var(--hc-font-size-sm);
1191
+ }
1192
+ [data-hc-ds] .hc-ui-panel-header__trail > svg { flex-shrink: 0; }
1193
+ [data-hc-ds] .hc-ui-panel-header :is(p, h1, h2, h3, h4, h5, h6) { margin: 0; }
1194
+ [data-hc-ds] .hc-ui-panel-header[data-variant='bar'] .hc-ui-panel-header__title {
1195
+ overflow: hidden;
1196
+ color: var(--hc-color-text-primary);
1197
+ font-family: inherit;
1198
+ font-size: inherit;
1199
+ font-stretch: inherit;
1200
+ font-weight: var(--hc-font-weight-semibold);
1201
+ line-height: inherit;
1202
+ letter-spacing: inherit;
1203
+ text-overflow: ellipsis;
1204
+ white-space: nowrap;
1205
+ }
1206
+ [data-hc-ds] .hc-ui-panel-header[data-variant='bar'] .hc-ui-panel-header__text { font-size: var(--hc-font-size-sm); }
1207
+ [data-hc-ds] .hc-ui-panel-header[data-variant='bar'] .hc-ui-panel-header__subtitle { overflow: hidden; color: var(--hc-color-text-muted); font-size: var(--hc-font-size-xs); text-overflow: ellipsis; white-space: nowrap; }
1208
+ [data-hc-ds] .hc-ui-panel-header[data-variant='section'] .hc-ui-panel-header__title {
1209
+ color: var(--hc-color-text-primary);
1210
+ font-family: var(--hc-font-display);
1211
+ font-size: var(--hc-font-size-lg);
1212
+ font-weight: 680;
1213
+ font-stretch: 90%;
1214
+ line-height: var(--hc-line-height-lg);
1215
+ letter-spacing: var(--hc-letter-spacing-snug);
1216
+ text-transform: none;
1217
+ }
1218
+ [data-hc-ds] .hc-ui-panel-header[data-variant='section'] .hc-ui-panel-header__subtitle { color: var(--hc-color-text-muted); font-size: var(--hc-font-size-sm); }
1219
+ /* subtitleInline: the subtitle follows the title on its baseline and is cut with an ellipsis (HCUI's desktop home). */
1220
+ [data-hc-ds] .hc-ui-panel-header[data-subtitle='inline'] .hc-ui-panel-header__text { display: flex; align-items: baseline; gap: var(--hc-space-2); overflow: hidden; }
1221
+ [data-hc-ds] .hc-ui-panel-header[data-subtitle='inline'] .hc-ui-panel-header__text > :is(h1, h2, h3, h4, h5, h6) { flex: 0 0 auto; }
1222
+ [data-hc-ds] .hc-ui-panel-header[data-subtitle='inline'] .hc-ui-panel-header__subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1223
+ [data-hc-ds] .hc-ui-panel-header__eyebrow {
1224
+ overflow: hidden;
1225
+ color: var(--hc-color-text-muted);
1226
+ font-family: var(--hc-font-display);
1227
+ font-size: var(--hc-font-size-2xs);
1228
+ font-weight: 620;
1229
+ font-stretch: 125%;
1230
+ line-height: var(--hc-line-height-xs);
1231
+ letter-spacing: 0.07em;
1232
+ text-overflow: ellipsis;
1233
+ text-transform: uppercase;
1234
+ white-space: nowrap;
1235
+ }
1236
+ [data-hc-ds] .hc-ui-panel-header__icon {
1237
+ display: inline-flex;
1238
+ flex: 0 0 auto;
1239
+ align-items: center;
1240
+ justify-content: center;
1241
+ width: 36px;
1242
+ height: 36px;
1243
+ border-radius: var(--hc-radius-full);
1244
+ background-color: var(--hc-color-bg-muted);
1245
+ color: var(--hc-color-text-primary);
1246
+ }
1247
+ [data-hc-ds] .hc-ui-panel-header__actions { display: flex; flex-shrink: 0; align-items: center; gap: var(--hc-space-2); }
1248
+ [data-hc-ds] :is(.hc-ui-panel-header__step, .hc-ui-panel-header__close) {
1249
+ appearance: none;
1250
+ margin: 0;
1251
+ border: 0;
1252
+ background: transparent;
1253
+ color: var(--hc-color-text-secondary);
1254
+ cursor: pointer;
1255
+ -webkit-tap-highlight-color: transparent;
1256
+ }
1257
+ [data-hc-ds] .hc-ui-panel-header__step {
1258
+ flex-shrink: 0;
1259
+ margin-left: calc(-1 * var(--hc-space-2));
1260
+ padding: var(--hc-space-1) var(--hc-space-2);
1261
+ border-radius: var(--hc-radius-xs);
1262
+ font: inherit;
1263
+ }
1264
+ [data-hc-ds] .hc-ui-panel-header__close {
1265
+ display: grid;
1266
+ flex-shrink: 0;
1267
+ place-items: center;
1268
+ width: 32px;
1269
+ height: 32px;
1270
+ padding: 0;
1271
+ border-radius: var(--hc-radius-full);
1272
+ }
1273
+ [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
+ [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);
1277
+ }
1278
+
1279
+ /* ListRow — HCUI's `list-row` mixin: a full-width button row with a translucent veil on hover
1280
+ and press and the focus ring drawn inside, rounded as the group it sits in. The base rule has
1281
+ zero specificity: each list sets its own height, padding, gap, corners and font by class. */
1282
+ :where([data-hc-ds] .hc-ui-list-row) {
1283
+ appearance: none;
1284
+ position: relative;
1285
+ display: flex;
1286
+ align-items: center;
1287
+ gap: var(--hc-space-3);
1288
+ box-sizing: border-box;
1289
+ width: 100%;
1290
+ min-height: 56px;
1291
+ margin: 0;
1292
+ padding: var(--hc-space-2) var(--hc-space-4);
1293
+ border: 0;
1294
+ background: transparent;
1295
+ color: var(--hc-color-text-primary);
1296
+ font: inherit;
1297
+ font-variation-settings: 'ROND' var(--hc-rond);
1298
+ text-align: left;
1299
+ cursor: pointer;
1300
+ -webkit-tap-highlight-color: transparent;
1301
+ touch-action: manipulation;
1302
+ }
1303
+ [data-hc-ds] .hc-ui-list-row::after {
1304
+ content: '';
1305
+ position: absolute;
1306
+ inset: 0;
1307
+ border-radius: inherit;
1308
+ background-color: currentColor;
1309
+ opacity: 0;
1310
+ pointer-events: none;
1311
+ transition: opacity var(--hc-dur-short) var(--hc-ease-standard);
1312
+ }
1313
+ @media (hover: hover) {
1314
+ [data-hc-ds] .hc-ui-list-row:hover:not(:disabled)::after { opacity: 0.04; }
1315
+ }
1316
+ [data-hc-ds] .hc-ui-list-row:active:not(:disabled)::after { opacity: 0.07; }
1317
+ [data-hc-ds] .hc-ui-list-row:focus-visible {
1318
+ border-radius: var(--hc-radius-lg);
1319
+ outline: 2px solid var(--hc-focus-ring);
1320
+ outline-offset: var(--hc-focus-ring-offset, -2px);
1321
+ }
1322
+ @media (prefers-reduced-motion: reduce) {
1323
+ [data-hc-ds] .hc-ui-list-row::after { transition: none; }
1324
+ }
1325
+
1326
+ /* CommandPalette — HCUI's desktop ⌘K (.command-palette): 640px wide, at most 560px tall,
1327
+ 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). */
1329
+ [data-hc-ds] .hc-ui-command-palette {
1330
+ box-sizing: border-box;
1331
+ width: min(640px, calc(100vw - 32px));
1332
+ max-height: min(560px, calc(100dvh - 120px));
1333
+ margin: 12vh auto auto;
1334
+ padding: 0;
1335
+ overflow: hidden;
1336
+ color: var(--hc-color-text-primary);
1337
+ background: var(--hc-color-bg-surface);
1338
+ border: 1px solid var(--hc-color-border);
1339
+ border-radius: var(--hc-radius-lg);
1340
+ box-shadow: var(--hc-shadow-soft);
1341
+ font-family: var(--hc-font-body);
1342
+ font-size: var(--hc-font-size-md);
1343
+ font-variation-settings: 'ROND' var(--hc-rond);
1344
+ line-height: var(--hc-line-height-md);
1345
+ outline: none;
1346
+ }
1347
+ [data-hc-ds] .hc-ui-command-palette::backdrop { background: var(--hc-command-palette-backdrop, var(--hc-color-bg-overlay)); }
1348
+ [data-hc-ds] .hc-ui-command-palette__box { display: flex; flex-direction: column; max-height: inherit; }
1349
+ [data-hc-ds] .hc-ui-command-palette__field {
1350
+ display: flex;
1351
+ align-items: center;
1352
+ gap: var(--hc-space-3);
1353
+ padding: var(--hc-space-3) var(--hc-space-4);
1354
+ border-bottom: 1px solid var(--hc-color-border);
1355
+ color: var(--hc-color-text-secondary);
1356
+ }
1357
+ [data-hc-ds] .hc-ui-command-palette__field > svg { flex-shrink: 0; }
1358
+ /* The `font` shorthand, as HCUI's: weight 400 and normal line height; ROND comes back after it. The placeholder
1359
+ keeps the browser's color, as in HCUI. */
1360
+ [data-hc-ds] .hc-ui-command-palette__input {
1361
+ box-sizing: border-box;
1362
+ flex: 1;
1363
+ min-width: 0;
1364
+ height: 36px;
1365
+ margin: 0;
1366
+ padding: 1px 2px;
1367
+ border: 0;
1368
+ outline: 0;
1369
+ background: transparent;
1370
+ color: var(--hc-color-text-primary);
1371
+ font: var(--hc-font-size-md) var(--hc-font-body);
1372
+ font-variation-settings: 'ROND' var(--hc-rond);
1373
+ }
1374
+ [data-hc-ds] .hc-ui-command-palette__status { flex-shrink: 0; color: var(--hc-color-text-muted); font-size: var(--hc-font-size-xs); }
1375
+ [data-hc-ds] .hc-ui-command-palette__list { flex: 1; min-height: 0; overscroll-behavior: contain; }
1376
+ /* Zero specificity: `listClassName` can change the overflow and padding (HCUI's scroll-panel). */
1377
+ :where([data-hc-ds] .hc-ui-command-palette__list) { overflow-y: auto; padding: var(--hc-space-2); }
1378
+ [data-hc-ds] .hc-ui-command-palette__heading {
1379
+ margin: var(--hc-space-3) var(--hc-space-2) var(--hc-space-1);
1380
+ color: var(--hc-color-text-muted);
1381
+ font-size: var(--hc-font-size-2xs);
1382
+ font-weight: var(--hc-font-weight-semibold);
1383
+ text-transform: uppercase;
1384
+ letter-spacing: 0.04em;
1385
+ }
1386
+ [data-hc-ds] .hc-ui-command-palette__empty { margin: var(--hc-space-4); color: var(--hc-color-text-muted); font-size: var(--hc-font-size-sm); }
1387
+ [data-hc-ds] .hc-ui-command-palette__item {
1388
+ appearance: none;
1389
+ box-sizing: border-box;
1390
+ display: flex;
1391
+ align-items: center;
1392
+ gap: var(--hc-space-3);
1393
+ width: 100%;
1394
+ min-height: 44px;
1395
+ margin: 0;
1396
+ padding: var(--hc-space-1) var(--hc-space-2);
1397
+ border: 0;
1398
+ border-radius: var(--hc-radius-sm);
1399
+ background: transparent;
1400
+ color: inherit;
1401
+ font: inherit;
1402
+ text-align: left;
1403
+ cursor: pointer;
1404
+ -webkit-tap-highlight-color: transparent;
1405
+ }
1406
+ [data-hc-ds] .hc-ui-command-palette__item[aria-selected='true'] { background: var(--hc-color-bg-muted); }
1407
+ [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);
1410
+ }
1411
+ [data-hc-ds] .hc-ui-command-palette__icon {
1412
+ display: grid;
1413
+ flex-shrink: 0;
1414
+ place-items: center;
1415
+ width: 32px;
1416
+ height: 32px;
1417
+ color: var(--hc-color-text-secondary);
1418
+ }
1419
+ [data-hc-ds] .hc-ui-command-palette__text { display: grid; flex: 1; min-width: 0; }
1420
+ [data-hc-ds] :is(.hc-ui-command-palette__label, .hc-ui-command-palette__detail) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1421
+ [data-hc-ds] .hc-ui-command-palette__label { font-size: var(--hc-font-size-sm); font-weight: var(--hc-font-weight-medium); }
1422
+ [data-hc-ds] .hc-ui-command-palette__detail { color: var(--hc-color-text-muted); font-size: var(--hc-font-size-2xs); }
1423
+ /* The `font` shorthand, as HCUI's: normal weight and line height; ROND comes back after it. */
1424
+ [data-hc-ds] .hc-ui-command-palette__kbd {
1425
+ flex-shrink: 0;
1426
+ padding: 1px var(--hc-space-1);
1427
+ border: 1px solid var(--hc-color-border);
1428
+ border-radius: var(--hc-radius-xs);
1429
+ color: var(--hc-color-text-muted);
1430
+ font: var(--hc-font-size-2xs) var(--hc-font-mono);
1431
+ font-variation-settings: 'ROND' var(--hc-rond);
1432
+ white-space: nowrap;
1433
+ }
1434
+ [data-hc-ds] .hc-ui-command-palette__footer {
1435
+ display: flex;
1436
+ flex-wrap: wrap;
1437
+ gap: var(--hc-space-4);
1438
+ padding: var(--hc-space-2) var(--hc-space-4);
1439
+ border-top: 1px solid var(--hc-color-border);
1440
+ color: var(--hc-color-text-muted);
1441
+ font-size: var(--hc-font-size-2xs);
1442
+ }
1443
+ [data-hc-ds] .hc-ui-command-palette__footer .hc-ui-command-palette__kbd { margin-right: 2px; }
1444
+
1445
+ /* ==========================================================================
1446
+ HeroClix game pieces — HCUI's src/heroclix-ui, as it is. Colors that stay the
1447
+ same in both themes (the dial paper, the dark outlines, the translucent rings
1448
+ of the symbols) are HeroClix tokens; black symbols turn white or gray through
1449
+ the `filter-symbol-*` tokens.
1450
+ ========================================================================== */
1451
+
1452
+ /* Border-box sizing, as HCUI's global rule, inside every piece. */
1453
+ [data-hc-ds] :is(.hc-ui-mini-dial, .hc-ui-power-icon, .hc-ui-special-icon, .hc-ui-equipment-icon, .hc-ui-combat-dial),
1454
+ [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),
1455
+ [data-hc-ds] .hc-ui-combat-dial::before,
1456
+ [data-hc-ds] .hc-ui-combat-dial::after { box-sizing: border-box; }
1457
+
1458
+ /* MiniDialView — HCUI `.mini-dial`. The cell size is `--hc-mini-dial-cell` (7px),
1459
+ set on the dial or any ancestor; the top margin has zero specificity. */
1460
+ :where([data-hc-ds] .hc-ui-mini-dial) { margin-top: 5px; }
1461
+ [data-hc-ds] .hc-ui-mini-dial {
1462
+ display: grid;
1463
+ grid-auto-rows: var(--hc-mini-dial-cell, 7px);
1464
+ gap: 1px;
1465
+ width: fit-content;
1466
+ max-width: 100%;
1467
+ padding: 2px;
1468
+ overflow: hidden;
1469
+ border-radius: 3px;
1470
+ background-color: var(--hc-color-bg-muted);
1471
+ }
1472
+ [data-hc-ds] .hc-ui-mini-dial__cell { display: block; border-radius: 1.5px; }
1473
+ /* In play: past clicks fade and the current one is outlined. */
1474
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-past] { opacity: .22; }
1475
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-round] { border-radius: 50%; }
1476
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-now] { outline: 1.5px solid var(--hc-color-danger); }
1477
+ /* No power: the paper. Special power: the paper with a dark 1px ring (thicker
1478
+ rings swallow the paper in 5–7px cells). Both themes. */
1479
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-empty] { background-color: var(--hc-color-dial-paper); }
1480
+ [data-hc-ds] .hc-ui-mini-dial__cell[data-special] {
1481
+ background-color: var(--hc-color-dial-paper);
1482
+ box-shadow: inset 0 0 0 1px var(--hc-color-dial-outline);
1483
+ }
1484
+
1485
+ /* PowerIconView and StatGlyphView — HCUI `.power-icon` and `.stat-glyph`. */
1486
+ [data-hc-ds] .hc-ui-power-icon {
1487
+ display: inline-flex;
1488
+ align-items: center;
1489
+ justify-content: center;
1490
+ flex-shrink: 0;
1491
+ border-radius: var(--hc-radius-full);
1492
+ box-shadow: inset 0 0 0 1px var(--hc-color-symbol-outline);
1493
+ }
1494
+ [data-hc-ds] .hc-ui-power-icon__glyph {
1495
+ display: block;
1496
+ width: 60%;
1497
+ height: 60%;
1498
+ object-fit: contain;
1499
+ }
1500
+ /* The symbol is black; inverted it turns white, for contrast on dark colors. */
1501
+ [data-hc-ds] .hc-ui-power-icon__glyph[data-invert] { filter: var(--hc-filter-symbol-light); }
1502
+ /* The black symbol turns neutral gray (dial legend). */
1503
+ [data-hc-ds] .hc-ui-stat-glyph {
1504
+ display: inline-block;
1505
+ flex-shrink: 0;
1506
+ object-fit: contain;
1507
+ filter: var(--hc-filter-symbol-muted);
1508
+ }
1509
+
1510
+ /* SpecialIconView — HCUI `.sp-icon`. */
1511
+ [data-hc-ds] .hc-ui-special-icon {
1512
+ position: relative;
1513
+ display: inline-flex;
1514
+ flex-shrink: 0;
1515
+ box-sizing: border-box;
1516
+ border: 1px solid var(--hc-color-symbol-outline-strong);
1517
+ }
1518
+ [data-hc-ds] :is(.hc-ui-special-icon__bg, .hc-ui-special-icon__glyph) {
1519
+ position: absolute;
1520
+ inset: 0;
1521
+ box-sizing: border-box;
1522
+ width: 100%;
1523
+ height: 100%;
1524
+ object-fit: contain;
1525
+ }
1526
+ /* Keeps the circle's edge visible even on white. */
1527
+ [data-hc-ds] .hc-ui-special-icon__bg {
1528
+ border-radius: var(--hc-radius-full);
1529
+ box-shadow: inset 0 0 0 1.5px var(--hc-color-symbol-outline-soft);
1530
+ }
1531
+ [data-hc-ds] .hc-ui-special-icon__glyph { padding: 22%; }
1532
+
1533
+ /* EquipmentIcon — HCUI `.equip-icon`: a white diamond on the purple power. */
1534
+ [data-hc-ds] .hc-ui-equipment-icon {
1535
+ display: inline-flex;
1536
+ align-items: center;
1537
+ justify-content: center;
1538
+ flex-shrink: 0;
1539
+ border-radius: var(--hc-radius-full);
1540
+ background-color: var(--hc-power-purple);
1541
+ box-shadow: inset 0 0 0 1px var(--hc-color-symbol-outline);
1542
+ }
1543
+ [data-hc-ds] .hc-ui-equipment-icon path { fill: var(--hc-color-symbol-light); }
1544
+
1545
+ /* AvatarView — HCUI `img.avatar-os`, `img.avatar-sq`, `img.avatar-sq--fit` and
1546
+ `img.default-avatar--fallback`. Without `size` the caller's class sizes and crops
1547
+ it (the defaults below have zero specificity); the shapes win over that class. */
1548
+ :where([data-hc-ds] .hc-ui-avatar) { display: block; box-sizing: border-box; max-width: 100%; }
1549
+ [data-hc-ds] .hc-ui-avatar[data-sized] {
1550
+ width: var(--hc-avatar-size);
1551
+ height: var(--hc-avatar-size);
1552
+ object-fit: cover;
1553
+ }
1554
+ [data-hc-ds] .hc-ui-avatar[data-sized][data-shape='round'] { border-radius: 50%; }
1555
+ /* One-shot: the landscape proportion of the search (avatar width, height ÷ 1.42, proportional corners). */
1556
+ [data-hc-ds] .hc-ui-avatar[data-shape='card'] {
1557
+ height: auto;
1558
+ aspect-ratio: 1.42 / 1;
1559
+ border-radius: 13.6% / 19.4%;
1560
+ object-fit: cover;
1561
+ }
1562
+ /* Maps fill the square; terrain markers show whole, fitted by width or height. */
1563
+ [data-hc-ds] .hc-ui-avatar:is([data-shape='square'], [data-shape='square-fit']) {
1564
+ aspect-ratio: 1 / 1;
1565
+ border-radius: 21%;
1566
+ object-fit: cover;
1567
+ }
1568
+ [data-hc-ds] .hc-ui-avatar[data-shape='square-fit'] { object-fit: contain; background-color: var(--hc-color-bg-muted); }
1569
+ [data-hc-ds] .hc-ui-avatar[data-fallback] { background-color: var(--hc-color-bg-muted); }
1570
+
1571
+ /* CombatDialView — HCUI `.combat-dial`. `--hc-dial-bleed` (and `--hc-dial-bleed-end`)
1572
+ is the container's padding, so the tracks run to the panel's edge;
1573
+ `--hc-dial-surface` is the fill behind the sticky legend. */
1574
+ [data-hc-ds] .hc-ui-combat-dial,
1575
+ [data-hc-ds] .hc-ui-combat-dial * { font-variation-settings: 'ROND' var(--hc-rond); }
1576
+ [data-hc-ds] .hc-ui-combat-dial__header {
1577
+ display: flex;
1578
+ flex-direction: column;
1579
+ gap: var(--hc-space-3);
1580
+ }
1581
+ [data-hc-ds] .hc-ui-combat-dial__header-top {
1582
+ display: flex;
1583
+ align-items: center;
1584
+ justify-content: space-between;
1585
+ flex-wrap: wrap;
1586
+ gap: var(--hc-space-3);
1587
+ }
1588
+ /* HCUI's `eyebrow`. */
1589
+ [data-hc-ds] :is(.hc-ui-combat-dial__label, .hc-ui-combat-dial__status) {
1590
+ font-family: var(--hc-font-display);
1591
+ font-weight: 620;
1592
+ font-stretch: 125%;
1593
+ font-size: var(--hc-font-size-2xs);
1594
+ line-height: var(--hc-line-height-xs);
1595
+ letter-spacing: 0.07em;
1596
+ text-transform: uppercase;
1597
+ }
1598
+ [data-hc-ds] .hc-ui-combat-dial__label { color: var(--hc-color-text-muted); letter-spacing: var(--hc-letter-spacing-wide); }
1599
+ [data-hc-ds] .hc-ui-combat-dial__status {
1600
+ display: inline-flex;
1601
+ align-items: center;
1602
+ gap: var(--hc-space-2);
1603
+ font-weight: var(--hc-font-weight-semibold);
1604
+ color: var(--hc-color-text-secondary);
1605
+ }
1606
+ [data-hc-ds] .hc-ui-combat-dial__status-ko { color: var(--hc-color-danger); }
1607
+
1608
+ /* Point value chips, on one line that scrolls sideways. */
1609
+ [data-hc-ds] .hc-ui-combat-dial__points {
1610
+ display: flex;
1611
+ align-items: center;
1612
+ flex-wrap: nowrap;
1613
+ gap: var(--hc-space-2);
1614
+ margin-inline: calc(var(--hc-dial-bleed, 0px) * -1) calc(var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px)) * -1);
1615
+ padding: var(--hc-space-2) 0;
1616
+ /* Condensed as HCUI's numbers (its `__points` rule); the chips inherit it. */
1617
+ font-stretch: 86%;
1618
+ -webkit-overflow-scrolling: touch;
1619
+ }
1620
+ [data-hc-ds] .hc-ui-combat-dial__points > .hc-ui-combat-dial__chip:first-child { margin-left: var(--hc-dial-bleed, 0px); }
1621
+ [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)); }
1622
+ [data-hc-ds] .hc-ui-combat-dial__chip {
1623
+ appearance: none;
1624
+ position: relative;
1625
+ display: inline-flex;
1626
+ align-items: center;
1627
+ gap: var(--hc-space-2);
1628
+ min-height: var(--hc-control-height-chip);
1629
+ margin: 0;
1630
+ padding: 0 14px;
1631
+ border: none;
1632
+ border-radius: var(--hc-radius-full);
1633
+ background-color: var(--hc-color-bg-surface);
1634
+ color: var(--hc-color-text-primary);
1635
+ font: inherit;
1636
+ font-family: var(--hc-font-body);
1637
+ font-weight: var(--hc-font-weight-semibold);
1638
+ font-size: var(--hc-font-size-sm);
1639
+ font-variation-settings: 'ROND' var(--hc-rond);
1640
+ white-space: nowrap;
1641
+ box-shadow: inset 0 0 0 1px var(--hc-color-border-strong);
1642
+ cursor: pointer;
1643
+ -webkit-tap-highlight-color: transparent;
1644
+ touch-action: manipulation;
1645
+ transition-property: transform, background-color, box-shadow, color, opacity;
1646
+ transition-duration: var(--hc-dur-short);
1647
+ transition-timing-function: var(--hc-ease-standard);
1648
+ }
1649
+ /* HCUI's state layer: a veil of the text color on hover (with a mouse) and press. */
1650
+ [data-hc-ds] .hc-ui-combat-dial__chip::after {
1651
+ content: '';
1652
+ position: absolute;
1653
+ inset: 0;
1654
+ border-radius: inherit;
1655
+ background-color: currentColor;
1656
+ opacity: 0;
1657
+ pointer-events: none;
1658
+ transition: opacity var(--hc-dur-short) var(--hc-ease-standard);
1659
+ }
1660
+ @media (hover: hover) {
1661
+ [data-hc-ds] .hc-ui-combat-dial__chip:hover:not(:disabled)::after { opacity: 0.05; }
1662
+ }
1663
+ [data-hc-ds] .hc-ui-combat-dial__chip:active:not(:disabled)::after { opacity: 0.09; }
1664
+ [data-hc-ds] .hc-ui-combat-dial__chip:hover:not(:disabled) { background-color: var(--hc-color-bg-muted); }
1665
+ [data-hc-ds] .hc-ui-combat-dial__chip:active:not(:disabled) { transform: scale(0.97); }
1666
+ [data-hc-ds] .hc-ui-combat-dial__chip:disabled { cursor: default; opacity: 0.75; }
1667
+ [data-hc-ds] .hc-ui-combat-dial__chip[aria-pressed='true'] {
1668
+ background-color: var(--hc-color-bg-muted);
1669
+ box-shadow: inset 0 0 0 1.5px var(--hc-dial-chip-color, var(--hc-color-success));
1670
+ }
1671
+ [data-hc-ds] .hc-ui-combat-dial__chip-bar {
1672
+ display: inline-block;
1673
+ flex-shrink: 0;
1674
+ width: 2px;
1675
+ height: 16px;
1676
+ border-radius: var(--hc-radius-full);
1677
+ background-color: var(--hc-dial-chip-color, var(--hc-color-success));
1678
+ }
1679
+ [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); }
1680
+ [data-hc-ds] .hc-ui-combat-dial__chip-clicks { opacity: 0.8; }
1681
+ [data-hc-ds] .hc-ui-combat-dial__chip[aria-pressed='true'] .hc-ui-combat-dial__chip-clicks { opacity: 0.92; }
1682
+ [data-hc-ds] .hc-ui-combat-dial__chip[aria-pressed='true'] .hc-ui-combat-dial__chip-value { color: var(--hc-color-text-primary); }
1683
+
1684
+ /* The dial track: one row that scrolls sideways (hidden scrollbar). */
1685
+ [data-hc-ds] .hc-ui-combat-dial__grid-wrap {
1686
+ position: relative;
1687
+ margin-inline: calc(var(--hc-dial-bleed, 0px) * -1) calc(var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px)) * -1);
1688
+ padding: var(--hc-space-4) 0;
1689
+ }
1690
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap) { overflow-x: auto; scrollbar-width: none; }
1691
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar { display: none; }
1692
+ /* With a mouse on HCUI's desktop (960px and up) the tracks show a thin 8px bar,
1693
+ whose thumb appears while the pointer is over the track or focus is inside it;
1694
+ the negative margin gives the bar's height back to the layout. */
1695
+ @media (min-width: 960px) and (hover: hover) and (forced-colors: none) {
1696
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap) {
1697
+ overflow: scroll hidden;
1698
+ margin-block-end: -8px;
1699
+ scrollbar-width: auto;
1700
+ }
1701
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar { display: block; width: 8px; height: 8px; }
1702
+ [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; }
1703
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar-thumb {
1704
+ min-width: var(--hc-space-8);
1705
+ border: 2px solid transparent;
1706
+ border-radius: var(--hc-radius-full);
1707
+ background: transparent padding-box;
1708
+ }
1709
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap):is(:hover, :has(:focus-visible))::-webkit-scrollbar-thumb {
1710
+ background-color: color-mix(in srgb, var(--hc-color-text-primary) 26%, transparent);
1711
+ }
1712
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap)::-webkit-scrollbar-thumb:is(:hover, :active) {
1713
+ border-width: 1px;
1714
+ background-color: color-mix(in srgb, var(--hc-color-text-primary) 46%, transparent);
1715
+ }
1716
+ /* Without ::-webkit-scrollbar (Firefox) the system's thin bar takes no room to give back. */
1717
+ @supports not selector(::-webkit-scrollbar) {
1718
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap) {
1719
+ margin-block-end: 0;
1720
+ scrollbar-width: thin;
1721
+ scrollbar-color: transparent transparent;
1722
+ }
1723
+ [data-hc-ds] :is(.hc-ui-combat-dial__points, .hc-ui-combat-dial__grid-wrap):is(:hover, :has(:focus-visible)) {
1724
+ scrollbar-color: color-mix(in srgb, var(--hc-color-text-primary) 26%, transparent) transparent;
1725
+ }
1726
+ }
1727
+ }
1728
+ [data-hc-ds] .hc-ui-combat-dial__grid {
1729
+ display: flex;
1730
+ align-items: stretch;
1731
+ gap: 8px;
1732
+ min-width: max-content;
1733
+ padding-right: var(--hc-dial-bleed-end, var(--hc-dial-bleed, 0px));
1734
+ }
1735
+ [data-hc-ds] .hc-ui-combat-dial__col {
1736
+ position: relative;
1737
+ display: grid;
1738
+ grid-template-rows: repeat(5, 40px);
1739
+ gap: 8px;
1740
+ margin: 0;
1741
+ padding: 0;
1742
+ border: none;
1743
+ border-radius: 0;
1744
+ background: transparent;
1745
+ color: inherit;
1746
+ font: inherit;
1747
+ cursor: pointer;
1748
+ -webkit-tap-highlight-color: transparent;
1749
+ touch-action: manipulation;
1750
+ transition: transform var(--hc-transition-fast), box-shadow var(--hc-transition-fast);
1751
+ }
1752
+ /* The legend stays put and covers the bleed: nothing shows to its left. */
1753
+ [data-hc-ds] .hc-ui-combat-dial__col[data-kind='legend'] {
1754
+ position: sticky;
1755
+ left: 0;
1756
+ z-index: 4;
1757
+ padding-left: var(--hc-dial-bleed, 0px);
1758
+ padding-right: var(--hc-space-2);
1759
+ color: var(--hc-color-text-secondary);
1760
+ background: var(--hc-dial-surface, var(--hc-color-bg-surface));
1761
+ }
1762
+ [data-hc-ds] .hc-ui-combat-dial__col[data-kind='click']:hover { background-color: var(--hc-color-bg-muted-2); }
1763
+ /* Clicks outside the selected point value fade. */
1764
+ [data-hc-ds] .hc-ui-combat-dial__col[data-dimmed] { opacity: 0.32; filter: saturate(0.7); }
1765
+ /* Starting line: a colored bar at the left edge of the point value's first click. */
1766
+ [data-hc-ds] .hc-ui-combat-dial__col[data-start]::before {
1767
+ content: '';
1768
+ position: absolute;
1769
+ top: 48px;
1770
+ bottom: 0;
1771
+ left: -5px;
1772
+ width: 2px;
1773
+ border-radius: 2px;
1774
+ background-color: var(--hc-dial-start-color, var(--hc-color-success));
1775
+ }
1776
+ [data-hc-ds] .hc-ui-combat-dial__col[data-current] {
1777
+ background-color: var(--hc-color-bg-muted-2);
1778
+ box-shadow: inset 0 3px 0 0 var(--hc-color-accent);
1779
+ }
1780
+ [data-hc-ds] .hc-ui-combat-dial__col[data-kind='ko'] { color: var(--hc-color-danger); }
1781
+ [data-hc-ds] .hc-ui-combat-dial[data-static] .hc-ui-combat-dial__col[data-kind='click'] { cursor: default; }
1782
+ [data-hc-ds] .hc-ui-combat-dial__cell {
1783
+ appearance: none;
1784
+ display: flex;
1785
+ align-items: center;
1786
+ justify-content: center;
1787
+ width: 40px;
1788
+ height: 40px;
1789
+ margin: 0;
1790
+ padding: 0;
1791
+ border: none;
1792
+ border-radius: 2px;
1793
+ background: transparent;
1794
+ color: inherit;
1795
+ font: inherit;
1796
+ cursor: pointer;
1797
+ -webkit-tap-highlight-color: transparent;
1798
+ touch-action: manipulation;
1799
+ }
1800
+ [data-hc-ds] .hc-ui-combat-dial__cell:focus-visible {
1801
+ outline: 2px solid var(--hc-focus-ring);
1802
+ outline-offset: var(--hc-focus-ring-offset, 2px);
1803
+ }
1804
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-round] { border-radius: 50%; }
1805
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='legend'] { color: var(--hc-color-text-secondary); }
1806
+ /* HCUI's `mono-value`. */
1807
+ [data-hc-ds] :is(.hc-ui-combat-dial__cell:is([data-kind='number'], [data-kind='value']), .hc-ui-combat-dial__range) {
1808
+ font-family: var(--hc-font-display);
1809
+ font-weight: 640;
1810
+ font-stretch: 86%;
1811
+ font-variant-numeric: tabular-nums;
1812
+ }
1813
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='number'] { font-size: var(--hc-font-size-sm); color: var(--hc-color-text-muted); }
1814
+ [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); }
1815
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='value'] {
1816
+ font-size: var(--hc-font-size-md);
1817
+ font-weight: var(--hc-font-weight-bold);
1818
+ color: var(--hc-color-text-primary);
1819
+ background-color: transparent;
1820
+ }
1821
+ /* Special powers: a dark outline, as on the printed card. The cell is the paper in
1822
+ both themes, so the fixed outline shows in light and dark. */
1823
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-outlined] { box-shadow: inset 0 0 0 2px var(--hc-color-dial-outline); }
1824
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-kind='ko'] {
1825
+ font-family: var(--hc-font-display);
1826
+ font-weight: 620;
1827
+ font-stretch: 125%;
1828
+ font-size: var(--hc-font-size-sm);
1829
+ line-height: var(--hc-line-height-xs);
1830
+ letter-spacing: 0.07em;
1831
+ text-transform: uppercase;
1832
+ color: var(--hc-color-danger);
1833
+ }
1834
+ /* Cells with a tip grow their hit area by half the gap on each side (about 48px),
1835
+ without changing their 40px look; neighbors split the gap. */
1836
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-tip] { position: relative; cursor: pointer; }
1837
+ [data-hc-ds] .hc-ui-combat-dial__cell[data-tip]::after { content: ''; position: absolute; inset: -4px; }
1838
+ [data-hc-ds] .hc-ui-combat-dial__special-icon { width: 20px; height: 20px; object-fit: contain; }
1839
+ /* Range (number) and targets (bolts) in the top legend cell. */
1840
+ [data-hc-ds] .hc-ui-combat-dial__rangebox { flex-direction: column; gap: 1px; }
1841
+ [data-hc-ds] .hc-ui-combat-dial__range { font-size: var(--hc-font-size-md); line-height: 1; color: var(--hc-color-text-primary); }
1842
+ [data-hc-ds] .hc-ui-combat-dial__bolts { display: inline-flex; align-items: center; gap: 2px; }
1843
+ /* `max-width` lets the bolts squeeze into the printed card's 28px legend, as in HCUI. */
1844
+ [data-hc-ds] .hc-ui-combat-dial__bolt { width: auto; max-width: 100%; height: 16px; object-fit: contain; filter: var(--hc-filter-symbol-muted); }
1845
+
1846
+ /* `presentation="printed"`: the physical card's dial, at HCUnits' measures (20px
1847
+ cells, 23px between clicks, 24px between rows); the white legend sits on the
1848
+ card's dark window. Its numbers keep HCUI's `font` shorthand, without ROND. */
1849
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__grid-wrap {
1850
+ display: flex;
1851
+ flex-direction: column;
1852
+ gap: 4px;
1853
+ margin-block-end: 0;
1854
+ padding: 0;
1855
+ overflow: visible;
1856
+ }
1857
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__grid { gap: 3px; min-width: 0; }
1858
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col { grid-template-rows: repeat(5, 20px); gap: 4px; }
1859
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='click']:hover { background: none; }
1860
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='legend'] {
1861
+ position: static;
1862
+ width: 28px;
1863
+ padding: 0;
1864
+ background: none;
1865
+ color: var(--hc-color-dial-legend-printed);
1866
+ }
1867
+ [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; }
1868
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-current] { background: none; box-shadow: none; }
1869
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-dimmed] { opacity: .45; filter: none; }
1870
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell { width: 20px; height: 20px; border-radius: 0; }
1871
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-round] { border-radius: 50%; }
1872
+ [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); }
1873
+ /* Condensed, so two digits fit the 20px cell; no tracking, so they stay centered. */
1874
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-kind='value'] {
1875
+ font: 600 17px/1 var(--hc-font-body);
1876
+ font-stretch: 50%;
1877
+ letter-spacing: 0;
1878
+ font-variant-numeric: tabular-nums;
1879
+ }
1880
+ [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); }
1881
+ /* Top numbers and KO in red with a paper outline, as on the card. */
1882
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell:is([data-kind='number'], [data-kind='ko']) {
1883
+ color: var(--hc-color-dial-number-printed);
1884
+ background: none;
1885
+ -webkit-text-stroke: 3px var(--hc-color-dial-paper);
1886
+ paint-order: stroke fill;
1887
+ font-family: var(--hc-font-body);
1888
+ font-stretch: 75%;
1889
+ }
1890
+ [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; }
1891
+ [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; }
1892
+ /* Only play marks the click: a red circle over the number, like a pen on the card. */
1893
+ [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'] {
1894
+ color: var(--hc-color-dial-number-printed);
1895
+ background: var(--hc-color-dial-paper);
1896
+ -webkit-text-stroke: 0;
1897
+ border-radius: 50%;
1898
+ box-shadow: 0 0 0 2px var(--hc-color-dial-number-printed);
1899
+ }
1900
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__cell[data-tip]::after { inset: -2px -1.5px; }
1901
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__rangebox { flex-direction: row; gap: 0; align-items: center; }
1902
+ [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); }
1903
+ [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); }
1904
+ /* The legend symbols are 18px tall at their own width, at most 26px, and white. */
1905
+ [data-hc-ds] .hc-ui-combat-dial[data-presentation='printed'] .hc-ui-combat-dial__col[data-kind='legend'] .hc-ui-stat-glyph {
1906
+ width: auto;
1907
+ max-width: 26px;
1908
+ height: 18px;
1909
+ filter: var(--hc-filter-symbol-light);
1910
+ }
1911
+
1912
+ @media (prefers-reduced-motion: reduce) {
1913
+ [data-hc-ds] :is(.hc-ui-combat-dial__chip, .hc-ui-combat-dial__chip::after, .hc-ui-combat-dial__col) { transition: none; }
1914
+ [data-hc-ds] .hc-ui-combat-dial__chip:active:not(:disabled) { transform: none; }
1915
+ }
1916
+
1917
+ /* PhysicalCardView — HCUI `.physical-cards`: the printed card in HCUnits' format,
1918
+ 375×525 px with absolute positions, scaled to the panel's width. HCUI's fonts
1919
+ (Google Sans Flex, condensed in the titles) with the original card's sizes and
1920
+ positions. The paper and ink follow the theme (`color-card-*`, `filter-card-*`,
1921
+ `blend-card-*`, `opacity-card-*`); seals, dial cells and symbols keep their
1922
+ official colors; the black and white printed parts are the same in both themes. */
1923
+ [data-hc-ds] .hc-ui-physical-cards {
1924
+ display: flex;
1925
+ flex-wrap: wrap;
1926
+ justify-content: center;
1927
+ gap: 16px;
1928
+ width: 100%;
1929
+ min-width: 0;
1930
+ grid-column: 1 / -1;
1931
+ }
1932
+ /* HCUI's global rules the card counts on, inside the card only and at zero
1933
+ specificity: border-box, block images and SVGs that never pass their box, no
1934
+ heading or paragraph margin, words that break only when they overflow, the
1935
+ slightly condensed titles. Upright letters, as on the printed card: the card
1936
+ sets `--hc-rond` to 0, so the printed dial inside reads it too. */
1937
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus),
1938
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus) *,
1939
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus) *::before,
1940
+ [data-hc-ds] :is(.hc-ui-physical-cards, .hc-ui-card-focus) *::after { box-sizing: border-box; }
1941
+ :where([data-hc-ds] .hc-ui-physical-card) :is(img, svg) { display: block; max-width: 100%; }
1942
+ :where([data-hc-ds] .hc-ui-physical-card) :is(h2, h3, p) { margin: 0; }
1943
+ :where([data-hc-ds] .hc-ui-physical-card) :is(p, span, h2, h3) { overflow-wrap: break-word; }
1944
+ :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%; }
1945
+ [data-hc-ds] .hc-ui-physical-card { --hc-rond: 0; }
1946
+ [data-hc-ds] .hc-ui-physical-card,
1947
+ [data-hc-ds] .hc-ui-physical-card * { font-variation-settings: 'ROND' var(--hc-rond); }
1948
+
1949
+ [data-hc-ds] .hc-ui-physical-card-slot {
1950
+ flex: none;
1951
+ width: calc(var(--hc-card-width) * var(--hc-card-scale));
1952
+ height: calc(var(--hc-card-height) * var(--hc-card-scale));
1953
+ }
1954
+ [data-hc-ds] .hc-ui-physical-card-tilt { width: 100%; height: 100%; }
1955
+ [data-hc-ds] .hc-ui-physical-card {
1956
+ position: relative;
1957
+ width: var(--hc-card-width);
1958
+ height: var(--hc-card-height);
1959
+ overflow: hidden;
1960
+ transform: scale(var(--hc-card-scale));
1961
+ transform-origin: top left;
1962
+ border-radius: 15px;
1963
+ background: var(--hc-color-card-paper);
1964
+ box-shadow: var(--hc-color-card-edge) 0 0 2px;
1965
+ color: var(--hc-color-card-ink);
1966
+ font-family: var(--hc-font-body);
1967
+ text-align: left;
1968
+ user-select: text;
1969
+ }
1970
+ [data-hc-ds] .hc-ui-physical-card img { user-select: none; }
1971
+ /* Paper grain: gray noise in tiles, static, no blur. Under the dial (z-index 2),
1972
+ so the official cell colors do not change. The SVG namespace is percent-encoded:
1973
+ the package source carries no web address. */
1974
+ [data-hc-ds] .hc-ui-physical-card::after {
1975
+ content: '';
1976
+ position: absolute;
1977
+ inset: 0;
1978
+ z-index: 1;
1979
+ pointer-events: none;
1980
+ 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;
1981
+ opacity: var(--hc-opacity-card-grain);
1982
+ mix-blend-mode: var(--hc-blend-card-grain);
1983
+ }
1984
+ /* The backgrounds come from the app, as gray images: the filter takes them to the
1985
+ paper's tone in each theme, with no seam where the image ends. */
1986
+ [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; }
1987
+ [data-hc-ds] .hc-ui-physical-card__bg[data-side='front'] { top: 0; width: 375px; filter: var(--hc-filter-card-background); }
1988
+ [data-hc-ds] .hc-ui-physical-card__bg[data-side='back'] { bottom: 75px; width: 375px; filter: var(--hc-filter-card-background); }
1989
+ [data-hc-ds] .hc-ui-physical-card__legacy { top: 0; width: 375px; opacity: 0.2; filter: saturate(0.6); }
1990
+ [data-hc-ds] .hc-ui-physical-card__rarity { left: auto; right: 0; top: 0; width: 80px; }
1991
+ [data-hc-ds] .hc-ui-physical-card__dial-bg { bottom: 0; width: 100%; filter: var(--hc-filter-card-background); }
1992
+ [data-hc-ds] .hc-ui-physical-card__team-up { position: absolute; inset: 0 0 auto; height: 70px; background: var(--hc-color-card-team-up); }
1993
+
1994
+ /* Header: name and team abilities, with the keywords or the object's type below. */
1995
+ [data-hc-ds] .hc-ui-physical-card__header { position: absolute; left: 10px; top: 2px; width: 305px; }
1996
+ [data-hc-ds] .hc-ui-physical-card__header[data-team-up] { --hc-color-card-ink: var(--hc-color-card-print-white); }
1997
+ [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); }
1998
+ [data-hc-ds] .hc-ui-physical-card h2 {
1999
+ margin: 0 5px 0 0;
2000
+ font-family: var(--hc-font-display);
2001
+ font-weight: 900;
2002
+ font-stretch: 40%;
2003
+ font-size: 24px;
2004
+ line-height: 1;
2005
+ letter-spacing: 0.2px;
2006
+ color: inherit;
2007
+ white-space: nowrap;
2008
+ }
2009
+ [data-hc-ds] .hc-ui-physical-card__ability {
2010
+ appearance: none;
2011
+ position: relative;
2012
+ display: grid;
2013
+ place-items: center;
2014
+ flex: none;
2015
+ width: 20px;
2016
+ height: 20px;
2017
+ margin: 0 0 0 1px;
2018
+ padding: 0;
2019
+ border: none;
2020
+ border-radius: 50%;
2021
+ background: var(--hc-color-card-print-black);
2022
+ color: var(--hc-color-card-print-white);
2023
+ font: inherit;
2024
+ cursor: pointer;
2025
+ -webkit-tap-highlight-color: transparent;
2026
+ touch-action: manipulation;
2027
+ }
2028
+ /* A hit area larger than the 20px symbol. */
2029
+ [data-hc-ds] .hc-ui-physical-card__ability::after { content: ''; position: absolute; inset: -6px -1px; }
2030
+ [data-hc-ds] .hc-ui-physical-card__ability img { position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; }
2031
+ [data-hc-ds] .hc-ui-physical-card__gear { width: 20px; height: 20px; margin-left: 1px; }
2032
+ [data-hc-ds] .hc-ui-physical-card__header-line {
2033
+ position: absolute;
2034
+ top: 26px;
2035
+ left: 0;
2036
+ display: flex;
2037
+ align-items: center;
2038
+ width: 305px;
2039
+ height: 32px;
2040
+ margin: 0;
2041
+ color: var(--hc-color-card-ink);
2042
+ line-height: 1;
2043
+ /* Slanted by the font's axis: less than the italic the browser would fake. */
2044
+ font-variation-settings: 'ROND' var(--hc-rond), 'slnt' -7;
2045
+ font-weight: 600;
2046
+ }
2047
+ [data-hc-ds] .hc-ui-physical-card__header-line[data-kind='keywords'] { font-size: 12px; font-weight: 500; font-stretch: 80%; }
2048
+ [data-hc-ds] .hc-ui-physical-card__header-line[data-kind='type'] { font-size: 16px; font-stretch: 70%; }
2049
+
2050
+ /* Collection number and set symbol over the rarity seal. */
2051
+ [data-hc-ds] .hc-ui-physical-card__collection {
2052
+ position: absolute;
2053
+ top: 15px;
2054
+ right: 3px;
2055
+ width: 65px;
2056
+ display: flex;
2057
+ flex-direction: column;
2058
+ align-items: center;
2059
+ }
2060
+ [data-hc-ds] .hc-ui-physical-card__collection strong {
2061
+ font: 800 20px/1 var(--hc-font-display);
2062
+ font-stretch: 62%;
2063
+ min-height: 19px;
2064
+ color: var(--hc-color-card-print-white);
2065
+ -webkit-text-stroke: 3px var(--hc-color-card-print-black);
2066
+ paint-order: stroke fill;
2067
+ }
2068
+ [data-hc-ds] .hc-ui-physical-card__set { width: 34px; height: 34px; object-fit: contain; }
2069
+ [data-hc-ds] .hc-ui-physical-card__dimensions {
2070
+ position: absolute;
2071
+ top: 85px;
2072
+ right: 5px;
2073
+ display: grid;
2074
+ place-items: center;
2075
+ width: 20px;
2076
+ height: 20px;
2077
+ border-radius: 10px;
2078
+ background: var(--hc-color-card-print-black);
2079
+ color: var(--hc-color-card-print-white);
2080
+ font-size: 11px;
2081
+ }
2082
+ [data-hc-ds] .hc-ui-physical-card__dimensions[data-oval] { width: 28px; height: 18px; border-radius: 9px; }
2083
+
2084
+ /* Text columns: the front (its height follows the dial) and the back's two. */
2085
+ [data-hc-ds] .hc-ui-physical-card__table {
2086
+ position: absolute;
2087
+ overflow: hidden;
2088
+ font-size: 13px;
2089
+ line-height: 1.4;
2090
+ color: var(--hc-color-card-ink-soft);
2091
+ }
2092
+ [data-hc-ds] .hc-ui-physical-card__table[data-column='front'] { left: 5px; right: 5px; top: 75px; height: var(--hc-card-front-table-height); }
2093
+ [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); }
2094
+ [data-hc-ds] .hc-ui-physical-card__table[data-column='left'] { left: 5px; }
2095
+ [data-hc-ds] .hc-ui-physical-card__table[data-column='right'] { right: 3px; }
2096
+
2097
+ /* The portrait (the app's image, with this class) or the object's token. */
2098
+ [data-hc-ds] .hc-ui-physical-card__token {
2099
+ float: right;
2100
+ display: block;
2101
+ width: 150px;
2102
+ height: 150px;
2103
+ margin: 10px 0 5px 5px;
2104
+ shape-outside: circle();
2105
+ border-radius: 50%;
2106
+ object-fit: cover;
2107
+ overflow: hidden;
2108
+ background: var(--hc-color-card-token-placeholder);
2109
+ }
2110
+ [data-hc-ds] .hc-ui-physical-card__table[data-small-token] .hc-ui-physical-card__token { width: 134px; height: 134px; }
2111
+ [data-hc-ds] .hc-ui-physical-card__token img { width: 100%; height: 100%; object-fit: cover; }
2112
+ /* Objects: a ring in the color of the object's size. */
2113
+ [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; }
2114
+
2115
+ /* Bystander: a replica of the 195px physical token (HCUnits' `largeCardBystander*`
2116
+ and `smallCard*`). The token has its own colors and does not follow the theme. */
2117
+ [data-hc-ds] .hc-ui-physical-card__bystander { display: flex; justify-content: center; }
2118
+ [data-hc-ds] .hc-ui-physical-card__bystander-token { position: relative; flex: none; width: 195px; height: 195px; color: var(--hc-color-card-print-white); }
2119
+ [data-hc-ds] .hc-ui-physical-card__bystander-clip { position: relative; width: 195px; height: 195px; border-radius: 50%; overflow: hidden; }
2120
+ [data-hc-ds] .hc-ui-physical-card__bystander-art {
2121
+ position: absolute;
2122
+ inset: 0;
2123
+ border: 7px solid var(--hc-color-card-print-black);
2124
+ border-radius: 50%;
2125
+ background: var(--hc-color-card-print-black);
2126
+ overflow: hidden;
2127
+ }
2128
+ /* The art's window: a gray cut-out to the right of the dial's stripe. */
2129
+ [data-hc-ds] .hc-ui-physical-card__bystander-window {
2130
+ position: absolute;
2131
+ left: 30px;
2132
+ top: 40px;
2133
+ right: 0;
2134
+ bottom: 16px;
2135
+ background: var(--hc-color-card-token-placeholder);
2136
+ overflow: hidden;
2137
+ }
2138
+ [data-hc-ds] .hc-ui-physical-card__bystander-window img { position: absolute; left: -35px; top: -45px; width: 195px; max-width: none; height: 195px; }
2139
+ [data-hc-ds] .hc-ui-physical-card__bystander-stripe {
2140
+ position: absolute;
2141
+ left: 23px;
2142
+ top: 46px;
2143
+ width: 72px;
2144
+ height: 126px;
2145
+ border: 5px solid var(--hc-color-card-print-black);
2146
+ border-left: 0;
2147
+ border-radius: 0 15px 20px 0;
2148
+ background: var(--hc-color-card-print-white);
2149
+ transform: skew(15deg);
2150
+ }
2151
+ [data-hc-ds] .hc-ui-physical-card__bystander-symbols { position: absolute; left: 7px; top: 47px; }
2152
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab {
2153
+ position: absolute;
2154
+ top: 0;
2155
+ height: 24px;
2156
+ border-radius: 0 10px 12px 0 / 0 12px 12px 0;
2157
+ background: var(--hc-color-card-print-black);
2158
+ }
2159
+ [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); }
2160
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='range'] { width: 73px; }
2161
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='speed'] { width: 35px; top: 24px; }
2162
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='attack'] { width: 43px; top: 48px; }
2163
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='defense'] { width: 51px; top: 72px; }
2164
+ [data-hc-ds] .hc-ui-physical-card__bystander-tab[data-stat='damage'] { width: 59px; top: 96px; }
2165
+ [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); }
2166
+ [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; }
2167
+ [data-hc-ds] .hc-ui-physical-card__bystander-name {
2168
+ position: absolute;
2169
+ left: 45px;
2170
+ top: 2px;
2171
+ display: flex;
2172
+ align-items: center;
2173
+ justify-content: center;
2174
+ width: 105px;
2175
+ height: 45px;
2176
+ font: 500 13px/1 var(--hc-font-body);
2177
+ font-stretch: 80%;
2178
+ text-align: center;
2179
+ }
2180
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities {
2181
+ position: absolute;
2182
+ top: 50px;
2183
+ left: 30px;
2184
+ display: flex;
2185
+ align-items: center;
2186
+ justify-content: flex-end;
2187
+ gap: 2px;
2188
+ width: 48px;
2189
+ height: 20px;
2190
+ }
2191
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities .hc-ui-physical-card__ability { width: 14px; height: 14px; margin: 0; background: none; }
2192
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities .hc-ui-physical-card__ability img { top: 0; left: 0; width: 14px; height: 14px; }
2193
+ [data-hc-ds] .hc-ui-physical-card__bystander-abilities .hc-ui-physical-card__ability svg { display: none; }
2194
+ [data-hc-ds] .hc-ui-physical-card__bystander-trait { width: 18px; height: 18px; margin-top: -3px; filter: var(--hc-filter-symbol-light); }
2195
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra {
2196
+ position: absolute;
2197
+ left: 80px;
2198
+ bottom: 2px;
2199
+ display: flex;
2200
+ align-items: center;
2201
+ justify-content: center;
2202
+ width: 40px;
2203
+ font: 500 14px/1 var(--hc-font-body);
2204
+ }
2205
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra img { width: 20px; height: 20px; filter: var(--hc-filter-symbol-light); }
2206
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra[data-kind='passengers'] img { width: auto; height: auto; margin-right: 5px; }
2207
+ [data-hc-ds] .hc-ui-physical-card__bystander-extra[data-kind='construct'] img { width: 18px; height: auto; }
2208
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved { position: absolute; left: 97px; top: 97px; }
2209
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved > :is(img, button) { position: absolute; width: 18px; height: 18px; }
2210
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved-ability {
2211
+ appearance: none;
2212
+ margin: 0;
2213
+ padding: 0;
2214
+ border: none;
2215
+ border-radius: 50%;
2216
+ background: transparent;
2217
+ color: inherit;
2218
+ font: inherit;
2219
+ cursor: pointer;
2220
+ -webkit-tap-highlight-color: transparent;
2221
+ touch-action: manipulation;
2222
+ }
2223
+ [data-hc-ds] .hc-ui-physical-card__bystander-improved-ability img { display: block; width: 18px; height: 18px; }
2224
+ [data-hc-ds] .hc-ui-physical-card__bystander-dial { position: absolute; left: 48px; top: 72px; }
2225
+ [data-hc-ds] .hc-ui-physical-card__bystander-value {
2226
+ position: absolute;
2227
+ display: flex;
2228
+ align-items: center;
2229
+ justify-content: center;
2230
+ box-sizing: border-box;
2231
+ width: 18px;
2232
+ height: 18px;
2233
+ margin: 2px;
2234
+ padding: 0;
2235
+ /* Without a power color the cell is the white stripe itself (dark theme too). */
2236
+ background-color: var(--hc-color-dial-paper);
2237
+ color: var(--hc-color-card-print-black);
2238
+ /* The card's dial, in proportion to the 18px cell. */
2239
+ font: 600 16px/1 var(--hc-font-body);
2240
+ font-stretch: 50%;
2241
+ letter-spacing: 0;
2242
+ font-variant-numeric: tabular-nums;
2243
+ }
2244
+ [data-hc-ds] .hc-ui-physical-card__bystander-value[data-special] { box-shadow: inset 0 0 0 2px var(--hc-color-dial-outline-printed); }
2245
+ [data-hc-ds] .hc-ui-physical-card__bystander-value[data-tip] {
2246
+ appearance: none;
2247
+ border: none;
2248
+ cursor: pointer;
2249
+ -webkit-tap-highlight-color: transparent;
2250
+ touch-action: manipulation;
2251
+ }
2252
+ /* A hit area larger than the 18px square. */
2253
+ [data-hc-ds] .hc-ui-physical-card__bystander-value[data-tip]::after { content: ''; position: absolute; inset: -3px; }
2254
+ [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 {
2255
+ outline: 2px solid var(--hc-focus-ring);
2256
+ outline-offset: var(--hc-focus-ring-offset, 2px);
2257
+ }
2258
+
2259
+ [data-hc-ds] .hc-ui-physical-card__terrain-art { display: block; max-width: min(360px, 100%); max-height: 335px; margin: 5px auto 0; }
2260
+
2261
+ /* Rules: tapping the paragraph copies it (`onCopy`). */
2262
+ [data-hc-ds] .hc-ui-physical-card__rule { overflow-wrap: anywhere; }
2263
+ [data-hc-ds] .hc-ui-physical-card__rule h3 {
2264
+ display: flex;
2265
+ align-items: center;
2266
+ gap: 3px;
2267
+ min-height: 22px;
2268
+ margin: 0 0 1px;
2269
+ font: 700 16px/1.1 var(--hc-font-display);
2270
+ font-stretch: 65%;
2271
+ text-transform: uppercase;
2272
+ color: var(--hc-color-card-ink);
2273
+ }
2274
+ /* As in HCUI's detailed view: without the icon's square border; the symbol's own
2275
+ white circle is the ring, as on HCUnits. */
2276
+ [data-hc-ds] .hc-ui-physical-card__rule h3 .hc-ui-special-icon { flex: none; border: none; }
2277
+ [data-hc-ds] .hc-ui-physical-card__rule h3 .hc-ui-special-icon__bg { box-shadow: none; }
2278
+ [data-hc-ds] .hc-ui-physical-card__rule p { margin: 0 0 2px 5px; white-space: pre-line; }
2279
+ /* HCUI's `.copyable`: no selection, a quick fade while pressed. */
2280
+ [data-hc-ds] .hc-ui-physical-card__copy {
2281
+ cursor: pointer;
2282
+ -webkit-user-select: none;
2283
+ user-select: none;
2284
+ -webkit-tap-highlight-color: transparent;
2285
+ transition: opacity var(--hc-transition-fast);
2286
+ }
2287
+ [data-hc-ds] .hc-ui-physical-card__copy:active { opacity: 0.6; }
2288
+ [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-stretch: 75%; color: var(--hc-color-card-ink); }
2289
+ [data-hc-ds] .hc-ui-physical-card__relic { margin: 0; }
2290
+
2291
+ /* Improved abilities right above the dial's window. */
2292
+ [data-hc-ds] .hc-ui-physical-card__improved-row { position: absolute; left: 18px; display: flex; gap: 2px; }
2293
+ [data-hc-ds] .hc-ui-physical-card__improved-group { display: contents; }
2294
+ [data-hc-ds] :is(.hc-ui-physical-card__improved-kind, .hc-ui-physical-card__improved) {
2295
+ width: 30px;
2296
+ height: 30px;
2297
+ border-radius: 50%;
2298
+ box-shadow: 0 0 6px 2px var(--hc-color-card-print-white);
2299
+ margin-right: 2px;
2300
+ }
2301
+ [data-hc-ds] .hc-ui-physical-card__improved {
2302
+ appearance: none;
2303
+ margin: 0;
2304
+ padding: 0;
2305
+ border: none;
2306
+ background: transparent;
2307
+ color: inherit;
2308
+ font: inherit;
2309
+ cursor: pointer;
2310
+ -webkit-tap-highlight-color: transparent;
2311
+ touch-action: manipulation;
2312
+ }
2313
+ [data-hc-ds] .hc-ui-physical-card__improved img { display: block; width: 30px; height: 30px; }
2314
+
2315
+ /* Above the shine: the cell colors do not change on hover. */
2316
+ [data-hc-ds] .hc-ui-physical-card__dial { position: absolute; left: 10px; bottom: 10px; z-index: 2; }
2317
+ [data-hc-ds] .hc-ui-physical-card__shine { display: none; }
2318
+
2319
+ /* Points on the black bar right of the dial; pressing one changes the point value. */
2320
+ [data-hc-ds] .hc-ui-physical-card__points {
2321
+ position: absolute;
2322
+ right: 15px;
2323
+ display: flex;
2324
+ flex-direction: column;
2325
+ align-items: flex-end;
2326
+ font-stretch: 86%;
2327
+ }
2328
+ [data-hc-ds] .hc-ui-physical-card__points[data-table='normal'] { top: 386px; }
2329
+ [data-hc-ds] .hc-ui-physical-card__points[data-table='long'] { top: 266px; }
2330
+ [data-hc-ds] .hc-ui-physical-card__points[data-table='short'] { bottom: 35px; }
2331
+ [data-hc-ds] .hc-ui-physical-card__point {
2332
+ appearance: none;
2333
+ margin: 0;
2334
+ padding: 0;
2335
+ border: none;
2336
+ background: transparent;
2337
+ color: inherit;
2338
+ font: 600 18px/23px var(--hc-font-display);
2339
+ font-stretch: 75%;
2340
+ font-variant-numeric: tabular-nums;
2341
+ text-align: right;
2342
+ cursor: pointer;
2343
+ -webkit-tap-highlight-color: transparent;
2344
+ touch-action: manipulation;
2345
+ }
2346
+ [data-hc-ds] .hc-ui-physical-card__point:disabled { cursor: default; opacity: 1; }
2347
+ [data-hc-ds] .hc-ui-physical-card__point[data-active] { text-decoration: underline 2px; text-underline-offset: 3px; }
2348
+ [data-hc-ds] .hc-ui-physical-card__object-points {
2349
+ position: absolute;
2350
+ left: 15px;
2351
+ bottom: 10px;
2352
+ font: 20px var(--hc-font-mono);
2353
+ color: var(--hc-color-card-print-white);
2354
+ 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);
2355
+ }
2356
+
2357
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial {
2358
+ position: absolute;
2359
+ bottom: 0;
2360
+ left: 94px;
2361
+ display: grid;
2362
+ grid-template-columns: repeat(3, 62px);
2363
+ grid-template-rows: 43px 30px;
2364
+ width: 188px;
2365
+ height: 80px;
2366
+ border-radius: 40px 40px 0 0;
2367
+ 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%);
2368
+ color: var(--hc-color-card-print-black);
2369
+ text-align: center;
2370
+ }
2371
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial span { align-self: end; font: 700 24px/1 var(--hc-font-display); }
2372
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial img { height: 22px; vertical-align: middle; }
2373
+ [data-hc-ds] .hc-ui-physical-card__terrain-dial b { font: 700 24px/30px var(--hc-font-display); font-stretch: 75%; letter-spacing: -1px; }
2374
+
2375
+ [data-hc-ds] .hc-ui-physical-card__back-bar {
2376
+ position: absolute;
2377
+ left: 0;
2378
+ bottom: 0;
2379
+ width: 375px;
2380
+ height: 75px;
2381
+ padding: 10px 10px 0;
2382
+ background: var(--hc-color-card-print-black);
2383
+ color: var(--hc-color-card-print-white);
2384
+ font-size: 12px;
2385
+ line-height: 19px;
2386
+ }
2387
+ [data-hc-ds] .hc-ui-physical-card__back-bar p { margin: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
2388
+ [data-hc-ds] .hc-ui-physical-card__back-bar b { font-size: 10px; font-weight: 700; }
2389
+
2390
+ /* 3D effect: by the mouse on the desktop and by the motion sensor only in the
2391
+ phone's focus view. Without a mouse over the card or a sensor reading there is
2392
+ no transform here; `[data-tilt]` is set by the view while it moves. */
2393
+ @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
2394
+ [data-hc-ds] .hc-ui-physical-card-tilt { transition: transform 0.18s ease-out; }
2395
+ [data-hc-ds] .hc-ui-physical-card { transition: box-shadow 0.18s ease-out; }
2396
+ [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; }
2397
+ [data-hc-ds] .hc-ui-physical-card__shine {
2398
+ display: block;
2399
+ position: absolute;
2400
+ inset: 0;
2401
+ z-index: 1;
2402
+ opacity: 0;
2403
+ pointer-events: none;
2404
+ background: radial-gradient(circle at var(--hc-card-shine-at, 50% 50%), var(--hc-color-card-shine), transparent 60%);
2405
+ mix-blend-mode: var(--hc-blend-card-shine);
2406
+ transition: opacity 0.18s ease-out;
2407
+ }
2408
+ [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; }
2409
+ [data-hc-ds] .hc-ui-physical-card-slot[data-tilt] .hc-ui-physical-card__shine { opacity: 1; }
2410
+ /* The front column lets the portrait pass the edge a little instead of cutting it. */
2411
+ [data-hc-ds] .hc-ui-physical-card-slot[data-tilt] .hc-ui-physical-card__table[data-column='front'] { overflow: clip; overflow-clip-margin: 5px; }
2412
+ }
2413
+ @media (hover: none) and (pointer: coarse) and (prefers-reduced-motion: no-preference) {
2414
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] .hc-ui-physical-card__shine {
2415
+ display: block;
2416
+ position: absolute;
2417
+ inset: 0;
2418
+ z-index: 1;
2419
+ opacity: 0;
2420
+ pointer-events: none;
2421
+ background: radial-gradient(circle at var(--hc-card-shine-at, 50% 50%), var(--hc-color-card-shine), transparent 60%);
2422
+ mix-blend-mode: var(--hc-blend-card-shine);
2423
+ transition: opacity 0.18s ease-out;
2424
+ }
2425
+ /* The sensor is already smoothed and updates every frame: no transition. */
2426
+ [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; }
2427
+ [data-hc-ds] .hc-ui-physical-cards[data-focus][data-tilt] .hc-ui-physical-card__shine { opacity: 1; }
2428
+ [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; }
2429
+ [data-hc-ds] .hc-ui-physical-cards[data-focus][data-tilt] .hc-ui-physical-card-tilt { will-change: transform; }
2430
+ }
2431
+ /* Holding the card opens the focus view: no text selection and no image menu. */
2432
+ @media (hover: none) and (pointer: coarse) {
2433
+ [data-hc-ds] .hc-ui-physical-cards {
2434
+ -webkit-user-select: none;
2435
+ user-select: none;
2436
+ -webkit-touch-callout: none;
2437
+ }
2438
+ [data-hc-ds] .hc-ui-physical-cards img { -webkit-touch-callout: none; }
2439
+ [data-hc-ds] .hc-ui-physical-card { -webkit-user-select: none; user-select: none; }
2440
+ /* Outside the focus view the grain stays without blending, which weighs on
2441
+ phones with several cards mounted. */
2442
+ [data-hc-ds] .hc-ui-physical-cards:not([data-focus]) .hc-ui-physical-card::after {
2443
+ opacity: var(--hc-opacity-card-grain-flat);
2444
+ mix-blend-mode: normal;
2445
+ }
2446
+ }
2447
+
2448
+ /* PhysicalCardFocusView — HCUI `.card-focus`. The blurred background was asked for
2449
+ by HCUI and applies only here. */
2450
+ [data-hc-ds] .hc-ui-card-focus {
2451
+ position: fixed;
2452
+ inset: 0;
2453
+ width: 100%;
2454
+ max-width: none;
2455
+ height: 100%;
2456
+ max-height: none;
2457
+ margin: 0;
2458
+ padding: calc(env(safe-area-inset-top, 0px) + 16px) 8px calc(max(env(safe-area-inset-bottom, 0px), var(--hc-space-3)) + 8px);
2459
+ border: 0;
2460
+ background: none;
2461
+ color: var(--hc-color-text-primary);
2462
+ overscroll-behavior: contain;
2463
+ touch-action: none;
2464
+ }
2465
+ [data-hc-ds] .hc-ui-card-focus[open] { display: flex; align-items: center; justify-content: center; }
2466
+ /* Darker than the overlay token, so the card stands out. Above ~24px of blur
2467
+ Chromium shows sharp edges and text behind again. */
2468
+ [data-hc-ds] .hc-ui-card-focus::backdrop {
2469
+ background-color: var(--hc-color-card-focus-backdrop);
2470
+ -webkit-backdrop-filter: blur(22px);
2471
+ backdrop-filter: blur(22px);
2472
+ }
2473
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
2474
+ [data-hc-ds] .hc-ui-card-focus::backdrop { background-color: var(--hc-color-bg-elevated); }
2475
+ }
2476
+ [data-hc-ds] .hc-ui-card-focus__actions {
2477
+ grid-row: 2;
2478
+ display: flex;
2479
+ justify-content: center;
2480
+ gap: 12px;
2481
+ margin-top: 24px;
2482
+ }
2483
+ /* Quiet: the card is what shows. The outline Button keeps its border and only
2484
+ gets the surface fill, which that variant leaves transparent. */
2485
+ [data-hc-ds] .hc-ui-card-focus .hc-ui-card-focus__actions .hc-ui-button[data-variant] { background-color: var(--hc-color-bg-surface); }
2486
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] {
2487
+ display: grid;
2488
+ justify-items: center;
2489
+ gap: 0;
2490
+ animation: hc-ui-card-focus-in 0.24s ease-out both;
2491
+ }
2492
+ /* Front and backs in the same place: flipping turns both faces together, swapping
2493
+ halfway, with the card edge-on. `backface-visibility` is not enough: the back
2494
+ face showed mirrored during the first half of the turn. */
2495
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot {
2496
+ grid-area: 1 / 1;
2497
+ transform: perspective(1400px) rotateY(0deg);
2498
+ transition: transform 0.5s ease-in-out, visibility 0s 0.25s;
2499
+ }
2500
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot[data-away] { visibility: hidden; pointer-events: none; }
2501
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot[data-side='front'][data-away] { transform: perspective(1400px) rotateY(-180deg); }
2502
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot[data-side='back'][data-away] { transform: perspective(1400px) rotateY(180deg); }
2503
+ @keyframes hc-ui-card-focus-in {
2504
+ from { opacity: 0; transform: scale(0.94); }
2505
+ to { opacity: 1; transform: scale(1); }
2506
+ }
2507
+
2508
+ @media (prefers-reduced-motion: reduce) {
2509
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] { animation: none; }
2510
+ [data-hc-ds] .hc-ui-physical-cards[data-focus] > .hc-ui-physical-card-slot { transition: none; }
2511
+ [data-hc-ds] .hc-ui-physical-card__copy { transition: none; }
2512
+ }
2513
+
2514
+ /* Map — HCUI `.map-board`, `.map-tooltip`, `.map-swatch`, `.map-scene__legend` and
2515
+ `.map-environment`. The board's white, the selection's shading and the swatch's
2516
+ text are HeroClix tokens, the same in both themes; the environment's black line
2517
+ icons turn light in the dark theme (`filter-map-environment-icon`). */
2518
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-swatch, .hc-ui-map-legend, .hc-ui-map-environment),
2519
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) *,
2520
+ [data-hc-ds] :is(.hc-ui-map-board, .hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) *::before,
2521
+ [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; }
2522
+ /* ROND everywhere, and HCUI's long words that break only when they overflow. */
2523
+ [data-hc-ds] :is(.hc-ui-map-tooltip, .hc-ui-map-swatch, .hc-ui-map-legend, .hc-ui-map-environment),
2524
+ [data-hc-ds] :is(.hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment) * { font-variation-settings: 'ROND' var(--hc-rond); }
2525
+ :where([data-hc-ds] :is(.hc-ui-map-tooltip, .hc-ui-map-legend, .hc-ui-map-environment)) span,
2526
+ :where([data-hc-ds]) :is(.hc-ui-map-swatch, .hc-ui-map-environment) { overflow-wrap: break-word; }
2527
+ /* Square corners: the map is a board with its grid and labels up to the edge. The
2528
+ hcmaps canvas draws on white, in both themes. */
2529
+ [data-hc-ds] .hc-ui-map-board {
2530
+ position: relative;
2531
+ width: 100%;
2532
+ box-shadow: var(--hc-shadow-card);
2533
+ background-color: var(--hc-color-map-board);
2534
+ cursor: crosshair;
2535
+ }
2536
+ [data-hc-ds] .hc-ui-map-board:focus-visible { outline: 2px solid var(--hc-color-outline); outline-offset: 4px; }
2537
+ [data-hc-ds] .hc-ui-map-board canvas {
2538
+ display: block;
2539
+ width: 100%;
2540
+ height: auto;
2541
+ }
2542
+ [data-hc-ds] .hc-ui-map-board[data-loading] {
2543
+ aspect-ratio: 2 / 3;
2544
+ background-color: var(--hc-color-bg-muted-2);
2545
+ background-image: linear-gradient(var(--hc-color-border) 1px, transparent 1px), linear-gradient(90deg, var(--hc-color-border) 1px, transparent 1px);
2546
+ background-size: 12.5% 12.5%;
2547
+ }
2548
+ /* Read by screen readers only. */
2549
+ [data-hc-ds] .hc-ui-map-board__status {
2550
+ position: absolute;
2551
+ width: 1px;
2552
+ height: 1px;
2553
+ padding: 0;
2554
+ margin: -1px;
2555
+ overflow: hidden;
2556
+ clip: rect(0, 0, 0, 0);
2557
+ white-space: nowrap;
2558
+ border: 0;
2559
+ }
2560
+ [data-hc-ds] .hc-ui-map-board__selection {
2561
+ position: absolute;
2562
+ inset: 0;
2563
+ display: block;
2564
+ width: 100%;
2565
+ max-width: 100%;
2566
+ height: 100%;
2567
+ pointer-events: none;
2568
+ }
2569
+ [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; }
2570
+ [data-hc-ds] .hc-ui-map-board__selection line { stroke: var(--hc-color-map-selection-line); stroke-width: .14; stroke-linecap: round; }
2571
+
2572
+ /* MapSwatch: the board's square, with the terrain's fill and border, in both themes. */
2573
+ [data-hc-ds] .hc-ui-map-swatch {
2574
+ display: inline-flex;
2575
+ align-items: center;
2576
+ justify-content: center;
2577
+ flex: 0 0 auto;
2578
+ width: 16px;
2579
+ height: 16px;
2580
+ border: 2px solid;
2581
+ border-radius: 3px;
2582
+ font-size: 10px;
2583
+ font-weight: var(--hc-font-weight-bold);
2584
+ line-height: 1;
2585
+ color: var(--hc-color-map-swatch-text);
2586
+ }
2587
+ [data-hc-ds] .hc-ui-map-swatch[data-light-text] { color: var(--hc-color-map-swatch-text-light); }
2588
+ [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); }
2589
+
2590
+ [data-hc-ds] .hc-ui-map-tooltip {
2591
+ position: fixed;
2592
+ z-index: var(--hc-z-tooltip);
2593
+ pointer-events: none;
2594
+ width: max-content;
2595
+ max-width: min(320px, calc(100vw - 16px));
2596
+ padding: var(--hc-space-3);
2597
+ border: 1px solid var(--hc-color-border-strong);
2598
+ border-radius: var(--hc-radius-md);
2599
+ background: var(--hc-color-bg-elevated);
2600
+ color: var(--hc-color-text-primary);
2601
+ box-shadow: var(--hc-shadow-card);
2602
+ font-size: var(--hc-font-size-xs);
2603
+ line-height: var(--hc-line-height-md);
2604
+ }
2605
+ /* HCUI's slightly condensed titles, at zero specificity. */
2606
+ :where([data-hc-ds] .hc-ui-map-tooltip__title) { font-stretch: 92%; }
2607
+ [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); }
2608
+ [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); }
2609
+ [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); }
2610
+ [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); }
2611
+ [data-hc-ds] .hc-ui-map-tooltip__coordinate { color: var(--hc-color-text-primary); font-weight: var(--hc-font-weight-bold); }
2612
+ [data-hc-ds] .hc-ui-map-tooltip__row { display: flex; align-items: center; gap: var(--hc-space-2); min-height: 18px; }
2613
+ [data-hc-ds] .hc-ui-map-tooltip__row[data-kind='terrain'] { color: var(--hc-color-text-primary); }
2614
+ [data-hc-ds] .hc-ui-map-tooltip__note { color: var(--hc-color-text-secondary); }
2615
+ [data-hc-ds] .hc-ui-map-tooltip .hc-ui-map-environment__item { gap: var(--hc-space-2); }
2616
+ [data-hc-ds] .hc-ui-map-tooltip .hc-ui-map-environment img { width: 16px; height: 16px; }
2617
+
2618
+ /* MapLegendView: the icons follow the text's size. */
2619
+ [data-hc-ds] .hc-ui-map-legend {
2620
+ display: flex;
2621
+ flex-wrap: wrap;
2622
+ align-items: center;
2623
+ gap: var(--hc-space-1) var(--hc-space-3);
2624
+ margin-top: var(--hc-space-2);
2625
+ font-size: var(--hc-font-size-xs);
2626
+ line-height: var(--hc-line-height-md);
2627
+ color: var(--hc-color-text-secondary);
2628
+ }
2629
+ [data-hc-ds] .hc-ui-map-legend .hc-ui-map-environment img { width: 16px; height: 16px; }
2630
+ [data-hc-ds] .hc-ui-map-legend__key { display: inline-flex; align-items: center; gap: var(--hc-space-1); }
2631
+
2632
+ [data-hc-ds] .hc-ui-map-environment {
2633
+ display: inline-flex;
2634
+ align-items: center;
2635
+ flex-wrap: wrap;
2636
+ gap: var(--hc-space-2);
2637
+ color: var(--hc-color-text-secondary);
2638
+ font-size: var(--hc-font-size-xs);
2639
+ line-height: var(--hc-line-height-md);
2640
+ }
2641
+ [data-hc-ds] .hc-ui-map-environment__item { display: inline-flex; align-items: center; gap: var(--hc-space-1); white-space: nowrap; }
2642
+ [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); }