:root{
  --page:#ffffff;--ink-0:#191919;--ink:#222222;--ink-2:#45453f;--ink-3:#686862;
  --ink-4:#8b8b85;--ink-5:#bdbdb7;--gray:#8b8b85;
  --rule:#d9d9d3;--line:#e7e7e2;--fill-1:#f8f8f5;--fill-2:#f1f1ec;--row:#f7f7f6;--panel:#f1f1ec;
  --blue:#1d68a3;--blue-soft:#e6eff7;--gold:#b7851a;--gold-text:#8a6200;--gold-soft:#f7eed8;
  --green:#3a7a4b;--green-soft:#e4f0e7;--red:#bf3b31;--red-soft:#f8e4e1;
  --win:var(--green);--loss:var(--red);--purple:#6a4c93;--pass:#2f7f98;--run:#b7812f;
  --font-head:"Archivo Head","Archivo","Helvetica Neue",Arial,sans-serif;
  --font-ui:"Archivo","Helvetica Neue",Arial,sans-serif;--head-stretch:78%;
  --r-1:2px;--r-2:3px;
  color-scheme:light;
}
@view-transition{navigation:auto}
::view-transition-old(root){animation:.2s ease-in both pk-fade-out}
::view-transition-new(root){animation:.2s ease-in both pk-fade-in}
@keyframes pk-fade-out{from{opacity:1}to{opacity:0}}
@keyframes pk-fade-in {from{opacity:0}to{opacity:1}}
@keyframes slideIn{from{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:none}}
@keyframes riseIn {from{opacity:0;transform:translateY(8px)} to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;}}
.tnote{font:500 12.5px/1.45 "Archivo","Helvetica Neue",Arial,sans-serif;
  color:var(--ink-3,#686862);letter-spacing:0;text-transform:none;white-space:nowrap}
.xp{border:1px solid var(--rule,#d7d7d4);border-radius:2px}
.xp-btn{width:100%;text-align:left;display:flex;align-items:center;justify-content:space-between;
  gap:10px;background:none;border:none;padding:10px 14px;
  font-family:"Archivo",system-ui,sans-serif;font-size:13.5px;font-weight:600;
  color:var(--ink,#222);cursor:pointer;transition:background .12s ease}
.xp-btn:hover{background:var(--row,#f7f7f6)}
.xp-chev{font-size:15px;flex:0 0 auto;transition:transform .2s ease;
  display:inline-block}
.xp.open .xp-chev{transform:rotate(180deg)}
.xp-body{display:grid;grid-template-rows:0fr;grid-template-columns:minmax(0,1fr);overflow:hidden;
  transition:grid-template-rows .24s ease}
.xp.open .xp-body{grid-template-rows:1fr}
.xp-inner{min-width:0;min-height:0;padding:0 14px}
.xp.open .xp-inner{padding:10px 14px 14px}
.hfoot{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11.5px;line-height:1.5;
  color:var(--ink-3,#8b8b8b);font-family:"Archivo",system-ui,sans-serif;
  font-variant-numeric:tabular-nums;border-top:1px solid var(--line,#e4e4e1);
  padding-top:6px;margin-top:8px}
.hfoot b{color:var(--ink-2,#5b5b5b);font-weight:600}

.cb{--page:#ffffff;--panel:#f1f1ec;--panel2:#f1f1ec;--ink:#222222;--muted:#686862;
  --line:#e7e7e2;--line-soft:rgba(34,34,34,.08);--rule:#d9d9d3;--chart-text:#45453f;
  --build:#1d68a3;--hold:#686862;--decline:#bf3b31;--neutral:#8b8b85;
  font-family:var(--font-ui,Archivo,Helvetica,Arial,sans-serif);color:var(--ink);background:var(--page);
  max-width:1120px;margin:0 auto;padding:0 22px 60px}
.cb *{box-sizing:border-box}
.cb h1,.cb h2,.cb h3{font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-weight:800;letter-spacing:-.01em;text-wrap:balance;margin:0;font-stretch:var(--head-stretch,78%)}
.cb .tnum{font-variant-numeric:tabular-nums}
.cb .eyebrow{font-size:12.5px;font-weight:700;color:var(--build)}
.cb .eyebrow a{color:inherit;text-decoration:none;border-bottom:1px solid transparent}
.cb .eyebrow a:hover{border-bottom-color:currentColor}
.cb header{padding:40px 0 20px;border-bottom:1px solid var(--line)}
.cb h1{font-size:clamp(32px,4.6vw,54px);line-height:1.03;margin:12px 0 0}
.cb .thesis{font-family:Archivo,Helvetica,Arial,sans-serif;font-weight:400;line-height:1.5;font-size:clamp(16px,1.9vw,19px);color:var(--muted);max-width:60ch;margin:15px 0 0}
.cb .thesis b{color:var(--ink);font-style:normal;font-weight:600}
/* Compressed decoder + ladder, above the scatter (2026-09-21) -- the full note stays
   at the bottom; this is the two sentences a cold reader needs before anything else
   on the page makes sense. */
.cb .cb-decoder{font-size:13.5px;line-height:1.55;color:var(--muted);max-width:68ch;margin:16px 0 0}
.cb .cb-decoder b{color:var(--ink)}
.cb .cb-ladder{font-size:12.5px;color:var(--muted);margin:8px 0 0;line-height:1.7}
.cb .cb-ladder a{color:inherit;text-decoration:none;border-bottom:1px solid var(--line)}
.cb .cb-ladder a:hover{border-bottom-color:var(--muted)}
/* Zero-JS in-page jump strip -- a real gap on a 25,000px+ mobile page. */
.cb .cb-jump{display:flex;flex-wrap:wrap;gap:4px 14px;margin:14px 0 0;font-size:12px}
.cb .cb-jump a{color:var(--muted);text-decoration:none;border-bottom:1px solid transparent}
.cb .cb-jump a:hover{opacity:.72}
/* Top-5 answer-first block (2026-09-21): satisfies "best cfb coaches ever" search
   intent immediately, before the scatter's more abstract argument. */
.cb .cb-top5{margin:26px 0 4px;padding:18px 20px;border:1px solid var(--line);border-radius:3px}
.cb .cb-top5 h2{font-size:19px;margin-bottom:10px}
.cb .cb-top5 ol{list-style:none;margin:0;padding:0;counter-reset:none}
.cb .cb-top5 li{display:flex;gap:12px;align-items:baseline;padding:8px 0;border-top:1px solid var(--line-soft)}
.cb .cb-top5 li:first-child{border-top:none}
.cb .cb-top5 .t5-rank{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:20px;color:var(--muted);min-width:22px;font-stretch:var(--head-stretch,78%)}
.cb .cb-top5 .t5-body{flex:1;min-width:0}
.cb .cb-top5 .t5-name a{color:var(--ink);font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:16px;text-decoration:none;border-bottom:1px solid var(--line);font-stretch:var(--head-stretch,78%)}
.cb .cb-top5 .t5-name a:hover{border-bottom-color:var(--ink)}
.cb .cb-top5 .t5-name{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:16px;font-stretch:var(--head-stretch,78%)}
.cb .cb-top5 .t5-team{font-size:12.5px;color:var(--muted);margin-left:4px}
.cb .cb-top5 .t5-hl{display:block;font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:13px;color:var(--muted);margin-top:2px;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .cb-top5-sub{font-size:12px;color:var(--muted);margin:10px 0 0}
.cb .mapwrap{position:relative;margin:24px 0 8px}
.cb .map-cap{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:8px;margin-bottom:6px}
.cb .map-cap h2{font-size:20px}
.cb .legend{display:flex;gap:15px;font-size:12px;color:var(--muted);flex-wrap:wrap}
.cb .legend i{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:5px;vertical-align:middle}
.cb svg{display:block;width:100%;height:auto;overflow:visible}
/* System Shift/System Coaches micro-glyphs (identity_glyph.py) are fixed-size
   64x16 icons, not charts that should fill their container -- without this
   override they inherit the page-wide `.cb svg{width:100%}` rule above and
   blow up to fill their flex parent (caught live via screenshot 2026-09-22:
   a 64x16 glyph rendered as a ~280px circle). Same bug class as doc-31's own
   mobile-chart note just above, opposite fix: this one must NOT stretch. */
.cb .idg{display:inline-block;width:64px;height:16px;max-width:64px;flex:none}
/* Reformat, don't shrink (doc-31's mobile-chart rule) -- measured 2026-09-21: the
   scatter's SVG had no min-width, so at 390px it rendered ~315px wide with all 284
   dots and 16 labels at an effective ~3px font size, genuinely unreadable. #cb-map
   scrolls horizontally below 720px instead of shrinking past legibility -- same
   pattern .cp-arc-wrap already uses successfully on the coach page. */
.cb #cb-map{overflow-x:auto;-webkit-overflow-scrolling:touch}
.cb #cb-map svg{min-width:720px}
.cb .cb-map-hint{display:none}
@media(max-width:760px){
  .cb .cb-map-hint{display:flex;align-items:center;gap:5px;margin:6px 0 0;
    font:500 10.5px/1 Archivo,sans-serif;color:var(--muted)}
  .cb .cb-map-hint svg{width:11px;height:11px;flex:0 0 auto}
}
.cb .qlabel{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;fill:var(--muted);opacity:.7}
.cb .qsub{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:13px;fill:var(--muted);font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .axlabel{font-size:12px;fill:var(--muted);font-weight:600}
/* cursor:pointer only on a dot that's a REAL link (2026-09-21 fix) -- before, every
   dot promised a click regardless of whether one did anything; a plain dot still
   highlights + shows its tooltip on hover, it just doesn't claim to be clickable. */
.cb .dot{transition:opacity .12s}.cb .dot:hover{stroke:var(--ink);stroke-width:1.5}
.cb .dot-link{cursor:pointer}
.cb a:focus-visible .dot-link{stroke:var(--ink);stroke-width:1.5}
.cb .mlabel{font-size:11px;font-weight:700;fill:var(--ink);pointer-events:none}
.cb .tip{position:absolute;pointer-events:none;background:#fff;color:var(--ink);border:1px solid var(--rule,#d7d7d4);padding:8px 11px;border-radius:2px;font-size:12.5px;max-width:230px;opacity:0;transition:opacity .1s;z-index:5;line-height:1.35}
.cb .tip b{font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .rails{padding:28px 0 6px}
.cb .toggle{display:inline-flex;border:1px solid var(--line);border-radius:3px;overflow:hidden;margin-bottom:18px}
.cb .toggle button{font-family:Archivo,sans-serif;font-size:13px;font-weight:700;padding:9px 16px;border:0;background:var(--page);color:var(--muted);cursor:pointer}
.cb .toggle button[aria-pressed=true]{background:var(--ink);color:#fff}
.cb .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
.cb .card{border:1px solid var(--line);border-radius:3px;padding:15px 16px 14px;background:var(--page);position:relative;overflow:hidden}
.cb .card::before{content:none}
.cb .card.a-transformer::before,.cb .card.a-builder::before{background:var(--build)}
.cb .card.a-inheritor::before,.cb .card.a-sustainer::before{background:var(--hold)}
.cb .card.a-decliner::before{background:var(--decline)}
.cb .card.a-caretaker::before{background:var(--neutral)}
.cb .card .rank{position:absolute;top:14px;right:15px;font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-size:28px;color:var(--line);font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .chead{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.cb .cname{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:22px;font-weight:800;line-height:1;font-stretch:var(--head-stretch,78%)}
/* A coach's name is the card's drill-down to his own career page. Underlined at rest in
   the hairline color (same affordance grammar as .cp-comp a below and .go-deeper a on
   /zeitgeist/history/) rather than colored: a colored name would collide with doc 100's
   accent bindings, and "looks exactly like body ink" is precisely the 2026-09-22 audit
   finding this rule answers. Names with no built page render as plain text, so the
   underline is an honest per-card signal, not decoration. */
.cb .cname a{color:inherit;text-decoration:underline;text-decoration-color:var(--line);
  text-underline-offset:3px;text-decoration-thickness:1.5px}
.cb .cname a:hover{opacity:.72}
.cb .cteam{font-size:13px;color:var(--muted);font-weight:600}
.cb .cyears{font-size:12px;color:var(--muted)}
.cb .badge{font-size:12.5px;font-weight:700;background:none;padding:0;border:0;border-radius:0;color:var(--ink-3,#686862)}
.cb .b-transformer,.cb .b-builder{background:none;color:var(--build)}.cb .b-inheritor,.cb .b-sustainer{background:none;color:var(--ink-3,#686862)}.cb .b-decliner{background:none;color:var(--red,#bf3b31)}.cb .b-caretaker{background:none;color:var(--ink-3,#686862)}
.cb .b-coy{background:none;color:var(--gold-text,#8a6200)}
.cb .hl{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:14.5px;line-height:1.35;margin:9px 0 12px;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .split-lab{display:flex;justify-content:space-between;font-size:12px;color:var(--muted);margin-bottom:4px}
.cb .split-bar{display:flex;height:14px;border-radius:2px;overflow:hidden;background:var(--panel2)}
/* split-built/split-neg are mutually exclusive on one bar (JS renders one or the
   other depending on sign) -- fixed 2026-09-21 to be pure, symmetric VALENCE (green
   built / red lost), not archetype color. Before this, split-neg was always red but
   split-built took the archetype's own color (blue, or gold for inheritor/sustainer)
   -- an asymmetric encoding where only the negative arm actually meant "positive/
   negative." The archetype signal already lives on the card's left-edge ribbon
   (.card.a-*::before) and the badge; this bar doesn't need to carry it a second time,
   and now reads cleanly as its own axis: how the split-inh/split-built/split-neg
   segments moved, independent of what kind of tenure this was. */
.cb .split-inh{background:#c7c7c2}.cb .split-built{background:var(--green)}
.cb .split-neg{background:var(--red)}
.cb .metrics{display:flex;gap:18px;align-items:flex-end;margin-top:12px}
.cb .hero{font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-size:var(--fs-h1,38px);font-weight:800;line-height:.9;font-stretch:var(--head-stretch,78%)}
.cb .hero small{font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;color:var(--muted);display:block;margin-top:4px}
.cb .arc{flex:1;min-width:0}
.cb .receipts{display:flex;gap:14px;flex-wrap:wrap;margin-top:11px;padding-top:10px;border-top:1px solid var(--line-soft);font-size:12px;color:var(--muted)}
.cb .receipts b{color:var(--ink);font-weight:700}
.cb .search{width:100%;max-width:340px;padding:9px 12px;border:1px solid var(--line);border-radius:3px;font-family:Archivo,sans-serif;font-size:14px;margin-bottom:14px;color:var(--ink);background:var(--page)}
/* flex, not grid: a program count that doesn't divide evenly into columns would leave a
   visibly empty gap on the last row with 1fr grid tracks -- flex + a fixed tile width just
   left-aligns a partial row instead, with no dead space, regardless of total count. */
.cb .pgrid{display:flex;flex-wrap:wrap;gap:8px}
.cb .ptile{border:1px solid var(--line);border-radius:3px;padding:10px 12px;display:flex;gap:10px;align-items:center;flex:0 0 228px}
.cb .ptile .ptlogo{width:32px;height:32px;object-fit:contain;flex:none}
.cb .ptile .ptbody{flex:1;min-width:0}
.cb .ptile .pteam{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:15px;font-weight:800;line-height:1.1;font-stretch:var(--head-stretch,78%)}
.cb .ptile .pcoach{font-size:12.5px;color:var(--muted);margin-top:2px}
.cb .ptile .pmeta{font-size:11px;color:var(--muted);margin-top:5px;display:flex;gap:8px;justify-content:space-between;align-items:baseline}
.cb .ptile .pband{font-weight:700;color:var(--ink)}
.cb .section-h{margin:44px 0 4px}.cb .section-h h2{font-size:26px}.cb .section-h.decline h2{color:var(--decline)}
.cb .section-sub{font-size:14px;color:var(--muted);max-width:62ch;margin:6px 0 20px}
.cb footer{margin:48px 0 0;padding-top:18px;border-top:1px solid var(--line);font-size:12.5px;color:var(--muted);max-width:72ch}
/* Hero card (2026-09-21): the coach with the single highest peak_composite ever recorded
   gets a wider, denser treatment inside cb-top5 instead of one more <li> -- see
   _hero_stats()'s docstring for why it's a deliberately separate ranking from the <ol>
   below it. Reuses .hero/.hero small (the same big-number pattern every card already
   uses in .metrics) rather than inventing a second numeral style. */
.cb .herocard{border:1px solid var(--line);border-radius:3px;padding:20px 22px 16px;margin:10px 0 16px;display:flex;flex-direction:column;gap:14px}
.cb .hc-top{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}
.cb .hc-crest{width:56px;height:56px;object-fit:contain;flex:none}
.cb .hc-id{flex:1;min-width:200px}
.cb .hc-name{font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-size:24px;font-weight:800;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;font-stretch:var(--head-stretch,78%)}
.cb .hc-team{font-size:13px;color:var(--muted);margin-top:2px}
.cb .hc-hl{margin:8px 0 0;font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:15.5px;line-height:1.4;max-width:64ch;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .hc-body{display:flex;gap:24px;align-items:flex-end;flex-wrap:wrap}
/* Same "reformat, don't shrink" rule as #cb-map and .cbl-scroll: the peak-year label would
   shrink well past legible if this 620px-native chart were left to squeeze into a ~240px
   flex slot on a phone. */
.cb .hc-arc{flex:1;min-width:240px;overflow-x:auto;-webkit-overflow-scrolling:touch}
.cb .hc-arc svg{min-width:560px}
.cb .hc-receipts{display:flex;gap:16px;font-size:12.5px;color:var(--muted);border-top:1px solid var(--line-soft);padding-top:10px;flex-wrap:wrap}
.cb .hc-receipts b{color:var(--ink);font-weight:700}


.cb .lin-head{display:flex;align-items:flex-start;gap:16px;
  }
.cb .lin-logo{position:relative;display:block;width:52px;height:52px;flex:0 0 auto;margin-top:4px}
.cb .lin-logo img{width:100%;height:100%;object-fit:contain;display:block}
.cb .lin-logo__mono{position:absolute;inset:0;border-radius:3px;display:none;align-items:center;
  justify-content:center;font-family:Archivo,sans-serif;font-weight:800;font-size:16px;color:#fff}
.cb .lin-h1{font-size:clamp(28px,4vw,46px);line-height:1.04;margin:12px 0 0}
.cb .supers{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:22px 0 8px}
.cb .super{border:1px solid var(--line);border-radius:3px;padding:12px 14px}
.cb .super .slab{font-size:11.5px;font-weight:800;color:var(--muted)}
/* display:block because .sname is now an <a>/<span> (it was a <div>) so the four verdict
   cards can link the coach they name -- see _super(). Affordance grammar matches .cname a
   on the board and .lname in the rail below: hairline underline at rest, team-ish accent
   on hover; an unlinked <span class="sname"> inherits neither. */
.cb .super .sname{display:block;font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:20px;font-weight:800;
  margin-top:3px;line-height:1.05;color:inherit;text-decoration:none;font-stretch:var(--head-stretch,78%)}
.cb .super a.sname{text-decoration:underline;text-decoration-color:var(--line);
  text-underline-offset:3px;text-decoration-thickness:1.5px}
.cb .super a.sname:hover{opacity:.72}
.cb .super .ssub{font-size:12.5px;color:var(--muted);margin-top:3px}
.cb .super .ssub .sdelta{font-weight:700}.cb .super .ssub .sdelta.pos{color:var(--build)}
.cb .super .ssub .sdelta.neg{color:var(--decline)}
.cb .context{margin:14px 0 8px;font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .context .cbig{font-size:clamp(17px,2vw,22px);font-weight:600;line-height:1.25}
.cb .context .ctraj{font-family:Archivo,sans-serif;font-size:13px;color:var(--build);font-weight:700;margin-top:6px}
.cb .tl{margin:26px 0 6px}.cb .tl h2{font-size:20px;margin-bottom:4px}
.cb .rail{margin:26px 0 0}.cb .rail h2{font-size:20px;margin-bottom:10px}
.cb .lrow{display:grid;grid-template-columns:auto 1fr auto;gap:14px;align-items:center;
  padding:11px 2px 11px 10px;border-bottom:1px solid var(--line-soft);
  transition:border-color .15s,background-color .15s}
.cb .lrow:hover{}
.cb .lrow.is-current{background:var(--fill-1,#f8f8f5)}
.cb .lrow .lyears{font-family:Archivo,sans-serif;font-size:12px;color:var(--muted);width:92px}
.cb .stub-note{font-size:10.5px;font-weight:400;color:var(--muted);white-space:nowrap}
.cb .lrow .lname{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:17px;font-weight:800;color:inherit;text-decoration:none;font-stretch:var(--head-stretch,78%)}
/* Rest-state affordance (2026-09-22 audit): these names have BEEN links since 2026-09-02,
   but at rest they computed to color #222, text-decoration none, Fraunces 600 -- byte-
   identical to the non-link rows beside them (e.g. Ohio State: 13 of 14 clickable, all 14
   looking the same), so the page's best drill-down was invisible until you happened to
   hover. Hairline underline at rest tells a reader which names go somewhere; the hover
   state stays as it was.
   Scoped `.cb .lrow a.lname`, not the bare `a.lname` the old hover rule used: `.cb .lrow
   .lname` above is three classes and outranked it, so even the hover color never actually
   applied. */
.cb .lrow a.lname{text-decoration:underline;text-decoration-color:var(--line);
  text-underline-offset:3px;text-decoration-thickness:1.5px}
.cb .lrow a.lname:hover{opacity:.72}
.cb .lrow .lhl{font-size:12.5px;color:var(--muted)}
.cb .lin-sig{font-family:Archivo,sans-serif;font-size:12px;color:var(--ink);
  margin-top:5px;line-height:1.4}
.cb .lin-sig--quiet{border-left-color:var(--line);color:var(--muted)}
.cb .lin-shift{display:flex;align-items:center;gap:6px;font-family:Archivo,sans-serif;font-size:11px;
  color:var(--muted);margin-top:5px}
.cb .lin-shift .idg{vertical-align:middle}
.cb .lrow .lstat{text-align:right;font-variant-numeric:tabular-nums}
.cb .lrow .lstat b{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:19px;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .lrow .lstat b.pos{color:var(--build)}.cb .lrow .lstat b.neg{color:var(--decline)}
/* Phones (2026-09-27): the fixed 92px years column plus a detail column that can't shrink
   below its content pushed the stat past a 390px screen (Texas A&M's R.C. Slocum row ended
   at 416px, the page scrolled sideways). Under 520px the years take their own line above
   the name, and the detail column may shrink (minmax(0,1fr)) and wrap. */
@media(max-width:520px){
  .cb .lrow{grid-template-columns:minmax(0,1fr) auto;row-gap:2px}
  .cb .lrow .lyears{grid-column:1 / -1;width:auto}
  .cb .lrow > :nth-child(2){min-width:0;overflow-wrap:anywhere}
}
.cb .lrow .lbadge{font-size:12.5px;font-weight:700;background:none;padding:0;border:0;border-radius:0;margin-left:8px}
/* Phase 0b (2026-09-23): hollow near-cliff qualifier, sibling to .lbadge -- never a fill,
   so it reads as "low confidence" rather than a second solid badge competing for attention. */
.cb .lbadge-near{display:inline-block;margin-left:3px;font-size:10px;font-weight:700;
  color:var(--muted);border:1px solid var(--line);border-radius:50%;width:13px;height:13px;
  line-height:11px;text-align:center;cursor:help;vertical-align:middle}
.cb .backlink{display:inline-block;margin:8px 0 0;font-size:13px;color:var(--build);font-weight:700;text-decoration:none}
.cb .hist-link{display:inline-block;margin:6px 0 0;font-size:13px;color:var(--build);font-weight:700;text-decoration:none}
.cb .band-link{color:inherit;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}
.cb .band-link:hover{opacity:.72}
.cb .b-short{background:none;color:var(--ink-3,#686862)}
.cb .lin-riv{display:flex;align-items:center;gap:4px;margin-top:5px}
.cb .lin-riv-lab{font-family:Archivo,sans-serif;font-size:10.5px;font-weight:700;color:var(--muted);margin-right:2px}
.cb .lin-riv-b{width:9px;height:9px;border-radius:2px;display:inline-block;background:var(--line)}
.cb .lin-riv-b.w{background:var(--green)}.cb .lin-riv-b.l{background:var(--red)}
.cb .lin-riv-b.t{background:var(--hold)}
.cb .lin-toggle-row{display:none;flex-wrap:wrap;align-items:center;gap:10px 18px;margin:10px 0 4px}
.js .cb .lin-toggle-row{display:flex}
.cb .lin-toggle{display:flex;align-items:center;gap:6px;font-family:Archivo,sans-serif;
  font-size:12.5px;color:var(--ink);cursor:pointer;user-select:none}
.cb .lin-toggle input{margin:0;cursor:pointer}
.cb .lin-toggle .sw{width:10px;height:10px;border-radius:2px;display:inline-block}
.cb .lin-modes{display:flex;margin-left:auto;border:1px solid var(--rule);border-radius:3px;overflow:hidden}
.cb .lin-modes button{font-family:Archivo,sans-serif;font-size:10.5px;font-weight:700;padding:4px 10px;background:var(--page);border:none;color:var(--muted);cursor:pointer}
.cb .lin-modes button.active{background:var(--ink);color:#fff}
/* Mobile chart strategy (2026-09-22): hold native width, let ONE wrapper scroll -- the
   house pattern documented at .cp-arc-svg below ("Axis/node text is SVG viewBox-space
   font-size, so it shrinks with the container... same overflow-x pattern as
   unit_lineage.py"). It had never been applied here, so this chart -- the best thing on
   the page -- rendered at 315 x 91 CSS px on a 390px phone, a 0.315x scale that put its
   9-10.5 user-unit text at ~2.8-3.3 CSS px (measured live, both figures). Two details
   that are load-bearing:
   (1) The scroller is a NEW parent around BOTH the stature chart and the style ribbon,
       never overflow-x on each of them separately: _style_ribbon_svg() shares
       _timeline_svg()'s exact X() so the two are pixel-aligned by contract, and two
       independent scroll boxes would let a reader slide one out of register with the
       other. One scroller moves them together.
   (2) min-width lives on .lin-chart-box / .lin-rib-wrap, not only on the <svg>: a plain
       block child of a scroll container sizes to the container's CLIENT width, so the
       SVG's own min-width alone would overflow a 315px-wide box (the same containing-
       block trap history_page.py documents on .zh .seq-head). .lin-chart-box must also
       keep position:relative -- #lin-tip is absolutely positioned inside it, and
       lineage-chart.js's setHoverYear() places the tip from
       (svgRect.left - boxRect.left), which stays correct only while the box itself is
       the thing that scrolls under the viewport, not the offset parent of the scroller.
   860px matches .cp-arc-svg's own native width exactly rather than inventing a second
   number. yearFromEvent() reads coordinates through getScreenCTM(), which already
   accounts for scroll, so hover needs no change. */
.cb .lin-scroll{overflow-x:auto;overflow-y:hidden}
/* Coach-tenure strip segments are real <a>s (see _timeline_svg). Cursor + a small
   opacity lift on hover so the click target reads as one; a segment for a coach with no
   built page renders as a <g> and gets neither. */
.cb .lin-scroll a.tl-seg{cursor:pointer}
.cb .lin-scroll a.tl-seg rect{transition:fill-opacity .1s ease-in}
.cb .lin-scroll a.tl-seg:hover rect{fill-opacity:1}
@media (prefers-reduced-motion:reduce){.cb .lin-scroll a.tl-seg rect{transition:none}}
.cb .lin-chart-box{position:relative;min-width:860px}
.cb .lin-rib-wrap{margin-top:4px;min-width:860px}
/* Same spurious-scrollbar fix, and for the same reason, as .cb #cp-arc-tip below: .tip is
   position:absolute with no top/left, so its static-position box (which lands after the
   SVG) joined the wrapper's scrollable overflow. The hover JS assigns real left/top. */
.cb #lin-tip{top:0;left:0}
.cb .lin-scroll-hint{display:none}
@media(max-width:900px){
  .cb .lin-scroll-hint{display:flex;align-items:center;gap:5px;margin:8px 0 0;
    font:500 10.5px/1 Archivo,sans-serif;color:var(--muted)}
  .cb .lin-scroll-hint svg{width:11px;height:11px;flex:0 0 auto}
}
.cb .lin-rib-cap{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted);margin:0 0 3px}
.cb .lin-rib-dot{transition:r .1s ease-in,fill .1s ease-in}
@media (prefers-reduced-motion:reduce){.cb .lin-rib-dot{transition:none}}
.cb .tband-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin:8px 0 2px;
  font-family:Archivo,sans-serif;font-size:11px;color:var(--muted)}
.cb .tband-legend i{width:8px;height:8px;border-radius:1px;display:inline-block;
  margin-right:4px;vertical-align:middle;opacity:.7}


.cb .cp-head{margin:14px 0 0;position:relative}
/* Hot-seat thermometer (DECISIONS.md#D-129): `.cp-hs-badge` is absolutely positioned
   in this header's top-right corner, so the header reserves its slot (124px + a 32px gutter,
   job_pressure_render._BADGE_SLOT) whenever one is present -- the name, runway and
   record can never run under it. Below 600px the badge flows inline instead. */
.cb .cp-head:has(>.cp-hs-badge){padding-right:156px}
@media(max-width:600px){.cb .cp-head:has(>.cp-hs-badge){padding-right:0}}
.cb .cp-name{font-size:clamp(28px,4.2vw,42px)}
.cb .cp-record{font-family:Archivo,sans-serif;font-weight:800;font-size:clamp(26px,3.6vw,38px);
  margin-top:6px;line-height:1}
.cb .cp-record small{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted);margin-left:8px;
  vertical-align:2px}
/* Career total drops to a secondary line + smaller size once a live current-season
   record is also shown (2026-09-21) -- the season record is what a cold search
   arrival came for; the career total is real context, not the hero number. */
.cb .cp-record-career{font-size:clamp(17px,2.2vw,22px);color:var(--muted);margin-top:2px}
/* 1936 data-floor mark (see coach_data_floor) -- muted, like the board's "⚠ early era". */
.cb .cp-record abbr.cp-floor,.cb .cp-record abbr.cp-lowerdiv{text-decoration:none;cursor:help;opacity:.7}
.cb .cp-so-arcnote{font:400 13px/1.45 'Archivo',sans-serif;color:var(--ink-2,#5b5b5b);margin:10px 0 0}
.cb .cp-so-arcnote a{color:inherit;text-decoration:underline;text-underline-offset:2px}
.cb .cp-record-note{font:400 12px/1.4 'Archivo',sans-serif;color:var(--ink-2,#5b5b5b);margin:2px 0 6px;max-width:44ch}
.cb .cp-record-note b{font-weight:700;color:var(--ink,#222)}
.cb .cp-record-note a{color:inherit;text-decoration:underline;text-underline-offset:2px}
.cb .cp-titles{font-family:Archivo,sans-serif;font-size:13.5px;font-weight:700;color:var(--ink);
  margin-top:6px}
/* Header tenure runway (2026-09-21, replaces the old text chip row): a single neutral
   spine plus per-stint color ticks -- see _render_tenure_runway's own docstring for why
   it deliberately carries no filled color block. Unboxed (2026-09-21: a boxed/bordered
   version was tried and reverted the same session -- too heavy between the name and the
   record) and tight against both neighbors, not floating in its own whitespace. */
.cb .cp-runway{margin:6px 0 0;max-width:640px}
.cb .cp-runway svg{display:block;width:100%;height:auto}
.cb .cp-runway a{cursor:pointer}
.cb .cp-runway a:hover{opacity:.7}
.cb .cp-early{margin:18px 0;font-size:14px;color:var(--muted)}
.cb .cp-stints{margin-top:26px}
.cb .cp-shift{display:flex;align-items:center;gap:6px;margin:6px 0 0}
.cb .cp-shift-lbl{font-family:Archivo,sans-serif;font-weight:700;font-size:11.5px;color:var(--blue)}
/* Iterated 3x 2026-09-22: boxed/muted-gray chip -> flat cp-titles-weight line ->
   promoted into its own larger italic lede+second sentence after a cold-fan audit ->
   slimmed back down to this flat cp-titles line (owner report: the header had gotten
   "a bit wordy" -- skip the recruiting factoid and the narrative sentence, "just
   present the data basically"). Reuses .cp-titles as its base class -- deliberately
   NOT its own visual system, so it reads as one more line in that same stat list. */
.cb .cp-system-fact a{color:inherit;text-decoration:none}
.cb .cp-system-fact a:hover{text-decoration:underline}
.cb .cp-arch-legend{font-size:12.5px;color:var(--muted);margin:2px 0 14px;line-height:1.5}
.cb .cp-arch-legend b{color:var(--ink);font-weight:700}
.cb .cp-row{display:grid;grid-template-columns:110px 1fr 90px;gap:14px;align-items:baseline;
  padding:12px 0;border-top:1px solid var(--line-soft);}
/* Grid-blowout guard: a grid item's default min-width:auto lets its content's intrinsic
   width (the season dossier table below, min-width:760px + nowrap coordinator names) win
   over the 1fr track, forcing this whole row -- and the page -- to overflow horizontally
   even though .cd-scroll has its own overflow-x:auto. min-width:0 lets the track win so
   the table's own scroller actually does its job. Caught 2026-09-10 on a 6-season stint. */
.cb .cp-row>*{min-width:0}
.cb .cp-row:first-child{border-top:none}
.cb .cp-yrs{font-weight:700}
.cb .cp-yrs .stub-note{font-size:10.5px;font-weight:400;color:var(--muted);white-space:nowrap}
.cb .cp-team a{color:var(--ink);text-decoration:none;font-weight:600}
.cb .cp-team a:hover{text-decoration:underline}
.cb .cp-row .lbadge{font-size:12.5px;font-weight:700;background:none;padding:0;border:0;border-radius:0;margin-left:8px;vertical-align:baseline}
.cb .cp-take{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:13.5px;line-height:1.4;
  color:var(--ink);margin-top:4px;max-width:60ch;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .cp-bands{color:var(--muted);font-size:12.5px;margin-top:2px}
.cb .cp-band-now{}
.cb .cp-wl{text-align:right;font-weight:700}
/* Swing glyph (2026-09-21) -- shape+count instead of a bare signed number or text badge; see
   coaching_impact.py's swing_glyph(). COLOR CORRECTED 2026-09-21 (was --build/--hold/
   --decline, the ARCHETYPE accents): archetype is a CATEGORY (builder/inheritor/...) and
   carries no valence of its own; the swing is a signed DELTA and must take the site's own
   delta accents (green=positive/wins, red=negative/losses -- doc-100 accent-semantics-
   contract), the same accents the career-arc chart's own delta text already uses one section
   up. Before this fix the identical number could render green in the arc chart and gold (as
   a "flat" glyph) or blue (as an "up" glyph) here -- same page, same delta, two colors. A
   blue BUILDER badge sitting beside a green up-arrow is NOT a contradiction once you see it
   this way -- they're different axes (contract §3): one says what kind of tenure this was,
   the other says which direction it just moved. Borderline confidence (replaces the old text
   "borderline" pill) is a real hollow Unicode glyph (△/▽) picked server-side, not a CSS
   stroke/transparent-fill trick -- a font-rendering gamble at 13px, whereas a different real
   character always renders correctly. Static `<span class="cp-glyph">` for the rare stint
   with nothing to expand on tap; the button variant below is the normal case. */
.cb .cp-glyph{font-family:Archivo,sans-serif;font-size:13px;font-weight:700;vertical-align:middle}
.cb .cp-glyph.up{color:var(--green)}
.cb .cp-glyph.down{color:var(--red)}
.cb .cp-glyph.flat{color:var(--muted)}
.cb .cp-glyph.nodata{color:var(--ink-3)}
.cb .cp-glyph-panel{display:inline-block;vertical-align:middle}
.cb .cp-glyph-panel .xp{margin:0}
/* The glyph IS the tap target, not the whole row (the row also holds the team link and the
   Comp: link -- a link nested inside a clickable container is an unreliable tap on mobile) and
   not a separate "More about this stint" text button. Padding (not font-size) gives it a real
   ~44px touch target while the glyph itself stays visually small, same trick used for any
   small tappable icon. */
.cb .cp-glyph-panel .xp-btn{font-family:Archivo,sans-serif;font-size:13px;font-weight:700;
  padding:11px 10px;margin:-11px -10px;background:none!important;border:none;
  transition:opacity .1s ease-in}
.cb .cp-glyph-panel.up .xp-btn{color:var(--green)}
.cb .cp-glyph-panel.down .xp-btn{color:var(--red)}
.cb .cp-glyph-panel.flat .xp-btn{color:var(--muted)}
.cb .cp-glyph-panel.nodata .xp-btn{color:var(--ink-3)}
.cb .cp-glyph-panel .xp-btn:hover{opacity:.7}
.cb .cp-glyph-panel .xp-btn .xp-chev{color:var(--muted);font-size:10px}
.cb .cp-glyph-panel .xp.open .xp-inner{padding:8px 0 2px!important}
/* Comp line -- a real crosslink to the nearest-magnitude peer stint, not generated prose. */
.cb .cp-comp{font-family:Archivo,sans-serif;font-size:12px;color:var(--muted);margin-top:3px}
.cb .cp-comp a{color:var(--muted);text-decoration:underline;text-decoration-color:var(--line)}
.cb .cp-comp a:hover{opacity:.72}
/* Swing detail (inside the tap panel): exact points + percentile line. */
.cb .cp-swing-detail{margin:2px 0 8px}
.cb .cp-swing-line{font-size:13px;color:var(--ink)}
@media (max-width:640px){
  /* 110px years + 90px record leaves as little as ~180px for the team column on a phone --
     survivable for the one-line collapsed summary, but the "More about this stint" detail
     panel (a season-by-season table, side-by-side stat cards) needs real width. Reflow years
     + record onto one compact header line and give the team column its own full-width row. */
  .cb .cp-row{grid-template-columns:1fr auto;grid-template-areas:"yrs wl" "body body";
    row-gap:4px;gap:8px 14px}
  .cb .cp-yrs{grid-area:yrs}
  .cb .cp-wl{grid-area:wl;text-align:right}
  .cb .cp-body{grid-area:body}
}
.cb .cp-games{margin-top:26px}
.cb .cp-game{display:block;padding:9px 0;border-top:1px solid var(--line-soft);font-size:14px;
  color:var(--ink);text-decoration:none;transition:opacity .1s ease-in}
.cb .cp-game:first-child{border-top:none}
.cb .cp-game:hover{opacity:.6}
.cb .cp-arc-section{margin:22px 0 0}
.cb .cp-arc-wrap{margin:10px 0 0;padding:18px 20px 8px;border:1px solid var(--line);border-radius:3px;overflow-x:auto}
.cb .cp-arc-chart-box{position:relative}
/* #cp-arc-tip (the .tip element, position:absolute with no top/left set) was
   contributing its static-position box -- which lands just after the SVG -- to
   .cp-arc-wrap's scrollable overflow, spawning a spurious ~8px vertical scrollbar
   inside the card (measured: scrollHeight 369 vs clientHeight 361). Do NOT "fix"
   this with overflow-y:hidden on .cp-arc-wrap -- overflow-x:auto is required (the
   SVG has min-width:860px) and per the CSS spec the other axis cannot then be
   `visible`, it computes to `auto`; hidden would also clip the tooltip and any
   SVG label using overflow:visible. Pinning the tip's own box to 0,0 (the scrub
   JS already assigns real left/top on hover) is the actual fix. */
.cb #cp-arc-tip{top:0;left:0}
/* Axis/node text is SVG viewBox-space font-size, so it shrinks with the container --
   confirmed illegible below its native width via a live render (same issue the old v1
   arc chart had). Hold native width and let the wrapper scroll instead of inventing a
   mobile chart variant, same overflow-x pattern as unit_lineage.py and
   coordinator_page.py's Tenure Clock chart -- unlike that predecessor this applies at
   every width, not just <640px, since this chart carries a full labeled axis + lanes
   that genuinely need the room, not just labels that could shrink to fit. */
.cb .cp-arc-svg{display:block;width:100%;height:auto;overflow:visible;min-width:860px}
.cb .cp-arc-svg text{font-family:Archivo,sans-serif;font-variant-numeric:tabular-nums}
.cb .cp-arc-hint{display:none}
/* Swipe affordance for the horizontally-scrollable arc below the 860px native chart
   width -- same pattern + copy convention as the homepage game strip's .gs-hint
   (nav.py), which is the only other "wide content in a scroll box" surface on the
   site with an explicit swipe cue. Added 2026-09-10 fan-audit mobile pass. */
@media(max-width:900px){
  .cb .cp-arc-hint{display:flex;align-items:center;gap:5px;margin:8px 0 0;
    font:500 10.5px/1 Archivo,sans-serif;color:var(--muted)}
  .cb .cp-arc-hint svg{width:11px;height:11px;flex:0 0 auto}
}
.cb .cp-count-line-section{margin:22px 0 0;padding:18px 20px;border:1px solid var(--line);border-radius:3px}
.cb .cp-count-line-intro{font-size:13px;line-height:1.5;color:var(--muted);margin:6px 0 14px;max-width:60ch}
.cb .cp-count-line-sources{font-size:11.5px;color:var(--muted);margin:10px 0 0}
.cb .cp-leaderboard-section{margin:22px 0 0;padding:18px 20px;border:1px solid var(--line);border-radius:3px}
.cb .cp-leaderboard-intro{font-size:13px;line-height:1.5;color:var(--muted);margin:6px 0 14px;max-width:60ch}
.cb .cp-leaderboard-caption{font-size:12.5px;color:var(--muted);margin:10px 0 0}
.cb .cp-d-line{font-size:13px;line-height:1.5;color:var(--ink);margin:6px 0}
.cb .cp-d-line b{font-weight:700}
.cb .cp-d-block{margin:10px 0}
.cb .cp-d-block b{display:block;font-size:12px;font-weight:800;color:var(--muted);margin-bottom:4px}
.cb .cp-d-item{display:block;font-size:13px;line-height:1.6;color:var(--ink)}
.cb .cp-d-item i{font-style:normal;color:var(--muted)}
.cb .xp{margin-top:8px;border:none}
.cb .xp-btn{font-family:Archivo,sans-serif;font-size:11.5px;font-weight:700;color:var(--build);
  padding:2px 0;background:none!important;border:none;transition:opacity .1s ease-in}
.cb .xp-btn:hover{opacity:.6}
.cb .xp-inner{padding:0!important}
.cb .xp.open .xp-inner{padding:6px 0 2px!important}
.cb .cp-peers{margin-top:26px}


/* ── IN THE NEWS (confirmed outlet reports naming this coach) ───────────────
   One compact horizontal strip, matching team_pages/latest_strip.py's "Latest"
   strip -- see render_coach_news's own docstring for why it isn't a literal
   shared component. Quoted headline + attribution, nothing else. No verdict,
   no site voice, no colour that would imply one -- muted/line tokens only,
   notably NOT the team-colour ribbon the header runway/chips use elsewhere on
   this page (docs/design-system/100-accent-semantics-contract: a coloured
   accent here would bind a meaning to a contract dispute or an accusation,
   and this band has no meaning it's entitled to assert). */
.cb .cp-news{display:flex;align-items:center;gap:14px;margin:22px 0 0;
  padding:9px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  overflow:hidden}
.cb .cp-news__label{flex:none;position:relative;padding-right:14px;
  font-family:Archivo,sans-serif;font-weight:800;font-size:11px;
  color:var(--muted);cursor:help}
.cb .cp-news__label::after{content:"";position:absolute;right:0;top:-2px;bottom:-2px;
  width:1px;background:var(--line)}
.cb .cp-news__row{display:flex;align-items:baseline;gap:20px;flex:1;min-width:0;
  overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;
  /* Fade, not a hard clip, at the scrollable edge -- without this the row just cut
     off mid-word at the container boundary with no hint it was scrollable at all,
     reading as broken rather than "there's more" (2026-09-21 fan-report finding). */
  mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent);
  -webkit-mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent)}
.cb .cp-news__row::-webkit-scrollbar{display:none}
.cb .cp-news-item{flex:none;white-space:nowrap;font-family:Archivo,sans-serif;
  font-size:13px;font-weight:600;color:var(--muted);text-decoration:none}
.cb .cp-news-item:hover{color:var(--ink)}
.cb .cp-news-item:hover .cp-news-item__meta{color:var(--ink)}
.cb .cp-news-item__meta{color:var(--muted);font-weight:500}
/* Strip -> full-archive click-through, same role as .cq-see-all next to the
   quote carousel -- flex:none so it never gets squeezed by the scrolling row
   and always stays visible past the fade. */
.cb .cp-news-see-all{flex:none;font-family:Archivo,sans-serif;font-size:12px;
  font-weight:700;color:var(--muted);text-decoration:none}
.cb .cp-news-see-all:hover{color:var(--ink);text-decoration:underline}
@media (max-width:600px){
  /* Mechanism (measured 2026-09-21): with all three children (label, scrolling
     row, see-all) on one flex row, `.cp-news__row`'s flex:1 got squeezed down to
     just 100px of a ~341px-wide strip once the label and see-all claimed their
     own space -- clientWidth 100 vs scrollWidth 3193, reading as a hard clip to
     ~2 words even though the row does scroll. Wrapping the scrolling row onto its
     own full-width line (order:2) gives it the whole strip width instead. */
  .cb .cp-news{gap:6px 10px;flex-wrap:wrap;align-items:baseline}
  .cb .cp-news__label{padding-right:10px}
  .cb .cp-news__row{flex:1 0 100%;order:2}
  .cb .cp-news-see-all{order:3;margin-left:auto}
}

/* ── EVERY HEADLINE (full archive, placed near the bottom of the page) ──────
   Restores the original vertical-card presentation this band had before the
   2026-09-21 strip redesign -- that design was always fine, it just shouldn't
   have sat unconditionally at the top. Same muted/line-only, no-accent rule
   as the strip above, for the same doc-100 reason. */
.cb .cp-news-full{margin:26px 0 0;scroll-margin-top:20px}
.cb .cp-news-full__h{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:19px;
  color:var(--ink);margin:0;font-stretch:var(--head-stretch,78%)}
.cb .cp-news-full__note{margin:6px 0 12px;font-family:Archivo,sans-serif;font-size:12.5px;
  line-height:1.5;color:var(--muted);max-width:62ch}
.cb .cp-news-full__list{list-style:none;margin:0;padding:0}
.cb .cp-news-full__item{border-top:1px solid var(--line)}
.cb .cp-news-full__item:last-child{border-bottom:1px solid var(--line)}
.cb .cp-news-full__link{display:block;padding:13px 0;text-decoration:none;color:var(--ink);
  transition:background .14s}
.cb .cp-news-full__link:hover{opacity:.72}
.cb .cp-news-full__head{display:block;font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:16px;
  line-height:1.34;color:var(--ink);max-width:64ch;font-stretch:var(--head-stretch,78%)}
.cb .cp-news-full__link:hover .cp-news-full__head{text-decoration:underline}
.cb .cp-news-full__meta{display:block;margin-top:5px;font-family:Archivo,sans-serif;font-size:12px;
  font-weight:500;color:var(--muted)}


html{scroll-behavior:smooth}
.cb .cq{margin:18px 0}
.cb .cq h2.cq-sr-h2{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.cb .cq-empty{font-family:Archivo,sans-serif;font-size:14px;color:var(--muted)}
.cb .cq-stage{position:relative}
.cb .cq-slides{display:grid}
/* Moderate shrink (2026-09-21, owner call): full quote text still shown, no
   truncation -- these lead with "about him" material that's meant to be read
   in full (a rival's dig, a beat writer's coin-flip line), so cutting them off
   would undercut the reason they're promoted to the carousel at all. Just a
   leaner box: ~22px down to ~16.5px, tighter line-height and margins throughout. */
.cb .cq-slide{grid-area:1/1;margin:0;padding:1px 0;font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:16.5px;line-height:1.32;color:var(--ink);
  quotes:'\201C' '\201D';opacity:0;transition:opacity .25s ease-in-out;pointer-events:none;font-stretch:var(--head-stretch,78%)}
.cb .cq-slide.is-active{opacity:1;pointer-events:auto}
.cb .cq-slide__text::before{content:open-quote}
.cb .cq-slide__text::after{content:close-quote}
.cb .cq-slide__meta{font-family:Archivo,sans-serif;font-weight:400;font-size:12px;line-height:1.4;
  color:var(--muted);margin-top:6px}
.cb .cq-slide__meta a{color:var(--muted);text-decoration:none}
.cb .cq-slide__meta a:hover{text-decoration:underline}
.cb .cq-slide__context{color:var(--ink-3,#8b8b85)}
/* Nav (prev/next/dots) and the "See every quote" CTA share one row now
   (2026-09-21, "clear up vertical space" pass) -- .cq-see-all's margin-left:auto
   pushes it to the far right of this same flex row instead of stacking below on
   its own row+margin. */
.cb .cq-stage-nav{display:flex;align-items:center;gap:8px;margin:8px 0 0 13px;flex-wrap:wrap}
.cb .cq-arrow{font-family:Archivo,sans-serif;font-size:14px;line-height:1;padding:2px 8px;
  border:1px solid var(--line);border-radius:2px;background:var(--page);color:var(--ink);
  cursor:pointer}
.cb .cq-arrow:hover{opacity:.72}
.cb .cq-dots{display:flex;gap:6px}
.cb .cq-dot{width:6px;height:6px;border-radius:50%;background:var(--line);border:0;padding:0;
  cursor:pointer}
.cb .cq-dot.is-active{background:var(--ink)}
.cb .cq-list{display:flex;flex-direction:column;gap:12px}
@media (prefers-reduced-motion:reduce){.cb .cq-slide{transition:none}}
/* "About him" carousel slides (2026-09-21) -- gold border-left instead of ink, same
   doc-100 perception/discourse accent render_receipt_card already uses for these
   quotes' full-card form below. */
.cb .cq-slide::before{content:"";display:block;width:40px;height:3px;background:var(--gold,#b7851a);margin:0 0 9px}
/* Carousel -> merged module click-through -- now a flex child inside
   .cq-stage-nav (see above), not its own stacked block. */
/* white-space:normal (was nowrap), 2026-09-21: at 335px this link forced a real
   horizontal-scroll bug on every coach page at 390px (document.scrollWidth 525 vs
   clientWidth 375, confirmed the sole offender) -- .cq-stage-nav's flex-wrap:wrap
   above lets this drop to its own line instead, and normal wrapping guarantees no
   overflow at any width even if the label grows. */
.cb .cq-see-all{margin-left:auto;font-family:Archivo,sans-serif;
  font-size:12px;font-weight:700;color:var(--muted);text-decoration:none;white-space:normal}
.cb .cq-see-all:hover{text-decoration:underline}
/* Merged "Every quote" module -- replaces the old two separately-collapsed panels.
   scroll-margin-top keeps the heading clear of the sticky/fixed chrome other pages
   on this site use, harmless here even without one. */
.cb .cq-full{margin:26px 0 0;scroll-margin-top:20px}
.cb .cq-full__h{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:19px;color:var(--ink);
  margin:0;font-stretch:var(--head-stretch,78%)}
.cb .cq-tabs{display:flex;gap:6px 20px;flex-wrap:wrap;margin:12px 0 18px;border-bottom:1px solid var(--line)}
.cb .cq-tab{font-family:var(--font-ui,Archivo,Helvetica,Arial,sans-serif);font-size:13px;font-weight:700;padding:6px 0;margin-bottom:-1px;border:0;
  border-bottom:2px solid transparent;border-radius:0;background:none;color:var(--muted);cursor:pointer}
.cb .cq-tab:hover{opacity:.72}
.cb .cq-tab.is-active{color:var(--ink);border-bottom-color:var(--ink)}
.cb .cq-group{margin-top:22px}
.cb .cq-group:first-of-type{margin-top:0}
.cb .cq-group__h{font-family:Archivo,sans-serif;font-weight:800;font-size:12.5px;color:var(--muted);margin:0 0 10px}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}


.cb .cj-hero{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:clamp(15px,1.8vw,19px);color:var(--muted);max-width:70ch;margin:16px 0 0;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .cj-hero b{color:var(--ink);font-style:normal;font-weight:600}
.cb .cj-ladder{display:flex;align-items:center;gap:6px 14px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin:22px 0 4px;padding:11px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.cb .cj-ladder .cj-lad-lab{font-size:12.5px;font-weight:700}
.cb .cj-ladder b{font-family:Archivo,sans-serif;font-weight:800;font-size:12.5px;display:inline-flex;align-items:center;gap:5px}
.cb .cj-ladder .cj-lad-arrow{color:var(--line);font-weight:700}
.cb .cj-sort{display:inline-flex;border:1px solid var(--line);border-radius:3px;overflow:hidden;margin:22px 0 2px}
.cb .cj-sort button{font-family:Archivo,sans-serif;font-size:13px;font-weight:700;padding:9px 15px;border:0;border-left:1px solid var(--line);background:var(--page);color:var(--muted);cursor:pointer}
.cb .cj-sort button:first-child{border-left:0}
.cb .cj-sort button[aria-pressed=true]{background:var(--ink);color:#fff}
.cb .cj-gallery{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:16px 0 0}
@media (max-width:820px){.cb .cj-gallery{grid-template-columns:1fr}}
.cb .cj-card{border:1px solid var(--line);border-radius:3px;padding:14px 10px 10px 16px;background:var(--page)}
.cb .cj-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.cb .cj-name{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:22px;font-weight:800;line-height:1.05;font-stretch:var(--head-stretch,78%)}
.cb .cj-meta{margin-top:5px}
.cb .cj-tag{font-family:var(--font-ui,Archivo,Helvetica,Arial,sans-serif);font-size:12.5px;font-weight:700;background:none;padding:0;border:0;border-radius:0}
.cb .cj-emp{color:var(--green,#3a7a4b)}.cb .cj-asc,.cb .cj-bld{color:var(--green,#3a7a4b)}.cb .cj-emp::before,.cb .cj-asc::before,.cb .cj-bld::before{content:"▲ "}
.cb .cj-fade{color:var(--red,#bf3b31)}.cb .cj-fade::before{content:"▼ "}.cb .cj-jour{color:var(--ink-3,#686862)}
.cb .cj-great{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:20px;font-weight:800;color:var(--ink);white-space:nowrap;text-align:right;line-height:1.05;font-stretch:var(--head-stretch,78%)}
.cb .cj-great .cj-great-sub{font-size:10px;font-weight:400;color:var(--muted)}
.cb .cj-arc{margin-top:2px}
.cb .cj-svg{width:100%;height:auto;overflow:visible}
.cb .cj-svg .cj-prog{font-family:Archivo,sans-serif;font-weight:700;font-size:11px;fill:var(--ink);paint-order:stroke;stroke:#fff;stroke-width:3px;stroke-linejoin:round}
.cb .cj-svg .cj-yrs{font-family:Archivo,sans-serif;font-weight:600;font-size:9px;fill:var(--muted);paint-order:stroke;stroke:#fff;stroke-width:2.5px}
.cb .cj-svg .cj-built{font-family:Archivo,sans-serif;font-weight:700;font-size:11px;font-variant-numeric:tabular-nums;paint-order:stroke;stroke:#fff;stroke-width:2.5px}
.cb .cj-svg a{cursor:pointer}.cb .cj-svg a:hover circle{stroke:var(--ink);stroke-width:2.2}
.cb .cj-back{display:inline-block;margin:34px 0 0;font-size:13px;color:var(--build);text-decoration:none;font-weight:700}
.cb .cj-back:hover{text-decoration:underline}


.cb .cp-style{margin:30px 0 0}
.cb .cp-style-sub{font-size:13px;line-height:1.5;color:var(--muted);max-width:70ch;margin:6px 0 0}
.cb .atb-legend{display:flex;align-items:center;gap:6px 16px;flex-wrap:wrap;font-size:12px;
  color:var(--muted);margin:4px 0 0;padding:10px 0;border-top:1px solid var(--line);
  border-bottom:1px solid var(--line)}
.cb .atb-legend span{display:inline-flex;align-items:center;gap:6px}
.cb .atb-legend .atb-key{font-weight:700;color:var(--ink)}
.cb .atb-legend i{width:11px;height:11px;border-radius:50%;flex:none;display:inline-block;
  box-sizing:border-box}
.cb .atb-legend i.atb-dot-first{background:var(--page);border:2px solid var(--blue)}
.cb .atb-legend i.atb-dot-last{background:var(--blue);border:2px solid var(--blue)}
.cb .atb-legend i.atb-dot-band{width:22px;height:11px;border-radius:2px;border:0;
  background:var(--blue);opacity:.28}
.cb .atb-cal{margin:20px 0 0}
.cb .atb-cal-head{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:15px;font-weight:800;color:var(--ink);font-stretch:var(--head-stretch,78%)}
.cb .atb-cal-sub{font-size:12px;line-height:1.5;color:var(--muted);max-width:70ch;margin:4px 0 14px}
.cb .atb-cal-row{display:grid;grid-template-columns:152px 1fr 178px;gap:14px;align-items:center;
  margin-top:9px}
.cb .atb-cal-row.is-pop{margin-bottom:26px}
.cb .atb-cal-lab{font-size:12.5px;color:var(--muted);line-height:1.3;overflow-wrap:anywhere}
.cb .atb-cal-track{position:relative;height:8px;background:var(--fill-2,#f1f1ec);border-radius:2px}
.cb .atb-cal-fill{position:absolute;top:0;left:0;height:8px;background:var(--blue);border-radius:2px}
.cb .atb-cal-mark{position:absolute;top:-4px;width:2px;height:16px;background:var(--ink-3)}
.cb .atb-cal-mark.is-median{background:var(--ink)}
.cb .atb-cal-tick{position:absolute;top:15px;font-size:10.5px;color:var(--ink-3);
  transform:translateX(-50%);white-space:nowrap}
.cb .atb-cal-tick.is-median{color:var(--ink);font-weight:700}
.cb .atb-cal-val{font-size:12.5px;color:var(--ink);font-variant-numeric:tabular-nums}
.cb .atb-cal-val b{font-weight:700}
.cb .atb-cal-val span{color:var(--muted);margin-left:7px}
@media (max-width:640px){
  .cb .atb-cal-row{grid-template-columns:1fr;gap:5px}
  .cb .atb-cal-row.is-pop{margin-bottom:34px}
  /* .atb-cal-tick labels are position:absolute below the track (top:15px + their own text
     height), which costs no flow space on desktop because .atb-cal-val sits in the column
     to the right, not below. Stacked to 1 column here, that floating tick text has nothing
     below it to push away and prints straight through "middle half of all stints" -- give
     the track real margin so the next stacked row actually clears it. */
  .cb .atb-cal-row.is-pop .atb-cal-track{margin-bottom:24px}
  .cb .atb-cal-val span{margin-left:0;display:block}
}
.cb .cp-atb-wrap{margin:22px 0 0}
.cb .atb-svg{width:100%;height:auto}
.cb .atb-axis{font-family:Archivo,sans-serif;font-size:11px;fill:var(--ink-3)}
.cb .atb-team{font-family:Archivo,sans-serif;font-weight:700;font-size:13px;fill:var(--ink)}
.cb .atb-sub{font-family:Archivo,sans-serif;font-size:11px;fill:var(--muted)}
.cb .atb-net{font-family:Archivo,sans-serif;font-weight:700;font-size:12px}
.cb .atb-fbs-avg{font-family:Archivo,sans-serif;font-weight:700;font-size:10px;fill:var(--ink-3)}
.cb .cd-scroll{overflow-x:auto;border:1px solid var(--line);border-radius:3px;margin:14px 0 0}
.cb table.cd-table{border-collapse:collapse;width:100%;min-width:760px;font-size:13px;font-family:Archivo,sans-serif}
.cb table.cd-table th,.cb table.cd-table td{padding:7px 9px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}
.cb table.cd-table th.rowlabel,.cb table.cd-table td.rowlabel{text-align:left;position:sticky;left:0;background:var(--page);font-weight:600;min-width:150px;z-index:2;border-right:1px solid var(--rule)}
.cb table.cd-table thead th{font-weight:700;color:var(--muted);font-size:11px;background:var(--page);border-bottom:1px solid var(--ink);position:sticky;top:0;z-index:1}
.cb table.cd-table thead th.rowlabel{z-index:3}
.cb table.cd-table th.trendcol,.cb table.cd-table td.trendcol{text-align:center;min-width:88px;border-left:1px solid var(--rule);background:var(--row)}
.cb table.cd-table tr.group-divider td{text-align:left;font-size:12px;font-weight:700;color:var(--ink-3);background:var(--row);border-bottom:1px solid var(--rule);border-top:1px solid var(--rule);padding:5px 9px}
.cb table.cd-table td.dim{color:var(--ink-3);font-size:11px}
.cb table.cd-table td.cell-text{text-align:left;font-size:12px;white-space:nowrap}
.cb table.cd-table td.rec-title{background:rgba(183,133,26,.24);font-weight:700;font-size:12px}
.cb table.cd-table td.rec-cfp-loss{background:rgba(191,59,49,.11);font-size:12px}
.cb table.cd-table td.rec-bowl-win{background:rgba(58,122,75,.14);font-size:12px}
.cb table.cd-table td.rec-bowl-loss{background:rgba(191,59,49,.07);font-size:12px}
.cb table.cd-table .cell-sub{display:block;font-size:9.5px;color:var(--ink-3);font-weight:400}
.cb table.cd-table tbody tr:not(.group-divider):hover td{background-color:var(--row)}
/* Reformat, don't shrink (doc-31's own mobile-chart rule) -- measured 2026-09-21 at
   390px: .cd-scroll clientWidth 297 vs scrollWidth 1308, with the sticky rowlabel
   column alone eating 150px, leaving only 147px of real data visible (~9 horizontal
   drags to read a 6-season table). Tightening padding/font-size and shrinking the two
   widest fixed columns (rowlabel, trendcol) gets ~215px of real data on screen at
   once without touching the min-width:0 grid-blowout guard above (.cp-row>*), which
   must stay untouched. */
@media(max-width:640px){
  .cb table.cd-table{min-width:520px;font-size:12px}
  .cb table.cd-table th,.cb table.cd-table td{padding:6px 7px}
  .cb table.cd-table th.rowlabel,.cb table.cd-table td.rowlabel{min-width:104px;font-size:11.5px}
  .cb table.cd-table th.trendcol,.cb table.cd-table td.trendcol{min-width:64px}
}


.cb .cp-ledger{margin:30px 0 0}
.cb .cp-ledger h2{margin-bottom:2px}
.cb .bgl-take{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:15px;
  line-height:1.5;color:var(--ink);max-width:60ch;margin:6px 0 16px;font-stretch:var(--head-stretch,78%)}
.cb .bgl-chips{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:16px}
.cb .bgl-chip{border:0;border-top:1px solid var(--line);border-radius:0;padding:8px 0 0;min-width:140px;flex:1 1 140px}
.cb .bgl-chip-label{font-family:Archivo,sans-serif;font-size:11.5px;font-weight:700;color:var(--muted)}
.cb .bgl-chip-val{font-family:var(--font-ui,Archivo,Helvetica,Arial,sans-serif);font-weight:800;font-size:19px;margin-top:2px;line-height:1.1}
.cb .bgl-chip-sub{font-size:11px;color:var(--muted);margin-top:2px}
.cb .bgl-grid{display:grid;grid-template-columns:1fr 1.2fr;gap:16px;align-items:start;margin-top:2px}
@media(max-width:640px){.cb .bgl-grid{grid-template-columns:1fr}}
.cb .bgl-card{border:1px solid var(--line);border-radius:3px;padding:14px 16px}
.cb .bgl-card-h{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted);margin-bottom:8px}
.cb .bgl-riv-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  padding:7px 0;border-top:1px solid var(--line-soft)}
.cb .bgl-riv-row:first-of-type{border-top:none}
.cb .bgl-riv-name a{color:var(--ink);text-decoration:none;font-weight:600;font-size:13.5px}
.cb .bgl-riv-name a:hover{opacity:.6;transition:opacity .1s ease-in}
.cb .bgl-riv-wl{font-family:Archivo,sans-serif;font-weight:800;font-size:13.5px}
.cb .bgl-riv-pct{color:var(--muted);font-size:11px;margin-left:6px;font-weight:600}
.cb .bgl-band-row{display:grid;grid-template-columns:112px 1fr 78px;align-items:center;gap:8px;padding:6px 0}
.cb .bgl-band-name{font-size:11.5px;font-weight:600;color:var(--ink)}
.cb .bgl-band-bar{background:var(--fill-2,#f1f1ec);border-radius:2px;height:8px;overflow:hidden}
.cb .bgl-band-bar span{display:block;height:100%;border-radius:2px}
.cb .bgl-band-wl{font-size:11.5px;text-align:right}
.cb .bgl-band-wl i{color:var(--muted);font-style:normal;margin-left:3px}
.cb .bgl-shadow{border:1px solid var(--decline);border-radius:3px;padding:14px 16px}
.cb .bgl-nemesis-badge{display:inline;margin-left:8px;font-size:12.5px;font-weight:700;background:none;padding:0;border:0;border-radius:0;color:var(--red,#bf3b31)}
.cb .bgl-shadow-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.cb .bgl-shadow-name{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:17px;font-stretch:var(--head-stretch,78%)}
.cb .bgl-shadow-name a{color:inherit;text-decoration:none;border-bottom:1px solid var(--line)}
.cb .bgl-shadow-wl{font-family:Archivo,sans-serif;font-weight:800;font-size:20px;color:var(--decline)}
.cb .bgl-shadow-note{font-size:11.5px;color:var(--muted);margin-top:4px}
.cb .bgl-games{margin-top:12px;display:flex;flex-wrap:wrap;gap:6px}
.cb .bgl-gpill{font-family:var(--font-ui,Archivo,Helvetica,Arial,sans-serif);font-size:13px;font-weight:600;border:0;padding:0;background:none;color:var(--ink-3,#686862)}
.cb .bgl-gpill.win{color:var(--green,#3a7a4b);background:none;font-weight:700}
.cb .bgl-threshold-note{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line);
  font-size:11px;color:var(--muted);line-height:1.5}
/* Job tabs (2026-09-27): radio inputs + labels, no script. The per-tab show/select rules are
   generated below this string (_LEDGER_TAB_CSS). Tabs wrap rather than scroll, so the
   default tab is always on screen at 390px. */
.cb .bgl-in{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}
.cb .bgl-tabs{display:flex;flex-wrap:wrap;gap:6px 22px;margin:12px 0 18px;border-bottom:1px solid var(--line)}
.cb .bgl-tab{cursor:pointer;border:0;border-bottom:2px solid transparent;border-radius:0;padding:6px 0;
  margin-bottom:-1px;line-height:1.3;color:var(--muted);background:none;-webkit-user-select:none;user-select:none}
.cb .bgl-tab:hover{opacity:.72}
.cb .bgl-tab b{display:block;font-family:Archivo,sans-serif;font-weight:700;font-size:13px;color:var(--ink)}
.cb .bgl-tab span{font-family:Archivo,sans-serif;font-size:11.5px;font-variant-numeric:tabular-nums;white-space:nowrap}
.cb .bgl-panel{display:none}
.cb .bgl-panel--solo{display:block}
/* Against the spread: a quiet second number beside each straight-up record. */
.cb .bgl-flip{font-family:Archivo,sans-serif;font-size:13px;line-height:1.5;color:var(--muted);
  max-width:64ch;margin:-8px 0 16px}
.cb .bgl-chip-ats{font-size:11px;color:var(--muted);margin-top:3px;font-variant-numeric:tabular-nums}
.cb .bgl-riv-row.has-ats{display:grid;grid-template-columns:minmax(0,1fr) auto 118px;column-gap:14px}
.cb .bgl-riv-ats,.cb .bgl-band-ats{font-family:Archivo,sans-serif;font-size:11.5px;color:var(--muted);
  text-align:right;white-space:nowrap}
.cb .bgl-riv-ats i,.cb .bgl-band-ats i{font-style:normal;opacity:.75;margin-left:3px}
.cb .bgl-ats-na{opacity:.6}
.cb .bgl-band-row.has-ats{grid-template-columns:112px 1fr 78px 118px}
@media(max-width:640px){
  .cb .bgl-riv-row.has-ats{grid-template-columns:minmax(0,1fr) auto}
  .cb .bgl-riv-row.has-ats .bgl-riv-ats{grid-column:1/-1;text-align:left;margin-top:1px}
  .cb .bgl-band-row.has-ats{grid-template-columns:112px 1fr 78px;row-gap:1px}
  .cb .bgl-band-row.has-ats .bgl-band-ats{grid-column:2/-1;text-align:left}
}
.cb .bgl-cov{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--gold);
  margin-left:5px;vertical-align:1px}
.cb .bgl-cov-key{margin-top:8px;font-size:11px;color:var(--muted)}
.cb .bgl-cov-key .bgl-cov{margin:0 5px 0 0}
.cb .bgl-shadow--even{border-color:var(--line)}
.cb .bgl-shadow--even .bgl-shadow-wl{color:var(--ink)}
.cb .bgl-ats-note{margin-top:14px;font-size:11.5px;line-height:1.55;color:var(--muted);max-width:68ch}
.cb .cp-roster-construction{margin:14px 0;padding:14px 16px;border:1px solid var(--line);border-radius:3px}
.cb .rc-nil{margin-top:14px;padding-top:12px;border-top:1px solid var(--line-soft)}
.cb .rc-nil-pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px}
.cb .rc-nil-pill{font-size:13px;font-weight:600;border:0;border-top:1px solid var(--line);border-radius:0;padding:6px 0 0;color:var(--ink)}
.cb .rc-nil-pill i{display:block;font-style:normal;font-weight:400;color:var(--muted);font-size:10.5px;margin-top:1px}
.cb .rc-nil-note{font-size:10.5px;color:var(--muted);margin-top:8px;line-height:1.4}
.cb .rc-profile{margin-top:14px;padding-top:12px;border-top:1px solid var(--line-soft)}
.cb .rc-grade{margin-top:14px;padding-top:12px;border-top:1px solid var(--line-soft)}
.cb .cp-roster-construction--portal-only>div:first-child{margin-top:0;padding-top:0;border-top:0}
.cb .rc-states{font-size:12px;color:var(--muted);margin-top:8px}
.cb .rc-states b{color:var(--ink);font-weight:700}
.cb .rc-mover{font-size:12.5px;color:var(--ink);margin-top:6px;line-height:1.5}
.cb .rc-mover b{font-weight:700}
.cb .rc-coverage-note{font-size:10.5px;color:var(--muted);margin-top:8px;line-height:1.4}
.cb .cp-ledger>.bgl-in:nth-of-type(1):checked~.bgl-panels>.bgl-panel:nth-of-type(1){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(1):checked~.bgl-tabs>.bgl-tab:nth-of-type(1){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(1):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(1){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(2):checked~.bgl-panels>.bgl-panel:nth-of-type(2){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(2):checked~.bgl-tabs>.bgl-tab:nth-of-type(2){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(2):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(2){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(3):checked~.bgl-panels>.bgl-panel:nth-of-type(3){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(3):checked~.bgl-tabs>.bgl-tab:nth-of-type(3){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(3):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(3){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(4):checked~.bgl-panels>.bgl-panel:nth-of-type(4){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(4):checked~.bgl-tabs>.bgl-tab:nth-of-type(4){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(4):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(4){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(5):checked~.bgl-panels>.bgl-panel:nth-of-type(5){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(5):checked~.bgl-tabs>.bgl-tab:nth-of-type(5){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(5):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(5){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(6):checked~.bgl-panels>.bgl-panel:nth-of-type(6){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(6):checked~.bgl-tabs>.bgl-tab:nth-of-type(6){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(6):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(6){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(7):checked~.bgl-panels>.bgl-panel:nth-of-type(7){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(7):checked~.bgl-tabs>.bgl-tab:nth-of-type(7){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(7):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(7){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(8):checked~.bgl-panels>.bgl-panel:nth-of-type(8){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(8):checked~.bgl-tabs>.bgl-tab:nth-of-type(8){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(8):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(8){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(9):checked~.bgl-panels>.bgl-panel:nth-of-type(9){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(9):checked~.bgl-tabs>.bgl-tab:nth-of-type(9){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(9):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(9){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(10):checked~.bgl-panels>.bgl-panel:nth-of-type(10){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(10):checked~.bgl-tabs>.bgl-tab:nth-of-type(10){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(10):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(10){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(11):checked~.bgl-panels>.bgl-panel:nth-of-type(11){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(11):checked~.bgl-tabs>.bgl-tab:nth-of-type(11){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(11):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(11){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-ledger>.bgl-in:nth-of-type(12):checked~.bgl-panels>.bgl-panel:nth-of-type(12){display:block}
.cb .cp-ledger>.bgl-in:nth-of-type(12):checked~.bgl-tabs>.bgl-tab:nth-of-type(12){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-ledger>.bgl-in:nth-of-type(12):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(12){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(1):checked~.bgl-panels>.bgl-panel:nth-of-type(1){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(1):checked~.bgl-tabs>.bgl-tab:nth-of-type(1){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(1):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(1){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(2):checked~.bgl-panels>.bgl-panel:nth-of-type(2){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(2):checked~.bgl-tabs>.bgl-tab:nth-of-type(2){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(2):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(2){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(3):checked~.bgl-panels>.bgl-panel:nth-of-type(3){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(3):checked~.bgl-tabs>.bgl-tab:nth-of-type(3){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(3):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(3){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(4):checked~.bgl-panels>.bgl-panel:nth-of-type(4){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(4):checked~.bgl-tabs>.bgl-tab:nth-of-type(4){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(4):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(4){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(5):checked~.bgl-panels>.bgl-panel:nth-of-type(5){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(5):checked~.bgl-tabs>.bgl-tab:nth-of-type(5){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(5):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(5){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(6):checked~.bgl-panels>.bgl-panel:nth-of-type(6){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(6):checked~.bgl-tabs>.bgl-tab:nth-of-type(6){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(6):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(6){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(7):checked~.bgl-panels>.bgl-panel:nth-of-type(7){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(7):checked~.bgl-tabs>.bgl-tab:nth-of-type(7){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(7):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(7){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(8):checked~.bgl-panels>.bgl-panel:nth-of-type(8){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(8):checked~.bgl-tabs>.bgl-tab:nth-of-type(8){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(8):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(8){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(9):checked~.bgl-panels>.bgl-panel:nth-of-type(9){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(9):checked~.bgl-tabs>.bgl-tab:nth-of-type(9){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(9):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(9){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(10):checked~.bgl-panels>.bgl-panel:nth-of-type(10){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(10):checked~.bgl-tabs>.bgl-tab:nth-of-type(10){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(10):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(10){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(11):checked~.bgl-panels>.bgl-panel:nth-of-type(11){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(11):checked~.bgl-tabs>.bgl-tab:nth-of-type(11){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(11):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(11){outline:2px solid var(--ink);outline-offset:2px}
.cb .cp-bigg>.bgl-in:nth-of-type(12):checked~.bgl-panels>.bgl-panel:nth-of-type(12){display:block}
.cb .cp-bigg>.bgl-in:nth-of-type(12):checked~.bgl-tabs>.bgl-tab:nth-of-type(12){border-bottom-color:var(--ink);color:var(--ink)}
.cb .cp-bigg>.bgl-in:nth-of-type(12):focus-visible~.bgl-tabs>.bgl-tab:nth-of-type(12){outline:2px solid var(--ink);outline-offset:2px}

.db-svg{width:100%;height:auto;display:block}
.db-conn{stroke:var(--rule,#d7d7d4);stroke-width:2}
.db-taper{fill:var(--rule,#d7d7d4)}
.db-tick{stroke:var(--rule,#d7d7d4);stroke-width:1;stroke-dasharray:2 2}
.db-band{stroke-dasharray:3 3;stroke-width:1}
.db-lab{font-family:"Archivo",system-ui,sans-serif;font-size:12px;font-weight:600;fill:var(--ink,#222)}
.db-end{font-family:"Archivo",system-ui,sans-serif;font-size:12px;fill:var(--ink-3,#8b8b8b)}
.db-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* In-chart annotation overlay — WS-08 (NYT-Upshot callout).
   Light-only (docs/design-system/90 + 91: dark is retired, no dark islands) --
   sharp white label box, 1px --rule border, ink text, matching doc 90's
   tooltip spec exactly (never a rounded dark bubble). */
.chart-ann__leader {
  stroke: var(--ann-accent, #5b5b5b);
  stroke-width: 1;
  stroke-opacity: 0.7;
}
.chart-ann__dot {
  fill: var(--ann-accent, #5b5b5b);
  stroke: var(--page, #fff);
  stroke-width: 1.5;
}
.chart-ann__box {
  fill: var(--page, #fff);
  stroke: var(--rule, #d7d7d4);
  stroke-width: 1;
}
.chart-ann__text {
  font-family: 'Archivo', system-ui, sans-serif;
  font-size: 11px;
  fill: var(--ink, #222222);
}

.countline-svg{width:100%;height:auto;display:block}
.countline-track{stroke:var(--rule,#d7d7d4);stroke-width:1.5}
.countline-dot--played{fill:var(--ink,#222222);stroke:var(--page,#fff);stroke-width:2}
.countline-dot--vacated{fill:var(--page,#fff);stroke:var(--muted,#5b5b5b);stroke-width:2}
.countline-strike{stroke:var(--muted,#5b5b5b);stroke-width:1.5}
.countline-restore-arc{fill:none;stroke:var(--muted,#5b5b5b);stroke-width:1.3;stroke-dasharray:2,3}
.countline-arrowhead{fill:var(--muted,#5b5b5b)}
.countline-label{font-family:"Archivo",system-ui,sans-serif;font-size:11px;fill:var(--ink,#222222)}
.lbstrip-svg{width:100%;height:auto;display:block}
.lbstrip-axis{stroke:var(--rule,#d7d7d4);stroke-width:1.5}
.lbstrip-axis-label{font-family:"Archivo",system-ui,sans-serif;font-size:10px;fill:var(--muted,#5b5b5b)}
.lbstrip-dot{fill:var(--page,#fff);stroke:var(--muted,#5b5b5b);stroke-width:1.5}
.lbstrip-dot--hi{fill:var(--ink,#222222);stroke:var(--page,#fff);stroke-width:1.5}
.lbstrip-label{font-family:"Archivo",system-ui,sans-serif;font-size:12px;fill:var(--muted,#5b5b5b);font-variant-numeric:tabular-nums}
.lbstrip-label--hi{font-family:"Archivo",system-ui,sans-serif;font-size:12px;font-weight:700;fill:var(--ink,#222222);font-variant-numeric:tabular-nums}
.lbstrip-gap{font-family:"Archivo",system-ui,sans-serif;font-size:11px;fill:var(--muted,#5b5b5b);font-style:italic}
.lbstrip-note{font-family:"Archivo",system-ui,sans-serif;font-size:10.5px;fill:var(--muted,#5b5b5b)}

  .cp-selgrid { margin: 20px 0 0; }
  .cp-selgrid-svg { display:block; max-width: 210px; }
  .cp-selgrid-caption { font-size: 12.5px; color: var(--muted); margin-top: 6px; }


.cb .cp-resilience{margin:14px 0;padding:14px 16px;border:1px solid var(--line);border-radius:3px}
.cb .rc-transition + .rc-transition{margin-top:16px;padding-top:16px;border-top:1px solid var(--line-soft)}
.cb .rs-dumbbell{margin:10px 0 4px;max-width:340px}
.cb .rs-band{display:inline;margin-left:8px;font-size:12.5px;font-weight:700;background:none;padding:0;border:0;border-radius:0}
.cb .rs-band--slipped{color:var(--red,#bf3b31)}.cb .rs-band--slipped::before{content:"▼ "}
.cb .rs-band--held{color:var(--ink-3,#686862)}.cb .rs-band--held::before{content:"● "}
.cb .rs-band--up{color:var(--green,#3a7a4b)}.cb .rs-band--up::before{content:"▲ "}
.cb .cp-talent-gap{margin:14px 0;padding:14px 16px;border:1px solid var(--line);border-radius:3px}
/* Promoted to a top-level page section (sibling of Career Arc/Style Position/the
   ledger) -- those carry no outer border of their own, the border lives on their
   inner content (chips, wraps); .cp-hc-verdict (Z5, "Was he good?") matches that
   convention instead of the bordered-box look .cp-talent-gap above uses for its own,
   DIFFERENT role as a nested sub-card inside the per-stint drill-down panel. */
.cb .cp-hc-verdict{margin:30px 0 0}
.cb .cp-verdict-row{margin:0 0 18px}
.cb .cp-verdict-row:last-child{margin-bottom:0}
.cb .cp-verdict-row-h{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted);margin-bottom:8px}
.cb .cp-verdict-help{cursor:help;margin-left:6px;font-size:10px;color:var(--muted);
  border:1px solid var(--line);border-radius:50%;width:14px;height:14px;display:inline-flex;
  align-items:center;justify-content:center}
.cb .cp-verdict-track-wrap{max-width:420px}
/* Reuses theme/percentile_bar.py's render_percentile_track() markup verbatim
   (wcfb-percentile-bar__track/__fill/__dot class names are fixed by that function) --
   this page's own self-contained _CSS block has no dependency on stats_table.css (no
   zeitgeist page links it), so the visual styling for those shared class names is
   defined here via a compound selector, per render_percentile_track()'s own docstring
   guidance for exactly this "custom grid layout, own stylesheet" case. */
.cb .cp-verdict-track{position:relative;height:8px;border-radius:2px;background:var(--panel2);
  margin:4px 0 6px}
.cb .cp-verdict-track .wcfb-percentile-bar__fill{height:100%;border-radius:2px}
.cb .cp-verdict-track .wcfb-percentile-bar__fill[data-pct-high]{background:var(--build)}
.cb .cp-verdict-track .wcfb-percentile-bar__fill[data-pct-medium]{background:var(--neutral)}
.cb .cp-verdict-track .wcfb-percentile-bar__fill[data-pct-low]{background:var(--decline)}
.cb .cp-verdict-track .wcfb-percentile-bar__dot{position:absolute;top:50%;width:10px;height:10px;
  border-radius:50%;background:var(--ink);transform:translate(-50%,-50%);border:2px solid var(--page)}
.cb .cp-verdict-track .wcfb-percentile-bar__dot--unknown{background:var(--page);border-color:var(--muted)}
.cb .cp-verdict-sub{font-size:12px;color:var(--muted)}
.cb .cp-verdict-note{font-size:12px;color:var(--muted);margin-top:4px}
/* render_baseline_sparkline() (charts/baseline_sparkline.py) ships bare <path>/<line>/<circle>
   elements with no fill/stroke of their own -- team_pages styles it via
   .trajectory-chip__spark, which no zeitgeist page loads. Same "own stylesheet, compound
   selector" pattern as .cp-verdict-track above. */
.cb .cp-verdict-spark-wrap{max-width:420px}
.cb .cp-verdict-spark{display:block;width:160px;height:36px;margin:4px 0 6px}
.cb .cp-verdict-spark path{fill:none;stroke:var(--ink);stroke-width:1.6;stroke-linejoin:round;
  stroke-linecap:round}
.cb .cp-verdict-spark circle{fill:var(--build)}
.cb .cp-verdict-spark line.baseline{stroke:var(--muted);stroke-dasharray:2 3;stroke-width:1;
  opacity:.6}
.cb .cp-mi-asof{font-size:11px;color:var(--muted);margin:10px 0 0}

/* Phase 1.5 item D (2026-09-23): Signature games. */
.cb .cp-sig-games{margin:30px 0 0}
.cb .cp-sig-header{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:18px;margin:0 0 14px;font-weight:800;font-stretch:var(--head-stretch,78%)}
.cb .cp-sig-header b{font-weight:600}
.cb .cp-sig-header-sub{font-family:Archivo,sans-serif;font-size:13px;color:var(--muted)}
.cb .cp-sig-header-window{font-family:Archivo,sans-serif;font-size:13px;color:var(--muted)}
.cb .cp-sig-map-label{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted);margin-bottom:6px}
.cb .cp-sig-map{display:block;width:100%;height:auto;margin-bottom:2px}
.cb .cp-sig-years{position:relative;height:15px;font:500 11px/1 Archivo,sans-serif;color:var(--muted)}
.cb .cp-sig-years span{position:absolute;top:0;transform:translateX(-50%);white-space:nowrap}
@media(max-width:640px){.cb .cp-sig-years .cp-sig-yr-thin{display:none}}
.cb .cp-sig-scroll{overflow-x:auto;overflow-y:hidden}
.cb .cp-sig-hint{display:none}
@media(max-width:640px){
  .cb .cp-sig-scroll--wide .cp-sig-plot{min-width:600px}
  .cb .cp-sig-hint{display:flex;align-items:center;gap:5px;margin:6px 0 0;font:500 10.5px/1 Archivo,sans-serif;color:var(--muted)}
  .cb .cp-sig-hint svg{width:11px;height:11px;flex:0 0 auto}
}
.cb .cp-sig-map-key{font:400 12px/1.4 Archivo,sans-serif;color:var(--muted);margin:6px 0 18px}
.cb .cp-sig-map-key i{display:inline-block;width:8px;height:8px;border-radius:50%;margin:0 4px 0 0;vertical-align:-0.5px}
.cb .cp-sig-map-key i.cp-sig-k-w{background:var(--green)}
.cb .cp-sig-map-key i.cp-sig-k-l{border:1.6px solid var(--red);width:7px;height:7px;margin-left:8px;box-sizing:border-box}
.cb .cp-sig-cols{display:grid;grid-template-columns:1fr 1fr;gap:20px}
@media(max-width:640px){.cb .cp-sig-cols{grid-template-columns:1fr}}
.cb .cp-sig-col-h{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted);margin-bottom:8px}
.cb .cp-sig-tile{display:flex;align-items:center;gap:10px;padding:8px 0;
  border-top:1px solid var(--line)}
.cb .cp-sig-tile:first-of-type{border-top:none}
.cb .cp-sig-wl{display:inline-flex;align-items:center;justify-content:center;width:20px;
  height:20px;border-radius:2px;font-size:11px;font-weight:800;color:#fff;flex:none}
.cb .cp-sig-w{background:var(--green)}
.cb .cp-sig-l{background:var(--red)}
.cb .cp-sig-tile-body{display:flex;flex-direction:column;gap:2px;min-width:0}
.cb .cp-sig-tile-opp{font-size:13px;font-weight:600}
.cb .cp-sig-tile-score{font-size:12px;color:var(--muted)}
.cb .cp-sig-tags{display:flex;flex-wrap:wrap;gap:0;margin-top:2px}
.cb .cp-sig-tag{font-size:12.5px;font-weight:600;color:var(--ink-3,#686862);background:none;border-radius:0;padding:0}.cb .cp-sig-tag + .cp-sig-tag::before{content:"·";margin:0 6px;color:var(--ink-4,#8b8b85)}
.cb .cp-sig-note{font-size:12px;color:var(--muted);margin-top:8px}
.cb .cp-sig-caveat{font-size:11.5px;color:var(--muted);margin-top:14px}

/* Phase 1.5 item B (2026-09-23): This season, week by week -- a real SVG line chart, same
   visual DNA as the career-arc chart (team-colored connector, _crest_node_svg logo nodes),
   not the tile-row layout an earlier pass shipped -- owner: "I liked this season better when
   it was a line chart like the main chart." */
.cb .cp-zoom{margin:20px 0}
.cb .cp-zoom-sub{font-size:12.5px;color:var(--muted);margin:2px 0 12px}
.cb .cp-zoom-wrap{overflow-x:auto}
.cb .cp-zoom-svg{display:block;width:100%;height:auto;min-width:480px}

/* _lin_logo_html()'s real markup (.lin-logo/.lin-logo__mono) is sized 52x52 for the lineage
   page's own header context -- compound-selector override for this page's much smaller inline
   use (Phase 1.5 items C/D, 2026-09-23), same "own stylesheet wins on specificity" pattern
   already used elsewhere on this page (see .cp-verdict-track's own docstring note). Item B no
   longer uses this helper (it draws logos in-SVG via _crest_node_svg instead). */
.cb .cp-verdict-sub .lin-logo,.cb .cp-sig-tile .lin-logo{width:22px;height:22px;margin:0;flex:0 0 auto}
.cb .cp-verdict-sub .lin-logo{vertical-align:middle;margin-right:6px}


.cb .cp-recruit-attr{margin:30px 0 0}
.cb .cp-ra-team-block{margin-bottom:14px}
.cb .cp-ra-team-block:last-child{margin-bottom:0}
.cb .cp-ra-team-h{display:flex;align-items:center;gap:6px;font-family:Archivo,sans-serif;
  font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:6px}
.cb .cp-ra-team-h .lin-logo{width:18px;height:18px;margin:0;flex:0 0 auto}
.cb .cp-ra-strip{display:flex;flex-wrap:wrap;gap:8px}
.cb .cp-ra-chip{min-width:76px;padding:6px 8px 0;border:0;border-top:3px solid var(--ink-5,#bdbdb7);border-radius:0;text-align:center}
.cb .cp-ra-chip--full_cycle{border-top-color:var(--ink);background:none}
.cb .cp-ra-chip--transition{border-top-style:dashed;opacity:.72}
.cb .cp-ra-chip--inherited{border-top-style:dashed;opacity:.55}
.cb .cp-ra-chip--unresolved{border-top-style:dotted;opacity:.4}
.cb .cp-ra-year{font-family:Archivo,sans-serif;font-weight:800;font-size:14px;color:var(--ink)}
.cb .cp-ra-rank{font-family:Archivo,sans-serif;font-weight:600;font-size:11px;color:var(--muted);margin-top:2px}
.cb .cp-ra-tag{font-family:Archivo,sans-serif;font-size:11.5px;font-weight:700;color:var(--muted);margin-top:3px}
.cb .cp-ra-chip--full_cycle .cp-ra-tag{color:var(--ink)}
.cb .cp-ra-synth{font-size:12.5px;color:var(--ink);margin:10px 0 0}
.cb .cp-ra-legend{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:12px;
  font-size:11px;color:var(--muted)}
.cb .cp-ra-legend span{display:inline-flex;align-items:center}
/* Real bug caught in Playwright review (2026-09-24): dashed/dotted 1px borders on a bare
   9x9 box are essentially invisible at that size -- only the full_cycle swatch (a solid
   border-color change) actually rendered; transition/inherited/unresolved read as blank
   squares next to their own legend words. Fixed with solid, visibly distinct fills instead
   of relying on border-style at a size too small to render a dash pattern. */
.cb .cp-ra-dot{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:5px;
  border:1.5px solid var(--ink)}
.cb .cp-ra-dot--full_cycle{background:var(--ink)}
.cb .cp-ra-dot--transition{background:var(--panel2,#e2e2e2);border-color:var(--ink);opacity:.75}
.cb .cp-ra-dot--inherited{background:var(--muted);border-color:var(--muted);opacity:.55}
.cb .cp-ra-dot--unresolved{background:var(--page);border-color:var(--line);opacity:.55}

/* "Followed him here" -- the heaviest beat of the five (2026-09-24 polish pass): a big
   lower-bound numeral column + Fraunces headline sentence + a named roster list, on a 2px
   ink top rule instead of a hairline box. Zero-follower moves are a quiet one-liner. */
.cb .cp-followed{margin:30px 0 0}
.cb .cp-fh-tile{display:grid;grid-template-columns:92px 1fr;gap:18px;border-top:2px solid var(--ink);
  padding:16px 0 18px;margin:14px 0 0}
.cb .cp-fh-tile--zero{display:block;border-top:1px solid var(--line);padding:10px 0;margin:0}
.cb .cp-fh-n{display:flex;flex-direction:column;align-items:flex-start;font-family:Archivo,sans-serif;
  color:var(--muted);font-size:11px;font-weight:700;line-height:1.1}
.cb .cp-fh-n b{font-size:56px;font-weight:800;color:var(--ink);line-height:.9;margin:2px 0 3px;
  letter-spacing:-.02em}
.cb .cp-fh-move{display:flex;align-items:center;gap:6px;font-family:Archivo,sans-serif;
  font-weight:700;font-size:13px;color:var(--muted);flex-wrap:wrap}
.cb .cp-fh-move .lin-logo{width:20px;height:20px;margin:0;flex:0 0 auto}
.cb .cp-fh-arrow{color:var(--muted);font-weight:400}
.cb .cp-fh-year{margin-left:auto;color:var(--muted);font-weight:600;font-size:12px}
.cb .cp-fh-count{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:clamp(18px,2.1vw,22px);
  line-height:1.25;color:var(--ink);margin-top:6px;max-width:34ch;font-stretch:var(--head-stretch,78%)}
.cb .cp-fh-count--zero{font-family:Archivo,sans-serif;font-weight:400;font-size:12.5px;
  color:var(--muted);max-width:none;margin-top:4px}
.cb .cp-fh-tile--zero .cp-fh-move{font-size:12.5px}
.cb .cp-fh-players{list-style:none;margin:12px 0 0;padding:0;columns:3 170px;column-gap:24px}
.cb .cp-fh-player{break-inside:avoid;font-size:13.5px;font-weight:600;color:var(--ink);
  padding:5px 0;border-bottom:1px solid var(--line-soft)}
.cb .cp-fh-player i{font-style:normal;color:var(--muted);font-weight:500;font-size:11.5px;margin-left:4px}
@media (max-width:560px){
  /* the Fraunces headline already says "At least N players..." -- on a phone the numeral
     column is pure repetition, so it drops and the headline carries the number alone */
  .cb .cp-fh-tile{grid-template-columns:1fr;gap:0}
  .cb .cp-fh-n{display:none}
}

.cb .cp-roster-mix{margin:30px 0 0}
.cb .cp-rm-own{margin-bottom:12px}
.cb .cp-rm-bar{display:flex;background:var(--fill-2,#f1f1ec);border-radius:2px;height:22px;overflow:hidden;
  max-width:560px;gap:2px}
.cb .cp-rm-bar-his{display:block;height:100%;background:var(--ink)}
.cb .cp-rm-bar-inh{display:block;height:100%;background:#bdbdb9}
.cb .cp-rm-bar-key{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:8px;font-size:12px;color:var(--muted)}
.cb .cp-rm-bar-key span{display:inline-flex;align-items:center;gap:5px}
.cb .cp-rm-bar-key b{color:var(--ink);font-weight:700}
.cb .cp-rm-bar-key i{display:inline-block;width:10px;height:10px;border-radius:2px}
.cb .cp-rm-k-his{background:var(--ink)}
.cb .cp-rm-k-inh{background:#bdbdb9}
.cb .cp-rm-own-label{font-size:13px;color:var(--ink);margin-top:10px;max-width:64ch;line-height:1.5}
.cb .cp-rm-tenure{font-size:13px;color:var(--ink);line-height:1.5;margin:10px 0 0;max-width:64ch}
.cb .cp-rm-tenure b{font-weight:800}
.cb .cp-rm-caveat{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line);
  font-size:11.5px;color:var(--muted);line-height:1.5;max-width:64ch}
/* Portal trend (2026-09-25): small multiples, one thin part-of-a-whole bar per season on an
   identical 0-100% axis, with an ink tick at that season's FBS-wide share. Thinner (12px)
   and lighter than the 22px ownership bar above so the two read as headline vs. detail. */
.cb .cp-rm-trend{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);max-width:560px}
.cb .cp-rm-trend-txt{font-size:13px;color:var(--ink);line-height:1.5;margin:4px 0 12px;max-width:64ch}
.cb .cp-rm-trend-txt b{font-weight:800}
.cb .cp-rm-tr-rows{display:flex;flex-direction:column;gap:7px}
.cb .cp-rm-tr{display:grid;grid-template-columns:40px minmax(0,1fr) 64px;align-items:center;gap:10px}
.cb .cp-rm-tr-y{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;color:var(--muted)}
.cb .cp-rm-tr-track{position:relative;display:block;height:12px;background:#dcdcd8;border-radius:2px}
.cb .cp-rm-tr-fill{display:block;height:100%;background:var(--blue);border-radius:2px 0 0 2px}
.cb .cp-rm-tr-fbs{position:absolute;top:-4px;bottom:-4px;width:2px;margin-left:-1px;background:var(--ink)}
.cb .cp-rm-tr-v{font-size:12px;color:var(--muted);text-align:right;white-space:nowrap}
.cb .cp-rm-tr-v b{color:var(--ink);font-weight:800}
.cb .cp-rm-tr-g{grid-column:2/-1;margin-top:-3px;font-size:11.5px;color:var(--muted);line-height:1.35}
.cb .cp-rm-tr-g b{color:var(--ink);font-weight:700}
.cb .cp-rm-k-portal{background:var(--blue)}
.cb .cp-rm-k-other{background:#dcdcd8}
.cb .cp-rm-bar-key i.cp-rm-k-fbs{width:2px;height:14px;border-radius:0;background:var(--ink)}
.cb .cp-rm-tr-note{font-size:11.5px;color:var(--muted);line-height:1.5;margin:10px 0 0;max-width:64ch}

/* "Size up front" (2026-09-25): percentile-bar rows on a shared lb axis. Gray band = middle
   half of FBS coaching runs; dashed ink rule = FBS average; hollow ring = the program before
   he arrived; arrow to a solid ink dot = his seasons. No team color (doc 90: data marks only). */
.cb .cp-ol-size{margin:30px 0 0}
.cb .cp-ol-rows{display:flex;flex-direction:column;gap:12px;max-width:640px;margin-top:4px}
.cb .cp-ol-row{display:grid;grid-template-columns:minmax(0,150px) minmax(0,1fr) 52px;align-items:center;gap:12px}
.cb .cp-ol-lab{display:flex;flex-direction:column;min-width:0;line-height:1.2}
.cb .cp-ol-lab b{font-size:13px;font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cb .cp-ol-lab i{font-style:normal;font-size:11.5px;color:var(--muted)}
.cb .cp-ol-track{position:relative;display:block;height:22px;background:var(--fill-2,#f1f1ec);border-radius:2px}
.cb .cp-ol-band{position:absolute;top:0;bottom:0;background:#dcdcd8}
.cb .cp-ol-zero{position:absolute;top:-3px;bottom:-3px;width:0;margin-left:-.5px;
  border-left:1.5px dashed var(--ink-3)}
.cb .cp-ol-arrow{position:absolute;top:50%;height:1.5px;margin-top:-.75px;background:var(--ink-3)}
.cb .cp-ol-arrow::after{content:"";position:absolute;top:-4px;border:4.75px solid transparent}
.cb .cp-ol-arrow--r::after{right:6px;border-left:7px solid var(--ink-3);border-right:0}
.cb .cp-ol-arrow--l::after{left:6px;border-right:7px solid var(--ink-3);border-left:0}
.cb .cp-ol-before,.cb .cp-ol-his{position:absolute;top:50%;width:12px;height:12px;margin:-6px 0 0 -6px;
  border-radius:50%;box-sizing:border-box}
.cb .cp-ol-before{background:var(--page);border:2px solid var(--ink-3)}
.cb .cp-ol-his{background:var(--ink);border:2px solid var(--ink)}
.cb .cp-ol-v{font-size:13px;font-weight:800;color:var(--ink);text-align:right;white-space:nowrap}
.cb .cp-ol-axis{margin-top:-6px}
.cb .cp-ol-axis .cp-ol-v{font-size:11px;font-weight:600;color:var(--muted);text-align:left}
.cb .cp-ol-ticks{position:relative;display:block;height:14px}
.cb .cp-ol-tick{position:absolute;top:0;transform:translateX(-50%);font-size:11px;color:var(--muted);
  white-space:nowrap}
.cb .cp-ol-tick.is-zero{color:var(--ink);font-weight:700}
.cb .cp-rm-bar-key i.cp-ol-k-his{background:var(--ink);border-radius:50%}
.cb .cp-rm-bar-key i.cp-ol-k-before{background:var(--page);border:2px solid var(--ink-3);border-radius:50%;
  box-sizing:border-box}
.cb .cp-rm-bar-key i.cp-ol-k-band{background:#dcdcd8;width:16px}
@media (max-width:560px){
  .cb .cp-ol-row{grid-template-columns:minmax(0,96px) minmax(0,1fr) 44px;gap:8px}
  .cb .cp-ol-lab b{font-size:12px}
  .cb .cp-ol-tick{font-size:10px}
}


.cb .cp-geography{margin:30px 0 0}
.cb .cp-geo-substub{font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;
  color:var(--muted);margin-bottom:8px}
.cb .cp-geo-states{margin-bottom:16px}
.cb .cp-geo-strip{display:flex;flex-wrap:wrap;gap:8px}
.cb .cp-geo-chip{min-width:52px;padding:6px 8px 0;border:0;border-top:1px solid var(--line);border-radius:0;text-align:center}
.cb .cp-geo-state{font-family:Archivo,sans-serif;font-weight:800;font-size:13px;color:var(--ink)}
.cb .cp-geo-n{font-family:Archivo,sans-serif;font-weight:600;font-size:11px;color:var(--muted);
  margin-top:2px}
.cb .cp-geo-distance{padding-top:2px}
.cb .cp-geo-distance-stat{font-size:13px;color:var(--ink);line-height:1.6}
.cb .cp-geo-distance-n{font-size:11.5px;color:var(--muted);margin-top:4px}
/* 2026-09-26 follow-ons to the real-geography map: region roll-up sentence,
   census-region chip strip, feeder-school callout. */
.cb .cp-geo-rollup{font-size:13px;color:var(--ink);line-height:1.5;margin:10px 0 0;max-width:60ch}
.cb .cp-geo-rollup b{color:var(--ink)}
.cb .cp-geo-regions{margin-top:12px}
.cb .cp-geo-chip--region{min-width:64px}
.cb .cp-geo-feeder{margin-top:10px;font-size:12.5px;color:var(--ink)}
.cb .cp-geo-feeder-label{font-family:Archivo,sans-serif;font-size:12px;font-weight:700;
  color:var(--muted)}
.cb .cp-geo-feeder-name{font-weight:700}
.cb .cp-geo-feeder-n{color:var(--muted)}

.cb .cp-nfl-pipeline{margin:30px 0 0}
.cb .cp-nfl-pipeline .bgl-chips{margin-bottom:10px}
/* Lower-bound caveat as a doc-90 §2.9 callout (4px left bar + pale tint), right under the
   lead number -- 2026-09-24 polish pass promoted it from a muted dashed box so a reader
   sees "at least" explained before any per-pick detail, never inside the expander. */
.cb .cp-nfl-caveat{font-size:12.5px;color:var(--ink);line-height:1.5;max-width:72ch;
  margin:0 0 14px;}
.cb .cp-nfl-caveat b{color:var(--ink)}
.cb .cp-nfl-split{display:flex;gap:2px;height:22px;max-width:560px;border-radius:2px;overflow:hidden;
  background:var(--fill-2,#f1f1ec)}
.cb .cp-nfl-seg{display:block;height:100%}
.cb .cp-nfl-seg--own,.cb .cp-nfl-k-own{background:var(--ink)}
.cb .cp-nfl-seg--inh,.cb .cp-nfl-k-inh{background:#bdbdb9}
.cb .cp-nfl-seg--unk,.cb .cp-nfl-k-unk{background:repeating-linear-gradient(135deg,
  #f1f1ec 0 3px,#bdbdb9 3px 4.5px)}
.cb .cp-nfl-k-unk{border:1px solid #cfcfcb}
.cb .cp-nfl-verif{color:var(--muted);font-size:11.5px}
.cb .cp-nfl-table-h{font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;color:var(--muted);margin:18px 0 0}
.cb .cp-nfl-pipeline .xp{margin-top:6px}
.cb .cp-nfl-pipeline .xp-btn{font-size:12.5px;color:var(--ink);padding:8px 0;width:auto}
.cb .cp-nfl-table{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:4px}
.cb .cp-nfl-table th{text-align:left;font-family:Archivo,sans-serif;font-weight:700;
  font-size:12px;color:var(--muted);
  border-bottom:1px solid var(--line);padding:6px 8px}
.cb .cp-nfl-table td{padding:6px 8px;border-bottom:1px solid var(--line);color:var(--ink);
  vertical-align:top}
.cb .cp-nfl-table tbody tr:last-child td{border-bottom:none}
.cb .cp-nfl-conf{font-size:11px;color:var(--muted);white-space:nowrap}
.cb .cp-nfl-conf--roster_verified{color:var(--ink)}
.cb .cp-nfl-credit{font-size:11px;white-space:nowrap}
.cb .cp-nfl-credit--inherited{color:var(--muted)}
.cb .cp-nfl-credit--own{color:var(--ink)}
@media (max-width:600px){
  .cb .cp-nfl-table{display:block;overflow-x:auto}
  /* keep the columns that carry the section's point (who gets credit, and how sure we
     are) on screen; position + NFL team are the secondary detail */
  .cb .cp-nfl-sec{display:none}
}


/* Real-geography recruit map (coach-page geography beat only) --
   docs/design-system/31-chart-vocabulary.md §7 owner-authorized
   exception, see us_map.py's module docstring. */
.usmap { margin: 0; }
.usmap__svg { width: 100%; height: auto; display: block; }
.usmap__state { fill: #f1f1ec; stroke: none; }
/* Home-state / border-state shading (doc 100 "gray = context", not a new
   color choice) -- two strengths so the map echoes the roll-up sentence's
   own "Georgia [home] and its border states [neighbors]" structure. */
.usmap__state { fill: #f4f4f2; }
.usmap__state--home { fill: #cdcdc6; }
.usmap__state--border { fill: #e2e2dc; }
.usmap__mesh { stroke: #fff; stroke-width: 1.4; stroke-linejoin: round; }
.usmap__dot { opacity: 0.72; stroke: #fff; stroke-width: 0.6; }
.usmap__caption {
  font-family: 'Archivo', 'Helvetica Neue', Arial, sans-serif;
  font-size: 12px;
  
  line-height: 1.4;
  color: var(--fg-secondary, #666);
  margin: 8px 0 0 0;
  max-width: 56ch;
}


.cb .cp-jumpnav{position:sticky;top:0;z-index:40;background:var(--page);
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin:14px 0 0}
.cb .cp-jn-inner{display:flex;align-items:center;gap:10px;height:44px}
.cb .cp-jn-lbl{flex:none;font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;color:var(--muted)}
.cb .cp-jn-scroll{display:flex;align-items:center;gap:2px;list-style:none;margin:0;padding:0;
  overflow-x:auto;scrollbar-width:none;flex:1;min-width:0;
  -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 28px),transparent);
  mask-image:linear-gradient(90deg,#000 calc(100% - 28px),transparent)}
.cb .cp-jn-scroll::-webkit-scrollbar{display:none}
.cb .cp-jn-scroll li{flex:none;display:flex;align-items:center}
.cb .cp-jn-scroll li:last-child{padding-right:28px}
.cb .cp-jn-sep{margin-left:6px;padding-left:6px;border-left:1px solid var(--line)}
.cb .cp-jn-scroll a{display:block;font-family:Archivo,sans-serif;font-size:12.5px;font-weight:600;
  color:var(--muted);text-decoration:none;padding:6px 9px;border-radius:2px;white-space:nowrap;
  transition:color .12s,background .12s}
.cb .cp-jn-scroll a:hover{opacity:.72}
.cb .cp-jn-scroll a[aria-current="true"]{color:var(--ink);text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:5px}
.cb .cp-jn-key a{color:var(--ink);font-weight:700}
.cb .cp-jn-key a::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
  background:var(--ink);margin-right:6px;vertical-align:1px}
.cb .cp-jn-pin{display:none;flex:none;font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;
  color:var(--ink);text-decoration:none;padding:6px 0 6px 10px;border-left:1px solid var(--line);
  white-space:nowrap}
.cb .cp-jn-pin::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
  background:var(--ink);margin-right:6px;vertical-align:1px}
.cb .cp-jn-pin[aria-current="true"]{text-decoration:underline;text-underline-offset:4px}
@media (max-width:760px){.cb .cp-jn-pin{display:block}.cb .cp-jn-scroll .cp-jn-key{display:none}}
@media (max-width:480px){.cb .cp-jn-lbl{display:none}.cb .cp-jn-scroll a{padding:6px 8px;font-size:12px}}
/* 2026-10-05 audit: every jump-nav link is a full 44px tap target (they were 26px), and on a phone the
   pinned key destination ("This week") reads first, at the row's left edge, not last at its right. */
.cb .cp-jn-scroll a{display:flex;align-items:center;min-height:44px;padding-top:0;padding-bottom:0}
@media (max-width:760px){.cb .cp-jn-pin{display:flex;align-items:center;min-height:44px;order:-1;padding:0 10px 0 0;
  border-left:0;border-right:1px solid var(--line)}}
.cb .cp-anchor,.cb .cp-beat,.cb .cp-chapter,.cb .wk-sec,.cb section.wk{scroll-margin-top:56px}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

.cb .cp-part{font-family:Archivo,sans-serif;font-size:12.5px;font-weight:800;color:var(--ink);margin:46px 0 0;padding-top:10px;
  border-top:2px solid var(--ink)}

.cb .cp-chapter{margin:0}
.cb .cp-chapter-dek{font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-size:clamp(19px,2.2vw,24px);font-weight:800;
  line-height:1.25;color:var(--ink);margin:8px 0 0;max-width:36ch;font-stretch:var(--head-stretch,78%)}
.cb .cp-chapter-idx{list-style:none;display:flex;flex-wrap:wrap;gap:4px 18px;margin:12px 0 0;padding:0}
.cb .cp-chapter-idx a{display:inline-flex;align-items:baseline;gap:6px;font-size:13px;font-weight:600;
  color:var(--ink);text-decoration:none;padding:3px 0;border-bottom:1px solid var(--line)}
.cb .cp-chapter-idx a:hover{border-bottom-color:var(--ink)}
.cb .cp-chapter-idx .tnum{font-weight:800;color:var(--muted);font-size:12px}
.cb .cp-beat{margin:40px 0 0}
.cb .cp-beat > section{margin-top:0}
.cb .cp-beat h2{margin-top:0}

.cb .cp-lede{display:flex;align-items:center;gap:18px;margin:10px 0 18px;max-width:760px}
.cb .cp-lede-num{flex:none;display:flex;flex-direction:column;font-family:Archivo,sans-serif;
  font-weight:800;font-size:clamp(44px,6vw,64px);line-height:.9;color:var(--ink);letter-spacing:-.02em}
.cb .cp-lede-k{order:2;font-size:12.5px;font-weight:700;
  color:var(--muted);margin-top:6px;letter-spacing:0}  /* the number's -.02em computes at 64px and would inherit as -1.3px */
.cb .cp-lede-pre{order:-1;font-size:12px;font-weight:700;color:var(--muted);letter-spacing:0;
  margin-bottom:4px}
.cb .cp-lede-txt{font-size:15px;line-height:1.45;color:var(--ink);margin:0 0 2px;max-width:52ch}
.cb .cp-lede-txt b{font-weight:800}
.cb .cp-lede--text .cp-lede-txt{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:18px;font-weight:800;max-width:46ch;font-stretch:var(--head-stretch,78%)}
/* Phones: keep number and sentence side by side (the sentences continue the number --
   "87% | of his 2026 roster...") at a smaller size, rather than stacking the label between them. */
@media (max-width:560px){
  .cb .cp-lede{align-items:flex-start;gap:12px}
  .cb .cp-lede-num{font-size:38px}
  .cb .cp-lede-k{font-size:9.5px;max-width:9ch}
  .cb .cp-lede-txt{font-size:14px}
}
.cb .cp-caption{font-size:12px;line-height:1.5;color:var(--muted);margin:14px 0 0;max-width:68ch}
.cb .cp-kicker{display:block;font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:2px}

/* Geography: map + distance side-by-side on desktop, stacked on phones.
   Map column widened 2026-09-26 (was minmax(0,420px), tuned for the
   choropleth's fixed 50-tile grid) now that it's a real map, which
   benefits from width more than a tile grid did. */
.cb .cp-geo-grid{display:grid;grid-template-columns:minmax(0,640px) minmax(0,1fr);gap:28px;align-items:start}
.cb .cp-geo-grid > :only-child{grid-column:1 / -1}
@media (max-width:760px){.cb .cp-geo-grid{grid-template-columns:1fr;gap:18px}}
.cb .cp-geo-figs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 18px;margin:4px 0 0}
.cb .cp-geo-figs div{border-top:1px solid var(--line);padding-top:8px}
.cb .cp-geo-figs dt{font-size:11.5px;color:var(--muted);order:2}
.cb .cp-geo-figs dd{margin:0 0 2px;font-family:Archivo,sans-serif;font-weight:800;font-size:26px;
  color:var(--ink);line-height:1}
.cb .cp-geo-figs div{display:flex;flex-direction:column}
.cb .cp-geo-figs dd{order:1}


.cb .cp-effective-size{margin:14px 0;padding:14px 16px;border:1px solid var(--line);border-radius:3px}
.cb .es-group-h{margin:10px 0 6px;font-family:Archivo,sans-serif;font-weight:700;
  font-size:11px;color:var(--ink-2)}
.cb .es-group-h:first-of-type{margin-top:2px}


.cb .cp-construction-capital{margin:14px 0;padding:14px 16px;border:1px solid var(--line);border-radius:3px}


/* Discourse Arcs — "What fans are saying" (Phase 6, doc-90 light) */
.da{margin:clamp(20px,3vw,30px) 0;}
.da-head{margin-bottom:14px;}
.da-title{font:600 1.15rem/1.25 'Archivo','Helvetica Neue',Arial,sans-serif;color:var(--ink,#222222);margin:0 0 4px;}
.da-honesty{font:400 .8rem/1.4 'Archivo',sans-serif;color:var(--ink-2,#5b5b5b);margin:0;}
.da-cards{display:flex;flex-direction:column;gap:12px;}
.da-card{background:#ffffff;border:1px solid var(--line,#e4e4e1);
  border-radius:3px;padding:14px 16px;border-left:1px solid var(--line,#e4e4e1);
  scroll-margin-top:52px;}
.da-card.da-media{border-left-color:var(--ink-3,#8b8b8b);}
.da-card:focus-visible{outline:2px solid var(--ink,#222222);outline-offset:2px;}
.da-eyebrow{display:flex;align-items:baseline;justify-content:space-between;
  gap:10px;margin-bottom:8px;flex-wrap:wrap;}
.da-aspect{font:600 .8rem/1 'Archivo',sans-serif;letter-spacing:.04em;
  text-transform:capitalize;color:var(--ink-2,#5b5b5b);}
.da-prevalence{font:600 .8rem/1 'Archivo',sans-serif;color:var(--ink-2,#5b5b5b);
  border-left:1px solid var(--line,#e4e4e1);padding-left:8px;}
.da-prevalence.da-single{font-style:italic;font-weight:500;}
.da-headline{font:600 1.05rem/1.3 'Archivo','Helvetica Neue',Arial,sans-serif;color:var(--ink,#222222);
  margin:0 0 8px;text-wrap:balance;}
.da-receipt{margin:0 0 10px;padding-left:12px;border-left:2px solid var(--line,#e4e4e1);}
.da-receipt p{font:400 .92rem/1.5 'Archivo',sans-serif;color:var(--ink,#222222);margin:0;}
.da-provenance{font:400 .8rem/1.4 'Archivo',sans-serif;color:var(--ink-2,#5b5b5b);margin:0;}
.da-more{margin-top:10px;}
.da-more summary{font:600 .82rem/1 'Archivo',sans-serif;color:#1a5dad;cursor:pointer;
  list-style:none;padding:6px 0;}
.da-more summary::-webkit-details-marker{display:none;}
.da-more summary:focus-visible{outline:2px solid var(--ink,#222222);outline-offset:2px;}
.da-extra{display:flex;flex-direction:column;gap:12px;margin-top:10px;}
@media(prefers-reduced-motion:reduce){.da-card{transition:none;}}


/* Aggregate mood card — Phase 7 half 1, reuses discourse_arcs.py's .da-card shell.
   DESIGN.md (2026-09-28): no green/red mood side stripe (and no "Fan mood"
   eyebrow over the headline, which says the mood in words). The left edge is
   the card's plain 1px frame whatever the shell's stripe does. */
.da-card.da-mood-positive,.da-card.da-mood-negative{border-left:1px solid var(--line,#e4e4e1);}


.stature-chip{--sc-muted:#686862;text-decoration:none;font-family:Archivo,system-ui,sans-serif}
.sc-inline,.sc-micro,.sc-standard{display:inline-flex;align-items:center;gap:6px;vertical-align:middle}
.sc-tick{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none}
.sc-band{font-size:12.5px;font-weight:700;color:var(--ink,#222222)}
.sc-rank{font-size:11.5px;color:var(--sc-muted);font-variant-numeric:tabular-nums;font-weight:600}
.sc-traj{font-size:11px;color:var(--sc-muted)}
.sc-hero{display:inline-flex;gap:12px;align-items:stretch}
.sc-ladder{display:flex;flex-direction:column;gap:1.5px;justify-content:center;width:15px}
.sc-lt{height:2px;background:rgba(28,28,26,.13);border-radius:1px}
.sc-hbody{display:flex;flex-direction:column;gap:2px;justify-content:center}
.sc-eyebrow{font-size:12px;font-weight:700;color:var(--sc-muted)}
.sc-hband{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-size:21px;font-weight:600;line-height:1}
.sc-hmeta{display:flex;gap:10px;align-items:baseline;font-size:12px;color:var(--sc-muted);font-variant-numeric:tabular-nums}
.sc-at{font-weight:700;color:#1c1c1a}
.sc-note{font-size:12px;color:var(--sc-muted);margin-top:1px}
.sc-held{color:var(--ink,#222222);font-weight:600}
.sc-swing{font-size:11px;font-weight:700;white-space:nowrap;cursor:help}
.sc-swing-w{font-weight:600;letter-spacing:.005em}
.sc-note.sc-swing{font-size:13px;font-weight:700;line-height:1.4;white-space:normal;cursor:default;margin:3px 0 5px}
.sc-swingcard{border:1px solid rgba(34,34,34,.1);border-radius:3px;padding:14px 16px 12px;margin:12px 0;font-family:Archivo,system-ui,sans-serif;background:var(--page,#fff)}
.sc-swingcard-h{font-size:13px;font-weight:700;color:var(--sc-muted,#686862);margin-bottom:8px}
.sc-swingcard-claim{font-size:15px;font-weight:800;line-height:1.3;margin-bottom:5px}
.sc-swingcard-sum{font-size:13px;line-height:1.5;color:#3a3a36;margin-bottom:9px}
.sc-swingcard-link{font-size:12px;font-weight:600;color:#1c1c1a;text-decoration:underline;text-underline-offset:2px}


.cb .cp-rightnow{margin:16px 0 20px;padding:14px 16px 16px;border:1px solid var(--line);border-radius:3px}
.cb .cp-rightnow h2{font-size:14px;color:var(--muted);margin:0 0 10px}
.cb .cp-rn-top{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:2px}
.cb .cp-rn-record{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:20px;font-stretch:var(--head-stretch,78%)}
.cb .cp-rn-streak{display:inline-block;margin-left:8px;font-family:Archivo,sans-serif;font-weight:700;
  font-size:12.5px;vertical-align:2px}
/* Bug fixed 2026-09-21: this was always --decline (red) regardless of whether the
   streak was winning or losing. Now matches the swing glyph's own green/red/muted. */
.cb .cp-rn-streak-up{color:var(--green)}
.cb .cp-rn-streak-down{color:var(--red)}
.cb .cp-rn-streak-flat{color:var(--muted)}
/* Opponent + score, visible per-game (2026-09-21, replaces the old title-only glyph
   row) -- W/L/T letter chip keeps shape+color redundancy, opponent name + score are
   now real text, not hover-only. */
.cb .cp-rn-results{display:flex;flex-direction:column;gap:4px;margin-top:10px;font-size:13px}
.cb .cp-rn-result{display:flex;align-items:baseline;gap:7px}
.cb .cp-rn-result a{color:var(--ink);text-decoration:none}
.cb .cp-rn-result a:hover{text-decoration:underline}
.cb .cp-rn-score{color:var(--muted);margin-left:auto}
.cb .cp-rn-g{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;
  border-radius:2px;font-size:10px;font-weight:800;color:#fff;cursor:default;flex:none}
/* green/red for win/loss, not the archetype blue/gold (fixed 2026-09-21, same
   category-vs-delta reasoning as the swing glyph above) -- a win is a win, doc-100's
   own green binding and doc-90's "positive/up" both land on the same answer, and the
   W/L/T letters already give shape+color redundancy either way. */
.cb .cp-rn-w{background:var(--green)}
.cb .cp-rn-l{background:var(--red)}
.cb .cp-rn-t{background:var(--muted)}
.cb .cp-rightnow .stature-chip{margin-left:auto}
.cb .cp-rightnow .da-card{margin-top:12px}
@media(max-width:600px){
  .cb .cp-rn-top{gap:10px}
  .cb .cp-rightnow .stature-chip{margin-left:0}
  .cb .cp-rn-score{margin-left:0}
}


.cb .cp-job{--hs-hot:#c4381c;--hs-warm:#b3591a;--hs-luke:#86681a;--hs-cool:#17699a;--hs-none:#6b6b6b;
  margin:16px 0 20px;padding:14px 16px 16px;border:1px solid var(--line);border-radius:3px}
.cb .cp-job[data-heat="hot"]{--hs:var(--hs-hot)}
.cb .cp-job[data-heat="warm"]{--hs:var(--hs-warm)}
.cb .cp-job[data-heat="luke"]{--hs:var(--hs-luke)}
.cb .cp-job[data-heat="cool"]{--hs:var(--hs-cool)}
.cb .cp-job[data-heat="none"]{--hs:var(--hs-none)}
.cb .cp-job-top{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;margin:0 0 10px}
.cb .cp-job h2{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:19px;margin:0;color:var(--ink);font-stretch:var(--head-stretch,78%)}
.cb .cp-job-all{font-family:Archivo,sans-serif;font-size:12.5px;font-weight:700;color:var(--ink);
  text-decoration:none;border-bottom:1px solid var(--line);white-space:nowrap}
.cb .cp-job-all:hover{border-bottom-color:var(--ink)}
.cb .cp-job-eyebrow{font-family:Archivo,sans-serif;font-size:11.5px;font-weight:700;color:var(--muted);margin:0 0 4px}
.cb .cp-job-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:8px}
.cb .cp-job-pct{font-family:var(--font-head,Archivo,Helvetica,Arial,sans-serif);font-weight:900;font-size:46px;line-height:.95;
  letter-spacing:-.02em;color:var(--hs);font-stretch:var(--head-stretch,78%)}
.cb .cp-job-hl{display:flex;flex-direction:column;gap:2px}
.cb .cp-job-pctl{font-family:Archivo,sans-serif;font-size:13px;font-weight:600;color:var(--muted);line-height:1.3}
.cb .cp-job-word{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:22px;line-height:1.1;color:var(--hs);font-stretch:var(--head-stretch,78%)}
.cb .cp-job-rank{font-family:Archivo,sans-serif;font-size:14px;color:var(--ink);line-height:1.35}
.cb .cp-job-rank b{font-weight:800}
.cb .cp-job-rank i{font-style:normal;color:var(--muted)}
.cb .cp-job-pos{margin:6px 0 8px;max-width:460px}
.cb .cp-job-track{position:relative;display:block;height:6px;border-radius:3px;
  background:linear-gradient(90deg,var(--hs-cool) 0 20%,var(--hs-luke) 20% 40%,var(--hs-warm) 40% 70%,var(--hs-hot) 70% 100%)}
.cb .cp-job-track i{position:absolute;top:-5px;width:4px;height:16px;background:var(--ink);
  border-radius:1px;transform:translateX(-2px);box-shadow:0 0 0 2px #fff}
.cb .cp-job-ends{display:flex;justify-content:space-between;margin-top:5px}
.cb .cp-job-ends em{font-style:normal;font-size:10.5px;color:var(--muted)}
.cb .cp-job-basis{font-size:12px;line-height:1.5;color:var(--muted);margin:0 0 14px;max-width:62ch}
.cb .cp-job h3{font-family:Archivo,sans-serif;font-weight:800;font-size:13.5px;color:var(--ink);margin:0 0 6px}
.cb .cp-job-why{list-style:none;margin:0 0 16px;padding:0;max-width:66ch}
.cb .cp-job-why li{display:grid;grid-template-columns:74px 1fr;gap:10px;padding:6px 0;
  border-top:1px solid var(--line);font-size:13.5px;line-height:1.5;color:var(--ink)}
.cb .cp-job-why li:first-child{border-top:0}
.cb .cp-job-why p{margin:0}
.cb .cp-job-why .cp-job-quiet{grid-column:1/-1;color:var(--muted)}
.cb .cp-job-more{display:inline;font-size:12px;line-height:1.5;color:var(--muted)}
.cb .cp-job-more summary{display:inline;cursor:pointer;color:var(--muted);
  text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:2px}
.cb .cp-job-more summary::-webkit-details-marker{display:none}
.cb .cp-job-more[open]{display:block;margin-top:4px}
.cb .cp-job-more p{margin:2px 0 0}
.cb .cp-job-dir{font-family:Archivo,sans-serif;font-size:11px;font-weight:800;padding-top:2px;white-space:nowrap}
.cb .cp-job-dir[data-dir="hotter"]{color:var(--hs-hot)}
.cb .cp-job-dir[data-dir="cooler"]{color:var(--hs-cool)}
.cb .cp-job-caveat{color:var(--muted)}
.cb .cp-job-sub2{font-size:12px;line-height:1.5;color:var(--muted);margin:-2px 0 6px;max-width:62ch}
.cb .cp-job-hist{margin:0 0 6px;max-width:560px}
.cb .cp-job-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  padding:6px 0;border-top:1px solid var(--line)}
.cb .cp-job-row dt{font-size:13px;color:var(--ink);margin:0;flex:1 1 auto}
.cb .cp-job-row dt i{display:block;font-style:normal;font-size:11px;color:var(--muted)}
.cb .cp-job-row dd{margin:0;text-align:right;white-space:nowrap;font-size:12px;color:var(--muted)}
.cb .cp-job-row dd b{font-family:Archivo,sans-serif;font-weight:800;font-size:17px;color:var(--ink);margin-right:4px}
.cb .cp-job-n{font-size:11.5px;line-height:1.5;color:var(--muted);margin:4px 0 12px;max-width:66ch}
.cb .cp-job-lines{border-top:1px solid var(--line);padding-top:10px;margin-top:2px}
.cb .cp-job-line{display:flex;gap:10px;align-items:baseline;padding:4px 0;font-size:13px;flex-wrap:wrap}
.cb .cp-job-line dt{font-family:Archivo,sans-serif;font-size:11.5px;font-weight:700;color:var(--muted);min-width:110px;margin:0}
.cb .cp-job-line dd{margin:0;color:var(--ink)}
.cb .cp-job-line dd i{font-style:normal;color:var(--muted);font-size:12px}
.cb .cp-job-note{font-size:11.5px;line-height:1.55;color:var(--muted);margin:12px 0 0;
  border-top:1px solid var(--line);padding-top:10px;max-width:70ch}
.cb .cp-job-note b{color:var(--ink);font-weight:700}
.cb .cp-job-wait{font-size:14px;line-height:1.5;color:var(--muted);margin:0;max-width:62ch}
.cb .cp-job-lede{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:16.5px;line-height:1.45;
  color:var(--ink);margin:0 0 14px;max-width:60ch;font-stretch:var(--head-stretch,78%)}
.cb .cp-job-lede b{font-weight:600;color:var(--hs)}
.cb .cp-job-trend{margin:2px 0 18px;max-width:760px}
.cb .cp-job-trend-wrap{overflow-x:auto;overflow-y:hidden;direction:rtl}
.cb .cp-job-trend-wrap>svg{direction:ltr;min-width:620px}
.cb .cp-job-trend-hint{display:none}
.cb .cp-job-trend-note{font-size:13px;line-height:1.5;color:var(--ink);margin:8px 0 0;max-width:66ch}
.cb .cp-job-trend-key{font-size:11.5px;line-height:1.5;color:var(--muted);margin:6px 0 0;max-width:70ch}
@media(max-width:700px){
  .cb .cp-job-trend-hint{display:block;margin:6px 0 0;font:500 10.5px/1 Archivo,sans-serif;color:var(--muted)}
}
@media(max-width:600px){
  .cb .cp-job{padding:12px 13px 14px}
  .cb .cp-job-lede{font-size:15.5px}
  .cb .cp-job-head{gap:4px 12px}
  .cb .cp-job-pct{font-size:40px}
  .cb .cp-job-pos{max-width:none}
  .cb .cp-job-ends em{font-size:10px}
  .cb .cp-job-why li{grid-template-columns:1fr;gap:2px}
  .cb .cp-job-row{flex-wrap:wrap;gap:2px 12px}
  .cb .cp-job-row dd{text-align:left}
  .cb .cp-job-line{gap:2px}
  .cb .cp-job-line dt{min-width:0;flex:1 1 100%}
}


.cb .cp-hs-badge{--hs-hot:#c4381c;--hs-warm:#b3591a;--hs-luke:#86681a;--hs-cool:#17699a;--hs-none:#6b6b6b;}
.cb .cp-hs-badge[data-heat="hot"]{--hs:var(--hs-hot)}
.cb .cp-hs-badge[data-heat="warm"]{--hs:var(--hs-warm)}
.cb .cp-hs-badge[data-heat="luke"]{--hs:var(--hs-luke)}
.cb .cp-hs-badge[data-heat="cool"]{--hs:var(--hs-cool)}
.cb .cp-hs-badge[data-heat="none"]{--hs:var(--hs-none)}
.cb .cp-hs-badge{position:absolute;top:40px;right:0;width:124px;text-align:center;
  font-family:Archivo,sans-serif}
.cb .cp-hs-badge a{display:flex;flex-direction:column;align-items:center;gap:6px;
  color:var(--ink);text-decoration:none}
.cb .cp-hs-badge a:hover .cp-hs-cap,.cb .cp-hs-badge a:hover .cp-hs-note{text-decoration:underline}
.cb .cp-hs-badge svg{display:block;flex:none;width:20px;height:66px}
.cb .cp-hs-badge .cp-hs-glass{fill:var(--page);stroke:var(--muted);stroke-width:1.5}
.cb .cp-hs-badge .cp-hs-merc{fill:var(--hs)}
.cb .cp-hs-badge .cp-hs-cap{display:flex;flex-direction:column;gap:2px}
.cb .cp-hs-badge .cp-hs-pct{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:900;font-size:22px;
  line-height:1;color:var(--hs);font-stretch:var(--head-stretch,condensed)}
.cb .cp-hs-badge .cp-hs-word{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:15px;
  line-height:1.1;color:var(--hs);font-stretch:var(--head-stretch,condensed)}
.cb .cp-hs-badge .cp-hs-rank{font-size:11.5px;font-weight:600;line-height:1.3;color:var(--muted);
  text-wrap:balance}
.cb .cp-hs-badge .cp-hs-note{font-size:12px;font-weight:700;line-height:1.35;color:var(--muted);
  text-wrap:balance}
@media(max-width:600px){
  .cb .cp-hs-badge{position:static;width:auto;text-align:left;margin-top:8px}
  .cb .cp-hs-badge a{flex-direction:row;justify-content:flex-start;gap:9px}
  .cb .cp-hs-badge svg{width:12px;height:40px}
}

.hst-svg{display:block;width:100%;height:auto;overflow:visible}
.hst-svg text{font-family:Archivo,sans-serif;font-variant-numeric:tabular-nums}
.hst-band{stroke:none;fill-opacity:.08}
.hst-band.hst-hot{fill:var(--hs-hot)}
.hst-band.hst-warm{fill:var(--hs-warm)}
.hst-band.hst-luke{fill:var(--hs-luke)}
.hst-band.hst-cool{fill:var(--hs-cool)}
.hst-cut{stroke:var(--line);stroke-width:1;stroke-dasharray:2 3}
.hst-zone{font-size:11px;font-weight:700;fill-opacity:.8}
.hst-zone.hst-hot,.hst-end-label.hst-hot,.hst-end.hst-hot{fill:var(--hs-hot)}
.hst-zone.hst-warm,.hst-end-label.hst-warm,.hst-end.hst-warm{fill:var(--hs-warm)}
.hst-zone.hst-luke,.hst-end-label.hst-luke,.hst-end.hst-luke{fill:var(--hs-luke)}
.hst-zone.hst-cool,.hst-end-label.hst-cool,.hst-end.hst-cool{fill:var(--hs-cool)}
.hst-line{fill:none;stroke-width:2.25;stroke-linejoin:round;stroke-linecap:round}
.hst-line.hst-hot{stroke:var(--hs-hot)}
.hst-line.hst-warm{stroke:var(--hs-warm)}
.hst-line.hst-luke{stroke:var(--hs-luke)}
.hst-line.hst-cool{stroke:var(--hs-cool)}
.hst-year{font-size:11px;fill:var(--muted)}
.hst-title{font-size:17px;fill:var(--ink);stroke:var(--page);stroke-width:3px;
  stroke-linejoin:round;paint-order:stroke}
.hst-guide{stroke:var(--muted);stroke-width:1;stroke-dasharray:1 3}
.hst-hit{fill:transparent;stroke:none;pointer-events:all}
.hst-end{stroke:var(--page);stroke-width:2}
.hst-end-label{font-size:11.5px;font-weight:800}
.hst-stripe{display:block;width:100%;height:16px}
.hst-tick{stroke:none}
.hst-tick.hst-hot{fill:var(--hs-hot)}
.hst-tick.hst-warm{fill:var(--hs-warm)}
.hst-tick.hst-luke{fill:var(--hs-luke)}
.hst-tick.hst-cool{fill:var(--hs-cool)}
.hst-tick.hst-unrated{fill:none;stroke:var(--muted);stroke-width:1;stroke-dasharray:2 2;
  vector-effect:non-scaling-stroke}

.hlh-svg{width:100%;height:auto;font-family:var(--font-ui, Archivo, sans-serif);}
.hlh-band{fill:var(--hlh-band, rgba(139,139,139,.12));stroke:none;}
.hlh-band-note{font-size:9.5px;fill:var(--muted, #767676);}
.hlh-grid{stroke:var(--line, #e4e4e1);stroke-width:1;}
.hlh-zero{stroke:var(--ink, #222222);stroke-width:1;}
.hlh-axis{font-size:11px;fill:var(--muted, #767676);}
.hlh-comp{fill:none;stroke:var(--hlh-comp, #8b8b8b);stroke-width:1.25;}
.hlh-comp-dot{fill:var(--hlh-comp, #8b8b8b);}
.hlh-comp-label{font-size:11px;fill:var(--hlh-comp, #8b8b8b);}
.hlh-own{fill:none;stroke:var(--hlh-subject, #1d68a3);stroke-width:1.25;stroke-dasharray:4 3;}
.hlh-subject{fill:none;stroke:var(--hlh-subject, #1d68a3);stroke-width:2.5;}
.hlh-subject-dot{fill:var(--hlh-subject, #1d68a3);}
.hlh-subject-label{font-size:11px;fill:var(--ink, #222222);font-weight:600;}
.hlh-hollow{fill:var(--page, #ffffff);stroke:var(--hlh-subject, #1d68a3);stroke-width:2;}
.hlh-end-marker{font-size:11px;fill:var(--muted, #767676);}
.hlh-svg .hlh-dim{opacity:.4;}
.hlh-svg .hlh-focus{stroke-width:2;}


.cb .hlh{margin:16px 0 20px;padding:14px 16px 16px;border:1px solid var(--line);border-radius:3px}
.cb .hlh h2{font-family:Archivo,Helvetica Neue,Arial,sans-serif;font-weight:800;font-size:19px;margin:0 0 4px;font-stretch:var(--head-stretch,78%)}
.cb .hlh-subtitle{font-size:13px;color:var(--muted);margin:0 0 10px}
.cb .hlh-method{display:block;font-size:11.5px;margin-top:2px}
.cb .hlh-count{font-size:15px;margin:0 0 4px}
.cb .hlh-count-sub{font-size:13px;color:var(--muted);font-weight:400;margin-top:2px}
.cb .hlh-chart-wrap{margin:10px 0}
.cb .hlh-subject-caveat{font-size:11.5px;color:var(--muted);margin:4px 0 0}
.cb .hlh-fallback{font-size:14px;color:var(--muted)}
.cb .hlh-cards{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px}
.cb .hlh-card{flex:0 0 220px;border:1px solid var(--line);border-radius:3px;padding:10px 12px;font-size:13px}
.cb .hlh-card-h{display:flex;align-items:center;gap:6px;font-weight:700;margin-bottom:4px}
.cb .hlh-card-h a{color:var(--ink);text-decoration:none}
.cb .hlh-card-h a:hover{text-decoration:underline}
.cb .hlh-num{display:inline-block;width:16px;height:16px;border-radius:2px;background:#fff;border:1px solid #e7e7e2;box-sizing:border-box;line-height:14px;
  color:var(--muted);font-size:10px;font-weight:800;text-align:center;flex:none}
.cb .hlh-nopage{color:var(--muted);font-weight:400;font-size:11.5px;border:1px solid var(--line);
  border-radius:2px;padding:1px 5px}
.cb .hlh-card-prior,.cb .hlh-card-move{color:var(--muted);font-size:12px}
.cb .hlh-card-rec{margin-top:6px;font-family:Archivo,sans-serif;font-variant-numeric:tabular-nums}
.cb .hlh-card-rec .hlh-w{color:var(--green)}
.cb .hlh-card-rec .hlh-l{color:var(--red)}
.cb .hlh-card-ended{color:var(--muted);font-size:12px;margin-top:2px}
.cb .hlh-card-delta{margin-top:6px;font-weight:700}
@media(max-width:600px){.cb .hlh-card{flex:0 0 200px}}


.cb .hlh-extra-cards{display:flex;gap:10px;margin:10px 0;flex-wrap:wrap}
.cb .hlh-extra-cards .hlh-card{flex:1 1 220px;max-width:280px}
.cb .hlh-card-titles,.cb .hlh-card-exit,.cb .hlh-card-tier,.cb .hlh-card-trend{
  margin-top:4px;font-size:12px;color:var(--muted)}
.cb .hlh-hist{margin:14px 0 4px;padding:12px 14px;border:1px solid var(--line);border-radius:3px}
.cb .hlh-hist-list{list-style:none;margin:8px 0 0;padding:0;font-size:13px}
.cb .hlh-hist-row{display:flex;align-items:center;gap:10px;padding:4px 0;border-top:1px solid var(--line)}
.cb .hlh-hist-row:first-child{border-top:none}
.cb .hlh-hist-coach{flex:1 1 auto;font-weight:600}
.cb .hlh-hist-year{color:var(--muted);width:44px;flex:none}
.cb .hlh-hist-rec{font-family:Archivo,sans-serif;font-variant-numeric:tabular-nums;width:56px;flex:none}
.cb .hlh-hist-delta{font-weight:700;width:52px;flex:none;text-align:right}
.cb .hlh-hist-marker{color:var(--muted);font-size:11px}
.cb .hlh-riv-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 0}
.cb .hlh-riv-row + .hlh-riv-row{border-top:1px solid var(--line)}
.cb .hlh-riv-name{color:var(--muted);font-size:12px}
@media(max-width:600px){.cb .hlh-extra-cards .hlh-card{flex:1 1 100%;max-width:none}}


/* ── Player-page component registry (audit item 14) ─────────────────────── */
/* Card tiers. Doc 90 §2.7: white surface + mandatory 1px --line hairline,
   --r-2 radius, no shadow. The gray plot panel retired (DESIGN.md) and a
   gray fill is never a tier-2 card background -- that ban is what tier 2
   encodes. */
.pc-card {
  background: var(--page, #ffffff);
  border: 1px solid var(--line, #e4e4e1);
  border-radius: var(--r-2, 3px);
  padding: 16px 20px;
  margin: 0 0 24px;
}
/* Tier 1 -- "the site stands behind this". Its 4px ribbon retired with the
   No Side Stripe Rule (DESIGN.md); --pc-ribbon is still injected inline per
   card (strict hex only) but nothing draws it. */
.pc-card--t1 { }
/* Tier 2 -- "context / derived": white + hairline, NO ribbon, NO fill.
   Quietness is the absence of the ribbon plus the eyebrow-register title
   (P4 §7 disagreement #1 overriding P1 §5.1's gray-panel proposal). */
.pc-card--t2 { padding: 14px 18px; }
.pc-card--t2 .pc-card__title {
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-2, #5b5b5b);
}
/* Tier 3 -- "model opinion / thin sample, labeled": thin box + the chip. */
.pc-card--t3 { padding: 12px 16px; border-color: var(--line, #e4e4e1); }
.pc-card--t3 .pc-card__title {
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 14px;
  font-weight: 600;
  color: var(--ink, #222222);
}
.pc-card__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 10px;
  margin-bottom: 10px;
}
.pc-card__head > .pc-kicker { flex: 1 0 100%; }
.pc-card__title {
  font-family: 'Archivo', 'Helvetica Neue', Arial, sans-serif;
  font-size: 19px;
  font-weight: 600;
  line-height: 1.2;
  color: var(--ink, #222222);
  margin: 0;
}
.pc-card__sub {
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 13px;
  line-height: 18px;
  font-weight: 400;
  color: var(--ink-3, #8b8b8b);
  margin: 0;
}
.pc-card__conf { margin-left: auto; }
.pc-card__body { font-family: var(--sans, 'Archivo', system-ui, sans-serif); }

/* Kicker / eyebrow. Sentence case -- doc 90 bans all-caps tracked labels, so
   there is deliberately no text-transform here. */
.pc-kicker {
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .04em;
  line-height: 1.5;
  color: var(--ink-3, #8b8b8b);
  margin: 0 0 2px;
}
.pc-kicker--accent { color: var(--gold-text,#8a6200); }
.pc-kicker--quiet  { color: var(--ink-3, #8b8b8b); opacity: .8; }

/* Stat-hero numeral -- doc 90 data-hero row: Archivo 30-74 / .85, weight 800,
   tabular-nums. Owner ruling 2026-08-06: Archivo, never Fraunces. */
.pc-hero { display: block; margin: 0 0 8px; }
.pc-hero__num {
  display: block;
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-weight: 800;
  line-height: .85;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--ink, #222222);
}
.pc-hero--sm .pc-hero__num { font-size: 30px; }
.pc-hero--md .pc-hero__num { font-size: 40px; }
.pc-hero--lg .pc-hero__num { font-size: clamp(40px, 4vw, 56px); }
.pc-hero--xl .pc-hero__num { font-size: clamp(48px, 6vw, 74px); }
.pc-hero__label {
  display: block;
  margin-top: 6px;
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-2, #5b5b5b);
}
.pc-hero__sub {
  display: block;
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 12px;
  line-height: 16px;
  color: var(--ink-3, #8b8b8b);
}

/* Receipt card -- pass 3 §5. The quote-tweet contract, flat: 1px border,
   <=3px radius, no shadow, and a mandatory date. */
.pc-receipt {
  border: 1px solid var(--line, #e4e4e1);
  border-radius: var(--r-2, 3px);
  background: var(--page, #ffffff);
  padding: 12px 14px;
  margin: 0 0 12px;
}
.pc-receipt__quote {
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 15px;
  line-height: 1.5;
  color: var(--ink, #222222);
  margin: 0 0 8px;
  quotes: '\201C' '\201D';
}
.pc-receipt__quote::before { content: open-quote; }
.pc-receipt__quote::after  { content: close-quote; }
.pc-receipt__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px;
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 12px;
  color: #686862;
}
.pc-receipt__source { font-weight: 600; color: var(--ink-2, #5b5b5b); }
a.pc-receipt__source { text-decoration: none; }
a.pc-receipt__source:hover { text-decoration: underline; color: var(--ink, #222); }
.pc-receipt__sep { color: var(--ink-3, #8b8b8b); }
.pc-receipt__date { font-variant-numeric: tabular-nums lining-nums; }
.pc-receipt__context { color: var(--ink-3, #8b8b8b); }
/* Identity, never an accent -- doc 100: identity is not a data meaning. */
.pc-receipt__role { color: var(--ink-2, #5b5b5b); }

/* Relation accents -- bound once, here, instead of in each host module's
   private CSS. DESIGN.md (D-143) retires side stripes, so the relation rides
   on the 40px rule above the quote, the house quote mark: `own_words` = ink
   (the subject speaking is identity, not a data meaning); `about` = gold
   (what people say); `verdict` = green/red only once an outcome is actually
   known, since an unresolved claim is not a measured result; `context` =
   gray. A card with no data-relation has no rule. */
.pc-receipt[data-relation]::before { content: ""; display: block; width: 40px; height: 3px;
  margin: 0 0 8px; background: var(--line, #e7e7e2); }
.pc-receipt[data-relation="own_words"]::before { background: var(--ink, #222222); }
.pc-receipt[data-relation="about"]::before     { background: var(--gold, #b7851a); }
.pc-receipt[data-relation="context"]::before   { background: var(--ink-3, #686862); }
.pc-receipt[data-relation="verdict"][data-outcome="hit"]::before  { background: var(--green, #3a7a4b); }
.pc-receipt[data-relation="verdict"][data-outcome="miss"]::before { background: var(--red, #bf3b31); }

/* data-source-type -- emitted by render_receipt_card since it shipped and
   styled by NOTHING until 2026-09-09, so a fan comment, a podcast line and a
   beat-writer quote were visually identical. This is the user's "who is this
   and why should I trust them" signal, carried without a text label: a small
   glyph before the attribution, weight and colour only, no pill and no
   badge (doc 90: flat, radius <=3px, no capsules). Sentence-case glyphs are
   deliberately punctuation-like rather than emoji -- they must not read as
   decoration next to a 12px meta line. */
.pc-receipt__source::before {
  font-weight: 400;
  color: var(--ink-3, #8b8b8b);
  margin-right: 5px;
}
.pc-receipt[data-source-type="outlet"] .pc-receipt__source::before { content: "\25A0"; }
.pc-receipt[data-source-type="podcast"] .pc-receipt__source::before { content: "\25B6"; }
.pc-receipt[data-source-type="fan"] .pc-receipt__source::before { content: "\25CF"; }
/* Trust reads left-to-right in weight: a named outlet is the darkest, a
   podcast mid, an anonymous community comment the lightest. */
.pc-receipt[data-source-type="outlet"] .pc-receipt__source { color: var(--ink, #222222); }
.pc-receipt[data-source-type="podcast"] .pc-receipt__source { color: var(--ink-2, #5b5b5b); }
.pc-receipt[data-source-type="fan"] .pc-receipt__source { color: var(--ink-3, #8b8b8b); font-weight: 500; }

/* Field position -- "who's around you" on a rank ladder (part 10).
   A list, not a chart: no fills, no bars, no plot area. The only visual weight
   is on the subject row, and it comes from type weight plus a 2px identity
   accent -- doc 90 keeps team color to a thin accent that carries data, never
   a fill or a section tint. */
.pc-field { margin: 8px 0 0; }
.pc-field__list {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--line, #e4e4e1);
}
.pc-field__row {
  display: flex;
  align-items: baseline;
  gap: 10px;
  padding: 4px 0 4px 8px;
  border-bottom: 1px solid var(--line, #e4e4e1);
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 13px;
  line-height: 1.45;
  color: var(--ink-2, #5b5b5b);
}
.pc-field__row--subject {
  color: var(--ink, #222222);
  font-weight: 700;
}
.pc-field__rank {
  min-width: 3.2em;
  font-weight: 800;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--ink-3, #8b8b8b);
}
.pc-field__row--subject .pc-field__rank { color: var(--ink, #222222); }
.pc-field__name { flex: 1; min-width: 0; }
.pc-field__name a { color: inherit; text-decoration: none; }
.pc-field__name a:hover { text-decoration: underline; }
.pc-field__you {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .04em;
  color: var(--ink-3, #8b8b8b);
}
/* The elision row states the count it swallowed -- a bare ellipsis would hide
   how big the gap is, which is exactly the number a reader is judging. */
.pc-field__gap {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 3px 0 3px 8px;
  border-bottom: 1px solid var(--line, #e4e4e1);
}
.pc-field__gap-rule {
  flex: 1;
  height: 0;
  border-top: 1px dotted var(--line, #e4e4e1);
}
.pc-field__gap-n {
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 11px;
  color: var(--ink-3, #8b8b8b);
  font-variant-numeric: tabular-nums lining-nums;
}
.pc-field__more {
  display: inline-block;
  margin-top: 6px;
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 12px;
  color: var(--blue, #1d68a3);
  text-decoration: none;
}
.pc-field__more:hover { text-decoration: underline; }

/* Keep-reading bar -- P4 §5.1. One row, hairline-topped, eyebrow register. */
.pc-keep {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px 20px;
  margin-top: 32px;
  padding-top: 14px;
  border-top: 1px solid var(--line, #e4e4e1);
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 13px;
  line-height: 1.5;
  color: var(--ink-2, #5b5b5b);
}
.pc-keep a { color: var(--ink, #222222); text-decoration: none; }
.pc-keep a:hover { text-decoration: underline; }
.pc-keep__next { font-weight: 600; }
.pc-keep__teaser { font-weight: 400; color: var(--ink-2, #5b5b5b); }
.pc-keep__arrow { color: var(--ink-3, #8b8b8b); }
.pc-keep__pagers { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; }
.pc-keep__eyebrow { flex: 1 0 100%; font-size: 11.5px; color: var(--ink-3, #8b8b8b); }
.pc-keep__pager { white-space: nowrap; }
.pc-keep__pager--prev { margin-right: auto; }
.pc-keep__pager--next { margin-left: auto; }
.pc-keep__more { color: var(--ink-3, #8b8b8b); }
.pc-keep__more-label { font-weight: 600; color: var(--ink-2, #5b5b5b); }
@media (max-width: 600px) {
  .pc-keep { flex-direction: column; align-items: flex-start; }
}

/* The close at the end of each tab (2026-10-04 audit S-17): a plain list of
   text links -- next game, team, coach, Heisman board, plays, the other tabs.
   No boxes, no arrows; hover is opacity (DESIGN.md). */
.pc-close {
  margin-top: 32px;
  padding-top: 14px;
  border-top: 1px solid var(--line, #e4e4e1);
  font-family: var(--sans, 'Archivo', system-ui, sans-serif);
  font-size: 15px;
  line-height: 1.5;
  color: var(--ink-2, #5b5b5b);
}
.pc-close__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0; }
/* 44px tap target without changing how the link looks (phone-width review, 2026-10-04: 17px tall). */
.pc-close a { display: inline-block; min-height: 44px; box-sizing: border-box; padding: 10px 4px; margin: 0 -4px; line-height: 24px; color: var(--ink, #222222); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; }
.pc-close a:hover { opacity: .72; }
.pc-close + .pc-keep { margin-top: 16px; }
