/* The Cold Front: Chicago nights, lake-effect snow, and a usable fan hub. */
:root { --ice-bright: #bcdff5; }
body { overflow-x: clip; }
.cf-atmosphere::before {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(4,12,24,.9), rgba(4,12,24,.77) 50%, rgba(4,12,24,.95)), url("../img/chicago-winter-lakefront.webp") center / cover;
}
.cf-atmosphere .cf-bands { opacity: .28; }
.cf-atmosphere .cf-aurora { background: radial-gradient(ellipse at 18% 25%, #85ccff24, transparent 52%), radial-gradient(ellipse at 85% 65%, #ff642329, transparent 54%); }
.weather-strip { padding: 7px 4%; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; font-size: 11px; }
.wx-brand { letter-spacing: .1em; }
.wx-item + .wx-item { margin-left: auto; }
.wx-gauge { font-size: 10px; }
.site-head { border-bottom-color: #ffffff12; }
.nav { gap: 2px; }
.nav a { padding: 12px 10px; }
.nav a.active { box-shadow: inset 0 -2px var(--orange-hot); border-color: transparent; background: #ff652014; }
.nav a.active::after { display: none; }
.nav a.nav-x { margin-left: 8px; }
.snow-toggle {
  position: fixed; right: max(18px, env(safe-area-inset-right)); bottom: max(18px, env(safe-area-inset-bottom)); z-index: 60;
  display: flex; align-items: center; gap: 9px; min-height: 44px; padding: 10px 15px;
  border-radius: 30px; border: 1px solid #c9eaff44; color: #eaf6ff; background: #0b1a2cef;
  backdrop-filter: blur(12px); box-shadow: 0 6px 30px #0007; cursor: pointer; font: 600 12px var(--body);
}
.snow-toggle span { color: #acdfff; font-size: 19px; }
.snow-toggle:hover { border-color: #c9eaff; }
.snow-toggle:disabled { cursor: default; opacity: .75; }
.motion-paused *, .motion-paused *::before, .motion-paused *::after { animation-play-state: paused !important; }
.motion-paused .reveal { opacity: 1; transform: none; }
.skip-link { position: fixed; left: 16px; top: -70px; padding: 12px 18px; background: #fff; color: #071426; z-index: 200; border-radius: 8px; }
.skip-link:focus { top: 12px; color: #071426; }
main:focus { outline: none; }

/* v1.13.0 — hero headline stays inside narrow phones (was min 65px, clipped on 360px screens) */
[hidden] { display: none !important; }
.reveal { opacity: 0; transform: translateY(18px); transition: opacity .6s ease, transform .6s ease; }
.reveal.is-visible { opacity: 1; transform: none; }
.hero { padding: 76px 0 36px; }
.hero-photo { background-image: linear-gradient(90deg, #030d1bed 2%, #030d1b84 55%, #030d1ba3), linear-gradient(0deg, #030d1b 0%, transparent 70%), url("../img/hero-chicago-night.webp"); background-position: center, center, center 43%; }
.hero::before { background: radial-gradient(ellipse, #8bd7ff14, transparent 65%); }
.hero-layout { display: grid; grid-template-columns: 1.08fr 1fr; gap: 58px; align-items: center; }
.hero-copy .eyebrow { color: #c1d8e8; font-size: 11px; letter-spacing: .22em; }
.hero h1 { font-size: clamp(65px, 7vw, 106px); max-width: none; line-height: .96; letter-spacing: -.025em; margin: 24px 0; }
.hero h1 .hot { filter: none; animation: none; text-shadow: 0 0 55px #fc5c2036; }
.hero .sub { font-size: 16px; max-width: 440px; line-height: 1.75; color: #c7d5e1; }
.hero-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 28px; }
.btn { min-height: 44px; }
.hero-actions .primary { background: #ef571c; box-shadow: 0 6px 30px #ee551a27; border-color: #ef571c; padding: 13px 22px; }
.hero-actions .primary:hover { background: #ff723b; transform: translateY(-2px); }
.hero-note { display: flex; align-items: center; gap: 9px; color: #86a4bb; font-size: 11px; margin-top: 20px; letter-spacing: .05em; }
.hero-note::before { content: ""; width: 6px; height: 6px; background: #88bddf; border-radius: 50%; box-shadow: 0 0 12px #88bddf; }
.match-card { padding: 27px; background: linear-gradient(145deg,#182b40e8,#071323f5); border: 1px solid #aecfe82e; border-top: 3px solid #f56c30; box-shadow: 0 18px 80px #0007, inset 0 1px #ffffff09; }
.match-kicker { display: flex; align-items: center; justify-content: space-between; gap: 10px; color: #a6bed1; font: 500 11px var(--body); letter-spacing: .16em; text-transform: uppercase; margin-bottom: 22px; }
.match-card h3 { font-size: 17px; letter-spacing: .035em; line-height: 1.5; }
.match-card .vs { margin: 24px 0 16px; grid-template-columns: 1fr 1.1fr 1fr; }
.match-card .abbr { font-size: 49px; line-height: 1; }
/* v1.37.0 — the hero card speaks Bears: the orange identity follows the Bears
   (not the home team), a bear identity chip marks their side, and finals carry
   the family winner treatment — the winner glows, the loser recedes, and a
   Bears win floods the card's top thread and warms the status pill. */
.match-card .side { position: relative; }
.match-card .side .abbr {
  color: #dfe9f2;
  transition: color 0.3s var(--ease-out), text-shadow 0.3s var(--ease-out);
}
.match-card .side.is-bears .abbr {
  color: #ff7941;
  text-shadow: 0 0 26px rgba(255, 110, 40, 0.42), 0 2px 12px rgba(0, 0, 0, 0.4);
}
.match-card .bears-chip {
  position: absolute;
  top: -8px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 13px;
  line-height: 1;
  display: none;
  filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.55));
}
.match-card .side.is-bears .bears-chip { display: block; }
.match-card .score {
  font-family: var(--display);
  font-size: 26px;
  color: var(--snow);
  margin-top: 6px;
  min-height: 30px;
  font-variant-numeric: tabular-nums;
  transition: color 0.3s var(--ease-out), text-shadow 0.3s var(--ease-out);
}
.match-card .score:empty { display: none; }
.match-card.final .side { transition: opacity 0.3s var(--ease-out); }
.match-card.final .side.winner .score {
  color: #fff;
  text-shadow: 0 0 22px rgba(255, 90, 31, 0.7), 0 2px 10px rgba(0, 0, 0, 0.4);
}
.match-card.final .side.loser { opacity: 0.55; }
.match-card.final .side.loser .score { color: var(--ice); text-shadow: none; }
.match-card.bears-won {
  border-top-color: var(--orange-hot);
  box-shadow: 0 18px 80px #0007, inset 0 1px #ffffff09, 0 0 34px rgba(255, 90, 31, 0.28);
}
.team-side-label { font: 500 10px var(--body); color: #7f9bb1; letter-spacing: .17em; text-transform: uppercase; margin-top: 7px; }
.match-card .mid { font-size: 10px; line-height: 1.6; color: #9ab5c8; }
.match-card .game-meta { font-size: 12px; line-height: 1.8; padding: 14px 0; border-top: 1px solid #ffffff10; }
.match-card .countdown { gap: 8px; margin-top: 8px; }
.match-card .countdown .unit { min-width: 0; flex: 1; padding: 12px 8px; background: #030b176e; border-color: #d6ecff13; }
.match-card .countdown b { font-size: 27px; }
.match-card .countdown span { font-size: 9px; letter-spacing: .14em; }
.match-footer { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-top: 20px; padding-top: 15px; border-top: 1px solid #ffffff12; font-size: 12px; }
.text-button { background: none; color: #bcdff5; border: 0; cursor: pointer; padding: 9px 0; font: inherit; }
.prediction { margin-top: 12px; padding-top: 14px; border-top: 1px solid #ffffff12; }
.prediction-fields { display: flex; align-items: end; gap: 10px; }
.prediction label { display: grid; gap: 7px; flex: 1; color: #a6bed1; font-size: 11px; }
.prediction input { width: 100%; }
.prediction .src-note { font-size: 11px; margin: 10px 0 0; }
.season-strip { display: grid; grid-template-columns: 1.4fr repeat(3,1fr); margin-top: 52px; padding: 22px 0 0; border-top: 1px solid #d5eaff24; align-items: center; gap: 22px; }
.season-strip > div + div { border-left: 1px solid #d5eaff1f; padding-left: 24px; }
.season-strip .season-brand { display: flex; align-items: center; gap: 12px; }
.season-strip img { width: 38px; height: 38px; }
.season-strip b { display: block; color: #edf4fa; font: 600 26px var(--display); font-variant-numeric: tabular-nums; }
.season-strip span { display: block; color: #95adbf; font-size: 10px; text-transform: uppercase; letter-spacing: .12em; margin-top: 3px; }
.season-brand b { font-size: 14px; letter-spacing: .1em; }
.north-layout { display: grid; grid-template-columns: 1.25fr 1fr; gap: 24px; align-items: start; }
.north-layout .card { background: #0d1d2edd; }
.section-head h2 { font-size: clamp(23px,3vw,32px); letter-spacing: .02em; }
.section-head .tag { font-size: 10px; }
.section-head a { margin-left: auto; font-size: 12px; }
.north-games { display: grid; gap: 10px; }
.mini-game { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 18px; padding: 16px 18px; border: 1px solid #d4eaff19; border-radius: 10px; background: #0a192acc; transition: border-color .2s, background .2s; }
.mini-game:hover { border-color: #ff79417a; background: #132840; }
.mini-game.our-game { border-left: 3px solid #ff7941; }
.mini-game strong { display: block; font: 500 18px var(--display); color: #f1f6fb; letter-spacing: .04em; }
.mini-game span { display: block; font-size: 11px; color: #90aabd; margin-top: 4px; }
.mini-game .mini-status { text-align: right; }
.front-news { display: grid; grid-template-columns: repeat(4,1fr); gap: 20px; }
.story-card { display: flex; flex-direction: column; overflow: hidden; border: 1px solid #e3f2ff18; border-radius: 13px; background: #0c1b2df2; transition: transform .25s,border-color .25s; }
.story-card:hover, .story-card:focus-within { transform: translateY(-5px); border-color: #e76c3680; }
/* v1.21.0 — story-card micro-interactions: the art zooms under a frosted
   gradient, the source becomes a tag chip, and the headline warms to orange.
   The global reduced-motion rule flattens every transition here to a snap. */
.story-art { display: block; position: relative; overflow: hidden; }
.story-art::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(180deg, transparent 48%, rgba(5, 13, 24, 0.62) 100%);
  opacity: 0.85; transition: opacity 0.35s ease;
}
.story-card:hover .story-art::after, .story-card:focus-within .story-art::after { opacity: 1; }
.story-image { width: 100%; height: 164px; object-fit: cover; background: #152638; transition: transform 0.45s cubic-bezier(0.2, 0.7, 0.2, 1); }
.story-card:hover .story-image, .story-card:focus-within .story-image { transform: scale(1.07); }
.story-copy .story-source {
  align-self: flex-start; padding: 4px 10px;
  border: 1px solid rgba(255, 148, 95, 0.4); border-radius: 999px;
  background: rgba(255, 122, 65, 0.1);
}
.story-copy h3 { transition: color 0.2s ease; }
.story-card:hover .story-copy h3, .story-card:focus-within .story-copy h3 { color: var(--orange-hot); }
.story-copy .story-end { margin-top: auto; display: flex; justify-content: space-between; color: #8aa5ba; font-size: 11px; }
.front-news > .empty { grid-column: 1 / -1; }
.quick a { background: #0a1b2bed; border-color: #d4eaff1b; min-height: 145px; padding: 23px; }
.quick a .ico { font-size: 23px; }
.quick a .desc { line-height: 1.6; }
.city-tile { min-height: 190px; }
.city-tile-label strong { display: block; font-size: 21px; letter-spacing: .025em; margin-top: 5px; }
.page-intro h1 { font-size: clamp(34px,5vw,60px); letter-spacing: -.025em; }
.page-intro { padding-top: 48px; }
.site-foot { margin-top: 50px; padding-bottom: 78px; }
.tbl-wrap { max-width: 100%; }
.tbl th { white-space: nowrap; }
.filter-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 18px 0; }
.filter-chip { border: 1px solid #d2eaff2e; border-radius: 25px; min-height: 40px; padding: 9px 16px; background: #0b1d2d; color: #b9cddd; font: 500 12px var(--body); cursor: pointer; }
.filter-chip[aria-pressed="true"] { background: #f36a25; color: #071423; border-color: #f36a25; }
.filter-chip:hover { border-color: #f36a25; }
.roster-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 16px; }
.player-card { position: relative; overflow: hidden; border: 1px solid #d6eaff22; border-radius: 13px; background: linear-gradient(140deg,#192e44,#0a1729); }
.player-portrait { height: 170px; overflow: hidden; background: radial-gradient(ellipse at bottom,#52758c66,transparent 72%); position: relative; display: flex; justify-content: center; }
.player-portrait img { position: relative; height: 100%; max-width: 100%; object-fit: contain; z-index: 1; }
.player-number { position: absolute; top: 10px; left: 16px; color: #bcd7e821; font: 700 92px/1 var(--display); }
.player-info { position: relative; padding: 18px; border-top: 1px solid #d2eaff15; }
.player-info h3 { font: 600 17px var(--body); text-transform: none; letter-spacing: -.02em; margin: 7px 0; }
.player-info p { font-size: 11px; color: #8ca7bd; line-height: 1.7; margin: 8px 0; }
.player-info .player-link { font-size: 11px; }
.favorite-button { position: absolute; right: 10px; top: 10px; z-index: 2; border-radius: 50%; width: 40px; height: 40px; border: 1px solid #d4eaff38; color: #bdd4e6; background: #081724d9; cursor: pointer; font-size: 21px; }
.favorite-button[aria-pressed="true"] { color: #ff975a; border-color: #ff975a; }
.roster-grid .empty { grid-column: 1/-1; }
@media (max-width:1100px) { .hero-layout { gap: 28px; } .front-news { grid-template-columns: repeat(2,1fr); } .roster-grid { grid-template-columns: repeat(3,1fr); } }
@media (max-width:960px) { .nav { max-height: calc(100dvh - 120px); overflow-y: auto; } .nav a { padding: 13px 16px; } .nav a.nav-x { margin-left: 0; } .weather-strip { gap: 5px 12px; } .wx-gauge { display: none; } }
@media (max-width:760px) {
  .hero { padding: 44px 0 28px; } .hero-layout,.north-layout { grid-template-columns: 1fr; gap: 30px; }
  .hero h1 { font-size: clamp(42px, 12.5vw, 68px); } .hero .sub { max-width: 530px; font-size: 15px; }
  .hero-photo { background-position: center,center,62% top; }
  .season-strip { margin-top: 28px; grid-template-columns: repeat(3,1fr); gap: 14px; }
  .season-strip .season-brand { display: none; } .season-strip > div + div { padding-left: 15px; } .season-strip > div:nth-child(2) { border-left: 0; padding-left: 0; }
  .roster-grid { grid-template-columns: repeat(2,1fr); } .city-strip { grid-template-columns: 1fr; }
  .city-tile { min-height: 170px; } .section-head { gap: 10px; flex-wrap: wrap; } .section-head .rule { display: none; }
  .section-head .tag { display: none; } .wx-item + .wx-item { display: none; }
  .snow-toggle { padding: 9px 12px; font-size: 11px; right: 12px; bottom: 12px; }
}
@media (max-width:440px) {
  .wrap { width: 92%; } .match-card { padding: 21px; } .match-card .abbr { font-size: 41px; }
  .hero h1 { font-size: clamp(36px, 13vw, 52px); line-height: 0.96; }
  .front-news { grid-template-columns: 1fr; } .story-image { height: 200px; }
  .hero-actions .btn { flex: 1; justify-content: center; padding: 12px 10px; }
  .player-portrait { height: 136px; } .player-info { padding: 13px; } .player-info h3 { font-size: 14px; }
  .roster-grid { gap: 10px; } .roster-grid .st { font-size: 9px; } .match-footer { font-size: 11px; }
}
@media (prefers-reduced-motion:reduce) {
  .reveal { opacity: 1; transform: none; } #snow { display: none; }
  *,*::before,*::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
}

/* Snow floats over the stadium imagery without intercepting controls. */
#snow { z-index: 4; }
.hero-photo[data-cf-hero-rotator] { background-image: none; }

/* v1.14.0 — "The Wire" headlines ticker: full-bleed divider under the hero.
   CSS-driven marquee; pauses on hover/focus; static wrap list for reduced motion. */
.wire-ticker {
  display: flex; align-items: stretch;
  border-top: 1px solid #d5eaff22; border-bottom: 1px solid #d5eaff22;
  background: linear-gradient(90deg, #0a1626f2, #0d1e33f2 40%, #0a1626f2);
  overflow: hidden;
}
.wire-ticker-label {
  flex: none; display: flex; align-items: center; gap: 8px;
  padding: 11px 18px; background: #f36a25; color: #071423;
  font: 700 11px var(--display); letter-spacing: .18em; white-space: nowrap;
}
.wire-ticker-label .wt-snow { font-size: 13px; }
.wire-ticker-viewport { flex: 1; overflow: hidden; position: relative; mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent); -webkit-mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent); }
.wire-ticker-track { display: inline-flex; align-items: center; width: max-content; min-height: 44px; animation: wire-scroll 60s linear infinite; }
.wire-ticker:hover .wire-ticker-track, .wire-ticker:focus-within .wire-ticker-track { animation-play-state: paused; }
@keyframes wire-scroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.wt-group { display: inline-flex; align-items: center; }
/* v1.45.0 — ticker item glow-up: headlines warm to snow with a soft orange glow
   under attention (mirroring the wire-card headline treatment), the source chip
   ignites, and the snowflake separator sparkles as each headline passes. A real
   :focus-visible ring closes the keyboard gap on the moving marquee (focus
   already pauses the scroll). Reduced-motion snaps every transition. */
.wt-item { display: inline-flex; align-items: baseline; gap: 8px; padding: 4px 8px; color: #d7e6f2; font-size: 12.5px; white-space: nowrap; text-decoration: none; border-radius: 6px; transition: color 0.22s var(--ease-out), text-shadow 0.22s var(--ease-out); }
.wt-item:hover, .wt-item:focus-visible { color: #fff; text-shadow: 0 0 14px rgba(255, 122, 40, 0.55); text-decoration: underline; text-decoration-color: #f36a25; text-underline-offset: 3px; }
.wt-item:focus-visible { outline: 2px solid var(--orange-hot); outline-offset: 2px; }
.wt-src { flex: none; color: #ff945f; font: 600 9.5px var(--body); letter-spacing: .14em; text-transform: uppercase; transition: color 0.22s var(--ease-out), text-shadow 0.22s var(--ease-out); }
.wt-item:hover .wt-src, .wt-item:focus-visible .wt-src { color: #ffd9bd; text-shadow: 0 0 10px rgba(255, 122, 40, 0.7); }
.wt-sep { color: #88bddf; font-size: 11px; margin: 0 18px; opacity: .7; transition: color 0.22s var(--ease-out), opacity 0.22s var(--ease-out), text-shadow 0.22s var(--ease-out); }
.wt-item:hover + .wt-sep, .wt-item:focus-visible + .wt-sep { color: #cfeaff; opacity: 1; text-shadow: 0 0 10px rgba(136, 189, 223, 0.9); }
.wire-ticker-standby { color: #7f9bb1; font-size: 12px; padding-left: 18px; white-space: nowrap; }
@media (prefers-reduced-motion: reduce) {
  .wire-ticker-track { animation: none; width: auto; flex-wrap: wrap; row-gap: 6px; padding: 8px 0; }
  .wire-ticker-viewport { mask-image: none; -webkit-mask-image: none; }
  .wt-item, .wt-src, .wt-sep { transition: none; }
}
@media (max-width: 760px) {
  .wire-ticker-label { padding: 10px 12px; font-size: 10px; letter-spacing: .12em; }
  .wt-sep { margin: 0 12px; }
}

/* v1.15.0 — Polymarket implied-probability bars: the crowd's lean at a glance.
   Static render (no animation), so it stays honest under prefers-reduced-motion. */
.poly-bar {
  grid-column: 1 / -1;
  display: flex;
  height: 7px;
  margin: 2px 0 4px;
  border-radius: 999px;
  overflow: hidden;
  background: rgba(7, 14, 26, 0.8);
  border: 1px solid rgba(255, 255, 255, 0.07);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);
}
.poly-bar i { display: block; height: 100%; min-width: 0; }
.poly-bar .yes {
  background: linear-gradient(90deg, #2e7d52, #7fd6a4);
  box-shadow: 0 0 12px rgba(76, 175, 125, 0.5);
}
.poly-bar .no {
  background: linear-gradient(90deg, #e8541e, #8f2d05);
  opacity: 0.6;
}

/* v1.22.0 — hero entrance choreography: the front rolls in piece by piece.
   Frost-fade load-in staggered eyebrow → headline → sub → CTAs → note →
   matchup card → season strip → wire ticker. Gated on no-preference so
   reduced-motion users (and the global motion kill-switches) see the hero
   instantly, and `both` fill-mode holds the pre-delay state while the page paints. */
@keyframes cf-hero-rise {
  from { opacity: 0; transform: translateY(26px); filter: blur(6px); }
  to   { opacity: 1; transform: none; filter: blur(0); }
}
@media (prefers-reduced-motion: no-preference) {
  .hero-copy .eyebrow       { animation: cf-hero-rise 0.8s cubic-bezier(0.22,0.61,0.21,1) 0.05s both; }
  .hero-copy h1            { animation: cf-hero-rise 0.9s cubic-bezier(0.22,0.61,0.21,1) 0.15s both; }
  .hero-copy .sub          { animation: cf-hero-rise 0.8s cubic-bezier(0.22,0.61,0.21,1) 0.28s both; }
  .hero-actions            { animation: cf-hero-rise 0.8s cubic-bezier(0.22,0.61,0.21,1) 0.40s both; }
  .hero-note               { animation: cf-hero-rise 0.8s cubic-bezier(0.22,0.61,0.21,1) 0.50s both; }
  .hero-layout .match-card { animation: cf-hero-rise 1.0s cubic-bezier(0.22,0.61,0.21,1) 0.48s both; }
  .season-strip            { animation: cf-hero-rise 0.8s cubic-bezier(0.22,0.61,0.21,1) 0.66s both; }
  .wire-ticker             { animation: cf-hero-rise 0.8s cubic-bezier(0.22,0.61,0.21,1) 0.78s both; }
}

/* v1.23.0 — photo-band recomposition: sub-page bands stop reading as a
   "floating sticker in a dark void". The dark overlay now falls off toward
   the right so the Chicago photography shows through, every crushed
   background gets lifted ~10-15%, the loose art badges overlap into one
   anchored emblem with a frost aura, and the inner rhythm tightens. */
.photo-band .photo-band-inner { min-height: 200px; padding: 30px 26px; gap: 20px; }
.photo-band::before {
  background:
    linear-gradient(90deg, rgba(2,6,14,0.86) 0%, rgba(2,6,14,0.5) 46%, rgba(2,6,14,0.22) 100%),
    linear-gradient(180deg, rgba(2,6,14,0.16) 0%, rgba(2,6,14,0.58) 100%),
    radial-gradient(ellipse 50% 70% at 82% 50%, rgba(255,90,31,0.2), transparent 70%);
}
/* Lift the crushed photography back out of the dark — copy sits left where
   the overlay stays deepest, so contrast is untouched where it matters. */
.photo-band .photo-band-bg { filter: saturate(0.98) brightness(0.86); }
.photo-band.theatre .photo-band-bg { filter: saturate(1.05) brightness(0.75); }
.photo-band.bean .photo-band-bg { filter: saturate(0.92) brightness(0.72); }
.photo-band.bean-dusk .photo-band-bg { filter: saturate(0.95) brightness(0.8); }
.photo-band.cta-night .photo-band-bg { filter: saturate(1.05) brightness(0.78); }
.photo-band.buckingham .photo-band-bg { filter: saturate(0.9) brightness(0.82); }
.photo-band.grant-park .photo-band-bg { filter: saturate(1.05) brightness(0.72); }
.photo-band.river-skyline .photo-band-bg { filter: saturate(1.02) brightness(0.7); }
.photo-band.lakefront-night .photo-band-bg { filter: saturate(1.08) brightness(0.7); }
.photo-band.north-ave .photo-band-bg { filter: saturate(1.05) brightness(0.7); }
.photo-band.navy-pier .photo-band-bg { filter: saturate(1.08) brightness(0.7); }
.photo-band.lincoln-park .photo-band-bg { filter: saturate(1.05) brightness(0.7); }
.photo-band.marina-city .photo-band-bg { filter: saturate(0.95) brightness(0.78) contrast(1.08); }
/* The badges compose into one overlapping emblem with a frost aura, so they
   sit *in* the scene instead of floating apart in a void. */
.photo-band .photo-band-art {
  position: relative;
  isolation: isolate;
  gap: 0;
  padding: 12px 6px 12px 34px;
  margin-right: 4px;
}
.photo-band .photo-band-art::before {
  content: "";
  position: absolute;
  inset: -10px -14px;
  z-index: -1;
  background: radial-gradient(ellipse 58% 52% at 60% 50%, rgba(255,106,40,0.15), rgba(8,18,32,0) 72%);
  pointer-events: none;
}
.photo-band .photo-band-art .art-mark:first-child { transform: translateY(-9px) rotate(-4deg); }
.photo-band .photo-band-art .art-mark:last-child { transform: translateY(11px) rotate(5deg); }
.photo-band .photo-band-art .art-mark + .art-mark { margin-left: -30px; }
@media (max-width: 960px) {
  .photo-band .photo-band-inner { padding: 24px 18px; min-height: 0; }
  .photo-band .photo-band-art { padding: 8px 0; margin-right: 0; }
  .photo-band .photo-band-art .art-mark:first-child { transform: translateY(-6px) rotate(-4deg); }
  .photo-band .photo-band-art .art-mark:last-child { transform: translateY(7px) rotate(5deg); }
  .photo-band .photo-band-art .art-mark + .art-mark { margin-left: -20px; }
}

/* v1.33.0 — stats page last-game box score: from inline-styled text to a real
   final scorecard. Frosted glass with the orange identity leading-edge
   thread; the winner's row glows (mirroring the game-card final treatment)
   while the loser recedes until hovered; the Bears row carries the 🐻 chip.
   Entrance frost-fades on first paint; the 2-minute refresh re-renders stay
   instant (stats.js only adds .cf-enter on the first load). */
@keyframes bxRise {
  from { opacity: 0; transform: translateY(14px); filter: blur(3px); }
}
.bx-card {
  position: relative;
  overflow: hidden;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius);
  background:
    linear-gradient(165deg, rgba(255,255,255,0.035) 0%, transparent 45%),
    var(--glass);
  backdrop-filter: blur(16px) saturate(1.2);
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
  box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.06);
  padding: 18px 20px 16px;
  margin-bottom: 16px;
}
.bx-card::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange-hot) 55%, rgba(255,180,140,0.35) 100%);
  box-shadow: 0 0 18px rgba(255,90,31,0.5);
  opacity: 0.85;
  pointer-events: none;
}
.bx-card.cf-enter { animation: bxRise 0.45s var(--ease-out) backwards; }
.bx-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.pill.result-loss { color: var(--ice); border-color: var(--line-2); background: rgba(11,22,38,0.5); }
.pill.result-tie { color: var(--snow); border-color: var(--glass-border-hot); background: rgba(25,46,68,0.5); }
.bx-teams { display: grid; gap: 8px; }
.bx-team {
  display: grid;
  grid-template-columns: auto minmax(0,1fr) auto;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
  border-radius: 10px;
  border: 1px solid transparent;
  transition: opacity 0.22s var(--ease-out), border-color 0.2s var(--ease-out), background 0.2s var(--ease-out);
}
.bx-abbr {
  font-family: var(--display);
  font-size: 13px;
  letter-spacing: 0.14em;
  color: var(--steel);
  border: 1px solid var(--line-2);
  border-radius: 6px;
  padding: 3px 9px;
  background: rgba(5,11,22,0.6);
  white-space: nowrap;
}
.bx-name {
  font-size: 15px;
  color: var(--snow);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.bx-chip {
  display: inline-block;
  vertical-align: 1px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orange-hot);
  border: 1px dashed rgba(255,90,31,0.55);
  border-radius: 999px;
  padding: 1px 8px;
  margin-left: 8px;
  white-space: nowrap;
}
.bx-score {
  font-family: var(--display);
  font-size: 34px;
  line-height: 1;
  color: var(--snow);
  font-variant-numeric: tabular-nums;
  min-width: 2ch;
  text-align: right;
}
/* Winner glows like a final game-card side; the Bears win also tints the row. */
.bx-team.winner { background: rgba(200,56,3,0.10); border-color: rgba(255,90,31,0.28); }
.bx-team.winner .bx-abbr {
  color: var(--orange-hot);
  border-color: rgba(255,90,31,0.55);
  text-shadow: 0 0 18px rgba(255,90,31,0.6);
}
.bx-team.winner .bx-score {
  color: var(--snow);
  text-shadow: 0 0 22px rgba(255,90,31,0.65), 0 2px 10px rgba(0,0,0,0.4);
}
/* Loser recedes until the fan comes back for a look. */
.bx-team.loser { opacity: 0.55; }
.bx-team.loser:hover { opacity: 1; }
.bx-card:focus-within .bx-team.loser { opacity: 1; }
.bx-meta {
  margin-top: 12px;
  font-size: 12.5px;
  color: var(--text-dim);
  display: flex;
  gap: 8px;
  align-items: center;
  flex-wrap: wrap;
}
.bx-meta .wx-dot { flex: 0 0 auto; }
@media (max-width: 560px) {
  .bx-card { padding: 14px 14px 12px; }
  .bx-score { font-size: 28px; }
  .bx-name { font-size: 13.5px; }
}
@media (prefers-reduced-motion: reduce) {
  .bx-card.cf-enter { animation: none; }
  .bx-team { transition: none; }
}

/* v1.34.0 — stats page season-pulse tiles become real stat cards. Frosted
   glass with the orange identity leading-edge thread; the record number
   glows warm on a winning record and recedes on a losing one (mirroring the
   season-log W/L row treatment), while the differential number tints
   ice-green when positive and recedes cool when negative. Staggered
   frost-fade entrance on first paint only — the 2-minute refresh re-renders
   stay instant (stats.js only adds .cf-enter on the first load).
   Reduced-motion snaps. */
@keyframes tileRise {
  from { opacity: 0; transform: translateY(12px); filter: blur(2px); }
}
.stat-tile { position: relative; overflow: hidden; }
.stat-tile::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange-hot) 55%, rgba(255,180,140,0.35) 100%);
  box-shadow: 0 0 18px rgba(255,90,31,0.5);
  opacity: 0.85;
  pointer-events: none;
}
.stat-tile b { font-variant-numeric: tabular-nums; }
.stat-tile.cf-enter { animation: tileRise 0.4s var(--ease-out) backwards; animation-delay: calc(var(--ni, 0) * 0.07s); }
/* Winning record warms the number; losing record recedes until hovered. */
.stat-tile.record-win b { color: #ffa76b; text-shadow: 0 0 14px rgba(255,90,31,0.5); }
.stat-tile.record-loss b { opacity: 0.55; transition: opacity 0.18s ease; }
.stat-tile.record-loss:hover b { opacity: 1; }
/* Differential carries the story: ice-green when ahead, cool-dim when behind. */
.stat-tile.diff-pos b { color: #b9e3c6; text-shadow: 0 0 14px rgba(76,175,125,0.45); }
.stat-tile.diff-neg b { opacity: 0.6; }
@media (max-width: 560px) {
  .stat-tile { padding: 14px 10px; }
  .stat-tile b { font-size: 24px; }
}
@media (prefers-reduced-motion: reduce) {
  .stat-tile.cf-enter { animation: none; }
  .stat-tile.record-loss b { transition: none; }
}

/* ============================================================
   v1.35.0 — Sunday desk becomes a matchup duel card. The flat
   "vs GB" line is replaced by a frosted duel: big CHI/OPP display
   abbrs with the Bears 🐻 identity chip, a vs/@ mid carrying the
   week number, a kickoff countdown chip in the card header, and
   the orange identity leading-edge thread across the top. The
   matchup survives as sr-only text so the card's polite live
   region still announces it (the visual duel is aria-hidden).
   Entrance frost-fades on first paint only — the 3-minute refresh
   re-renders stay instant (games.js only adds .cf-enter once).
   Reduced-motion snaps. */
.next-opp-card {
  position: relative;
  overflow: hidden;
  border-color: rgba(92, 122, 153, 0.42);
  background: linear-gradient(165deg, rgba(18, 34, 56, 0.92), rgba(8, 18, 34, 0.95));
  box-shadow: var(--shadow-lift), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.next-opp-card::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange-hot) 55%, rgba(255, 180, 140, 0.35) 100%);
  box-shadow: 0 0 18px rgba(255, 90, 31, 0.5);
  opacity: 0.9;
  pointer-events: none;
}
.desk-head-chips { display: inline-flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.pill.desk-countdown {
  border-color: rgba(232, 84, 30, 0.55);
  color: #ffc79a;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.pill.desk-countdown.today {
  background: rgba(232, 84, 30, 0.18);
  box-shadow: 0 0 16px rgba(255, 90, 31, 0.35);
  color: #ffd9b8;
}
.next-opp-body { flex-direction: column; gap: 12px; }
.desk-meta-row { display: flex; flex-wrap: wrap; gap: 10px 20px; align-items: center; justify-content: space-between; }
.duel {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 10px;
  align-items: stretch;
  width: 100%;
}
.duel-side {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 3px;
  padding: 12px 14px;
  border-radius: 12px;
  border: 1px solid var(--glass-border);
  background: rgba(8, 18, 34, 0.55);
  min-width: 0;
}
.duel-side.bears {
  border-color: rgba(232, 84, 30, 0.45);
  background: linear-gradient(160deg, rgba(232, 84, 30, 0.14), rgba(8, 18, 34, 0.6) 70%);
  box-shadow: inset 0 1px 0 rgba(255, 200, 160, 0.12), 0 6px 18px rgba(209, 58, 2, 0.18);
}
.duel-side.opp {
  border-color: rgba(140, 180, 220, 0.35);
  background: linear-gradient(200deg, rgba(120, 170, 230, 0.1), rgba(8, 18, 34, 0.6) 70%);
  text-align: right;
}
.duel-abbr {
  font-family: var(--display);
  font-size: clamp(28px, 4.6vw, 42px);
  font-weight: 700;
  letter-spacing: 0.05em;
  line-height: 1;
  color: var(--snow);
  font-variant-numeric: tabular-nums;
}
.duel-side.bears .duel-abbr { color: #ffa76b; text-shadow: 0 0 16px rgba(255, 90, 31, 0.45); }
.duel-name {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12.5px;
  color: var(--text-dim);
  min-width: 0;
}
.duel-name > span:last-child { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.duel-side.opp .duel-name { justify-content: flex-end; }
.duel-bear {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px; height: 20px;
  border-radius: 6px;
  background: rgba(232, 84, 30, 0.2);
  border: 1px solid rgba(232, 84, 30, 0.5);
  font-size: 12px;
}
.duel-mid {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 0 6px;
  min-width: 64px;
}
.duel-vs {
  font-family: var(--display);
  font-size: 15px;
  letter-spacing: 0.2em;
  color: var(--text-dim);
  text-transform: uppercase;
}
.duel-week {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.12em;
  color: var(--orange-hot);
  border: 1px solid rgba(232, 84, 30, 0.4);
  border-radius: 999px;
  padding: 3px 10px;
  background: rgba(232, 84, 30, 0.1);
  white-space: nowrap;
}
@keyframes duelRise {
  from { opacity: 0; transform: translateY(10px) scale(0.98); filter: blur(2px); }
}
.duel.cf-enter .duel-side { animation: duelRise 0.45s var(--ease-out) backwards; animation-delay: calc(var(--ni, 0) * 0.08s); }
.duel.cf-enter .duel-mid { animation: duelRise 0.45s var(--ease-out) backwards; animation-delay: 0.08s; }
@media (max-width: 560px) {
  .duel { gap: 8px; }
  .duel-side { padding: 10px; }
  .duel-mid { min-width: 52px; padding: 0 2px; }
  .duel-name { font-size: 11px; }
}
@media (prefers-reduced-motion: reduce) {
  .duel.cf-enter .duel-side, .duel.cf-enter .duel-mid { animation: none; }
}

/* v1.39.0 — stats page player leaders tables become real leaderboards. The
   plain tables in the Player leaders section and the box-score leaders
   sub-table get the family treatment: an orange identity leading-edge thread
   across the top of the wrapper, a category glyph chip before each category,
   the line number in display typography with a warm glow (it's the headline
   stat), rows that warm on hover AND keyboard focus, a visible :focus-visible
   ring on the leader link, and a frost-fade entrance on first paint only —
   the 5-minute/2-minute refresh re-renders stay instant (stats.js only adds
   .cf-enter on the first load). Reduced-motion snaps. */
@keyframes ldRise {
  from { opacity: 0; transform: translateY(12px); filter: blur(2px); }
}
.tbl-wrap.ld { position: relative; overflow: hidden; overflow-x: auto; }
.tbl-wrap.ld::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange-hot) 55%, rgba(255,180,140,0.35) 100%);
  box-shadow: 0 0 18px rgba(255,90,31,0.5);
  opacity: 0.85;
  pointer-events: none;
  z-index: 2;
}
.tbl-wrap.ld.cf-enter { animation: ldRise 0.45s var(--ease-out) backwards; }
.ld-cat { white-space: nowrap; }
.ld-glyph {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px; height: 26px;
  margin-right: 10px;
  vertical-align: -7px;
  font-size: 14px;
  border: 1px solid var(--glass-border-hot);
  border-radius: 8px;
  background: linear-gradient(165deg, rgba(232,84,30,0.16), rgba(232,84,30,0.05));
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.06);
}
/* The line is the headline stat: display numerals with a warm glow. */
.ld-line {
  font-family: var(--display);
  font-size: 17px;
  letter-spacing: 0.02em;
  color: var(--snow);
  text-shadow: 0 0 14px rgba(255,90,31,0.35);
  white-space: nowrap;
}
.ld-when { white-space: nowrap; }
.tbl.ld tr.ld-row { transition: background-color 0.18s ease; }
.tbl.ld tr.ld-row:hover td,
.tbl.ld tr.ld-row:focus-within td { background: rgba(232,84,30,0.08); }
.tbl.ld .ld-leader a {
  color: var(--snow);
  font-weight: 600;
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color 0.18s ease, border-color 0.18s ease;
}
.tbl.ld .ld-leader a:hover { color: var(--orange-hot); border-bottom-color: rgba(255,90,31,0.6); }
.tbl.ld .ld-leader a:focus-visible {
  outline: 2px solid var(--orange-hot);
  outline-offset: 3px;
  border-radius: 4px;
}
@media (max-width: 560px) {
  .ld-line { font-size: 15px; }
  .ld-glyph { width: 24px; height: 24px; font-size: 12px; margin-right: 8px; }
}
@media (prefers-reduced-motion: reduce) {
  .tbl-wrap.ld.cf-enter { animation: none; }
  .tbl.ld tr.ld-row, .tbl.ld .ld-leader a { transition: none; }
}

/* v1.41.0 — division standings glow-up. The North standings (home) and the
   Division watch table (games.html) get the family treatment: an orange
   identity leading-edge thread across the top of the wrapper, the Bears row
   warmed with an orange leading edge and a 🐻 identity chip, the Pct column
   in display typography (a warm glow on our row), a 👑 DIV LEAD chip on the
   division leader that ignites orange when it's the Bears, streak pills on
   the games.html table, rows that warm on hover with keyboard parity, and a
   frost-fade entrance on first paint only — the 5-minute refreshes re-render
   instantly. Reduced-motion snaps. */
@keyframes stndRise {
  from { opacity: 0; transform: translateY(12px); filter: blur(2px); }
}
.tbl-wrap.stnd { position: relative; overflow: hidden; overflow-x: auto; }
.tbl-wrap.stnd::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange-hot) 55%, rgba(255,180,140,0.35) 100%);
  box-shadow: 0 0 18px rgba(255,90,31,0.5);
  opacity: 0.85;
  pointer-events: none;
  z-index: 2;
}
.tbl-wrap.stnd.cf-enter,
.race-bars.stnd.cf-enter { animation: stndRise 0.45s var(--ease-out) backwards; }
.tbl.stnd tr.stnd-row { transition: background-color 0.18s ease; }
.tbl.stnd tr.stnd-row:hover td,
.tbl.stnd tr.stnd-row:focus-within td { background: rgba(232,84,30,0.08); }
/* Our row: warmer tint, orange leading edge, bear identity chip. */
.tbl.stnd tr.stnd-me td { background: rgba(232,84,30,0.12); }
.tbl.stnd tr.stnd-me:hover td,
.tbl.stnd tr.stnd-me:focus-within td { background: rgba(232,84,30,0.17); }
.tbl.stnd tr.stnd-me td:first-child { box-shadow: inset 3px 0 0 var(--orange-hot); }
.stnd-bear {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 19px; height: 19px;
  margin-right: 8px;
  vertical-align: -4px;
  border-radius: 6px;
  font-size: 12px;
  background: rgba(232,84,30,0.2);
  border: 1px solid rgba(232,84,30,0.5);
  filter: drop-shadow(0 0 6px rgba(255,90,31,0.4));
}
/* Pct is the headline number: display numerals, warm glow on our row. */
.tbl.stnd .stnd-pct {
  font-family: var(--display);
  font-size: 15px;
  letter-spacing: 0.02em;
  color: var(--snow);
  font-variant-numeric: tabular-nums;
}
.tbl.stnd tr.stnd-me .stnd-pct {
  color: #ffd9c2;
  text-shadow: 0 0 14px rgba(255,90,31,0.45);
}
/* Division leader crown; ignites orange when it's the Bears. */
.stnd-crown {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-left: 8px;
  padding: 3px 8px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  white-space: nowrap;
  color: var(--ice);
  background: rgba(92,122,153,0.2);
  border: 1px solid rgba(92,122,153,0.4);
}
.stnd-crown.hot {
  color: #ffd9c2;
  background: rgba(232,84,30,0.22);
  border-color: rgba(255,90,31,0.6);
  box-shadow: 0 0 12px rgba(255,90,31,0.35);
}
/* Streak pill (games.html Division watch). */
.stnd-strk {
  display: inline-block;
  padding: 3px 9px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--ice);
  background: rgba(92,122,153,0.18);
  border: 1px solid rgba(92,122,153,0.35);
}
.stnd-strk.up { color: #ffb49a; background: rgba(232,84,30,0.2); border-color: rgba(232,84,30,0.5); }
.stnd-strk.down { color: #a8c4dc; background: rgba(60,90,120,0.2); border-color: rgba(92,122,153,0.45); }
@media (max-width: 560px) {
  .stnd-pct, .tbl.stnd .stnd-pct { font-size: 13.5px; }
  .stnd-crown { font-size: 9px; padding: 2px 7px; margin-left: 6px; }
}
@media (prefers-reduced-motion: reduce) {
  .tbl-wrap.stnd.cf-enter,
  .race-bars.stnd.cf-enter { animation: none; }
  .tbl.stnd tr.stnd-row { transition: none; }
}

/* ============================================================
   v1.43.0 — odds board glow-up.
   The league-wire odds cards (.odds-card) and the Polymarket
   cards (.poly-card) get the family treatment: an orange identity
   leading-edge thread across the top that ignites on hover or
   keyboard focus, :focus-within parity for the hover lift with a
   visible :focus-visible ring on the details links, a warm tint on
   the odds row carrying the BEST chip so the winning line reads
   at a glance, and a staggered frost-fade entrance on first paint
   only — the 60-second auto-refreshes re-render instantly.
   Reduced-motion snaps the entrance and the transitions.
   ============================================================ */
@keyframes oddsRise {
  from { opacity: 0; transform: translateY(12px); filter: blur(2px); }
}
.odds-card, .poly-card { position: relative; overflow: hidden; }
.odds-card::before, .poly-card::before {
  content: "";
  position: absolute;
  z-index: 2;
  left: 0; right: 0; top: 0;
  height: 2px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange) 55%, rgba(159, 184, 204, 0.35) 85%, transparent);
  box-shadow: 0 0 14px rgba(255, 90, 31, 0.55);
  opacity: 0;
  transition: opacity 0.22s ease;
  pointer-events: none;
}
.odds-card:hover::before, .odds-card:focus-within::before,
.poly-card:hover::before, .poly-card:focus-within::before { opacity: 1; }
.odds-card:hover, .odds-card:focus-within {
  border-color: var(--glass-border-hot);
  transform: translateY(-3px);
  box-shadow: var(--shadow-lift), var(--rim-glow);
}
.poly-card:hover, .poly-card:focus-within {
  border-color: var(--glass-border-hot);
  transform: translateY(-2px);
  box-shadow: var(--shadow-lift), var(--rim-glow);
}
.odds-card a:focus-visible, .poly-card a:focus-visible {
  outline: 2px solid var(--orange-hot);
  outline-offset: 2px;
  border-radius: 4px;
}
/* The row holding the BEST chip warms so the winning line reads at a glance. */
.odds-row:has(b.best) {
  background: rgba(255, 90, 31, 0.08);
  border-radius: 6px;
  padding: 3px 8px;
  margin: 0 -8px;
}
.best-strip.cf-enter, .odds-card.cf-enter, .poly-card.cf-enter {
  animation: oddsRise 0.45s var(--ease-out) backwards;
  animation-delay: calc(var(--ni, 0) * 0.06s);
}
@media (prefers-reduced-motion: reduce) {
  .best-strip.cf-enter, .odds-card.cf-enter, .poly-card.cf-enter { animation: none; }
  .odds-card, .poly-card, .odds-card::before, .poly-card::before { transition: none; }
  .odds-card:hover, .odds-card:focus-within { transform: none; }
  .poly-card:hover, .poly-card:focus-within { transform: none; }
}

/* v1.44.0 — practice tracker week-intel treatment. The tracker table
   (practice.html) joins the family: an orange identity leading-edge thread
   across the top of the wrapper, an intensity leading-edge on every row
   (Off → ice, Walk → steel, Light → amber, Full → orange, Game day → hot
   orange), a warmed today row, rows that warm on hover with keyboard parity,
   and a frost-fade entrance on first paint only — the 5-minute refresh
   re-renders instantly. Reduced-motion snaps. */
@keyframes trkRise {
  from { opacity: 0; transform: translateY(12px); filter: blur(2px); }
}
.tbl-wrap.trk { position: relative; overflow: hidden; overflow-x: auto; }
.tbl-wrap.trk::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--orange-hot), var(--orange-hot) 55%, rgba(255,180,140,0.35) 100%);
  box-shadow: 0 0 18px rgba(255,90,31,0.5);
  opacity: 0.85;
  pointer-events: none;
  z-index: 2;
}
.tbl-wrap.trk.cf-enter { animation: trkRise 0.45s var(--ease-out) backwards; }
.tbl.trk tr.trk-row { transition: background-color 0.18s ease; }
.tbl.trk tr.trk-row:hover td,
.tbl.trk tr.trk-row:focus-within td { background: rgba(232,84,30,0.08); }
/* Intensity leading-edges, mirroring the injury severity treatment. */
.tbl.trk tr.trk-lv0 td:first-child { box-shadow: inset 3px 0 0 rgba(92,122,153,0.55); }
.tbl.trk tr.trk-lv1 td:first-child { box-shadow: inset 3px 0 0 rgba(122,167,204,0.7); }
.tbl.trk tr.trk-lv2 td:first-child { box-shadow: inset 3px 0 0 var(--warn); }
.tbl.trk tr.trk-lv3 td:first-child { box-shadow: inset 3px 0 0 var(--orange); }
.tbl.trk tr.trk-lv4 td:first-child { box-shadow: inset 3px 0 0 var(--orange-hot); }
/* Today reads first: warmed row that deepens under attention. */
.tbl.trk tr.trk-row.trk-today td { background: rgba(232,84,30,0.1); }
.tbl.trk tr.trk-row.trk-today:hover td,
.tbl.trk tr.trk-row.trk-today:focus-within td { background: rgba(232,84,30,0.15); }
@media (prefers-reduced-motion: reduce) {
  .tbl-wrap.trk.cf-enter { animation: none; }
  .tbl.trk tr.trk-row { transition: none; }
}
