/* ALOFT history pages - house sheet, derived from public/articles/the-bye-week-tax.html */:root{--ground:#EEF0EC;--surface:#F8F9F6;--sunk:#E3E7E1;--ink:#141D1A;--body:#33413C;--muted:#657570;--rule:#D2D9D1;--hair:#E1E6DF;--cover:#2C6A52;--coverwash:#DCE8E1;--hold:#A5432A;--holdwash:#F0DCD5;--shadow:0 1px 2px rgba(20,29,26,.06),0 8px 24px -16px rgba(20,29,26,.28)}@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--ground:#0D1412;--surface:#141D1A;--sunk:#101815;--ink:#E6EBE7;--body:#B8C4BE;--muted:#849690;--rule:#25322D;--hair:#1D2825;--cover:#63B694;--coverwash:#172C24;--hold:#E08262;--holdwash:#2E1C16;--shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px -16px rgba(0,0,0,.7)}}:root[data-theme="dark"]{--ground:#0D1412;--surface:#141D1A;--sunk:#101815;--ink:#E6EBE7;--body:#B8C4BE;--muted:#849690;--rule:#25322D;--hair:#1D2825;--cover:#63B694;--coverwash:#172C24;--hold:#E08262;--holdwash:#2E1C16;--shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px -16px rgba(0,0,0,.7)}}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;background:var(--ground);color-scheme:dark light}body{margin:0;background:var(--ground);color:var(--body);font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;font-size:16px;line-height:1.62;font-variant-numeric:tabular-nums}.wrap{max-width:60rem;margin:0 auto;padding:0 1.25rem 5rem}header{padding:3rem 0 0}.eyebrow{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.72rem;letter-spacing:.2em;text-transform:uppercase;color:var(--muted);display:flex;gap:.75rem;flex-wrap:wrap;align-items:center}.eyebrow a{color:var(--muted);text-decoration:none}.eyebrow a:hover{color:var(--cover)}.eyebrow span{color:var(--cover)}.sitenav{font-family:ui-monospace,"SF Mono","Cascadia Mono",Menlo,Consolas,monospace;font-size:.66rem;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);display:flex;gap:.6rem;flex-wrap:wrap;align-items:center;opacity:.75}.sitenav a{color:inherit;text-decoration:none;border-bottom:1px solid transparent}.sitenav a:hover{color:var(--ink);border-bottom-color:var(--rule)}.sitenav span{color:var(--rule)}.sitenav a[aria-current]{color:var(--cover);opacity:1;border-bottom-color:var(--cover)}.crumb{display:flex;flex-wrap:wrap;align-items:center;gap:.36rem;margin:.55rem 0 0;font-size:.84rem;color:var(--muted);line-height:1.5}.crumb a{color:var(--muted);text-decoration:none;border-bottom:1px solid transparent}.crumb a:hover{color:var(--ink);border-bottom-color:var(--rule)}.crumb .sep{color:var(--rule);font-style:normal}.crumb .cur{color:var(--ink);font-weight:600}h1{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:clamp(2rem,7vw,3.2rem);line-height:1.05;letter-spacing:-.035em;font-weight:650;color:var(--ink);margin:1.1rem 0 0;text-wrap:balance}.standfirst{font-size:1.1rem;line-height:1.6;margin:1.35rem 0 0;max-width:62ch;color:var(--body)}.meta{display:flex;flex-wrap:wrap;gap:1rem 2.25rem;margin-top:2.25rem;padding-top:1.1rem;border-top:1px solid var(--rule);font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.78rem;color:var(--muted)}.meta b{display:block;color:var(--ink);font-size:1.15rem;font-weight:650;letter-spacing:-.01em}section{margin-top:3.5rem}h2{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.8rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--ink);margin:0 0 .75rem}h2::before{content:"";display:block;width:100%;height:1px;background:var(--rule);margin-bottom:1.1rem}.sub{margin:0 0 1.5rem;color:var(--muted);font-size:.94rem;max-width:62ch}p{max-width:66ch}a{color:var(--cover);text-decoration:none}a:hover{text-decoration:underline}strong{color:var(--ink);font-weight:650}.scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-top:.25rem}.pv-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-top:.25rem}.pv-controls{display:flex;flex-wrap:wrap;gap:.7rem 1.4rem;align-items:flex-end;margin:.25rem 0 1.25rem}.pv-controls label{display:flex;flex-direction:column;gap:.3rem;font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}.pv-controls select,.pv-controls input{font:inherit;font-size:.95rem;letter-spacing:normal;text-transform:none;color:var(--ink);background:var(--surface);border:1px solid var(--rule);border-radius:3px;padding:.4rem .5rem;min-width:9rem}.pv-controls input[type="search"]{min-width:12rem}.pv-count{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.78rem;color:var(--muted);align-self:center}#pv-career h3{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:1.15rem;letter-spacing:-.01em;color:var(--ink);margin:0 0 .75rem}#pv-career h3 .small{color:var(--muted);font-size:.8rem;letter-spacing:.14em;text-transform:uppercase}table{border-collapse:collapse;width:100%;min-width:30rem;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-size:.84rem}caption{caption-side:top;text-align:left;color:var(--muted);font-size:.8rem;padding-bottom:.7rem;font-family:system-ui,sans-serif}th{text-align:right;font-weight:600;color:var(--muted);font-size:.68rem;letter-spacing:.07em;text-transform:uppercase;padding:0 .55rem .5rem;border-bottom:1px solid var(--rule);white-space:nowrap}th:first-child,td:first-child{text-align:left;padding-left:0}td{padding:.46rem .55rem;text-align:right;border-bottom:1px solid var(--hair);color:var(--body);white-space:nowrap}tbody tr{transition:background .12s ease}tbody tr:hover{background:var(--sunk)}table.bx tbody tr:hover,tr.dr:hover{background:transparent}.has-js th{cursor:pointer;outline-offset:2px;position:relative}.has-js th button{display:inline;font:inherit;color:inherit;letter-spacing:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;cursor:pointer;border:none;background:none;padding:0;margin:0;appearance:none;-webkit-appearance:none}.has-js th button::after{content:'↕';font-size:.6rem;color:var(--muted);position:absolute;right:.05rem;top:50%;transform:translateY(-50%)}.has-js th[aria-sort="ascending"] button::after{content:'↑';color:var(--cover)}.has-js th[aria-sort="descending"] button::after{content:'↓';color:var(--cover)}.metrics-catalog{display:grid;grid-template-columns:repeat(auto-fill,minmax(26rem,1fr));gap:1rem;margin-top:.75rem}.metrics-catalog .card{margin:0}.metrics-catalog .card h3{font-family:system-ui,sans-serif;font-size:.95rem;letter-spacing:0;text-transform:none;color:var(--ink);margin:0 0 .45rem;line-height:1.3}.metrics-catalog .metric-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem .9rem;font-size:.8rem;color:var(--muted);margin:0 0 .6rem;font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace}.metrics-catalog .prom-name{word-break:break-all;background:var(--sunk);padding:.1rem .35rem;border-radius:2px}.metrics-catalog .metric-meta .pill{flex-shrink:0}.metrics-catalog .metric-description{margin:0;color:var(--body);font-size:.9rem;line-height:1.55;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}.metrics-catalog .caption{color:var(--muted);font-size:.82rem;margin:.25rem 0 .75rem}.metrics-catalog .metric-description .small{font-size:inherit}@media(max-width:44rem){.metrics-catalog{grid-template-columns:1fr}}.records-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(34rem,1fr));gap:1.5rem;margin-top:1rem}.records-grid>*,.metrics-catalog>*,.cards>*,.scards>*{min-width:0}@media(max-width:44rem){table:not(.lineup):not(.bx){display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;width:max-content;min-width:100%;max-width:100%}}.meta-item,.meta-item code{overflow-wrap:anywhere;min-width:0}footer,footer .small{overflow-wrap:anywhere}@media(max-width:30rem){.pv-controls{flex-direction:column;align-items:stretch}.pv-controls label{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.5rem;align-items:center;min-width:0}.pv-controls select,.pv-controls input{min-width:0;width:100%;max-width:100%}}@media(max-width:44rem){.records-grid,.metrics-catalog{grid-template-columns:1fr}}.record-block{background:var(--surface);padding:1.1rem 1.25rem;border-radius:3px}.record-block h3{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.74rem;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:0 0 .75rem}@media(max-width:44rem){.records-grid{grid-template-columns:1fr}}tbody tr:last-child td{border-bottom:none}td.k{color:var(--ink);font-weight:650}.pill{display:inline-block;padding:.05rem .5rem;border-radius:2px;font-size:.72rem;font-weight:650;letter-spacing:.03em}.pill.c{background:var(--coverwash);color:var(--cover)}.pill.h{background:var(--holdwash);color:var(--hold)}.tab-nav{display:flex;gap:1rem;flex-wrap:wrap;margin:1rem 0 .5rem;font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.82rem}.tab-nav a{color:var(--muted)}.tab-nav a:hover{color:var(--cover)}.tab-nav a.active{color:var(--ink);font-weight:650;text-decoration:underline}.tab-content{margin-top:1.2rem}.has-js .tab-content{display:none}.has-js .tab-content.active{display:block}.cards{display:grid;gap:1px;background:var(--rule);border:1px solid var(--rule);border-radius:3px;overflow:hidden;grid-template-columns:1fr}@media(min-width:44rem){.cards{grid-template-columns:1fr 1fr}}.cards.nested{background:transparent;border:none;border-radius:0;grid-template-columns:1fr;margin-top:.75rem}.cards.nested .card{padding:.75rem .9rem;background:var(--sunk)}.card{background:var(--surface);padding:1.1rem 1.25rem}.card h3{margin:0 0 .35rem;font-size:.74rem;letter-spacing:.14em;text-transform:uppercase;font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;color:var(--muted)}.card h3.c{color:var(--cover)}.card h3.h{color:var(--hold)}.card p{margin:0;font-size:.94rem;max-width:none}.caveat{border-left:2px solid var(--hold);background:var(--surface);padding:1.15rem 1.4rem;border-radius:0 3px 3px 0;margin:1.2rem 0 0}.caveat p{margin:0;max-width:64ch}.caveat p+p{margin-top:.8rem}.muted{color:var(--muted)}.small{font-size:.82rem}footer{margin-top:4rem;padding-top:1.2rem;border-top:1px solid var(--rule);font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.74rem;color:var(--muted);line-height:1.75}figure.chart{margin:1.5rem 0;background:var(--surface);padding:1rem;border:1px solid var(--rule);border-radius:3px}figure.chart figcaption{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:.8rem;color:var(--muted);margin-bottom:.75rem}svg.charts{max-width:100%;height:auto;display:block}svg.charts text{font-family:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;font-size:10px;fill:var(--muted)}svg.charts .axis{stroke:var(--rule)}svg.charts .grid{stroke:var(--hair);stroke-dasharray:2 2}svg.charts .line{fill:none;stroke-width:2;stroke-linecap:round}svg.charts .line.cbs-std{stroke:#6b9080}svg.charts .line.cbs-dec{stroke:#588157}svg.charts .line.slp-std{stroke:#8ecae6}svg.charts .line.slp-half{stroke:#219ebc}svg.charts .bar{rx:2}svg.charts .bar.cbs-std{fill:#6b9080}svg.charts .bar.cbs-dec{fill:#588157}svg.charts .bar.slp-std{fill:#8ecae6}svg.charts .bar.slp-half{fill:#219ebc}svg.charts .dot{stroke-width:2;fill:var(--ink)}svg.charts .dot.cbs-std{fill:#6b9080}svg.charts .dot.cbs-dec{fill:#588157}svg.charts .dot.slp-std{fill:#8ecae6}svg.charts .dot.slp-half{fill:#219ebc}svg.charts .legend-dot{stroke-width:8}ul.refs{list-style:none;padding:0;margin:0;font-size:.85rem;color:var(--muted)}ul.refs li{margin:.25rem 0}.g{display:block;padding:.1rem 0}.g .w{font-weight:650;color:var(--ink)}.g .l{display:inline}.eyebrow a,.sitenav a,.crumb a,.crumb .cur,.tab-nav a,ul.refs a,a.pill,td a{min-height:44px;display:inline-flex;align-items:center}@media(max-width:44rem){.eyebrow,.small,th,td,caption,h2,.pill,.card h3,footer{font-size:.82rem}td,th{white-space:normal;padding:.35rem .45rem}table{min-width:0}svg.charts text{font-size:18px}table.coach-seasons td:nth-child(2),table.coach-seasons td:nth-child(7),table.coach-seasons td:nth-child(8),table.coach-seasons td:nth-child(9),table.coach-seasons td:nth-child(12),table.coach-seasons th:nth-child(2),table.coach-seasons th:nth-child(7),table.coach-seasons th:nth-child(8),table.coach-seasons th:nth-child(9),table.coach-seasons th:nth-child(12),table.season-standings-cbs td:nth-child(1),table.season-standings-cbs td:nth-child(4),table.season-standings-cbs td:nth-child(5),table.season-standings-cbs th:nth-child(1),table.season-standings-cbs th:nth-child(4),table.season-standings-cbs th:nth-child(5),table.season-standings-slp td:nth-child(1),table.season-standings-slp td:nth-child(7),table.season-standings-slp td:nth-child(8),table.season-standings-slp th:nth-child(1),table.season-standings-slp th:nth-child(7),table.season-standings-slp th:nth-child(8),table.h2h td:nth-child(5),table.h2h td:nth-child(6),table.h2h th:nth-child(5),table.h2h th:nth-child(6){display:none}}
/* ---- THE MATCHUP PAGES ARE DARK, DELIBERATELY AND ONLY THEM ---------------
   Owner, twice: "still not there", "miles away from the polished look of the
   sleeper game day scoreboard." Three structural things were missing and the
   first is this one - Sleeper's matchup view is a near-black surface, and most
   of what reads as "polish" is the contrast that buys: white names against deep
   navy, colour that actually glows, scores that carry.

   SCOPED TO THESE PAGES, not the site. Matchup pages already load their own
   stylesheet (matchups.css), so redefining the tokens here dresses the whole
   page - shell, nav and all - without touching the ledger, the coach pages or
   anything else. It is one section choosing a different skin on purpose, which
   is what a game-day view is.

   The other two were spacing and type scale: Sleeper gives a player ~60px of
   air and NO divider, so the lineup reads as a feed rather than a table. Both
   are below. */
/* SPECIFICITY, AND THIS PALETTE DID NOT APPLY AT ALL UNTIL IT WAS FIXED.
   shell() stamps data-theme="dark" on every page, so the house sheet's
   :root[data-theme="dark"] block (0,2,0) beat a plain :root (0,1,0) and won
   every token. The page still LOOKED dark - the house dark theme is dark - so
   three rounds of "it is still not right" were spent tuning a palette that was
   never on the page. A screenshot cannot catch this; only reading the computed
   value can. Both stamps are matched explicitly, and the bare :root keeps the
   un-stamped case. */
:root,
:root[data-theme="dark"],
:root[data-theme="light"]{
  --ground:#0a1424; --surface:#111d31; --sunk:#0d1727; --ink:#f2f6fb;
  --muted:#8a9ab0; --rule:#1e2c42; --hair:#182437;
  /* --shadow IS A COLOUR HERE AND A FULL SHADOW IN THE HOUSE SHEET. Inheriting
     the house value made the board's box-shadow declaration invalid, so it
     rendered with no shadow at all on every page. Declared as the colour this
     sheet uses it as. */
  --shadow:rgba(0,0,0,.45);
  --cover:#2ee6a8; --coverwash:#132a3f; --hold:#ffb347; --holdwash:#33281a;
}
@media (prefers-color-scheme: light){
  :root,:root[data-theme="dark"],:root[data-theme="light"]{
    --ground:#0a1424; --surface:#111d31; --sunk:#0d1727; --ink:#f2f6fb;
    --muted:#8a9ab0; --rule:#1e2c42; --hair:#182437; --shadow:rgba(0,0,0,.45);
    --cover:#2ee6a8; --coverwash:#132a3f; --hold:#ffb347; --holdwash:#33281a;
  }
}
body{background:var(--ground);color:var(--ink)}

/* ---- SLEEPER'S MATCHUP LANGUAGE ------------------------------------------
   Copied deliberately, because it is a solved problem: a lineup is read by
   SHAPE before it is read by word. Position colour, a centre slot badge, the
   big number with a smaller reference beneath it, and a one-line stat summary
   under each name are what make their view scannable, and all four survive
   being applied to a 2003 game. What is NOT copied is anything that would have
   to be invented - a projection, a win probability, a live drive chart. Those
   slots carry true things instead: the season average where a projection would
   be, a margin bar where win probability would be. A previous version of this
   comment cited docs/aloft/history.md for that list and the file said nothing
   about it - a reference that sends a reader somewhere empty is worse than no
   reference, so the substitutions are named here where they are made. */
:root{
  --qb:#e0577f; --rb:#25c08b; --wr:#4a9ef0; --te:#e8913c; --k:#a274e8; --df:#e0703c;
  --slotbg:#e8ecf3; --slotink:#5a6473;
}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){--slotbg:#1d2431;--slotink:#93a1b5}}
:root[data-theme="dark"]{--slotbg:#1d2431;--slotink:#93a1b5}

/* The scoreboard: two teams facing, the winner's score lifted. */
/* SLEEPER'S SCOREBOARD IS A BAR, NOT A CARD. Avatars sit at the OUTER edges
   with the scores pulled toward the middle, which is why theirs reads as a
   head-to-head and a centred card reads as a summary box. */
.board{display:grid;grid-template-columns:auto 1fr auto 1fr auto;align-items:center;gap:.85rem;
  padding:1.1rem 1rem .9rem;border:1px solid var(--rule);border-radius:16px;
  background:var(--surface);box-shadow:0 1px 3px var(--shadow);margin:1rem 0 .2rem}
.board .bt{display:flex;align-items:center;gap:.65rem;min-width:0}
.board .bt.r{flex-direction:row;justify-content:flex-end;text-align:right}
.board .bt .bi{min-width:0}
.board .bt .n{display:block;font-weight:700;font-size:1.05rem;line-height:1.25;overflow-wrap:break-word}
.board .bt .c{display:block;color:var(--muted);font-size:.82rem;margin-top:.12rem}
.board .bt.win .n{color:var(--cover)}
/* the team disc - an avatar slot that needs no avatar */
.disc{flex:0 0 auto;display:grid;place-items:center;width:3.1rem;height:3.1rem;border-radius:50%;
  font-size:.82rem;font-weight:800;letter-spacing:.02em;
  color:hsl(var(--h) 65% 30%);background:hsl(var(--h) 70% 90%);box-shadow:inset 0 0 0 1px hsl(var(--h) 45% 78%)}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .disc{color:hsl(var(--h) 70% 82%);background:hsl(var(--h) 40% 22%);box-shadow:inset 0 0 0 1px hsl(var(--h) 35% 34%)}}
:root[data-theme="dark"] .disc{color:hsl(var(--h) 70% 82%);background:hsl(var(--h) 40% 22%);box-shadow:inset 0 0 0 1px hsl(var(--h) 35% 34%)}
.board .bs{display:flex;align-items:baseline;justify-content:center;gap:.6rem;
  font-variant-numeric:tabular-nums;font-size:2.4rem;font-weight:800;letter-spacing:-.025em}
.board .bs .dash{color:var(--muted);font-size:1.05rem;font-weight:400}
.board .bs .sc{color:var(--muted)}
.board .bs .sc.win{color:var(--ink)}
/* section headings, the way Sleeper labels Starters / Bench */
.lineup caption{text-transform:uppercase;letter-spacing:.06em;font-size:.78rem;color:var(--muted);font-weight:700}
tr.sr:hover>td{background:var(--surface)}
:root{--slotbg:#17233a;--slotink:#7e8ea6}
/* The margin bar stands where Sleeper puts win probability. Same shape, and it
   states a fact about the game rather than a forecast nobody made. */
.mbar{display:flex;height:5px;border-radius:999px;overflow:hidden;background:var(--hair);margin:.15rem 0 .1rem}
.mbar i{display:block;height:100%}
.mbar i.won{background:var(--cover)} .mbar i.lost{background:#e86a6a} .mbar i.tie{background:var(--muted)}
.mbar-l{display:flex;justify-content:space-between;color:var(--muted);font-size:.75rem;margin-bottom:.9rem}

/* ---- the lineup ---------------------------------------------------------- */
/* THE HOUSE SHEET MAKES EVERY TABLE MONOSPACE, and the lineup IS a table - so
   every player name rendered in a terminal face while the design was being
   judged on "polish". That single inherited rule was doing more damage than the
   spacing and the palette combined. A game-day view is a sans-serif surface. */
table.lineup,table.bx,table.lineup *,table.bx *{font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
/* THE BOX SCORE IS A NESTED TABLE AND INHERITED A 30rem FLOOR. The shared sheet
   gives every table min-width:30rem so wide data tables scroll rather than
   crush; two box scores side by side then demanded 960px before the slot column
   was counted, and a game page with its lineups open scrolled sideways from
   about 700px to 1400px - the whole tablet and laptop band. 1,311px of content
   in a 1,280px window, on the page that is 2,376 of the site's 2,900. */
table.bx{min-width:0}
table.bx th[scope="row"]{overflow-wrap:break-word}
/* AND THEY MAY WRAP. The shared sheet keeps data-table cells on one line and
   only relaxes that below 44rem, so between about 700px and 1400px a player's
   name and stat line could not break: the lineup table computed a 1,151px
   min-content inside a 728px column and the page scrolled sideways. These two
   tables are prose in cells, not a grid of figures - they wrap at every width. */
table.lineup td,table.lineup th,table.bx td,table.bx th{white-space:normal}
h1,h2{font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;letter-spacing:-.02em}
/* A GAME-DAY HEADER IS COMPACT. The house h1 is a 3.2rem editorial headline,
   right for an article and wrong above a scoreboard - it pushed the actual
   matchup below the fold. The breadcrumb stack gets the same treatment: useful,
   but it should not be the first two inches of the page. */
h1{font-weight:800;font-size:clamp(1.35rem,3.6vw,1.9rem);margin:.5rem 0 0;line-height:1.15}
.eyebrow{font-size:.66rem;letter-spacing:.14em;gap:.5rem;opacity:.72}
.sitenav{font-size:.63rem;gap:.55rem}
.crumb{font-size:.88rem;margin-top:.5rem}
.mnav{display:flex;gap:.6rem;align-items:center;flex-wrap:wrap;margin:.85rem 0 0}
.mnav .wk{font-size:.86rem}
form.picker{font-size:.86rem}
form.picker select{padding:.3rem .5rem;border:1px solid var(--rule);border-radius:8px;
  background:var(--surface);color:var(--ink);font:inherit}
form.picker button{padding:.3rem .7rem;border:1px solid var(--rule);border-radius:8px;
  background:var(--sunk);color:var(--ink);font:inherit;cursor:pointer}
.mmeta{color:var(--muted);font-size:.85rem;margin:.9rem 0 .4rem}
table.lineup{width:100%;border-collapse:collapse;margin:.2rem 0 .4rem;min-width:0}
/* NO DIVIDERS, AND TWICE THE AIR. Sleeper separates players with whitespace
   alone - about 60px a row - which is why their lineup reads as a feed and a
   bordered one reads as a spreadsheet. This was 0.6rem of padding under a hair
   rule; it is the single change that most moves the page toward the app. */
table.lineup caption{text-align:left;font-weight:800;font-size:1.5rem;letter-spacing:-.01em;
  color:var(--ink);text-transform:none;padding:1.4rem 0 .6rem}
/* BOTH borders, not just the top one. The house sheet puts a border-BOTTOM on
   every td, so zeroing border-top left the rules exactly where they were and
   the lineup still read as a grid. Whitespace is the separator here. */
table.lineup td,table.lineup th{border-top:0;border-bottom:0}
tr.sr>td{padding:1.05rem .35rem .3rem;vertical-align:top}
tr.sr:first-child>td{padding-top:.4rem}
tr.dr>td{border:0}
td.p{width:38%}
td.p.home{text-align:right}
td.p.empty{color:var(--muted)}
td.v{width:6.5rem;text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
td.v.home{text-align:left}
td.slot{width:4rem;text-align:center;vertical-align:middle;padding-top:1.05rem}

/* the name block - a button, because it opens the box score */
button.pn{display:block;width:100%;text-align:inherit;background:none;border:0;padding:0;
  font:inherit;color:inherit;cursor:pointer}
button.pn:hover .nm{text-decoration:underline}
/* THE SHORT NAME IS HIDDEN UNTIL IT IS WANTED. Both forms are in the markup and
   the compact block picks the short one - but a media query is not a default, so
   with only that block every name rendered TWICE above 896px: "Lamar JacksonL.
   Jackson", 33,903 spans over 2,275 pages, and the accessible name carried the
   doubling too. The rule that hides it has to exist outside the query. */
.pn .nm .ab{display:none}
.pn .nm .fu{display:inline}
/* the owning fantasy team is only needed once the two columns stack; see the mobile block */
.pn .own{display:none}
/* the name carries the row, the way it does in the app */
.pn .nm{display:block;font-weight:700;font-size:1.32rem;line-height:1.2;letter-spacing:-.01em;overflow-wrap:anywhere}
.pn .pm{display:flex;gap:.45rem;align-items:center;margin:.25rem 0 0;font-size:.85rem}
td.p.home .pn .pm{justify-content:flex-end}
.pn .pm .pos{font-style:normal;font-weight:700;letter-spacing:.04em}
.pn .pm .tm{font-style:normal;color:var(--muted)}
.pn .gm{display:block;font-size:.85rem;margin-top:.32rem;color:var(--muted)}
.pn .gm.w{color:var(--cover)} .pn .gm.l{color:#e86a6a} .pn .gm.t{color:var(--muted)}
.pn .ln{display:block;color:var(--muted);font-size:.86rem;margin-top:.22rem;line-height:1.45;letter-spacing:.005em}
.pos.qb{color:var(--qb)} .pos.rb{color:var(--rb)} .pos.wr{color:var(--wr)}
.pos.te{color:var(--te)} .pos.k{color:var(--k)} .pos.df{color:var(--df)} .pos.x{color:var(--muted)}

/* points, with the season average beneath where Sleeper shows a projection */
.pp{display:block;font-size:1.55rem;font-weight:700;line-height:1.1;letter-spacing:-.02em}
.av{display:block;color:var(--muted);font-size:.85rem;margin-top:.15rem;cursor:help}

/* the centre slot badge */
.sb{display:inline-flex;gap:1px;align-items:center;justify-content:center;min-width:2.9rem;height:2.9rem;
  border-radius:12px;background:var(--slotbg);font-size:.82rem;font-weight:800;letter-spacing:.02em;line-height:1}
.sb i{font-style:normal;color:var(--slotink)}
.sb i.qb{color:var(--qb)} .sb i.rb{color:var(--rb)} .sb i.wr{color:var(--wr)}
.sb i.te{color:var(--te)} .sb i.k{color:var(--k)} .sb i.df{color:var(--df)}

/* the uncertainty mark - a "?" on any slot that was chosen rather than recorded */
.inf{display:inline-block;margin-left:.3rem;padding:0 .32rem;border-radius:999px;
  background:var(--holdwash);color:var(--hold);font-size:.75rem;font-weight:800;cursor:help;vertical-align:.05em}

/* the box score panel */
tr.dr>td{padding:0 .35rem .7rem}
.ddw{display:grid;grid-template-columns:1fr 1fr;gap:1rem;align-items:start}
.ddw>.dd{min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.has-js tr.dr{display:none}
.has-js tr.dr.open{display:table-row}
dl.sl{display:grid;grid-template-columns:repeat(auto-fill,minmax(8.5rem,1fr));gap:.25rem .8rem;margin:.2rem 0 0}
dl.sl div{display:flex;justify-content:space-between;gap:.5rem;border-bottom:1px dotted var(--hair);padding:.12rem 0}
dl.sl dt{color:var(--muted);font-size:.8rem}
dl.sl dd{margin:0;font-variant-numeric:tabular-nums;font-size:.8rem;font-weight:600}
p.none{color:var(--muted);font-size:.85rem;margin:.2rem 0 0}

/* THE BENCH IS THE LINEUP TABLE, so it needs no layout of its own. It used to
   be two side-by-side <ul> lists in a .benches grid with their own row
   language, their own collapse rule and their own type scale - about 20 rules
   that all said "nearly, but not quite, the starters". Owner, 2026-09-24: keep
   the aesthetic the same and label it Bench, the way Sleeper does. It now
   emits class="lineup bench" and inherits every one of those rules, so the
   only thing left to say is how it is set apart from the starters above it. */
.lineup.bench{margin-top:1.25rem}
.lineup.bench caption{padding-top:.35rem}
/* The BN badge is the one slot that names no position, so it is quieter than
   the coloured position letters it sits under. */
.lineup.bench .sb i.x{color:var(--muted)}

/* ---- the scoring legend --------------------------------------------------
   Collapsed by default: it is reference, not the story of the game. <details>
   needs no scripting, so it opens on the no-JS path too. */
details.legend{border:1px solid var(--rule);border-radius:12px;background:var(--sunk);margin:1rem 0;overflow:hidden}
details.legend>summary{cursor:pointer;padding:.7rem .9rem;font-weight:650;font-size:.92rem;list-style:none}
details.legend>summary::-webkit-details-marker{display:none}
details.legend>summary::before{content:"▸";display:inline-block;margin-right:.5rem;color:var(--muted);transition:transform .12s}
details.legend[open]>summary::before{transform:rotate(90deg)}
details.legend>summary:hover{background:var(--coverwash)}
.legend-b{padding:.2rem .9rem 1rem;border-top:1px solid var(--hair)}
.legend-b .sub{color:var(--muted);font-size:.8rem;margin:.6rem 0 .5rem}
.legend-b h4{font-size:.78rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:.9rem 0 .35rem}
ul.rules,.lad ul,ul.beh{list-style:none;margin:0;padding:0}
ul.rules{display:grid;grid-template-columns:repeat(auto-fill,minmax(13rem,1fr));gap:.1rem .9rem}
ul.rules>li,.lad li{display:flex;justify-content:space-between;gap:.6rem;border-bottom:1px dotted var(--hair);padding:.18rem 0;font-size:.82rem}
ul.rules>li span,.lad li span{color:var(--muted)}
ul.rules>li b,.lad li b{font-variant-numeric:tabular-nums;font-weight:650}
.lad{margin-top:.8rem}
.lad h4{margin:.2rem 0 .3rem}
.lad ul{display:grid;grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));gap:.1rem .9rem}
ul.beh>li{font-size:.82rem;line-height:1.5;margin:.25rem 0;color:var(--muted)}
ul.beh>li b{color:var(--ink)}
.legend-b .why{font-size:.78rem;line-height:1.6;color:var(--muted);margin:.2rem 0 0}

/* ---- THE SCOREBOARD ROW ---------------------------------------------------
   Used on the season page, the week page and the "also this week" list, and it
   had NO styling at all - five inline spans with nothing between them, so it
   rendered as "Bickering War Wrens114at82Gamblin' Garz". One missing rule
   degraded every browsing surface at once, which is why it is a grid now:
   the two team names pull toward the centre and the scores meet in the middle,
   so a column of them scans as a scoreboard rather than as prose. */
/* A LIST OF GAMES IS A SCOREBOARD, NOT A CENTRED PARAGRAPH. The rows were
   1fr/auto/1.6rem/auto/1fr with both names pulled toward the middle, so on a
   1120px page the content sat in the central 440px and a quarter of the row was
   dead margin on each side - the first thing that reads as unfinished. The names
   now anchor to the OUTER edges and the scores meet at a centre axis, which is
   how a scoreboard is read and what fills the row. Rows get a hairline and a
   hover so they look like the links they have always been. */
ul.ms{list-style:none;margin:.4rem 0 0;padding:0;display:grid;gap:0}
li.mrow{margin:0;border-bottom:1px solid var(--hair)}
li.mrow:last-child{border-bottom:0}
/* SEVEN CHILDREN, SO SEVEN COLUMNS. A row emits .t .s .vs .s .t and then a
   star for a title game and a dot for an unsolved lineup - a championship
   that ALSO did not reconstruct has both, and the sixth column held one of
   them, wrapping the other onto a second grid row under the away team's
   name. Ten rows. An empty auto column costs nothing, so the flag sits in
   the same place whether or not the star is there. */
.ml{display:grid;grid-template-columns:1fr 3.4rem 1.6rem 3.4rem 1fr auto auto;align-items:center;gap:.7rem;
  padding:.72rem .8rem;border-radius:10px;text-decoration:none;color:inherit;
  transition:background .12s ease}
a.ml:hover{background:var(--surface)}
li.mrow.here .ml{background:var(--surface);box-shadow:inset 0 0 0 1px var(--rule)}
.ml .t{text-align:left;color:var(--muted);overflow-wrap:break-word;font-size:.95rem}
.ml .t~.t{text-align:right}
.ml .t.win{color:var(--ink);font-weight:650}
.ml .s{font-variant-numeric:tabular-nums;font-weight:650;color:var(--muted);text-align:right}
.ml .s~.s{text-align:left}
.ml .s.win{color:var(--cover)}
.ml .vs{color:var(--muted);font-size:.72rem;text-align:center;letter-spacing:.06em}
.ml .tt{color:var(--hold)}
/* The reconstruction's confidence, per game. Amber for one lineup missing, red
   for both - the same two states the matchup page explains in words. */
/* The side that did not solve, speaking for itself instead of rendering as a
   column of nothing. Vertically centred against the other team's eight. */
.nolineup{margin:.2rem 0 .6rem;padding:.85rem 1rem;border:1px solid var(--rule);border-left:3px solid var(--hold);
  border-radius:10px;background:var(--sunk);color:var(--muted);font-size:.9rem;line-height:1.55}
.nolineup>b{display:block;color:var(--hold);font-size:.78rem;text-transform:uppercase;letter-spacing:.09em;margin-bottom:.3rem}
.nolineup b.tm{color:var(--ink);text-transform:none;letter-spacing:0;font-size:inherit;display:inline}
/* One lineup, so the single column takes the middle rather than hugging an
   edge - which needs the auto margins, not just the cap. With max-width
   alone the table sat flush left with 244px dead to its right. */
table.lineup.solo{max-width:46rem;margin-inline:auto}
table.lineup.solo-home .v.home,table.lineup.solo-home .v.home *,
table.lineup.solo-home .p.home,table.lineup.solo-home .p.home *{text-align:left;justify-content:flex-start}
.lf{font-size:.6rem;line-height:1;width:1.1rem;text-align:center}
.lf.one{color:var(--hold)}
.lf.nil{color:#ff6b6b}
.gapchk{position:absolute;opacity:0;pointer-events:none}
.gsec{margin-top:.4rem}
.gsec .wkblock:first-of-type{margin-top:.5rem}
.gaplab{display:inline-flex;align-items:center;gap:.45rem;margin:.7rem 0 0;padding:.4rem .7rem;
  border:1px solid var(--rule);border-radius:999px;color:var(--muted);font-size:.8rem;cursor:pointer;
  min-height:44px;box-sizing:border-box}
.gaplab:hover{color:var(--ink);border-color:var(--muted)}
.gapchk:focus-visible+.gaplab{outline:2px solid var(--cover);outline-offset:2px}
.gapchk:checked+.gaplab{background:var(--holdwash);border-color:var(--hold);color:var(--ink)}
.gapchk:checked~.wkblock .mrow:not(.gap1):not(.gap2){display:none}
.gapchk:checked~.wkblock:not(:has(.gap1,.gap2)){display:none}
/* AT PHONE WIDTH A SCOREBOARD STACKS. Five columns across 390px gave each team
   name about 90px, and overflow-wrap:anywhere then broke them mid-word -
   "Bickerin/g Wrens", "Part of the Establis/hment". One team per line, score
   right, the centre "at" dropped because the stack already says which is which. */
@media(max-width:34rem){
  .ml{grid-template-columns:1fr auto 1.1rem;grid-template-areas:"an as f" "hn hs f";
    gap:.2rem .55rem;padding:.6rem .5rem}
  .ml .t{grid-area:an}
  .ml .t~.t{grid-area:hn;text-align:left}
  .ml .s{grid-area:as;text-align:right}
  .ml .s~.s{grid-area:hs;text-align:right}
  .ml .vs{display:none}
  .ml .tt{grid-area:f;align-self:start}
  .ml .lf{grid-area:f;align-self:end}

}

/* THE LINEUP NEEDS MORE ROOM THAN THE SCORE LIST DOES, so it stacks earlier.
   Holding both at 34rem left a 142px band - 545px to 686px, between a phone
   turned sideways and a small tablet - where the five-column table was back and
   still did not fit: 83 of 100 sampled game pages scrolled sideways at 600px,
   the widest 740px. It was invisible because the width sweep sampled 430 then
   768 and stepped straight over it. Sample either side of every breakpoint the
   CSS declares; this one now lives at 44rem, where the shared sheet already
   relaxes its table rules. */
@media(max-width:56rem){
  /* TWO COLUMNS, ON A PHONE AND A TABLET, BECAUSE THAT IS WHAT A MATCHUP IS.
     This first stacked the two teams into one card per slot - away above home -
     which fit beautifully and answered the wrong question: the page exists to
     put one lineup against the other, and a reader comparing two teams cannot
     do it by scrolling. Owner, looking at it beside the real thing: "Don't
     combine opponents players into one view."
     Sleeper keeps both columns at 393px and pays for it by shortening the name,
     so the name shortens here too and everything else just gets tighter. Each
     side ends up with about 110px, which is enough for "B. Purdy" and a stat
     line that wraps under it.
     It runs to 56rem rather than 44rem because the desktop name is 1.32rem and
     needs real width: at 705px, one pixel past the old boundary, 24 of 56 names
     wrapped. The compact treatment is simply the right one until there is room. */
  table.lineup td.p{width:auto;vertical-align:top}
  /* wide enough for "avg 14.83" on ONE line: at 3.4rem it broke after the word
     and every row grew a third line of nothing. */
  table.lineup td.v{width:3.15rem;vertical-align:top;padding-top:.1rem}
  table.lineup td.slot{width:2.2rem;padding-top:.7rem}
  table.lineup .av{white-space:nowrap}
  /* .82rem is what fits the longest real names - "R. Mendenhall",
     "M. Muhammad", "A. Seferian-Jenkins" - in the ~106px each side gets. The
     longest real abbreviations are 19 characters, not the 11-13 this was first
     calibrated on, so some still wrap at the narrowest widths: measured over 96
     pages chosen by longest name, 0 wrap between 545 and 896px, and it climbs
     below that. The "?" on an inferred starter can still drop to its own line
     at 320px - nowrap on the marker does not bind it to the word before it. */
  table.lineup .pn .nm{font-size:.82rem;line-height:1.25;overflow-wrap:break-word}
  table.lineup .pn .nm .inf{white-space:nowrap}
  table.lineup .pn .nm .fu{display:none}
  table.lineup .pn .nm .ab{display:inline}
  table.lineup .pn .pm{font-size:.72rem;gap:.3rem;margin-top:.15rem}
  table.lineup .pn .gm{font-size:.72rem;margin-top:.2rem;line-height:1.35}
  table.lineup .pn .ln{font-size:.72rem;margin-top:.15rem;line-height:1.35}
  table.lineup .pp{font-size:1.02rem}
  table.lineup .av{font-size:.66rem;margin-top:.08rem}
  table.lineup .sb{min-width:2.2rem;height:2.2rem;font-size:.7rem;border-radius:9px}
  table.lineup tr.sr>td{padding-bottom:.5rem;padding-left:.15rem;padding-right:.15rem}
  /* the benches follow the lineup into one column. They had their own 640px
     breakpoint, so between 641 and 896 the lineup was compact while the benches
     were still side by side, and their box scores pushed the page to 672px.
     THAT WHOLE CLASS OF FAULT IS GONE: the bench is the lineup table now, so it
     narrows at exactly the same breakpoints by construction rather than by a
     second set of rules that has to be kept in step with the first. */
  /* THE TABLE IS FIXED-LAYOUT HERE, WHICH IS WHAT MAKES THE REST WORK. A
     percentage max-width cannot resolve inside an AUTO-width table cell, so
     capping the box score at 100% did nothing and the lineup grew to 1,161px;
     making the detail rows blocks instead put block rows inside a
     table-row-group, which is ill-defined and only got it to 521px. With
     table-layout:fixed the cells have definite widths, 100% means something,
     and the four-column box score scrolls inside its own cell while the
     starters above it stay two real columns. */
  table.lineup{table-layout:fixed;width:100%}
  .ddw{grid-template-columns:1fr;gap:.6rem}
  /* the bench panels are plain divs, not grid items, and need the same escape */
  .bench .d,.roster .d{overflow-x:auto;-webkit-overflow-scrolling:touch;min-width:0}
  .bench li,.roster li{min-width:0}
}

/* THE SMALLEST PHONES STILL GET BOTH TEAMS. At 320px the side-by-side columns
   fall to about 95px each and 22 of 56 names wrap; one more step down keeps the
   two lineups facing each other rather than falling back to one team at a time,
   which is the thing this layout exists to avoid. */
@media(max-width:22rem){
  table.lineup .pn .nm{font-size:.76rem}
  table.lineup td.v{width:2.7rem}
  table.lineup td.slot{width:1.8rem}
  table.lineup .pn .pm,table.lineup .pn .gm,table.lineup .pn .ln{font-size:.64rem}
  table.lineup .pp{font-size:.9rem}
  table.lineup .av{font-size:.58rem}
  table.lineup .sb{min-width:1.8rem;height:1.8rem;font-size:.6rem}
}

/* ---- THE INDEX: 25 SEASONS AS SOMETHING TO NAVIGATE -----------------------
   It was a flat bullet list whose spans had no styling, so each row rendered as
   "200258 games, 16 weeksCBS" - the year, the count and the platform run
   together into a number. Cards in a grid, grouped by ERA, because the eras are
   where the scoring rules changed and that is where a reader hunting a
   discrepancy should be looking. Each card carries the champion and, where the
   lineups are reconstructed rather than recorded, how much of the season
   actually solved - the number someone chasing gaps wants and the site had
   nowhere. */
.eblock{margin:1.8rem 0 0}
.eblock h2{font-size:.82rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:700;margin:0 0 .6rem}
.eblock h2 .esub{color:var(--rule);margin-left:.4rem;letter-spacing:.04em}
.scards{display:grid;grid-template-columns:repeat(auto-fill,minmax(11rem,1fr));gap:.6rem}
a.scard{display:grid;gap:.18rem;padding:.8rem .85rem;border-radius:12px;background:var(--surface);
  box-shadow:inset 0 0 0 1px var(--rule);text-decoration:none;color:inherit;align-content:start}
a.scard:hover{box-shadow:inset 0 0 0 1px var(--cover)}
.scard .sy{font-size:1.45rem;font-weight:800;letter-spacing:-.02em;line-height:1.1}
.scard .sn{font-size:.78rem;color:var(--muted)}
.scard .sc{font-size:.78rem;color:var(--hold);overflow-wrap:anywhere;margin-top:.15rem}
.scard .cov{display:block;height:4px;border-radius:999px;background:var(--hair);margin-top:.45rem;overflow:hidden}
.scard .cov i{display:block;height:100%;background:var(--cover)}
.scard .covl{font-size:.7rem;color:var(--muted);margin-top:.12rem}

/* ---- WEEK CHIPS -----------------------------------------------------------
   Seventeen weeks is too many to walk through with prev/next, and a season page
   that lists every game is thousands of pixels tall. A strip of chips turns
   "week 12" from a scroll into one click, and marks the week you are on. */
.wkchips{display:flex;flex-wrap:wrap;gap:.3rem;margin:.8rem 0 .2rem}
.wkchips a,.wkchips span{display:inline-grid;place-items:center;min-width:2.1rem;height:2.1rem;
  border-radius:8px;font-size:.82rem;font-weight:650;text-decoration:none;
  background:var(--sunk);color:var(--muted);box-shadow:inset 0 0 0 1px var(--rule)}
.wkchips a:hover{background:var(--surface);color:var(--ink)}
.wkchips .on{background:var(--cover);color:#06281d;box-shadow:none}
.wkchips .ttl{color:var(--hold)}
.wkchips-l{color:var(--muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;margin:.9rem 0 0}

/* provenance sits under the lineup, not inside it */
p.prov{color:var(--muted);font-size:.85rem;line-height:1.5;margin:.35rem 0}

@media (max-width:640px){
  /* FIVE COLUMNS DO NOT FIT, AND REFLOWING THEM INTO THREE MADE A PUZZLE: the
     away disc, both names and the score landed in whatever order the grid could
     manage, and "Octomore 6.3" came apart as Octo/more/6.3. The score is one
     element and cannot be split between the teams, so it takes the top line -
     which is the number you came for - and the two teams read down the left
     under it, each beside its own disc. */
  .board{grid-template-columns:auto 1fr;grid-template-areas:"sc sc" "da na" "dh nh";
    gap:.5rem .7rem;padding:.85rem .8rem;align-items:center}
  .board>.disc:first-child{grid-area:da}
  .board>.bt:not(.r){grid-area:na}
  .board>.bs{grid-area:sc;justify-self:center;padding-bottom:.15rem}
  .board>.bt.r{grid-area:nh}
  .board>.disc:last-child{grid-area:dh}
  .board .bt.r{flex-direction:row;justify-content:flex-start;text-align:left}
  .board .bs{font-size:1.5rem}
  .board .bt .n{font-size:1rem;overflow-wrap:break-word}
  .disc{width:2.5rem;height:2.5rem;font-size:.72rem}
}
