/* OWS Stacks Tool — same palette and type as the One Prop Season hub. */
#ows-stacks{
  --page:#f7f1ea;--surface:#f2e9de;--line:#d8cec1;--ink:#171512;--muted:#5f564d;
  --orange:#ff7a00;--orange-dark:#c95f00;--green:#237a4a;--hit:#fde3c8;
  --display:Knockout-Heavy,"Arial Narrow",Arial,sans-serif;
  --sans:Knockout-Narrow,"Arial Narrow",Arial,sans-serif;
  --ui:Knockout,"Knockout 31",Oswald,system-ui,sans-serif;
  color:var(--ink);font-family:var(--ui);max-width:1100px;margin:0 auto;padding:0 0 56px;
}
#ows-stacks *{box-sizing:border-box}
#ows-stacks h1,#ows-stacks h2,#ows-stacks h3,#ows-stacks p{color:inherit;margin:0}
#ows-stacks a{color:inherit}
#ows-stacks button,#ows-stacks input,#ows-stacks select{font-family:var(--ui)}

.stx-kicker{color:var(--orange-dark);font-family:var(--sans);font-size:13px;font-weight:900;letter-spacing:.15em;text-transform:uppercase}
.stx-hero{padding:34px 0 22px}
.stx-title{margin:6px 0 0!important;font-family:var(--display)!important;font-size:clamp(52px,7vw,88px);font-weight:900;line-height:.9;letter-spacing:-.035em}
.stx-intro{margin:12px 0 0!important;max-width:640px;color:var(--muted);font-size:19px;line-height:1.4}

