.metric-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-top:16px}.metric-strip span{font-size:8px;letter-spacing:.4px;color:var(--muted)}.metric-strip b{display:block;font-size:11px;color:var(--text);line-height:1.35;margin-top:3px}.radar-card,.clinical-card,.log-card,.focus-card{min-height:286px}.radar-head,.clinical-head,.focus-top{display:flex;justify-content:space-between;gap:8px;font-size:8px;letter-spacing:.7px;color:var(--muted)}.radar-reading,.clinical-reading,.log-reading{display:flex;align-items:end;justify-content:space-between}.zone-chip{border:1px solid currentColor;border-radius:50%;width:45px;height:45px;display:grid;place-content:center;font-size:11px;font-weight:900}.radar-footer{position:absolute;left:20px;bottom:16px;font-size:8px;color:var(--muted);letter-spacing:.5px}.clinical-card{border-top:5px solid #246b7a!important}.clinical-head{border-bottom:1px solid currentColor;padding-bottom:8px}.clinical-reading small,.log-reading small{display:block;font-size:8px;color:var(--muted);margin-top:3px}.log-card{border:2px solid currentColor!important;border-top:7px solid currentColor!important}.log-index{font:800 8px ui-monospace,monospace;letter-spacing:1px}.log-reading .bpm{font-family:ui-monospace,monospace}.focus-card:first-child{grid-column:span 2}.focus-zone{display:flex;justify-content:space-between;align-items:center;font-size:10px}.focus-zone .zone{font-size:22px}.theme-training-log .metric-strip,.theme-training-log .radar-footer{border-top:1px solid #151515;padding-top:8px}.theme-training-log .metric-strip span,.theme-training-log .metric-strip b{color:#151515}.theme-clinical .clinical-card{min-height:300px}.theme-clinical .metric-strip{padding:10px;background:#edf5f6}.theme-athlete-focus .focus-card{border-top:4px solid #c5ff43!important}.theme-athlete-focus .focus-card:first-child{min-height:340px}.theme-athlete-focus .focus-card:first-child .bpm{font-size:130px}.theme-radar .radar-card{border-top:4px solid #69d9d5!important}.theme-radar .metric-strip{padding:10px;background:#061923;border-radius:8px}.theme-radar .metric-strip b{color:#eaffff}@media(max-width:650px){.focus-card:first-child{grid-column:span 2}.metric-strip{grid-template-columns:1fr 1fr}.metric-strip span:last-child{grid-column:span 2}.radar-card,.clinical-card,.log-card,.focus-card{min-height:275px}}

/* TV fit for non-Signal themes (Claude copy, 2026-10-14). tv.js sets --tv-cols / --tv-row-h / --tv-g-fs; IDs + !important beat the themes' injected sizes. */
body.tv #tv-cards.tv-fit{grid-template-columns:repeat(var(--tv-cols,3),minmax(0,1fr))!important;grid-auto-rows:var(--tv-row-h,386px);align-content:start}
body.tv #tv-cards.tv-fit .card{min-height:0!important;height:100%;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}
body.tv #tv-cards.tv-fit .card .person{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-height:1.2em}
body.tv #tv-cards.tv-fit .card .log-reading{margin-top:auto;gap:12px;align-items:flex-end}
body.tv #tv-cards.tv-fit .card .log-reading>div:last-child{flex:none;min-width:84px;text-align:right}
body.tv #tv-cards.tv-fit .card .bpm{font-size:var(--tv-g-fs)!important;margin:0 0 4px!important;line-height:.9;white-space:nowrap;font-variant-numeric:tabular-nums}
body.tv #tv-cards.tv-fit .card:first-child .bpm{font-size:var(--tv-g-fs1,var(--tv-g-fs))!important}
body.tv #tv-cards.tv-fit .card .metric-strip{margin-top:12px}
body.tv #tv-cards.tv-fit.tv-compact .card{padding:14px 17px!important}
body.tv #tv-cards.tv-fit.tv-compact .card .log-index,body.tv #tv-cards.tv-fit.tv-compact .card .sensor{display:none}
body.tv #tv-cards.tv-fit.tv-compact .card .person{font-size:19px}
body.tv #tv-cards.tv-fit.tv-compact .card .metric-strip{margin-top:8px;padding:6px 8px}
/* Clinical: zone labels used the dark-theme colours on white (Z3 yellow ≈ invisible) — pre-existing; match each zone's number colour. */
body.tv.theme-clinical .card.z1 .zone{color:#2478ad!important}
body.tv.theme-clinical .card.z2 .zone{color:#459e63!important}
body.tv.theme-clinical .card.z3 .zone{color:#b28716!important}
body.tv.theme-clinical .card.z4 .zone{color:#d36b25!important}
body.tv.theme-clinical .card.z5 .zone{color:#c44155!important}

/* Review 14/10: zone sits next to the number, and zone / status / stats grow with the card (first Athlete Focus card too). */
body.tv #tv-cards.tv-fit .card{--fs:var(--tv-g-fs)}
body.tv #tv-cards.tv-fit .card:first-child{--fs:var(--tv-g-fs1,var(--tv-g-fs))}
body.tv #tv-cards.tv-fit .card .log-reading{justify-content:flex-start;gap:calc(var(--fs) * .22)}
body.tv #tv-cards.tv-fit .card .log-reading>div:last-child{min-width:0;text-align:left;padding-bottom:calc(var(--fs) * .1)}
body.tv #tv-cards.tv-fit .card .zone{display:block;font-size:max(18px,calc(var(--fs) * .3));line-height:.9;letter-spacing:.02em}
body.tv #tv-cards.tv-fit .card .log-reading small{font-size:max(10px,calc(var(--fs) * .085));margin-top:calc(var(--fs) * .05);white-space:nowrap}
body.tv #tv-cards.tv-fit .card{--sfs:var(--tv-strip-fs,12px)}
body.tv #tv-cards.tv-fit .card:first-child{--sfs:var(--tv-strip-fs1,var(--tv-strip-fs,12px))}
body.tv #tv-cards.tv-fit .card .metric-strip span{font-size:calc(var(--sfs) * .72);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
body.tv #tv-cards.tv-fit .card .metric-strip b{font-size:var(--sfs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body.tv #tv-cards.tv-fit .card .person{font-size:max(18px,min(calc(var(--fs) * .22),36px))}
/* Narrow cards: two stat columns (kcal, zone) — battery is dropped like the STRAP · BAT line — so values stay readable. */
body.tv #tv-cards.tv-fit.tv-compact .card .metric-strip{grid-template-columns:1fr 1fr}
body.tv #tv-cards.tv-fit.tv-compact .card .metric-strip span:nth-child(3){display:none}
body.tv #tv-cards.tv-fit .card .log-reading small{max-width:100%;overflow:hidden;text-overflow:ellipsis}
/* Athlete Focus: the first athlete is a real 2×2 hero, so its number and info grow, not only its frame. */
body.tv #tv-cards.tv-fit.tv-hero .card:first-child{grid-column:span 2!important;grid-row:span 2}
/* Option D rule here too: fixed 3‑digit box, number right-aligned, so the zone never moves with the digits. */
body.tv #tv-cards.tv-fit .card .bpm{min-width:calc(var(--fs) * var(--tv-num-w,1.8));text-align:right}
/* Review round 3: zone once — zone + its time next to the number; stats keep kcal and battery (2 columns). */
body.tv #tv-cards.tv-fit .card .zone{white-space:nowrap}
body.tv #tv-cards.tv-fit .card .zone .zone-t{font-style:normal;font-size:.55em;letter-spacing:0;margin-left:.15em;font-variant-numeric:tabular-nums}
body.tv #tv-cards.tv-fit .card .metric-strip{grid-template-columns:1fr 1fr}
body.tv #tv-cards.tv-fit.tv-compact .card .metric-strip span:nth-child(3){display:block}
/* Review 3, comments 7–8: names grow with the number too (the big first card included). */
body.tv #tv-cards.tv-fit .card .person{font-size:max(18px,min(calc(var(--fs) * .3),64px))}
/* One row of cards (few athletes on a wide TV): keep the approved card size and centre the row vertically instead of leaving the lower half empty. */
body.tv #tv-cards.tv-fit.tv-one-row{align-content:center;box-sizing:content-box}
/* 16/10 review: names were stuck at 19px (the compact rule out-ranked the "grow with the number" rule) — grow in compact grids too; the big first card up to 72px. */
body.tv #tv-cards.tv-fit.tv-compact .card .person,body.tv #tv-cards.tv-fit .card .person{font-size:max(20px,min(calc(var(--fs) * .3),52px))}
body.tv #tv-cards.tv-fit.tv-compact .card:first-child .person,body.tv #tv-cards.tv-fit .card:first-child .person{font-size:max(20px,min(calc(var(--fs) * .3),72px))}
/* Athlete Focus: the big number was always lime (theme accent) even in Z3/Z4/Z5 — it now takes its zone colour like every other card. */
body.tv.theme-athlete-focus #tv-cards .card.z1:first-child .bpm{color:var(--blue)!important}
body.tv.theme-athlete-focus #tv-cards .card.z2:first-child .bpm{color:var(--lime)!important}
body.tv.theme-athlete-focus #tv-cards .card.z3:first-child .bpm{color:var(--yellow)!important}
body.tv.theme-athlete-focus #tv-cards .card.z4:first-child .bpm{color:var(--orange)!important}
body.tv.theme-athlete-focus #tv-cards .card.z5:first-child .bpm{color:var(--red)!important}