/* ---- gate ---- */
.stx-card{padding:22px 24px;border:1px solid var(--line);background:var(--surface)}
.stx-gate{max-width:560px;margin-top:8px;padding:30px 32px 28px;border:0;background:var(--ink);color:#fff;box-shadow:11px 11px 0 var(--orange)}
.stx-gate .stx-kicker{color:#ffc58f}
.stx-gate h2{margin:12px 0 0!important;color:#fff!important;font-family:var(--display)!important;font-size:clamp(30px,3.6vw,44px);line-height:.96;letter-spacing:-.03em}
.stx-gate ul{margin:18px 0 0;padding-left:18px;color:#e4ddd3;font-size:17px;line-height:1.5}
.stx-gate p{margin-top:14px!important;color:#e4ddd3;font-size:16px}
.stx-gate-login{color:#b9b0a5!important;font-size:15px!important}
.stx-gate-login a{color:#fff!important;text-decoration:underline}
.stx-primary{display:inline-flex;align-items:center;justify-content:center;width:100%;margin-top:22px;padding:17px 20px;border:0;border-radius:3px;background:var(--orange);color:var(--ink)!important;box-shadow:0 5px 0 var(--orange-dark);font-family:var(--display);font-size:20px;font-weight:900;text-decoration:none!important;cursor:pointer}

/* ---- tabs ---- */
.stx-tabs{display:flex;gap:6px;margin-bottom:-1px}
.stx-tab{padding:12px 20px;border:1px solid var(--line);border-bottom:0;border-radius:4px 4px 0 0;background:rgba(23,21,18,.04);color:var(--muted);font-family:var(--display);font-size:18px;letter-spacing:-.01em;cursor:pointer}
.stx-tab.is-active{background:var(--surface);color:var(--ink);border-color:var(--ink);border-bottom:1px solid var(--surface);position:relative;z-index:2}
.stx-tab:hover{color:var(--ink)}
.stx-panel[hidden]{display:none}
.stx-panel .stx-controls{border-top-color:var(--ink)}

/* ---- teams ---- */
.stx-team-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:14px 22px}
.stx-team-row select{padding:10px 12px;border:2px solid var(--ink);border-radius:3px;background:#fff;font-size:16px;min-width:220px}
.stx-team-row .stx-check{padding-bottom:10px}
.stx-chart{overflow-x:auto}
.stx-svg{display:block;width:100%;min-width:640px;height:auto}
.stx-grid{stroke:rgba(23,21,18,.1);stroke-width:1}
.stx-axis{font-family:var(--sans);font-size:12px;fill:var(--muted)}
.stx-share-label{font-family:var(--display);font-size:14px;fill:var(--orange-dark)}
.stx-seg{stroke:#fff;stroke-width:1}
.stx-seg:hover{opacity:.85}
.stx-bar-total{font-family:var(--display);font-size:12px;fill:var(--ink)}
.stx-share-line{fill:none;stroke:var(--orange-dark);stroke-width:2.5;stroke-dasharray:5 4}
.stx-share-dot{fill:#fff;stroke:var(--orange-dark);stroke-width:2.5}
.stx-legend{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:10px}
.stx-leg{display:inline-flex;align-items:center;gap:6px;font-size:14px}
.stx-leg small{color:var(--muted)}
.stx-swatch{display:inline-block;width:12px;height:12px;border-radius:2px;margin-right:6px;vertical-align:-1px}
.stx-dist td b{font-size:17px}
.stx-dist .stx-bar{background:var(--orange)}
.stx-leads{display:flex;flex-wrap:wrap;gap:4px 12px}
.stx-lead{white-space:nowrap;font-size:14px}
.stx-lead b{font-family:var(--display);font-size:15px}
.stx-open-row{display:flex;align-items:center;gap:14px;margin-top:12px}
.stx-open{width:auto;margin-top:0;padding:12px 18px;font-size:17px}
.stx-open:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}
.stx-league-row,.stx-pl-row{cursor:pointer}
.stx-league-row:hover td,.stx-pl-row:hover td{background:var(--hit)}
/* Team and player names read as one unit; "Baltimore Ravens" over two lines
   dragged every other cell in the row down with it. */
.stx-team-cell{white-space:nowrap}
.stx-team-cell b{font-family:var(--display);font-size:19px;letter-spacing:-.01em}
.stx-team-cell small{display:inline;margin-left:4px;color:var(--muted)}

/* Season leaders: a fixed three-row list so every team's "combined" lands in
   the same place, at a size that does not shout over the share column. */
.stx-leadlist{list-style:none;margin:0;padding:0;min-width:190px}
.stx-leadlist li{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:1px 0;font-size:14.5px;line-height:1.35}
.stx-leadname{color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stx-leadpct{flex:0 0 auto;font-family:var(--display);font-size:15px;color:var(--ink)}
.stx-leadsum{margin-top:4px;padding-top:4px;border-top:1px solid var(--line);font-family:var(--sans);font-size:11.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--orange-dark);white-space:nowrap}

/* Sortable headings */
.stx-sortable{cursor:pointer;user-select:none}
.stx-sortable:hover{color:var(--ink)}
.stx-arrow{font-size:9px;opacity:.85}
.stx-arrow-idle{opacity:.25}

/* Sub-tabs (Teams | Players) and position chips */
.stx-subtabs{display:flex;gap:6px;margin:12px 0 0}
.stx-subtab{padding:8px 16px;border:1px solid var(--line);border-radius:3px;background:transparent;color:var(--muted);font-family:var(--display);font-size:16px;cursor:pointer}
.stx-subtab.is-active{background:var(--ink);border-color:var(--ink);color:#fff}
.stx-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px}
.stx-chip-btn{padding:6px 14px;border:1px solid var(--line);border-radius:999px;background:#fff;color:var(--muted);font-family:var(--sans);font-size:12.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;cursor:pointer}
.stx-chip-btn.is-active{background:var(--orange);border-color:var(--orange-dark);color:var(--ink)}

/* Collapsed explanations: a quiet line you can open, not an orange block. */
.stx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 0}
.stx-note-d{flex:1 1 300px;border:1px solid var(--line);border-left:3px solid var(--orange);background:var(--surface)}
.stx-note-d summary{padding:8px 12px;font-family:var(--sans);font-size:12px;font-weight:900;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);cursor:pointer;list-style:none}
.stx-note-d summary::-webkit-details-marker{display:none}
.stx-note-d summary::before{content:"+";margin-right:8px;color:var(--orange-dark);font-family:var(--display);font-size:15px}
.stx-note-d[open] summary::before{content:"\2212"}
.stx-note-d summary:hover{color:var(--ink)}
.stx-note-body{padding:0 12px 12px;font-size:15px;line-height:1.5;color:var(--ink)}

/* Season distribution: no horizontal scroll, so columns must earn their place. */
.stx-dist{table-layout:auto;width:100%}
.stx-dist .stx-tick{width:26px;padding-right:0}
.stx-dist td,.stx-dist th{padding-left:6px;padding-right:6px}
.stx-dist .stx-rate-col{width:30%}
.stx-salppd i{margin:0 4px;color:var(--muted);font-style:normal}
.stx-log .stx-lead.is-first b{color:var(--orange-dark)}
.stx-sep{margin:0 7px;color:var(--rule-2,#c3c9d6)}

/* Week-by-week expander inside the season distribution */
.stx-expand{width:20px;height:20px;margin-right:7px;padding:0;border:1px solid var(--rule-2,#c3c9d6);border-radius:3px;background:#fff;color:var(--muted);font-family:var(--ui);font-size:14px;line-height:1;cursor:pointer;vertical-align:1px}
.stx-expand:hover{background:var(--hit);color:var(--ink)}
.stx-weeks-row td{background:rgba(23,21,18,.035);padding-top:8px;padding-bottom:10px}
.stx-weeks{display:flex;flex-wrap:wrap;gap:6px}
.stx-wk{display:flex;flex-direction:column;min-width:104px;padding:6px 9px;border:1px solid var(--line);border-left:3px solid var(--orange);background:#fff}
.stx-wk.is-top{border-left-color:var(--green)}
.stx-wk-out{border-left-color:var(--line);opacity:.65}
.stx-wk-h{font-family:var(--sans);font-size:10.5px;font-weight:900;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);white-space:nowrap;margin-bottom:4px;padding-bottom:3px;border-bottom:1px solid var(--line)}
.stx-wk small{color:var(--muted);font-size:11.5px;white-space:nowrap}
/* Compact on purpose: these repeat once per game per player, and a wall of
   22px numbers is unreadable on a phone. */
.stx-wk-r{display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:12px;white-space:nowrap;padding:1px 0}
.stx-wk-r i{color:var(--muted);font-family:var(--sans);font-size:9.5px;font-style:normal;font-weight:900;letter-spacing:.05em;text-transform:uppercase}
.stx-wk-r b{font-family:var(--display);font-size:15px}
.stx-wk-note{color:var(--muted);font-size:11px;font-style:italic}

/* Chart key for the dashed share line. NOT flex: flex would make every <b> in
   the sentence its own column and break the prose into fragments. */
.stx-linekey{display:block}
.stx-linekey-swatch{display:inline-block;width:26px;height:3px;margin-right:7px;border-radius:2px;vertical-align:middle;
  background:repeating-linear-gradient(to right,var(--orange-dark) 0 6px,transparent 6px 10px)}

/* Three surnames are a caption, not a headline: matched to the tile's own
   supporting line rather than sized like a single big number. */
.stx-trio{display:block;font-family:var(--ui);font-size:14px;font-weight:600;line-height:1.4;letter-spacing:.01em}
.stx-trio i{margin:0 4px;color:var(--orange);font-style:normal}
.stx-table th small{display:block;margin-top:3px;font-family:var(--ui);font-size:11px;font-weight:400;letter-spacing:0;text-transform:none;color:var(--muted)}
.stx-lead-sum{font-family:var(--sans);font-size:12.5px;font-weight:900;letter-spacing:.04em;text-transform:uppercase;color:var(--orange-dark)}
/* "Without touchdowns" reads as the quieter companion to the real number. */
.stx-pre{color:var(--muted)}
.stx-pre b{color:var(--ink)}
.stx-rate.is-pre b{color:var(--muted)}
.stx-rate.is-pre .stx-bar{background:var(--rule-2,#c3c9d6)}
.stx-ppd{font-family:var(--display);font-size:17px}
.stx-ppd.is-good{color:var(--orange-dark)}
.stx-ppd.is-smash{padding:2px 7px;border-radius:3px;background:var(--green);color:#fff}
.stx-lead small{display:block;color:var(--muted);font-family:var(--sans);font-size:11px}
.stx-note{border-left:5px solid var(--orange);background:var(--hit)}
.stx-note p{margin:0!important;font-size:15.5px;line-height:1.5}

/* ---- controls ---- */
.stx-controls{padding:20px;border:1px solid var(--line);background:var(--surface)}
.stx-picks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 16px;align-items:start}
.stx-pick[hidden]{display:none}
.stx-add{grid-column:1 / -1;justify-self:start;padding:9px 14px;border:2px dashed var(--orange-dark);border-radius:3px;background:transparent;color:var(--orange-dark);font-family:var(--display);font-size:16px;cursor:pointer}
.stx-add:hover{background:var(--hit)}
.stx-add[hidden]{display:none}
.stx-actions{grid-column:1 / -1;display:flex;flex-wrap:wrap;gap:10px}
.stx-add.is-locked{border-style:solid;border-color:var(--line);color:var(--muted);background:rgba(23,21,18,.03)}
.stx-add.is-locked:hover{background:var(--hit);color:var(--ink)}
.stx-upsell{position:relative;margin-top:12px;padding:24px 28px;border:0;background:var(--ink);color:#fff;box-shadow:8px 8px 0 var(--orange)}
.stx-upsell .stx-kicker{color:#ffc58f}
.stx-upsell h3{margin:8px 0 0!important;color:#fff!important;font-family:var(--display)!important;font-size:clamp(24px,3vw,34px);line-height:1;letter-spacing:-.02em}
.stx-upsell p{margin-top:10px!important;max-width:60ch;color:#e4ddd3;font-size:16px;line-height:1.45}
.stx-upsell .stx-primary{width:auto;margin-top:16px;padding:14px 22px;font-size:18px}
.stx-upsell-x{position:absolute;top:10px;right:10px;width:32px;height:32px;border:0;border-radius:50%;background:rgba(255,255,255,.12);color:#fff;font-size:20px;line-height:1;cursor:pointer}
.stx-actions .stx-add{grid-column:auto}
.stx-add-without{border-color:var(--muted);color:var(--muted)}
.stx-add-without:hover{background:rgba(23,21,18,.06)}
.stx-pick-without{grid-column:1 / -1;padding:12px 14px;border:1px dashed var(--rule,#c3c9d6);border-left:5px solid var(--muted);background:rgba(23,21,18,.03)}
.stx-pick-without .stx-label{color:var(--ink)}
.stx-pick-without .stx-chip{border-color:var(--muted)}
.stx-pick-without .stx-chip-img{filter:grayscale(1);opacity:.7}
.stx-hint{margin:8px 0 0!important;color:var(--muted);font-size:13.5px;line-height:1.4}
.stx-without-tag{display:inline-block;margin-left:8px;padding:2px 10px;border-radius:999px;background:var(--muted);color:#fff;font-family:var(--sans);font-style:normal;font-size:.42em;font-weight:900;letter-spacing:.06em;text-transform:uppercase;vertical-align:middle}
.stx-wo{border-left:6px solid var(--muted)}
.stx-wo-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.stx-wo-col{padding:12px 14px;border:1px solid var(--line);background:#fff}
.stx-wo-col.is-key{border-color:var(--ink);box-shadow:5px 5px 0 var(--orange)}
.stx-wo-h{display:block;margin-bottom:8px;font-family:var(--display);font-size:20px;line-height:1}
.stx-wo-row{display:flex;justify-content:space-between;align-items:baseline;padding:5px 0;border-top:1px solid var(--line);font-size:15px;color:var(--muted)}
.stx-wo-row b{font-family:var(--display);font-size:20px;color:var(--ink)}
/* Label above the box, not beside it. Side by side, "YOUR NUMBER" plus an 84px
   input gave this cell a 163px min-content width, and since it is the widest
   thing in column one it set the width of the whole column and pushed the
   table past the card. Stacked, the column sizes to the thresholds instead. */
.stx-custom-lbl{display:flex;flex-direction:column;align-items:flex-start;gap:5px;font-family:var(--sans);font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.stx-custom-wrap{display:inline-flex;align-items:center;border:2px solid var(--ink);border-radius:3px;background:#fff;overflow:hidden}
.stx-custom-wrap em{padding:0 8px;font-family:var(--display);font-style:normal;font-size:18px;color:var(--ink);background:var(--hit)}
.stx-label{display:block;margin-bottom:6px;font-family:var(--sans);font-size:12px;font-weight:900;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.stx-search{position:relative}
.stx-search input{width:100%;padding:14px 14px;border:2px solid var(--ink);border-radius:3px;background:#fff;color:var(--ink);font-size:18px;line-height:1.2}
.stx-search input:disabled{border-color:var(--line);background:#efe8df;color:var(--muted)}
.stx-search input:focus{outline:none;border-color:var(--orange);box-shadow:0 0 0 3px rgba(255,122,0,.2)}
.stx-results{position:absolute;z-index:30;top:calc(100% + 4px);left:0;right:0;max-height:320px;margin:0;padding:0;overflow-y:auto;list-style:none;border:2px solid var(--ink);background:#fff;box-shadow:0 12px 30px rgba(23,21,18,.18)}
.stx-results li{display:flex;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid var(--line);cursor:pointer}
.stx-results li:last-child{border-bottom:0}
.stx-results li:hover,.stx-results li.is-active{background:var(--hit)}
.stx-results .stx-r-empty{color:var(--muted);cursor:default;font-size:15px}
.stx-r-img{width:38px;height:38px;border-radius:50%;object-fit:cover;background:var(--surface);flex:0 0 auto}
.stx-r-copy{min-width:0}
.stx-r-name{display:block;font-family:var(--display);font-size:17px;line-height:1.1}
.stx-r-meta{display:block;color:var(--muted);font-family:var(--sans);font-size:12.5px;letter-spacing:.02em}
.stx-chip{display:flex;align-items:center;gap:12px;padding:8px 10px 8px 8px;border:2px solid var(--ink);border-radius:3px;background:#fff}
.stx-chip-img{width:48px;height:48px;border-radius:50%;object-fit:cover;background:var(--surface);flex:0 0 auto}
.stx-chip-copy{flex:1 1 auto;min-width:0}
.stx-chip-copy b{display:block;font-family:var(--display);font-size:22px;line-height:1;letter-spacing:-.01em}
.stx-chip-copy small{display:block;margin-top:3px;color:var(--muted);font-family:var(--sans);font-size:13px}
.stx-chip-x{flex:0 0 auto;width:34px;height:34px;border:0;border-radius:50%;background:var(--surface);color:var(--ink);font-size:22px;line-height:1;cursor:pointer}
.stx-chip-x:hover{background:var(--hit)}
.stx-window{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.stx-window .stx-label{margin:0}
.stx-window select{padding:9px 12px;border:2px solid var(--ink);border-radius:3px;background:#fff;font-size:15px}
.stx-check{display:inline-flex;align-items:center;gap:7px;font-size:15px;color:var(--muted)}
.stx-status{margin:14px 0 0;padding:12px 16px;border-left:5px solid var(--orange);background:var(--surface);font-size:16px}
.stx-status.is-error{border-left-color:#9c3029}
.stx-foot{margin-top:22px!important;color:var(--muted);font-size:14px;line-height:1.5}
.stx-foot code{font-size:13px}

/* ---- results ---- */
.stx-output{margin-top:20px}
.stx-headline{padding:6px 0 16px}
.stx-headline-pair{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.stx-h-img{width:64px;height:64px;border-radius:50%;object-fit:cover;background:var(--surface);border:2px solid var(--ink);margin-right:-22px}
.stx-h-img + .stx-h-img{margin-right:6px}
.stx-headline h2{font-family:var(--display)!important;font-size:clamp(30px,4vw,46px);line-height:.95;letter-spacing:-.03em}
.stx-headline h2 span{color:var(--orange)}
.stx-headline p{flex-basis:100%;margin-top:4px!important;color:var(--muted);font-family:var(--sans);font-size:14px;letter-spacing:.04em;text-transform:uppercase}
/* Four across, and the views that use it emit exactly four or six tiles, so a
   row is never left with a single orphan hanging under it. */
.stx-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.stx-tiles.is-six{grid-template-columns:repeat(3,minmax(0,1fr))}

/* Per-player averages: a quiet strip, not four more tiles. */
.stx-avgstrip{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 22px;margin-top:10px;padding:10px 16px;border:1px solid var(--line);background:var(--surface)}
.stx-avgstrip span{display:flex;align-items:baseline;gap:8px}
.stx-avgstrip i{font-family:var(--sans);font-size:11.5px;font-style:normal;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.stx-avgstrip b{font-family:var(--display);font-size:21px;line-height:1}
.stx-avgstrip-note{margin-left:auto;color:var(--muted);font-size:13px}
.stx-tiles .stx-tile{min-width:0}
.stx-tile b{overflow-wrap:anywhere}
.stx-tile span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stx-tile small{line-height:1.35}
.stx-tile{padding:14px 16px;border:1px solid var(--line);background:var(--surface)}
.stx-tile:first-child{background:var(--ink);color:#fff;border-color:var(--ink)}
.stx-tile:first-child b{color:var(--orange)}
/* Every tile the same shape: label, one big number, one line of context.
   The second row used to read smaller than the first purely by accident. */
.stx-tile{display:flex;flex-direction:column}
/* Tile headings carry the meaning; at 11px they were losing to the numbers. */
.stx-tile span{display:block;font-family:var(--sans);font-size:13px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;opacity:.9}
.stx-tile b{display:block;margin-top:6px;font-family:var(--display);font-size:34px;line-height:1.02;letter-spacing:-.02em}
.stx-tile small{display:block;margin-top:auto;padding-top:6px;font-size:13px;opacity:.85}
/* Both ceiling cards run full width. Side by side they were ~300px each, and
   neither table fits in that: Combined ceiling is five columns with two rate
   bars, Individual ceilings is a player name plus three counts. At half width
   the names ran straight over the numbers and the "No TDs" pair was clipped by
   the card edge. Full width is the only honest fix. */
.stx-grid{display:grid;grid-template-columns:1fr;gap:12px;margin-top:12px}
/* A grid item defaults to min-width:auto, so a wide table refuses to shrink
   and spills past the card instead of being contained by it. */
.stx-grid > *{min-width:0}
.stx-grid table{min-width:0}
.stx-output .stx-card{margin-top:12px}
.stx-grid .stx-card{margin-top:0}
.stx-card h3{font-family:var(--display)!important;font-size:24px;letter-spacing:-.02em;line-height:1}
.stx-sub{margin:4px 0 12px!important;color:var(--muted);font-size:14px}
.stx-scroll{overflow-x:auto}
.stx-table{width:100%;border-collapse:collapse;font-size:16px}
.stx-table th{padding:6px 8px;border-bottom:2px solid var(--ink);text-align:left;font-family:var(--sans);font-size:12px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);white-space:nowrap}
.stx-table td{padding:8px 8px;border-bottom:1px solid var(--line);vertical-align:top}
.stx-table td b{font-family:var(--display);font-size:18px}
.stx-table td small{display:block;color:var(--muted);font-size:12.5px;line-height:1.3}
/* Counts like "2 / 5" and "2 of 5" are one fact; never break them over lines. */
.stx-nowrap{white-space:nowrap}
.stx-nowrap small{display:inline;margin-left:3px}
.stx-table td.is-hit{background:var(--hit);font-weight:700}
/* Individual ceilings: players down the side, thresholds across, so the width
   is fixed no matter how many players are in the stack. */
.stx-solo{table-layout:fixed;width:100%}
.stx-solo th:first-child,.stx-solo td:first-child{text-align:left}
.stx-solo th:not(:first-child),.stx-solo td:not(:first-child){width:22%;text-align:right}
.stx-solo td b{font-family:var(--display);font-size:18px}
.stx-solo td small{display:inline;margin-left:4px;color:var(--muted)}
.stx-solo .stx-solo-sum td{border-top:2px solid var(--ink);background:rgba(23,21,18,.03)}
.stx-solo .stx-solo-sum td:first-child b{font-family:var(--sans);font-size:12px;font-weight:900;letter-spacing:.05em;text-transform:uppercase}

.stx-rate-col{width:48%}
/* The combined-ceiling table carries TWO rate columns (as scored, and again
   with TDs taken out), so the blanket 48% above asked for 96% of the table for
   two of its five columns and shoved the rest through the card border. These
   widths are explicit and add to 100. */
.stx-ceil{table-layout:fixed}
.stx-ceil th:first-child,.stx-ceil td:first-child{width:22%}
.stx-ceil th:nth-child(2),.stx-ceil td:nth-child(2),
.stx-ceil th:nth-child(4),.stx-ceil td:nth-child(4){width:14%}
.stx-ceil th.stx-rate-col,.stx-ceil td.stx-rate-col{width:25%}
.stx-rate{display:flex;align-items:center;gap:12px}
.stx-rate b{flex:0 0 52px;font-family:var(--display);font-size:18px}
/* Without min-width:0 a flex item refuses to shrink under its content, so the
   track can push a fixed-width cell wider than the column it lives in. */
.stx-track{flex:1 1 auto;min-width:0;height:12px;background:rgba(23,21,18,.08)}
.stx-bar{display:block;height:100%;min-width:2px;background:var(--orange)}
.stx-playoff{display:inline-block;margin-left:6px;padding:2px 7px;border-radius:999px;background:var(--ink);color:#fff;font-family:var(--sans);font-size:10.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;vertical-align:middle}
.stx-log tr.is-45 td{background:rgba(255,122,0,.08)}
.stx-log tr.is-55 td{background:var(--hit)}
.stx-empty p{font-size:17px}
.stx-muted{color:var(--muted);font-size:14px}
.stx-custom{width:76px;padding:5px 8px;border:0;background:#fff;font-family:var(--display);font-size:17px;color:var(--ink)}
.stx-custom:focus{outline:none}
.stx-custom-row td{background:rgba(255,122,0,.05)}
.stx-salary{border-left:6px solid var(--orange)}
/* One row: every salary, then Combined at the end. A grid with an auto-fit
   repeat collapsed to a single column here and stacked them; plain flex with
   no wrap keeps them side by side at two players and at four. */
.stx-sal-row{display:flex;flex-wrap:nowrap;align-items:flex-end;gap:14px;margin:4px 0 14px}
.stx-sal{flex:0 1 auto;min-width:0}
.stx-sal span,.stx-sal-total span{display:block;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.stx-sal b,.stx-sal-total b{display:block;margin-top:3px;font-family:var(--display);font-size:26px;line-height:1;letter-spacing:-.01em}
.stx-sal small{display:block;margin-top:3px;color:var(--orange-dark);font-size:12px}
.stx-sal-in{width:100%;max-width:96px;padding:2px 4px;border:0;border-bottom:2px solid var(--ink);background:transparent;font-family:var(--display);font-size:24px;line-height:1;color:var(--ink)}
.stx-sal-in:focus{outline:none;border-bottom-color:var(--orange)}
.stx-sal-total{flex:0 0 auto;margin-left:auto;display:flex;flex-direction:column;justify-content:center;padding:8px 16px;background:var(--ink);color:#fff;white-space:nowrap}
.stx-sal-total b{color:var(--orange)}
.stx-table tr.is-key td{background:var(--hit)}

/* ---- Against a defense ---- */
.stx-def{border-left:6px solid var(--ink)}
.stx-def-pick{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;max-width:260px}
.stx-def-pick select{padding:9px 11px;border:2px solid var(--ink);border-radius:3px;background:#fff;font-size:16px}
.stx-deftable td b{font-family:var(--display);font-size:19px}
.stx-deftable td small{display:block;color:var(--orange-dark);font-size:11px;letter-spacing:.05em;text-transform:uppercase}
.stx-deftable tr.is-mine td{background:var(--hit)}
.stx-def-rank b{font-family:var(--display);font-size:19px;color:var(--muted)}
.stx-def-rank small{display:block;font-family:var(--sans);font-size:10.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
/* A soft matchup is the thing you are looking for, so let it show. */
.stx-def-rank.is-soft b{color:var(--ink)}
.stx-def-rank.is-soft small{color:var(--orange-dark)}
.stx-wk-open{display:inline-block;margin-top:7px;padding:5px 10px;border:1px solid var(--ink);border-radius:3px;background:transparent;color:var(--ink);font-family:var(--sans);font-size:10.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;white-space:nowrap}
.stx-wk-open:hover{background:var(--ink);color:#fff}
.stx-wk-stack small i{font-style:normal;color:var(--orange-dark)}

/* ---- Cascading Projections tab ---- */
.stx-tab-premium i{font-style:normal;font-size:13px;opacity:.75}
.stx-proj-gate{max-width:620px}
/* The embedded tool brings its own skin. Keep this wrapper free of any type or
   colour rules so nothing here leaks into it — the only job is to undo the
   card padding the panel would otherwise impose. */
/* Give Cascading Projections the same width it gets on its own page.
   `#ows-stacks` caps at 1100px inside a 1170px theme container; CP's own
   wrapper is 1140px, so embedding it here was quietly costing it 40px. That
   did not matter at eleven columns. Projections 2.9.47 added an ownership
   column — twelve now — and CP only turns on its horizontal scroller inside a
   media query, so desktop has no scroll to fall back on if the table
   overflows. Breaking out 20px a side restores its native width exactly, and
   1140 still sits inside the 1170 container so the page never scrolls
   sideways. Only the CP panel does this; our own tabs are built for 1100. */
@media (min-width:1140px){
  #stx-panel-projections{margin-left:-20px;margin-right:-20px}
}
.stx-proj-embed{margin-top:12px}
.stx-proj-embed > *:first-child{margin-top:0}
/* The explainer comes from JM's page with its own .ows-cpg skin. Give it room
   and otherwise keep hands off. */
.stx-proj-intro{margin-bottom:6px}
.stx-proj-intro .ows-cpg{padding-left:0;padding-right:0}
.stx-proj-pitch{margin-top:14px!important;font-size:18px!important;line-height:1.5}
.stx-proj-pitch b{color:#ffc58f}
/* The Offer Manager promo band across the top.
   Breaks out of the tool's 1100px column to span the viewport, the way the
   homepage banner does. `100vw` includes the scrollbar, so `max-width:100%`
   on the section plus `overflow-x:clip` on the band keeps that extra ~15px
   from producing a horizontal scrollbar on the whole page. */
.stx-promo{margin:0 0 22px}
.stx-promo-in{max-width:1140px;margin:0 auto;padding:0}
/* Contained CARD, not a full-width band. Geometry matches .cpg-cta-box in
   cp-primer.css so the promo and the Cascading Projections join prompt read as
   one component in two places. */
.stx-promo .ows-ma-contextual-strip{background:var(--ink)!important;border:0!important;
  border-radius:10px!important;box-shadow:none!important;margin:0!important;
  padding:22px 24px!important;display:flex;gap:24px;align-items:center;flex-wrap:wrap}
.stx-promo .ows-ma-contextual-copy{flex:1 1 420px;min-width:0}
.stx-promo .ows-ma-contextual-actions{flex:0 0 auto;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
/* Everything below is forced on purpose. The Offer Manager ships a light CARD
   design and we are re-hosting it as a dark BAND, so its colours land ink-on-ink
   and vanish — the headline and the button were both invisible in testing.
   Worse, its stylesheet only loads when a real offer renders, so the band has
   to be legible on its own rather than inheriting anything. Scoped to
   .stx-promo, so nothing here touches the offer anywhere else on the site. */
.stx-promo .ows-ma-kicker{color:var(--orange)!important;font-size:12px;letter-spacing:.12em}
.stx-promo h3{margin:4px 0 0!important;color:#fff!important;font-size:26px;line-height:1.15}
.stx-promo .ows-ma-body,.stx-promo .ows-ma-body p{color:#C9C4BC!important}
.stx-promo .ows-ma-body p{margin:4px 0 0}
.stx-promo .ows-ma-benefits span{color:#C9C4BC!important}
.stx-promo .ows-ma-primary-button{background:var(--orange)!important;color:#171512!important;
  display:inline-block;text-decoration:none;font-family:var(--display);font-size:15px;
  letter-spacing:.06em;text-transform:uppercase;padding:12px 22px!important;border-radius:4px;
  border:0!important;white-space:nowrap}
.stx-promo .ows-ma-primary-button:hover{filter:brightness(1.07)}
.stx-promo .ows-ma-offer-pill{background:rgba(255,255,255,.12)!important;color:#fff!important}
/* The dismiss / "maybe later" control and the signed-out log-in link. */
.stx-promo .ows-ma-contextual-actions button,
.stx-promo .ows-ma-contextual-actions a:not(.ows-ma-primary-button){color:#9A948A!important;
  background:transparent!important;border:0!important;font-size:13px;text-decoration:underline;cursor:pointer}
@media (max-width:759.98px){
  .stx-promo-in{padding:0 14px}
  .stx-promo .ows-ma-contextual-strip{padding:14px 0!important;gap:12px}
  .stx-promo .ows-ma-contextual-actions{width:100%}
}

/* "Turn your phone sideways." Only on a narrow screen held upright, so it is
   absent on desktop, on a tablet, and the instant the phone is rotated. Same
   wording and treatment as the Contest Finder, so the tools agree with each
   other. */
.stx-rotate{display:none}
@media (max-width:820px) and (orientation:portrait){
  .stx-rotate{display:block;margin:16px 0 0;padding:11px 14px;border:1px solid var(--line);
    border-left:3px solid var(--orange);background:var(--surface);
    color:var(--ink);font-size:14.5px;line-height:1.45}
  .stx-rotate b{font-weight:700}
}

/* One-click examples on the empty tool. The point is to get a real answer on
   screen in one click — reading that a tool is good proves nothing. */
.stx-examples{margin-top:18px}
.stx-ex-lead{margin:0 0 10px!important;color:var(--muted);font-size:14px}
.stx-ex-row{display:grid;grid-template-columns:1fr;gap:10px}
@media (min-width:760px){.stx-ex-row{grid-template-columns:repeat(3,1fr)}}
.stx-ex{display:block;width:100%;text-align:left;cursor:pointer;background:#fff;
  border:2px solid var(--ink);border-left-width:5px;border-radius:4px;padding:12px 14px;font:inherit}
.stx-ex:hover{background:var(--hit)}
.stx-ex b{display:block;font-family:var(--display);font-size:18px;line-height:1.15;color:var(--ink)}
.stx-ex small{display:block;margin-top:5px;color:var(--muted);font-size:13px;line-height:1.4}

/* The locked Cascading Projections view: explainer first, then the ask. */
.stx-proj-locked .ows-cpg{max-width:none;padding:0}
.stx-proj-locked .stx-proj-gate{margin-top:14px}

/* The IC Lite alternative. Deliberately quiet — a line of text under the
   button, not a second button competing with it. */
.stx-proj-alt{margin:12px 0 0!important;font-size:14px;line-height:1.5;color:var(--muted)}
.stx-proj-alt a{color:#ffc58f;text-decoration:underline}
.stx-proj-stale{margin:8px 0 0!important;padding:8px 12px;border-left:3px solid var(--orange);background:var(--surface);font-size:13px;line-height:1.5;color:var(--muted)}
.stx-def-foot{margin-top:10px!important;line-height:1.5}

/* ---- This Week ------------------------------------------------------------ */
.stx-wk-filters{display:flex;flex-wrap:wrap;gap:16px 22px;align-items:flex-end}
.stx-wk-f{display:flex;flex-direction:column;gap:6px;min-width:0}
.stx-wk-f select{padding:8px 10px;border:2px solid var(--ink);border-radius:3px;background:#fff;font-family:var(--sans);font-size:14px;color:var(--ink)}
/* Named for this tab on purpose: .stx-seg is already an SVG class in the
   Concentrated Offenses chart, and one class meaning two things has bitten
   this stylesheet before. */
.stx-wkseg{display:inline-flex;border:2px solid var(--ink);border-radius:3px;overflow:hidden;background:#fff}
.stx-wkseg button{padding:8px 14px;border:0;border-right:1px solid var(--line);background:transparent;color:var(--muted);font-family:var(--sans);font-size:12.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;white-space:nowrap}
.stx-wkseg button:last-child{border-right:0}
.stx-wkseg button.is-active{background:var(--orange);color:var(--ink)}
.stx-wkseg button:hover:not(.is-active){background:var(--surface)}

.stx-wk-hint{margin:10px 0 0!important;font-size:12.5px;color:var(--muted)}

/* Players stacked, position in front and smaller than the name, so you can read
   the shape of the stack (QB / RB / WR) without parsing a sentence. */
.stx-wk-plist{margin:0!important;padding:0!important;list-style:none!important}
.stx-wk-plist li{display:flex;align-items:baseline;gap:7px;margin:0;padding:1px 0;list-style:none}
.stx-wk-plist i{flex:0 0 24px;font-family:var(--sans);font-style:normal;font-size:10.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--orange-dark)}
/* A flex item will not shrink under its own text without min-width:0, so a long
   surname would push the cell past its column. Truncate instead of overflow. */
.stx-wk-plist b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--display);font-size:17px;line-height:1.2;letter-spacing:-.01em}
.stx-wk-plist span{margin-left:auto;font-size:12.5px;color:var(--muted);white-space:nowrap}

.stx-wk-intro .stx-sub{max-width:none}
.stx-wk-heads{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:10px;margin-top:6px}
.stx-wk-head{min-width:0;padding:12px 14px;border:1px solid var(--line);border-top:4px solid var(--orange);background:var(--surface)}
.stx-wk-head-lbl{margin:0 0 7px!important;font-family:var(--sans);font-size:10.5px;font-weight:900;letter-spacing:.09em;text-transform:uppercase;color:var(--orange-dark)}
.stx-wk-head-meta{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin:7px 0 0!important;padding-top:6px;border-top:1px solid var(--line);font-size:12.5px;color:var(--muted)}
.stx-wk-head-meta b{font-family:var(--display);font-size:17px;color:var(--ink)}
/* The same three numbers in the same three places on every card, so four cards
   compare at a glance instead of reading as four different sentences. */
.stx-wk-mini{width:100%;margin-top:8px;border-collapse:collapse;font-size:13px}
.stx-wk-mini thead th{padding:0 0 3px;border:0;border-bottom:1px solid var(--line);text-align:right;font-family:var(--sans);font-size:9.5px;font-weight:900;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}
.stx-wk-mini thead th:first-child{text-align:left}
.stx-wk-mini tbody th{padding:4px 0;border:0;text-align:left;font-family:var(--display);font-size:15px;color:var(--muted)}
.stx-wk-mini td{padding:4px 0 4px 8px;border:0;text-align:right;white-space:nowrap}
.stx-wk-mini td b{font-family:var(--display);font-size:16px}
.stx-wk-mini tr.is-ok td b{color:var(--orange-dark)}
.stx-wk-mini tr.is-strong td b{color:var(--ink);background:var(--hit);padding:0 5px}
.stx-wk-head-foot{display:flex;flex-wrap:wrap;gap:4px 14px;margin:8px 0 0!important;padding-top:7px;border-top:1px solid var(--line);font-family:var(--sans);font-size:10.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.stx-wk-head-foot b{margin-left:4px;font-family:var(--display);font-size:15px;letter-spacing:0;text-transform:none;color:var(--ink)}

/* Sortable headings: the board's own sort control. */
.stx-wk-table th.stx-sortable{cursor:pointer;user-select:none;white-space:nowrap}
.stx-wk-table th.stx-sortable:hover{color:var(--ink)}
.stx-wk-table th.stx-sortable i{display:inline-block;width:11px;margin-left:3px;font-style:normal;font-size:9px;color:var(--orange-dark)}
.stx-wk-table th.is-sorted{color:var(--ink);border-bottom-color:var(--orange)}

.stx-wk-table{table-layout:fixed;width:100%}
/* Adds to 100. The Stack column needed the extra width once players went one
   per line; it came from Games/Avg/Best, which hold a single short number, not
   from Cost or the rate columns, which each carry three facts. */
.stx-wk-table th:first-child,.stx-wk-table td:first-child{width:26.5%}
.stx-wk-table th:nth-child(2),.stx-wk-table td:nth-child(2){width:14%}
.stx-wk-table th:nth-child(3),.stx-wk-table td:nth-child(3){width:8.5%}
.stx-wk-table th:nth-child(n+4):nth-child(-n+6),.stx-wk-table td:nth-child(n+4):nth-child(-n+6){width:12%}
.stx-wk-table th:nth-last-child(-n+2),.stx-wk-table td:nth-last-child(-n+2){width:7.5%;text-align:right;padding-left:4px;padding-right:4px}
.stx-wk-stack small{display:block;margin-top:4px;padding-top:4px;border-top:1px solid var(--line);color:var(--muted);font-size:11.5px;letter-spacing:.04em;text-transform:uppercase}
.stx-wk-table td small{display:block;color:var(--muted);font-size:11.5px;line-height:1.3}
.stx-wk-n{font-family:var(--display);font-size:17px;color:var(--muted)}
.stx-wk-x b{font-family:var(--display);font-size:18px}
.stx-wk-x em{display:block;margin-top:2px;font-style:normal;font-size:11px;letter-spacing:.03em;text-transform:uppercase;color:var(--orange-dark)}
.stx-wk-x.is-ok{background:rgba(255,122,0,.07)}
.stx-wk-x.is-strong{background:var(--hit)}
.stx-wk-note p{font-size:14.5px;line-height:1.55}
.stx-wk-note p + p{margin-top:8px}

@media (max-width:1040px){
  .stx-wk-heads{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* Phones in landscape (601-900px) get the full tables rather than the card
   layout — vertical space is scarce there, so a table beats a tall stack of
   cards. The eight-column board needs tighter type to fit: at default size the
   Cost column wanted 87px and had 73. */
@media (min-width:601px) and (max-width:900px){
  .stx-wk-table{font-size:14px}
  .stx-wk-table th,.stx-wk-table td{padding-left:4px;padding-right:4px}
  .stx-wk-table th{font-size:10.5px;letter-spacing:.02em}
  .stx-wk-table td small{font-size:10px}
  .stx-wk-table td b{font-size:16px}
  .stx-wk-stack b,.stx-wk-plist b{font-size:15px}
  .stx-wk-plist i{flex:0 0 22px;font-size:9.5px}
  .stx-wk-x b{font-size:16px}
  .stx-wk-x em{font-size:10px}
}

@media (max-width:600px){
  #ows-stacks{padding:0 16px 48px}
  .stx-picks{grid-template-columns:1fr}
  .stx-tiles,.stx-tiles.is-six{grid-template-columns:repeat(2,minmax(0,1fr))}
  .stx-avgstrip-note{margin-left:0;flex-basis:100%}
  .stx-team-cell{white-space:normal}
  /* "Robinson RB" was wrapping onto two lines and making that row twice as
     tall as the others, while the count cells clipped by 2px. Smaller type and
     a narrower name column buys both back. */
  .stx-solo{font-size:14px}
  .stx-solo th:first-child,.stx-solo td:first-child{width:36%}
  .stx-solo th:not(:first-child),.stx-solo td:not(:first-child){width:21.3%}
  /* nowrap + hidden overflow, so a long surname truncates rather than wrapping
     the row to double height or spilling into the counts. */
  .stx-solo .stx-team-cell{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .stx-solo td b{font-size:15px}
  /* The position badge costs ~22px here and the colour swatch already tells you
     which player the row is; position is on the chips above either way. */
  .stx-solo .stx-team-cell small{display:none}
  .stx-solo th,.stx-solo td{padding-left:3px;padding-right:3px}
  .stx-solo .stx-swatch{width:8px;height:8px;margin-right:4px}
  .stx-leadlist{min-width:0}
  .stx-wk{flex:1 1 44%}
  /* The chart keeps its 640px floor — 17 weeks squeezed into 264px would be
     slivers with unreadable labels — but at this width it is not obvious it
     scrolls, so say so rather than letting it look cut off. */
  .stx-svg{min-width:560px}
  .stx-chart{position:relative}
  .stx-chart::after{content:"Swipe the chart sideways to see every week";display:block;padding-top:6px;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);position:sticky;left:0}
  /* Four salaries on one no-wrap row at 375px left each input 43px wide for a
     70px number, so $8,700 rendered as "870" — a wrong price, not just a tight
     one. Two per row instead, each input as wide as its box. */
  .stx-sal-row{flex-wrap:wrap;gap:12px 14px}
  .stx-sal{flex:1 1 calc(50% - 7px);min-width:0}
  .stx-sal b{font-size:23px}
  .stx-sal-in{width:100%;max-width:none;font-size:22px}
  .stx-sal-total{flex:1 1 100%;margin-left:0;flex-direction:row;align-items:baseline;justify-content:space-between;padding:10px 14px}
  .stx-sal-total b{margin-top:0}
  .stx-grid{grid-template-columns:1fr}
  .stx-wo-grid{grid-template-columns:1fr}
  .stx-tile b{font-size:28px}
  .stx-table{font-size:15px}
  /* Five columns on a phone: the fixed percentages leave ~34px a column and
     clip "4 / 12" mid-word. Let the columns size to their content instead, and
     drop the rate bars — at this width they are a few pixels of orange and say
     nothing the percentage next to them does not. */
  .stx-ceil{table-layout:auto;font-size:13px}
  .stx-ceil th,.stx-ceil td{padding:8px 3px}
  .stx-ceil th{font-size:10.5px;letter-spacing:.02em}
  .stx-ceil td b{font-size:15px}
  .stx-ceil th:first-child,.stx-ceil td:first-child,
  .stx-ceil th:nth-child(2),.stx-ceil td:nth-child(2),
  .stx-ceil th:nth-child(4),.stx-ceil td:nth-child(4),
  .stx-ceil th.stx-rate-col,.stx-ceil td.stx-rate-col{width:auto}
  .stx-ceil .stx-track{display:none}
  .stx-ceil .stx-rate{gap:0}
  .stx-ceil .stx-rate b{flex:0 0 auto}
  /* Same treatment for the 3x/4x/5x value table in the salary card: at this
     width the bar was a 20px stub and the 48% it claimed squeezed "10 / 31"
     onto two lines. */
  .stx-salary .stx-rates .stx-rate-col{width:auto}
  .stx-salary .stx-rates .stx-track{display:none}
  .stx-salary .stx-rates .stx-rate{gap:0}
  .stx-salary .stx-rates .stx-rate b{flex:0 0 auto}
  /* Five columns overflow the card by 90px at this width. Targets a game is the
     one to lose: share of targets says the same thing, normalised. */
  .stx-def-tgt{display:none}
  .stx-def-pick{max-width:none}
  .stx-deftable{font-size:14px}
  .stx-deftable th,.stx-deftable td{padding-left:4px;padding-right:4px}
  .stx-deftable td b{font-size:17px}
  .stx-custom{width:58px;font-size:15px}
  .stx-custom-lbl{font-size:10.5px;letter-spacing:.02em}
  .stx-tabs{flex-wrap:wrap}
  .stx-tab{flex:1 1 auto;padding:10px 12px;font-size:16px;text-align:center}
  /* Eight columns will not fit a phone, and this table's whole point is the
     comparison across 3x/4x/5x — so it scrolls sideways inside its card rather
     than being squeezed into something unreadable. */
  .stx-wk-heads{grid-template-columns:1fr}
  .stx-wk-filters{gap:12px 14px}
  .stx-wk-f{flex:1 1 100%}
  .stx-wk-f select{width:100%}
  .stx-wkseg{width:100%}
  .stx-wkseg button{flex:1 1 auto;padding:9px 6px;font-size:11.5px;letter-spacing:.03em}
  /* Eight columns will not fit a phone, and dragging a table sideways hides the
     stack name — which leaves a row of percentages belonging to nobody. Same
     answer as the league table below: one card per stack. */
  .stx-wk-table,.stx-wk-table tbody,.stx-wk-table tr,.stx-wk-table td{display:block;width:auto!important;min-width:0}
  .stx-wk-table{min-width:0;font-size:15px}
  .stx-wk-table thead{display:none}
  .stx-wk-table tr{margin-bottom:10px;padding:13px 15px 11px;border:1px solid var(--line);border-left:5px solid var(--orange);background:var(--surface)}
  .stx-wk-table td{padding:4px 0;border:0;display:flex;justify-content:space-between;align-items:baseline;gap:14px}
  .stx-wk-table td::before{content:attr(data-label);flex:0 0 auto;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
  .stx-wk-table td.stx-wk-stack{display:block;padding:0 0 8px;border-bottom:1px solid var(--line);margin-bottom:6px}
  .stx-wk-table td.stx-wk-stack::before{display:none}
  .stx-wk-table td.stx-wk-stack .stx-wk-plist b{font-size:20px}
  .stx-wk-table td.stx-wk-stack .stx-wk-plist i{flex:0 0 30px;font-size:11.5px}
  .stx-wk-table td small{display:inline;margin-left:6px}
  .stx-wk-table td.stx-wk-stack small{display:block;margin-left:0}
  /* The 3x/4x/5x rows carry three facts; keep them on one line, right-aligned. */
  .stx-wk-x{flex-wrap:wrap;justify-content:flex-start!important}
  .stx-wk-x b{margin-left:auto}
  .stx-wk-x em{flex:0 0 100%;margin-top:0;text-align:right}
  .stx-wk-table td.stx-wk-x.is-ok,.stx-wk-table td.stx-wk-x.is-strong{margin:2px -15px;padding:4px 15px}
  .stx-team-row select{min-width:0;width:100%}
  .stx-team-row > div{flex:1 1 100%}

  /* Game log: one card per game. A tester called it "a lot of info piled into a
     small screen" — eight columns of numbers, each player's DK points and stat
     line stacked in a cell you had to drag sideways to reach. As a card each
     player gets his own labelled line and the combined total is the big number. */
  .stx-log,.stx-log tbody,.stx-log tr,.stx-log td{display:block;width:auto;min-width:0}
  .stx-log{min-width:0}
  .stx-log thead{display:none}
  .stx-log tr{margin-bottom:10px;padding:12px 15px 10px;border:1px solid var(--line);border-left:5px solid var(--line);background:#fff}
  .stx-log tr.is-45{border-left-color:var(--orange)}
  .stx-log tr.is-55{border-left-color:var(--orange-dark)}
  /* The row shading carried the "big game" signal; on cards the left edge does,
     so the fill would only muddy the text. */
  .stx-log tr.is-45 td,.stx-log tr.is-55 td{background:transparent}
  /* Three fixed tracks — label, points, stat line — so the points sit in the
     same place on every line. With space-between they drifted left and right
     depending on the length of the stat line beside them, which is what made
     the log unreadable: a TE with no carries pulled his score somewhere else
     entirely. */
  /* Name and score on one line with the score always flush right, stat line
     full width underneath. With space-between the score drifted left and right
     depending on the stat line beside it — a TE with no carries pulled his
     number somewhere else entirely, which is what made the log unreadable. */
  .stx-log td{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:1px 10px;padding:4px 0;border:0}
  .stx-log td::before{content:attr(data-label);font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .stx-log td b{justify-self:end;font-family:var(--display);font-size:18px}
  .stx-log td small{grid-column:1/-1;display:block;color:var(--muted);font-size:12px;line-height:1.35}
  .stx-log td.stx-log-game{display:block;padding:0 0 7px;margin-bottom:5px;border-bottom:1px solid var(--line);font-size:16px}
  .stx-log td.stx-log-game::before{display:none}
  .stx-log td.stx-log-game b{font-family:var(--display);font-size:19px;text-align:left}
  .stx-log td.stx-log-total{margin-top:5px;padding-top:6px;border-top:2px solid var(--ink)}
  .stx-log td.stx-log-total b{font-size:22px}

  /* Season distribution: one card per player. This table has seven columns and
     was never inside a scroll box, so at phone width it ran 230px past the
     card's right edge — content escaping its container, not just a tight fit. */
  .stx-dist,.stx-dist tbody,.stx-dist tr,.stx-dist td{display:block;width:auto;min-width:0}
  .stx-dist{min-width:0}
  .stx-dist thead{display:none}
  .stx-dist tr.stx-dist-row{position:relative;margin-bottom:10px;padding:12px 44px 10px 15px;border:1px solid var(--line);border-left:5px solid var(--orange);background:#fff}
  /* flex-wrap so a long value drops below its label instead of overflowing, and
     width:auto to undo the desktop `.stx-dist .stx-rate-col{width:30%}`, which
     was still pinning the share cell to 60px inside a 199px card. */
  .stx-dist td{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:2px 12px;padding:3px 0;border:0;width:auto}
  .stx-dist td.stx-rate-col{width:auto}
  .stx-dist td::before{content:attr(data-label);flex:0 0 auto;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}
  .stx-dist td.stx-team-cell{display:block;padding:0 0 7px;margin-bottom:5px;border-bottom:1px solid var(--line);white-space:normal}
  .stx-dist td.stx-team-cell::before{display:none}
  .stx-dist td.stx-team-cell b{font-family:var(--display);font-size:19px}
  /* Checkbox and expander pinned to the corner rather than eating a column. */
  .stx-dist td.stx-tick{position:absolute;top:12px;right:14px;padding:0}
  .stx-dist td.stx-tick::before{display:none}
  .stx-dist td.stx-rate-col .stx-rate{flex:1 1 auto;justify-content:flex-end;gap:8px}
  .stx-dist td.stx-rate-col .stx-track{max-width:96px}
  /* The week strip is its own block under the player it belongs to. */
  .stx-dist tr.stx-weeks-row{margin:-10px 0 10px;padding:10px 15px;border:1px solid var(--line);border-top:0;background:var(--surface)}
  .stx-dist tr.stx-weeks-row td{display:block;padding:0}
  .stx-dist tr.stx-weeks-row td::before{display:none}
  .stx-dist tr.stx-weeks-row td:first-child{display:none}

  /* The league table becomes one card per team: a horizontal scroll hid the
     team name, which left a column of percentages belonging to nobody. */
  .stx-league,.stx-league thead,.stx-league tbody,.stx-league tr,.stx-league td{display:block;width:auto;min-width:0}
  .stx-league thead{display:none}
  .stx-league{min-width:0}
  .stx-league tr{position:relative;margin-bottom:10px;padding:14px 16px 12px;border:1px solid var(--line);border-left:5px solid var(--orange);background:var(--surface)}
  .stx-league td{padding:4px 0;border:0;display:flex;justify-content:space-between;align-items:baseline;gap:14px}
  .stx-league td::before{content:attr(data-label);flex:0 0 auto;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
  .stx-league td[data-label="Rank"]{position:absolute;top:14px;right:16px;padding:0;font-family:var(--display);font-size:22px;color:var(--muted)}
  .stx-league td[data-label="Rank"]::before{content:"#";font-family:var(--display);font-size:16px;letter-spacing:0}
  .stx-league td[data-label="Team"]{display:block;padding:0 40px 8px 0;border-bottom:1px solid var(--line);margin-bottom:6px}
  .stx-league td[data-label="Team"]::before{display:none}
  .stx-league td[data-label="Team"] b{font-family:var(--display);font-size:22px;line-height:1.05}
  .stx-league td.stx-rate-col{display:block}
  .stx-league td.stx-rate-col::before{display:block;margin-bottom:4px}
  .stx-league .stx-rate{width:100%}
  .stx-league td.stx-leads{display:block}
  .stx-league td.stx-leads::before{display:block;margin-bottom:5px}
  .stx-league .stx-lead{display:inline-block;margin-right:12px}
}

/* ---------------------------------------------------------------------------
   "Without Touchdowns" tab. Appended as its own block so it lifts out in one
   deletion if the tab is ever pulled.
   --------------------------------------------------------------------------- */
.stx-notd-lede{max-width:760px;margin:26px 0 22px}
.stx-notd-lede h2{margin:0 0 10px!important;font-family:var(--display)!important;font-size:clamp(28px,3.4vw,40px);line-height:1.02;letter-spacing:-.02em}
.stx-notd-lede p{margin:0 0 10px!important;color:var(--muted);font-size:17px;line-height:1.45}
.stx-notd-lede .stx-notd-read{padding-left:14px;border-left:3px solid var(--orange);color:var(--ink)}
.stx-notd-controls{display:flex;flex-wrap:wrap;align-items:flex-end;gap:18px 26px}
.stx-notdseg{display:inline-flex;border:2px solid var(--ink);border-radius:3px;overflow:hidden;background:#fff}
.stx-notdseg button{padding:8px 14px;border:0;border-right:1px solid var(--line);background:transparent;color:var(--muted);font-family:var(--sans);font-size:12.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;white-space:nowrap}
.stx-notdseg button:last-child{border-right:0}
.stx-notdseg button.is-active{background:var(--orange);color:var(--ink)}
.stx-notdseg button:hover:not(.is-active){background:var(--surface)}
.stx-notd-note{margin:0 0 14px!important;color:var(--muted);font-size:14px;line-height:1.4}
.stx-notd-table th .stx-th-sub{display:block;margin-top:2px;font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:none;opacity:.7}
.stx-notd-table th.stx-sortable{cursor:pointer;user-select:none;white-space:nowrap}
.stx-notd-table th.stx-sortable:hover{color:var(--ink)}
.stx-notd-table th.stx-sortable i{display:inline-block;width:11px;margin-left:3px;font-style:normal;font-size:9px;color:var(--orange-dark)}
.stx-notd-name b{display:block;line-height:1.15}
.stx-notd-meta{display:block;margin-top:2px;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}
/* Not orange: the TD share is the part of a score we are arguing is the least
   dependable, so it should not wear the colour the tool uses for "good". */
.stx-bar-td{background:var(--rule-2,#c3c9d6)!important}
.stx-move.is-up{color:#237a4a}
.stx-move.is-down{color:#9c3029}
.stx-empty{margin:18px 0!important;color:var(--muted);font-size:16px}

@media (max-width:600px){
  .stx-notd-controls{gap:14px 18px}
  .stx-notdseg{width:100%}
  .stx-notdseg button{flex:1 1 auto;padding:9px 6px;font-size:11.5px;letter-spacing:.03em}
  /* Seven columns will not fit a phone, and a sideways scroll hides the name,
     which leaves a row of numbers belonging to nobody. One card per player. */
  .stx-notd-table,.stx-notd-table thead,.stx-notd-table tbody,.stx-notd-table tr,.stx-notd-table td{display:block;width:auto;min-width:0}
  .stx-notd-table thead{display:none}
  .stx-notd-table tr{position:relative;margin-bottom:10px;padding:14px 16px 12px;border:1px solid var(--line);border-left:5px solid var(--orange);background:var(--surface)}
  .stx-notd-table td{padding:4px 0;border:0;display:flex;justify-content:space-between;align-items:baseline;gap:14px}
  .stx-notd-table td::before{content:attr(data-label);flex:0 0 auto;font-family:var(--sans);font-size:11px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
  .stx-notd-table td[data-label="Rank"]{position:absolute;top:14px;right:16px;padding:0;font-family:var(--display);font-size:22px;color:var(--muted)}
  .stx-notd-table td[data-label="Rank"]::before{content:"#";font-family:var(--display);font-size:16px;letter-spacing:0}
  .stx-notd-table td[data-label="Player"],.stx-notd-table td[data-label="Offense"]{display:block;padding:0 44px 8px 0;border-bottom:1px solid var(--line);margin-bottom:6px}
  .stx-notd-table td[data-label="Player"]::before,.stx-notd-table td[data-label="Offense"]::before{display:none}
  .stx-notd-table td[data-label="Player"] b,.stx-notd-table td[data-label="Offense"] b{font-family:var(--display);font-size:22px;line-height:1.05}
  .stx-notd-table td.stx-rate-col{display:block}
  .stx-notd-table td.stx-rate-col::before{display:block;margin-bottom:4px}
  .stx-notd-table .stx-rate{width:100%}
}
