:root{
  --bg:#000000;            /* app backdrop — near black */
  --surface:#101013;       /* card surface */
  --surface-2:#17171c;     /* elevated / row hover */
  --surface-3:#1e1e24;
  --line:rgba(255,255,255,.09);
  --line-2:rgba(255,255,255,.15);
  --text:#f4f6f8;
  --muted:#9aa1ac;
  /* A11Y 2026-07-13: was #6b7280, which measured 3.93–4.14:1 against the app's
     surfaces — under the 4.5:1 AA floor for small text. It carries the bottom-tab
     labels, card subtitles and meta lines, i.e. a lot of the app's small copy.
     axe never flagged it: it could not resolve the backdrop behind 102 elements
     (gradients + backdrop-filter) and quietly filed them as "incomplete" rather
     than as violations, so the app reported 0 while genuinely failing.
     #7b828f is the smallest step that clears AA on every surface (worst case
     4.91:1) while staying clearly darker than --muted (#9aa1ac), so the muted /
     muted-2 hierarchy is preserved. */
  --muted-2:#7b828f;
  --blue:#5284ff;          /* the brand blue lifted for TEXT. Same hue as --accent,
                            one step lighter so small copy clears AA (4.82:1 on the
                            worst surface). --accent as text is only 3.68:1, which
                            is why these two cannot be the same value. */
  --blue-deep:#2e6bff;
  --accent:#2e6bff;        /* THE RinkWire blue. Fills, buttons, active controls and
                            every piece of brand art. Hue 222.5; every other blue
                            in the app and on the site is a lightness step of it. */
  --blue-glow:rgba(82,132,255,.16);
  --green:#2ee06a;         /* Final */
  --red:#ff5468;           /* Live */
  --amber:#ffc24b;
  --shadow:0 18px 40px rgba(0,0,0,.55);
  --r:16px;                /* card radius */
  --r-sm:11px;
  --tabbar-h:70px;         /* content zone for icon + label (2026-07-21: iPhone 16 Pro was clipping labels; tightened per Paul) */
  --header-h:50px;
  --strip-h:112px;
  --maxw:430px;
  font-synthesis-weight:none;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0}
body{
  background:
    radial-gradient(120% 55% at 50% -10%, #000000 0%, rgba(0,0,0,0) 60%),
    var(--bg);
  color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI",Inter,Roboto,Helvetica,Arial,sans-serif;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  min-height:100dvh;
}
/* ------- Desktop: frame the app like a device so it reads as an app ------- */
.rw-app{
  position:relative;
  width:100%;
  max-width:var(--maxw);
  margin:0 auto;
  height:100dvh;                 /* fixed app frame: only the middle scrolls */
  display:flex;flex-direction:column;
  background:var(--bg);
  overflow:hidden;
}
@media (min-width:620px){
  body{padding:26px 0;}
  .rw-app{
    min-height:calc(100dvh - 52px);
    height:calc(100dvh - 52px);
    border-radius:30px;
    border:1px solid var(--line-2);
    box-shadow:0 40px 120px rgba(0,0,0,.6),0 0 0 10px #05090f;
    overflow:hidden;
    display:flex;flex-direction:column;
  }
}
button{font-family:inherit;cursor:pointer}
a{color:inherit;text-decoration:none}
::-webkit-scrollbar{width:0;height:0}

/* ---------------- Header ---------------- */
.rw-hdr{
  position:sticky;top:0;z-index:40;
  height:calc(var(--header-h) + env(safe-area-inset-top));
  padding-top:env(safe-area-inset-top);
  display:flex;align-items:center;gap:12px;
  padding-left:16px;padding-right:14px;
  background:rgba(8,8,10,.86);
  backdrop-filter:saturate(160%) blur(16px);
  -webkit-backdrop-filter:saturate(160%) blur(16px);
  border-bottom:1px solid var(--line);
}
.rw-brand{display:flex;align-items:center;gap:9px;min-width:0}
.rw-mark{
  display:flex;align-items:center;justify-content:center;
  width:34px;height:34px;border-radius:9px;
  background:linear-gradient(160deg,#1c1c22,#0d0d11);
  border:1px solid rgba(82,132,255,.5);
  box-shadow:0 0 0 1px rgba(0,0,0,.4),0 6px 16px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.06);
  font-weight:900;font-size:14px;letter-spacing:.5px;
}
.rw-mark span{color:#dfeaff}
.rw-mark .w{color:var(--blue)}
.rw-brand-text{display:flex;flex-direction:column;min-width:0;line-height:1}
.rw-brand-word{font-style:italic;font-weight:900;letter-spacing:-.045em;font-size:19px;color:#fff}
.rw-brand-word b{color:var(--blue)}
.rw-brand-img{height:22px;width:auto;display:block}
.rw-brand-sub{font-size:6.5px;font-weight:800;letter-spacing:.16em;color:var(--muted-2);text-transform:uppercase;margin-top:2px;white-space:nowrap}

/* ---------------- Launch splash ---------------- */
.rw-splash{position:absolute;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;background:#000;overflow:hidden;transition:opacity .45s ease,visibility .45s ease}
.rw-splash.hide{opacity:0;visibility:hidden;pointer-events:none}
.rw-splash-frame{position:relative;width:min(100%,calc(100vh * 2 / 3));aspect-ratio:2/3;max-height:100%;flex:0 0 auto}
.rw-splash-art{display:block;width:100%;height:100%;object-fit:contain;object-position:center;background:#000}
.rw-splash-progress{position:absolute;left:18.85%;top:74.28%;width:62.4%;height:1.05%;min-height:5px;overflow:hidden;border-radius:999px;background:#0c111a;box-shadow:0 0 0 1px rgba(255,255,255,.025)}
.rw-splash-progress i{display:block;width:0;height:100%;border-radius:inherit;background:linear-gradient(90deg,#1a5cff,#2e6bff);box-shadow:0 0 12px rgba(46,107,255,.7);animation:rwSplashLoad 3.2s cubic-bezier(.18,.72,.2,1) forwards}
@keyframes rwSplashLoad{0%{width:2%}45%{width:58%}75%{width:78%}100%{width:94%}}
@media (prefers-reduced-motion:reduce){.rw-splash-progress i{animation:none;width:72%}}

/* ---------------- Add to Home Screen banner ---------------- */
.rw-install{position:absolute;left:10px;right:10px;bottom:calc(var(--tabbar-h) + env(safe-area-inset-bottom) + 10px);z-index:45;display:flex;align-items:center;gap:11px;padding:11px 12px;border-radius:14px;background:linear-gradient(180deg,#15161b,#0c0c0f);border:1px solid var(--line-2);box-shadow:0 12px 30px rgba(0,0,0,.6);transform:translateY(14px);opacity:0;transition:opacity .24s ease,transform .24s ease}
.rw-install.on{transform:none;opacity:1}
/* 2026-09-01: display:flex above beat the [hidden] attribute the install JS
   toggles, so a dismissed (or never shown) prompt stayed laid out at opacity 0
   and took every tap in the strip above the tab bar — the runtime test's
   "favorite star has dead space" on iPhone landscape. Same rule .rw-calpop and
   .rw-gc-acts already carry. */
.rw-install[hidden]{display:none}
/* 2026-07-13: the install prompt floats above the tab bar, but .rw-scroll only
   reserved room for the TAB BAR — so while the prompt is up it sat on top of the
   last row of content (a team card, a standings row) with no way to read it short
   of dismissing the prompt. Reserve the prompt's height too, but ONLY while it is
   actually shown, so nothing changes for the (majority) case where it is not.
   :has() keeps this in CSS rather than coupling it to the install JS. */
.rw-app:has(.rw-install.on) .rw-scroll{
  padding-bottom:calc(var(--tabbar-h) + env(safe-area-inset-bottom) + 18px + 68px);
}
.rw-install .ic{flex:0 0 auto;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--blue);background:rgba(82,132,255,.12);border:1px solid rgba(82,132,255,.3)}
.rw-install .tx{flex:1;min-width:0}
.rw-install .tx b{display:block;font-size:13px;font-weight:800;color:#eaf1fb;line-height:1.2}
.rw-install .tx small{display:block;font-size:11px;color:var(--muted-2);margin-top:2px;line-height:1.3}
.rw-install .go{flex:0 0 auto;font-size:12.5px;font-weight:800;color:#fff;background:var(--accent);border:0;border-radius:10px;padding:9px 14px;cursor:pointer}
.rw-install .x{position:relative;flex:0 0 auto;width:26px;height:26px;border-radius:8px;border:0;background:none;color:var(--muted-2);font-size:20px;line-height:1;cursor:pointer}
.rw-install .x::after{content:"";position:absolute;inset:-9px} /* 26 -> 44 hit area (audit) */
.rw-hdr-right{margin-left:auto;display:flex;align-items:center;gap:9px}
.rw-hdr-search{position:relative;width:34px;height:34px;border-radius:9px;border:1px solid var(--line-2);background:rgba(255,255,255,.06);color:#cfe0f5;display:flex;align-items:center;justify-content:center;padding:0}
/* TAP TARGETS 2026-07-17 (audit): visible controls keep their locked size; an
   invisible ::after pad extends each HIT AREA to ~44x44 (Apple HIG). A pseudo-
   element is part of its parent for hit-testing, so no markup or layout moves. */
.rw-hdr-search::after{content:"";position:absolute;inset:-5px}
.rw-hdr-search:active{background:var(--surface-2)}
/* search overlay */
.rw-search{position:absolute;left:0;right:0;top:0;bottom:0;z-index:55;background:var(--bg);display:flex;flex-direction:column;transform:translateY(-6px);opacity:0;visibility:hidden;transition:opacity .16s,transform .16s}
.rw-search.on{transform:none;opacity:1;visibility:visible}
.rw-search-bar{display:flex;align-items:center;gap:6px;height:calc(var(--header-h) + env(safe-area-inset-top));padding-top:env(safe-area-inset-top);padding-left:6px;padding-right:14px;border-bottom:1px solid var(--line);background:rgba(8,8,10,.92)}
.rw-search-bar input{flex:1;background:var(--surface);border:1px solid var(--line-2);border-radius:11px;color:#eef4fb;font:inherit;font-size:16px;padding:10px 13px}
.rw-search-bar input:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-glow)}
.rw-search-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:4px 0 calc(var(--tabbar-h) + env(safe-area-inset-bottom) + 16px)}
.rw-search-group{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2);padding:14px 16px 6px}
.rw-sres{display:flex;align-items:center;gap:11px;padding:11px 16px;width:100%;text-align:left;background:none;border:0;border-bottom:1px solid rgba(255,255,255,.07);cursor:pointer;font:inherit}
.rw-sres:active{background:var(--surface)}
.rw-sres .meta{flex:1;min-width:0}
.rw-sres .nm{display:block;font-size:14.5px;font-weight:750;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-sres .nm b{color:#fff}
.rw-sres .sub{display:block;font-size:11.5px;color:var(--muted-2);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-sres .tag{font-size:9.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);padding:3px 7px;border:1px solid var(--line-2);border-radius:999px;flex:0 0 auto}
.rw-search-hint{padding:34px 24px;text-align:center;color:var(--muted-2);font-size:13px;line-height:1.5}
.rw-season{
  font-size:9.5px;font-weight:800;letter-spacing:.08em;color:#8fa3bd;
  padding:4px 8px;border-radius:999px;border:1px solid var(--line);
  background:rgba(255,255,255,.03);white-space:nowrap;
}
.rw-season b{font-weight:900;color:var(--muted-2);font-size:9px;margin-left:1px}
.rw-live-dot{width:7px;height:7px;border-radius:50%;background:var(--muted-2);box-shadow:0 0 0 3px rgba(120,150,190,.12)}

/* ---------------- ESPN-style top tab row ---------------- */
.rw-toptabs{flex:0 0 auto;display:flex;gap:2px;align-items:stretch;overflow-x:auto;-webkit-overflow-scrolling:touch;padding:0 8px;background:rgba(8,8,10,.86);backdrop-filter:saturate(160%) blur(16px);-webkit-backdrop-filter:saturate(160%) blur(16px);border-bottom:1px solid var(--line);scrollbar-width:none}
.rw-toptabs::-webkit-scrollbar{display:none}
.rw-tt{flex:1 0 auto;position:relative;background:none;border:0;color:var(--muted);font:inherit;font-size:11.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;padding:12px 9px 11px;cursor:pointer;white-space:nowrap;text-align:center}
.rw-tt.on{color:#fff}
.rw-tt.on::after{content:"";position:absolute;left:12px;right:12px;bottom:0;height:2.5px;border-radius:2px 2px 0 0;background:var(--blue)}
.rw-tt:active{color:#dbe6f5}

/* ---------------- Overview section headers ---------------- */
.rw-ov-head{display:flex;align-items:baseline;gap:9px;padding:20px 16px 9px}
.rw-ov-head .ttl{font-size:11.5px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.rw-ov-head .rw-ov-date{margin-left:auto;font-size:12px;font-weight:800;letter-spacing:.04em;color:var(--muted-2)}
.rw-ov-head .rw-ov-sub{font-size:12px;font-weight:750;color:var(--muted-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-ov-head .rw-ov-link{margin-left:auto;flex:0 0 auto;font-size:12px;font-weight:800;letter-spacing:.02em;color:var(--blue);cursor:pointer;white-space:nowrap}

/* ---------------- Latest strip cards (mini scoreboard rows) ---------------- */
.rw-tstrip{padding-top:2px}
.rw-tcard{scroll-snap-align:start;flex:0 0 auto;width:152px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:14px;padding:10px 11px 10px;box-shadow:var(--shadow);cursor:pointer;text-align:left}
.rw-tcard:active{border-color:var(--line-2)}
/* TYPE FLOOR 2026-07-17 (audit): functional labels were as small as 8.5px —
   illegible in motion or at the rink. Floor is now 9.5px. (.rw-brand-sub's 6.5px
   wordmark is the locked header brand lockup, decorative not functional — it
   deliberately stays.) */
.rw-tcard-dv{font-size:9.5px;font-weight:900;letter-spacing:.1em;text-transform:uppercase;color:var(--muted-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-tcard-r{display:flex;align-items:center;gap:8px;padding:4.5px 0}
.rw-tcard-r:first-of-type{margin-top:6px}
.rw-tcard-r .rw-crest{width:27px;height:27px;border-radius:7px;font-size:10.5px}
.rw-tcard-r .ab{flex:1;min-width:0;font-size:12.5px;font-weight:850;letter-spacing:.02em;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-tcard-r .sc{font-size:15.5px;font-weight:900;font-variant-numeric:tabular-nums;color:var(--muted)}
.rw-tcard-r.win .ab,.rw-tcard-r.win .sc{color:#fff}
.rw-tcard-st{margin-top:6px;padding-top:7px;border-top:1px solid rgba(255,255,255,.07);font-size:9px;font-weight:900;letter-spacing:.09em;text-transform:uppercase;color:var(--green)}
.rw-tcard-st.live{color:var(--red)}
/* GREEN MEANS FINAL. 2026-08-18. The strip can now carry a game that has not been
   played, and every other status slot in the app already has a `sched` token that
   renders muted (.rw-tg-l .st.sched, .rw-gc-st.sched). This is that same token,
   defined for the one element that was missing it. */
.rw-tcard-st.sched{color:var(--muted)}
.rw-tcard-more{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;width:78px;color:var(--muted);font-weight:800;font-size:11px}
.rw-tcard-more .ic{font-size:22px;line-height:1;color:var(--blue)}

/* ---------------- Featured hero card ---------------- */
/* ---- My Team hero (Paul, 2026-07-16): the followed team, marquee-sized, top of
   Home. Same restrained card language as the marquee hero below it — a touch of
   RW blue in the wash so "my team" reads as special without shouting. ---- */
.rw-myteam{position:relative;display:block;margin:8px 16px 4px;padding:13px 14px 6px;background:linear-gradient(180deg,rgba(12,26,46,.92),#0c0c10);border:1px solid var(--line-2);border-radius:16px;box-shadow:var(--shadow)}
.rw-mt-main{display:flex;align-items:center;gap:13px;width:100%;background:none;border:0;padding:0 0 9px;color:inherit;text-align:left;cursor:pointer}
.rw-mt-main .tx{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.rw-mt-main .tx b{font-size:19px;font-weight:950;letter-spacing:-.02em;color:#f4f8fe;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rw-mt-main .tx .lg{font-size:9.5px;font-weight:900;letter-spacing:.09em;text-transform:uppercase;color:var(--blue)}
.rw-mt-main .tx .ln{font-size:11.5px;font-weight:750;color:var(--muted-2)}
.rw-mt-cycle{position:absolute;top:11px;right:12px;background:rgba(82,132,255,.08);border:1px solid rgba(82,132,255,.28);border-radius:999px;color:var(--blue);font:inherit;font-size:10px;font-weight:900;letter-spacing:.04em;padding:4px 9px;cursor:pointer}
.rw-mt-line{display:flex;align-items:center;gap:9px;width:100%;background:none;border:0;border-top:1px solid var(--line-2);padding:9px 2px;color:inherit;font:inherit;text-align:left;cursor:pointer}
.rw-mt-line.still{cursor:default}
.rw-mt-line .k{flex:0 0 auto;font-size:9px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2)}
.rw-mt-line .k.next{color:var(--blue)}
.rw-mt-line .k.done{color:var(--muted-2)}
.rw-mt-line .v{flex:1;min-width:0;font-size:12.5px;font-weight:750;color:#dfe8f4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rw-mt-line .v b{font-weight:950}
.rw-mt-line .v b.w{color:var(--green,#31c48d)}
.rw-mt-line .v b.l{color:var(--red,#f45d6a)}
.rw-mt-line .rw-chev{flex:0 0 auto;color:var(--muted-2)}
.rw-hero2{margin:4px 16px 4px;background:linear-gradient(180deg,#16161b,#0c0c10);border:1px solid var(--line-2);border-radius:16px;overflow:hidden;box-shadow:var(--shadow);cursor:pointer}
.rw-hero2:active{border-color:var(--blue)}
.rw-hero2-top{display:flex;align-items:center;gap:9px;padding:13px 14px 4px}
.rw-hero2-top .dv{font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2)}
.rw-hero2-main{display:flex;align-items:stretch;gap:10px;padding:8px 14px 14px}
.rw-hero2-teams{flex:1;min-width:0}
.rw-hero2-team{display:flex;align-items:center;gap:11px;padding:8px 0}
.rw-hero2-team+.rw-hero2-team{border-top:1px solid var(--line)}
.rw-hero2-team .nm{flex:1;min-width:0;font-size:18px;font-weight:900;letter-spacing:-.01em;color:#f2f7fd;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-hero2-team .sc{font-size:26px;font-weight:900;font-variant-numeric:tabular-nums;color:#fff}
.rw-hero2-team.lose .nm{color:var(--muted)}
.rw-hero2-team.lose .sc{color:var(--muted)}
.rw-hero2-meta{flex:0 0 auto;width:112px;border-left:1px solid var(--line);padding-left:12px;display:flex;flex-direction:column;justify-content:center;gap:4px;text-align:right}
.rw-hero2-meta .st{font-size:11px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--green)}
.rw-hero2-meta .dt{font-size:13px;font-weight:800;color:#dbe6f5}
.rw-hero2-meta .rk{font-size:11px;color:var(--muted-2);line-height:1.3}
.rw-hero2-foot{display:flex;align-items:center;justify-content:flex-end;padding:11px 14px;border-top:1px solid var(--line);background:rgba(82,132,255,.04)}
.rw-hero2-foot .gc{font-size:13px;font-weight:800;letter-spacing:.02em;color:var(--blue)}

/* ---------------- Top games list ---------------- */
.rw-topgames{margin:0 16px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:14px;overflow:hidden}
.rw-tg{display:flex;align-items:center;gap:11px;padding:12px 13px;cursor:pointer}
.rw-tg+.rw-tg{border-top:1px solid var(--line)}
.rw-tg:active{background:rgba(255,255,255,.05)}
.rw-tg-l{flex:0 0 auto;width:58px;display:flex;flex-direction:column;gap:3px}
.rw-tg-l .st{font-size:10px;font-weight:900;letter-spacing:.05em;text-transform:uppercase;color:var(--green)}
.rw-tg-l .dv{font-size:10px;font-weight:750;color:var(--muted-2);line-height:1.2}
.rw-tg-m{flex:1;min-width:0}
.rw-tg-row{display:flex;align-items:center;gap:9px;padding:3px 0}
.rw-tg-row .nm{flex:1;min-width:0;font-size:14.5px;font-weight:800;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-tg-row .sc{font-size:16px;font-weight:900;font-variant-numeric:tabular-nums;color:var(--muted)}
.rw-tg-row.win .nm{color:#fff}.rw-tg-row.win .sc{color:#fff}
.rw-tg-row.lose .nm,.rw-tg-row.lose .sc{color:var(--muted)}
.rw-tg-r{flex:0 0 auto;width:78px;border-left:1px solid var(--line);padding-left:11px;display:flex;flex-direction:column;gap:2px;text-align:left}
.rw-tg-r .dt{font-size:11.5px;font-weight:800;color:#cfe0f5}
.rw-tg-r .rk{font-size:10.5px;color:var(--muted-2);line-height:1.25;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}

/* ---------------- Home standings table ---------------- */
.rw-tbl-wrap{margin:0 16px;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:14px;background:linear-gradient(180deg,var(--surface),#0b0b0e)}
.rw-tbl{min-width:0}
.rw-tbl-head,.rw-tbl-row{display:grid;grid-template-columns:18px minmax(0,1fr) 24px 22px 22px 20px 30px 40px 40px;align-items:center;gap:0;padding:0 11px}
.rw-tbl-head{height:34px;border-bottom:1px solid var(--line)}
.rw-tbl-head span{font-size:10px;font-weight:800;letter-spacing:.03em;text-transform:uppercase;color:var(--muted-2);text-align:center}
.rw-tbl-head .rk{text-align:left}.rw-tbl-head .tm{text-align:left}
.rw-tbl-row{height:46px;cursor:pointer}
.rw-tbl-row+.rw-tbl-row{border-top:1px solid rgba(255,255,255,.07)}
.rw-tbl-row:active{background:rgba(255,255,255,.05)}
.rw-tbl-row .rk{font-size:13px;font-weight:800;color:var(--muted);text-align:left}
.rw-tbl-row .tm{display:flex;align-items:center;gap:8px;min-width:0;overflow:hidden}
.rw-tbl-row .tm .nm{font-size:13px;font-weight:750;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-tbl-row .n{font-size:12.5px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--muted);text-align:center}
.rw-tbl-row .n.pts{font-weight:900;color:#fff}
.rw-tbl-row .n.pct{color:#cfe0f5}
.rw-tbl-row .n.strk{font-weight:800}
.rw-tbl-row .n.strk.up{color:var(--green)}
.rw-tbl-row .n.strk.down{color:var(--red)}

/* ---------------- Favorite star ---------------- */
.rw-star{position:relative;flex:0 0 auto;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;background:none;border:0;padding:0;cursor:pointer;color:var(--muted-2);-webkit-tap-highlight-color:transparent}
/* Star hit area 34 -> 44. Stars are handled in the CAPTURE phase (onFavClick),
   so where the bigger zone overlaps a card, the star still wins — exactly the
   behavior it had before, just harder to miss at the rink. */
.rw-star::after{content:"";position:absolute;inset:-5px}
.rw-star svg{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linejoin:round;transition:transform .12s}
.rw-star.on{color:var(--amber)}
.rw-star.on svg{fill:var(--amber);stroke:var(--amber)}
.rw-star:active svg{transform:scale(.86)}
.rw-ctxbar{display:flex;align-items:center;gap:6px}
.rw-ctxbar>button{min-width:0}
.rw-ctxbar>button:first-child{flex:1}
.rw-ctxbar>button.rw-star{flex:0 0 44px;width:44px;padding:0;justify-content:center}
.rw-teamcard{cursor:pointer}
.rw-sheet-hero .rw-sheet-heronm{flex:1;min-width:0}
.rw-sheet-hero .rw-star{align-self:flex-start}

/* ---------------- For You (full-width rows) ---------------- */
.rw-fylist{margin:0 16px;display:grid;gap:9px}
.rw-fyrow{display:flex;align-items:center;gap:12px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:13px;padding:11px 12px;box-shadow:0 6px 16px rgba(0,0,0,.3);cursor:pointer}
.rw-fyrow:active{border-color:var(--line-2)}
.rw-fyrow .tx{flex:1;min-width:0}
.rw-fyrow .tx b{display:block;font-size:14.5px;font-weight:800;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-fyrow .tx small{display:block;font-size:11px;color:var(--muted-2);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-fyrow .res{flex:0 0 auto;text-align:right}
.rw-fyrow .res b{display:block;font-size:13px;font-weight:900;color:var(--muted);font-variant-numeric:tabular-nums}
.rw-fyrow .res b.w{color:var(--green)}.rw-fyrow .res b.l{color:var(--red)}
.rw-fyrow .res small{display:block;font-size:10.5px;color:var(--muted-2);margin-top:1px;max-width:92px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-fy-divs{display:flex;flex-wrap:wrap;gap:8px;padding:8px 16px 2px}
.rw-fy-divchip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:800;color:#cfe0f5;background:rgba(82,132,255,.08);border:1px solid var(--line-2);border-radius:999px;padding:6px 11px;cursor:pointer}
.rw-fy-divchip .s{color:var(--amber);font-size:11px}
.rw-foryou-empty{display:flex;align-items:center;gap:12px;margin:0 16px;padding:14px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px dashed var(--line-2);border-radius:14px}
.rw-foryou-empty .tx{flex:1;min-width:0}
.rw-foryou-empty .tx b{display:block;font-size:14px;font-weight:850;color:#eaf1fb}
.rw-foryou-empty .tx span{display:block;font-size:12px;color:var(--muted-2);margin-top:3px;line-height:1.4}
.rw-foryou-cta{flex:0 0 auto;font-size:12.5px;font-weight:800;color:#fff;background:var(--accent);border:0;border-radius:10px;padding:10px 14px;cursor:pointer;box-shadow:0 5px 16px rgba(46,107,255,.35)}

/* ---------------- Profile / Settings ---------------- */
.rw-prof{padding:12px 16px 24px}
.rw-prof-card{background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:12px}
.rw-prof-h{font-size:13px;font-weight:900;letter-spacing:.04em;text-transform:uppercase;color:#eef4fb;margin-bottom:10px;display:flex;align-items:center;gap:8px}
.rw-prof-h .ct{font-size:11px;font-weight:800;color:var(--muted-2);background:rgba(255,255,255,.12);border-radius:999px;padding:1px 8px}
.rw-prof-note{font-size:12.5px;color:var(--muted);line-height:1.5}
.rw-prof-acct{display:flex;align-items:center;gap:11px;margin-bottom:10px}
.rw-prof-acct .av{width:40px;height:40px;border-radius:50%;background:linear-gradient(160deg,#1c1c22,#0d0d11);border:1px solid rgba(82,132,255,.5);display:flex;align-items:center;justify-content:center;font-weight:900;color:#dfeaff}
.rw-prof-acct .who{min-width:0}
.rw-prof-acct .who b{display:block;font-size:14px;color:#eaf1fb}
.rw-prof-acct .who small{display:block;font-size:12px;color:var(--muted-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-prof-sync{font-size:12px;font-weight:700;color:var(--green);margin-bottom:12px}
.rw-prof-in{width:100%;background:var(--bg);border:1px solid var(--line-2);border-radius:11px;color:#eef4fb;font:inherit;font-size:16px;padding:11px 13px;margin-bottom:9px}
/* Age-gate selects: same skin as the text inputs (16px stops iOS zoom-on-focus). */
.rw-prof-sel{appearance:none;-webkit-appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--muted-2) 50%),linear-gradient(135deg,var(--muted-2) 50%,transparent 50%);background-position:calc(100% - 18px) 55%,calc(100% - 13px) 55%;background-size:5px 5px;background-repeat:no-repeat;padding-right:32px}
.rw-prof-in:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-glow)}
.rw-prof-btn{width:100%;font-size:14px;font-weight:800;color:#fff;background:var(--accent);border:0;border-radius:11px;padding:12px;cursor:pointer}
.rw-prof-btn.ghost{color:#dbe6f5;background:rgba(255,255,255,.1);border:1px solid var(--line-2)}
.rw-prof-btn.danger{color:var(--red);background:rgba(255,84,104,.08);border:1px solid rgba(255,84,104,.3);margin-top:10px}
.rw-prof-or{text-align:center;font-size:11px;color:var(--muted-2);margin:12px 0 9px;position:relative}
.rw-prof-row{display:flex;gap:9px}
.rw-prof-row .rw-prof-btn{flex:1}
.rw-prof-msg{font-size:12.5px;color:var(--blue);margin-top:10px;min-height:16px;line-height:1.4}
.rw-prof-fav{display:flex;align-items:center;gap:10px;padding:9px 0;border-top:1px solid rgba(255,255,255,.08);cursor:pointer}
.rw-prof-fav:first-of-type{border-top:0}
.rw-prof-fav .tx{flex:1;min-width:0}
.rw-prof-fav .tx b{display:block;font-size:14px;font-weight:750;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-prof-fav .tx small{display:block;font-size:11.5px;color:var(--muted-2)}

/* ---------------- More: Stat Leaders + Power Index ---------------- */
.rw-leadgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;padding:0 16px}
.rw-leadcard{min-height:150px;border:1px solid var(--line);border-radius:12px;background:linear-gradient(180deg,var(--surface),#0b0b0e);padding:13px;box-shadow:var(--shadow)}
.rw-leadcard .ll{font-size:9px;font-weight:850;letter-spacing:.08em;color:var(--muted-2)}
.rw-leadcard .lp{display:flex;align-items:center;gap:9px;margin-top:13px}
.rw-leadcard .lav{width:38px;height:38px;border-radius:50%;background:linear-gradient(145deg,#20222a,#101013);border:1px solid var(--line-2);display:grid;place-items:center;font-size:11px;font-weight:900;color:#dbe5f1;flex:0 0 auto}
.rw-leadcard .lc{min-width:0}
.rw-leadcard .lc b{display:block;font-size:12.5px;font-weight:800;color:#eaf1fb;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rw-leadcard .lc small{display:block;margin-top:3px;color:var(--muted-2);font-size:9.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rw-leadcard .lv{margin-top:15px;font-size:27px;font-weight:900;line-height:1;color:#fff;font-variant-numeric:tabular-nums}
.rw-leadcard .lv span{font-size:9px;color:var(--muted-2);font-weight:800;letter-spacing:.06em;margin-left:5px}
.rw-powerlist{margin:0 16px;border:1px solid var(--line);border-radius:14px;background:linear-gradient(180deg,var(--surface),#0b0b0e);overflow:hidden}
.rw-powerrow{display:grid;grid-template-columns:26px 26px minmax(0,1fr) auto;align-items:center;gap:10px;padding:10px 13px;cursor:pointer}
.rw-powerrow+.rw-powerrow{border-top:1px solid var(--line)}
.rw-powerrow:active{background:rgba(255,255,255,.04)}
.rw-powerrow .pr-rank{font-size:13px;font-weight:900;color:var(--muted)}
.rw-powerrow .pr-copy{min-width:0}
.rw-powerrow .pr-copy b{display:block;font-size:13px;font-weight:800;color:#eaf1fb;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rw-powerrow .pr-copy small{display:block;margin-top:2px;color:var(--muted-2);font-size:10px}
.rw-powerrow .pr-score{font-size:18px;font-weight:900;color:var(--blue);font-variant-numeric:tabular-nums}

/* ---------------- Scroll region ---------------- */
.rw-scroll{
  position:relative;
  overflow-y:auto;overflow-x:hidden;
  -webkit-overflow-scrolling:touch;
  padding-bottom:calc(var(--tabbar-h) + 0px + 18px);
  flex:1 1 auto;
}
@media (min-width:620px){ .rw-scroll{height:auto} }
/* (2026-07-22) The negative-margin companion for the in-flow bar is gone — the bar
   is fixed on phones now, takes no flow space, and the scroller's own bottom
   padding provides the clearance. */
/* =========================================================================
   THE ROOT FIX for the floating nav bar (Paul, 2026-07-16, fourth and last).
   Symptoms: bar drifts on open AND scrolling fights the finger. Cause: the
   PAGE ITSELF could always move. iOS lets the document rubber-band even when
   it exactly fits the screen, and — the part that made every earlier fix a
   half-fix — WebKit IGNORES `overscroll-behavior:none` on the body (set
   below at line ~731; honored by Chrome/Android, not by iOS). So the whole
   app frame, tab bar included, elastic-dragged with the finger, and iOS
   handed scroll gestures to the page instead of the game list.
   The only body lock iOS respects is position:fixed — the standard app-shell
   lock every installed PWA uses. With the document pinned, the ONLY thing
   that can ever scroll is the inner scroller, and nothing outside it can
   move a pixel: not at boot, not on bounce, not in Safari, not installed.
   Phones only — the desktop device-frame layout keeps its own behavior. */
@media (max-width:619.98px){
  html,body{position:fixed;inset:0;width:100%;height:100%;overflow:hidden}
  body{min-height:0}
  .rw-app{height:100%}   /* fill the locked body — no more dvh churn at all */
}
/* RECLAIM THE FULL SCREEN (Paul, 2026-07-17: "still too high — we're losing real
   estate"). The lock above ended the floating; what it exposed is that iOS hands
   an INSTALLED web app a window ~80pt shorter than the screen — the layout
   viewport excludes the status-bar and home-indicator safe areas. So the frame,
   pinned honestly to that short window, parked the tab bar high with dead space
   beneath. Fix: in installed (standalone) mode only, claim the LARGE viewport —
   100lvh is the full physical screen — with a calc() fallback for engines
   without lvh. The bar's own safe-area padding already keeps its icons above
   the home indicator, so flush-to-bottom is safe. Safari-tab browsing is
   deliberately excluded (display-mode gate): there, lvh is taller than the
   visible area until Safari's chrome retracts, which would hide the bar. */
/* STANDALONE HEIGHT (2026-07-21, final): the installed app gets a window ~80pt
   SHORTER than the physical screen (iOS excludes the status-bar/home-indicator
   zones), so without this claim the tab bar parks HIGH with dead space beneath —
   not flush at the bottom like a native app. Claim the full screen (100lvh) in
   installed mode only. The label clipping this once caused is now handled by the
   bar's own hard 34px safe-area floor (height + padding-bottom above), so full
   height AND visible labels hold together — the NHL-app position. */
/* (2026-07-22) Standalone frame-height compensation removed: the bar is fixed to
   bottom:0 on phones, so the frame's exact height no longer decides where the bar
   sits. The frame stays at the body-lock's height:100%. */

/* ---------------- Section chrome ---------------- */
.rw-sec{padding:18px 16px 4px}
.rw-sec-head{display:flex;align-items:baseline;gap:10px;margin:0 0 12px}
.rw-eyebrow{font-size:11px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.rw-sec-title{font-size:11.5px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:0}
.rw-sec-link{margin-left:auto;font-size:12.5px;font-weight:700;color:var(--blue)}

/* ---------------- Home hero + hot teams ---------------- */
.rw-hero{padding:20px 16px 4px}
.rw-hero-title{font-size:26px;font-weight:900;letter-spacing:-.02em;margin:6px 0 5px;line-height:1.06}
.rw-hero-sub{font-size:13.5px;color:var(--muted);margin:0}
.rw-hot{scroll-snap-align:start;flex:0 0 auto;width:152px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:var(--r);padding:13px 13px 14px;box-shadow:var(--shadow)}
.rw-hot .nm{font-size:13.5px;font-weight:800;color:#eaf1fb;margin:9px 0 2px;line-height:1.15;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:31px}
.rw-hot .sub{font-size:11px;color:var(--muted-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-hot .streak{margin-top:10px;display:inline-block;font-size:10.5px;font-weight:900;letter-spacing:.02em;color:var(--green);background:rgba(46,224,106,.12);border:1px solid rgba(46,224,106,.28);padding:4px 9px;border-radius:999px}
.rw-hot .streak.up{color:var(--green)}
.rw-hot .streak.amber{color:var(--amber);background:rgba(255,194,75,.12);border-color:rgba(255,194,75,.3)}
.rw-hot .rw-hot-form{margin-top:9px}
.rw-hot .rw-hot-form .rw-form{gap:4px;margin:0}
.rw-hot .rw-hot-form .rw-form i{width:8px;height:8px;border-radius:2px}
.rw-hot .rw-lead-tag{display:inline-block;font-size:9.5px;font-weight:900;letter-spacing:.07em;text-transform:uppercase;color:var(--amber);background:rgba(255,194,75,.1);border:1px solid rgba(255,194,75,.28);padding:2px 7px;border-radius:999px;margin-bottom:9px}

/* ---------------- Rankings KPI board ---------------- */
.rw-kpis{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:14px 16px 2px}
.rw-kpi{background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:12px;padding:11px 12px;min-width:0}
.rw-kpi b{display:block;font-size:20px;font-weight:900;font-variant-numeric:tabular-nums;color:#eef4fb;line-height:1}
.rw-kpi b.up{color:var(--green)}.rw-kpi b.down{color:var(--red)}
.rw-kpi span{display:block;font-size:11px;color:var(--muted-2);margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------------- Matchup Intelligence ---------------- */
.rw-intel{margin:0 16px 12px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:14px;padding:14px;box-shadow:var(--shadow)}
.rw-intel-top{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;text-align:center}
.rw-intel-score{min-width:0}
.rw-intel-score b{display:block;font-size:24px;font-weight:900;font-variant-numeric:tabular-nums;color:var(--blue);line-height:1}
.rw-intel-score b.lab{font-size:17px;color:#eef4fb}
.rw-intel-score span{display:block;font-size:10.5px;color:var(--muted-2);margin-top:5px;letter-spacing:.02em}
.rw-intel-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.rw-intel-tag{font-size:10px;font-weight:900;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);background:rgba(255,255,255,.1);border:1px solid var(--line);padding:3px 8px;border-radius:999px}
.rw-intel-tag.hot{color:var(--amber);background:rgba(255,194,75,.12);border-color:rgba(255,194,75,.3)}
.rw-intel-why{font-size:12.5px;color:var(--muted);line-height:1.5;margin-top:11px;padding-top:11px;border-top:1px solid var(--line)}

/* ---------------- Upset Tracker ---------------- */
.rw-upset{background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:12px;padding:11px 12px;margin-bottom:9px}
.rw-upset-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:7px}
.rw-upset-div{font-size:11px;font-weight:800;color:var(--muted-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-upset-tag{flex:0 0 auto;font-size:9.5px;font-weight:900;letter-spacing:.05em;color:var(--amber);background:rgba(255,194,75,.12);border:1px solid rgba(255,194,75,.3);padding:3px 8px;border-radius:999px}
.rw-upset-row{display:flex;align-items:center;gap:9px;padding:3px 0}
.rw-upset-row .nm{flex:1;min-width:0;font-size:13.5px;font-weight:750;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-upset-row .nm small{color:var(--muted-2);font-weight:700;font-size:11px;margin-left:3px}
.rw-upset-row .sc{font-size:16px;font-weight:900;font-variant-numeric:tabular-nums;color:var(--muted)}
.rw-upset-row .sc.win{color:#fff}
.rw-upset-date{font-size:11px;color:var(--muted-2);margin-top:6px;padding-top:6px;border-top:1px solid rgba(255,255,255,.08)}

/* ---------------- Horizontal score strip ---------------- */
.rw-strip-wrap{padding:6px 0 2px}
.rw-strip{display:flex;gap:10px;overflow-x:auto;padding:2px 16px 12px;scroll-snap-type:x proximity}
.rw-gcard-mini{
  scroll-snap-align:start;flex:0 0 auto;width:172px;
  background:linear-gradient(180deg,var(--surface),#0b0b0e);
  border:1px solid var(--line);border-radius:var(--r);
  padding:11px 12px;box-shadow:var(--shadow);
}
.rw-gcard-mini .lg{font-size:10px;font-weight:800;letter-spacing:.1em;color:var(--muted-2);text-transform:uppercase;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center}
.rw-gcard-mini .row{display:flex;align-items:center;gap:8px;margin:6px 0}
.rw-gcard-mini .nm{font-size:13px;font-weight:700;color:#dbe6f5;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-gcard-mini .sc{font-size:16px;font-weight:900;font-variant-numeric:tabular-nums;min-width:20px;text-align:right}
.rw-gcard-mini .row.win .nm{color:#fff}
.rw-gcard-mini .row.win .sc{color:#fff}
.rw-gcard-mini .row.lose .nm,.rw-gcard-mini .row.lose .sc{color:var(--muted)}

/* ---------------- Crest / monogram ---------------- */
.rw-crest{
  position:relative;overflow:hidden;
  flex:0 0 auto;display:flex;align-items:center;justify-content:center;
  width:30px;height:30px;border-radius:8px;font-size:11.5px;font-weight:900;letter-spacing:.3px;
  color:#0c0c10;background:#fff;border:1px solid rgba(10,22,44,.14);
  box-shadow:0 1px 2px rgba(0,0,0,.25);
}
.rw-crest.lg{width:50px;height:50px;border-radius:12px;font-size:16.5px}
.rw-crest.xl{width:72px;height:72px;border-radius:16px;font-size:23px}
.rw-crest img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;padding:2px;border-radius:inherit;background:#fff}
.rw-crest.xl img{padding:5px}.rw-crest.lg img{padding:3px}

/* ---------------- Status pill ---------------- */
.rw-pill{font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;padding:3px 7px;border-radius:999px;white-space:nowrap}
.rw-pill.final{color:var(--green);background:rgba(46,224,106,.12);border:1px solid rgba(46,224,106,.28)}
.rw-pill.live{color:#fff;background:var(--red);border:1px solid var(--red);box-shadow:0 0 12px rgba(255,84,104,.5)}
.rw-pill.sched{color:var(--muted);background:rgba(255,255,255,.10);border:1px solid var(--line-2)}

/* ---------------- Full game card (Scores tab) ---------------- */
.rw-daygroup{margin:2px 0 4px}
.rw-dayhdr{position:sticky;top:0;z-index:2;font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);
  padding:12px 16px 8px;background:linear-gradient(180deg,var(--bg) 60%,rgba(6,13,24,0))}
.rw-gcard{
  margin:0 16px 10px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  overflow:hidden;box-shadow:0 8px 22px rgba(0,0,0,.35);
}
/* game-type tag (Playoff / Tournament / Preseason / Exhibition) */
.rw-ktag{font-size:9px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;padding:2px 6px;border-radius:999px;white-space:nowrap}
.rw-ktag.pl{color:var(--amber);background:rgba(255,194,75,.14);border:1px solid rgba(255,194,75,.32)}
.rw-ktag.to{color:#c3a6ff;background:rgba(163,130,255,.15);border:1px solid rgba(163,130,255,.32)}
.rw-ktag.pre{color:#8fb0d8;background:rgba(255,255,255,.13);border:1px solid var(--line-2)}
.rw-ktag.exh{color:#8fb0d8;background:rgba(255,255,255,.13);border:1px solid var(--line-2)}
.rw-ktag.nl{color:#8fb0d8;background:rgba(255,255,255,.13);border:1px solid var(--line-2)}
.rw-gcard-top .r,.rw-gcard-foot{gap:8px}
.rw-gcard-top .r{display:flex;align-items:center;gap:7px}
.rw-gcard[data-gi],.rw-gcard-mini[data-gi]{cursor:pointer}
.rw-gcard[data-gi]:active,.rw-gcard-mini[data-gi]:active{border-color:var(--line-2)}
/* mini game card (Game Center season series) */
.rw-mini-game{margin:0 16px 8px;background:var(--surface);border:1px solid var(--line);border-radius:11px;overflow:hidden}
.rw-mini-row{display:flex;align-items:center;gap:9px;padding:7px 12px}
.rw-mini-row+.rw-mini-row{border-top:1px solid rgba(255,255,255,.07)}
.rw-mini-row .rw-crest{width:25px;height:25px}
.rw-mini-row .nm{flex:1;min-width:0;font-size:13px;font-weight:700;color:#dbe6f5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-mini-row .sc{font-size:16px;font-weight:900;font-variant-numeric:tabular-nums;min-width:20px;text-align:right;color:var(--muted)}
.rw-mini-row.win .nm{color:#fff;font-weight:800}
.rw-mini-row.win .sc{color:#fff}
.rw-mini-row.lose{opacity:.55}
.rw-mini-foot{padding:5px 12px;border-top:1px solid var(--line);font-size:11px;color:var(--muted-2)}
.rw-gcard-top{display:flex;align-items:center;justify-content:space-between;padding:8px 13px;border-bottom:1px solid var(--line);
  font-size:10.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--muted-2)}
.rw-team-row{display:flex;align-items:center;gap:11px;padding:11px 13px}
.rw-team-row+.rw-team-row{border-top:1px solid rgba(255,255,255,.07)}
.rw-team-row .nm{flex:1;min-width:0;font-size:15px;font-weight:750;color:#e7eefb;line-height:1.15;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rw-team-row .rec{font-size:11px;color:var(--muted-2);font-weight:600;margin-left:2px}
.rw-team-row .sc{font-size:20px;font-weight:900;font-variant-numeric:tabular-nums;min-width:26px;text-align:right}
.rw-team-row.win .nm{color:#fff}
.rw-team-row.lose{opacity:.62}
.rw-win-caret{width:12px;color:var(--blue);font-size:12px;opacity:0}
.rw-team-row.win .rw-win-caret{opacity:1}
.rw-gcard-foot{padding:8px 13px;border-top:1px solid var(--line);display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--muted)}
.rw-gcard-foot .rink{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------------- Filter chips ---------------- */
.rw-chips{display:flex;gap:8px;overflow-x:auto;padding:10px 16px 6px}
.rw-chip{
  flex:0 0 auto;font-size:12px;font-weight:800;letter-spacing:.03em;text-transform:uppercase;color:var(--muted);
  padding:8px 13px;border-radius:8px;border:1px solid var(--line-2);
  background:rgba(255,255,255,.06);white-space:nowrap;transition:.14s;
}
.rw-chip.on{color:#fff;background:var(--accent);border-color:var(--accent);box-shadow:0 5px 16px rgba(46,107,255,.35);font-weight:850}
.rw-subchips{display:flex;gap:7px;overflow-x:auto;padding:2px 16px 8px}
.rw-subchip{flex:0 0 auto;font-size:12px;font-weight:700;color:var(--muted);padding:7px 12px;border-radius:9px;border:1px solid var(--line);background:var(--surface);white-space:nowrap}
.rw-subchip.on{color:#fff;background:var(--surface-3);border-color:var(--blue);box-shadow:inset 0 0 0 1px rgba(82,132,255,.4)}
/* context bar — slim "League · Division ▾" pinned under the header */
.rw-ctxbar{position:sticky;top:0;z-index:6;padding:10px 16px;background:rgba(6,13,24,.9);backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid var(--line)}
.rw-ctxbar>button{display:flex;align-items:center;gap:10px;width:100%;border:1px solid var(--line-2);background:var(--surface);color:#eaf1fb;border-radius:12px;padding:11px 14px;font:inherit;box-shadow:0 6px 16px rgba(0,0,0,.28)}
.rw-ctxbar>button:active{background:var(--surface-2)}
.rw-ctxbar .rw-chips{flex:1;min-width:0}
.rw-ctxbar .lg{font-size:11px;font-weight:850;letter-spacing:.1em;text-transform:uppercase;color:var(--blue)}
.rw-ctxbar .sep{color:var(--muted-2)}
.rw-ctxbar .dv{font-size:15px;font-weight:850;letter-spacing:-.01em}
.rw-ctxbar .chev{margin-left:auto;color:var(--muted-2);font-size:13px}
/* picker sheet header + leagues */
.rw-pick-hd{padding:2px 18px 10px;font-size:13px;font-weight:800;letter-spacing:.02em;color:var(--muted)}
.rw-pick-leagues{display:flex;flex-wrap:wrap;gap:8px;padding:0 16px 12px;border-bottom:1px solid var(--line)}
/* grouped division selector — every age + tier visible at once (no hidden scroll) */
.rw-divselect{display:flex;flex-direction:column;gap:9px;padding:12px 16px 16px;border-bottom:1px solid var(--line)}
.rw-divrow{display:flex;flex-direction:column;gap:6px}
.rw-divlabel{font-size:10.5px;font-weight:800;letter-spacing:.09em;color:var(--muted-2);text-transform:uppercase}
.rw-divtiers{display:flex;flex-wrap:wrap;gap:6px}
.rw-divtiers .rw-subchip{min-width:40px;text-align:center;padding:7px 13px}

/* ---------------- Standings table ---------------- */
.rw-standings{margin:4px 16px 16px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;box-shadow:var(--shadow)}
.rw-st-head,.rw-st-row{display:grid;grid-template-columns:26px 1fr 30px 30px 30px 34px;align-items:center;gap:6px;padding:10px 13px}
.rw-st-head{font-size:10.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);border-bottom:1px solid var(--line)}
.rw-st-head .l{text-align:left}.rw-st-head .c{text-align:center}
.rw-st-row{border-top:1px solid rgba(255,255,255,.07);font-size:13.5px}
.rw-st-row:first-of-type{border-top:0}
.rw-st-row .rk{font-weight:800;color:var(--muted);text-align:center;font-variant-numeric:tabular-nums}
.rw-st-row .team{display:flex;align-items:center;gap:9px;min-width:0}
.rw-st-row .team .nm{font-weight:700;color:#e7eefb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-st-row .n{text-align:center;font-variant-numeric:tabular-nums;color:var(--muted)}
.rw-st-row .pts{text-align:center;font-weight:900;color:#fff;font-variant-numeric:tabular-nums}
.rw-st-row.lead{background:linear-gradient(90deg,rgba(82,132,255,.10),rgba(82,132,255,0))}
.rw-st-row.lead .rk{color:var(--blue)}
/* rich standings (rank/team+form/GP/W/L/T/PTS/DIFF) */
.rw-st2{margin:6px 16px 4px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;box-shadow:var(--shadow)}
.rw-st2-head,.rw-st2-row{display:grid;grid-template-columns:18px minmax(0,1fr) 26px 52px 28px 34px;align-items:center;gap:5px;padding:9px 10px}
.rw-st2-row .team .rw-crest{width:25px;height:25px}
.rw-st2-row .team .nm{font-size:12.5px}
.rw-st2-row .rec2{text-align:center;font-variant-numeric:tabular-nums;color:var(--muted);font-weight:700;font-size:12px;white-space:nowrap}
.rw-st2-head{font-size:10px;font-weight:800;letter-spacing:.02em;text-transform:uppercase;color:var(--muted-2);border-bottom:1px solid var(--line);text-align:center}
.rw-st2-head .l{text-align:left}
.rw-st2-row{border-top:1px solid rgba(255,255,255,.07);font-size:12.5px}
.rw-st2-row .rk{font-weight:800;color:var(--muted);text-align:center;font-variant-numeric:tabular-nums}
.rw-st2-row .team{display:flex;align-items:center;gap:9px;min-width:0;overflow:hidden}
.rw-st2-row .team .tx{min-width:0;overflow:hidden}
.rw-st2-row .team .nm{font-weight:750;color:#e7eefb;font-size:13px;line-height:1.16;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rw-st2-row .n{text-align:center;font-variant-numeric:tabular-nums;color:var(--muted)}
.rw-st2-row .pts{text-align:center;font-weight:900;color:#fff;font-variant-numeric:tabular-nums}
.rw-st2-row .gd{text-align:center;font-variant-numeric:tabular-nums;font-weight:700}
.rw-st2-row.lead{background:linear-gradient(90deg,rgba(82,132,255,.10),rgba(82,132,255,0))}
.rw-st2-row.lead .rk{color:var(--blue)}
.rw-gd-pos{color:var(--green)}.rw-gd-neg{color:var(--red)}
.rw-form{display:flex;gap:3px;margin-top:4px}
.rw-form i{width:6px;height:6px;border-radius:2px;display:block;opacity:.92}
.rw-form i.W{background:var(--green)}.rw-form i.L{background:var(--red)}.rw-form i.T{background:var(--muted-2)}

/* ---------------- Team list / cards ---------------- */
.rw-teamlist{padding:4px 16px 8px;display:grid;gap:9px}
.rw-teamcard{display:flex;align-items:center;gap:12px;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:11px 12px;box-shadow:0 6px 16px rgba(0,0,0,.3)}
.rw-teamcard .meta{flex:1;min-width:0}
.rw-teamcard .nm{font-size:14.5px;font-weight:750;color:#eaf1fb;line-height:1.18;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* 2026-07-13 — the division is IDENTITY, not a caption.
   A club fields one team per age/tier, so the picker showed eight rows all reading
   "Aliso Viejo Avalanche". The division is the only thing that tells a parent which
   row is their child's, so it now lives in the loud line with the name.
   white-space:nowrap so that when a long club name wraps/clamps, the part that gets
   cut is the NAME — never the division, which would defeat the whole point. */
.rw-teamcard .nm .dv{font-weight:750;color:#a8bdd8;white-space:nowrap}
.rw-teamcard .sub{display:block;font-size:11.5px;color:var(--muted-2);margin-top:2px}
.rw-teamcard .rec{font-size:13px;font-weight:800;color:#dbe6f5;font-variant-numeric:tabular-nums;text-align:right}
.rw-teamcard .rec small{display:block;font-size:10px;font-weight:700;color:var(--muted-2);letter-spacing:.05em}
.rw-chev{color:var(--muted-2);font-size:17px;margin-left:2px}

/* ---------------- Quick links ---------------- */
.rw-quick{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;padding:6px 16px 4px}
.rw-qcard{display:flex;align-items:center;gap:11px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:13px;box-shadow:0 6px 16px rgba(0,0,0,.28)}
.rw-qcard .ic{width:34px;height:34px;border-radius:9px;display:flex;align-items:center;justify-content:center;background:rgba(82,132,255,.10);border:1px solid var(--line-2);color:var(--blue)}
.rw-qcard .t{font-size:13.5px;font-weight:750;color:#eaf1fb}
.rw-qcard .d{font-size:11px;color:var(--muted-2);margin-top:1px}

/* ---------------- More list (mockup style — icon squares, separated rows) ---------------- */
.rw-morelist{padding:0;display:grid;gap:9px;background:none;border:0;border-radius:0;overflow:visible;margin:4px 16px 16px}
.rw-morerow{display:flex;align-items:center;gap:13px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:13px;padding:12px 13px;box-shadow:0 6px 16px rgba(0,0,0,.25)}
.rw-morerow:active{border-color:var(--line-2);background:var(--surface-2)}
.rw-morerow .ic{flex:0 0 auto;width:37px;height:37px;border-radius:10px;display:flex;align-items:center;justify-content:center;background:var(--surface-2);border:1px solid var(--line-2);color:#dfe9f5}
.rw-morerow .t{flex:1;min-width:0;font-size:14.5px;font-weight:800;color:#eef4fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-morerow .t small{display:block;font-size:11px;font-weight:600;color:var(--muted-2);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------------- Bottom tab bar ---------------- */
.rw-tabbar{
  /* IN-FLOW, NOT FIXED (Paul, 2026-07-16 — "the nav bar is still moving up").
     Third and final fix for the first-open float. position:fixed anchored the bar
     to the VIEWPORT, and iOS repositions viewport-fixed layers during the big
     boot reflow (content height 0 → thousands of px + scroll restore), so the
     bar visibly slid into place right as the app appeared — regardless of splash
     timing (v49/v50 masked, this REMOVES). Now the bar is a normal flex child at
     the bottom of the 100dvh .rw-app column, exactly the mechanism the desktop
     frame has always used without a single glitch: the bar cannot move except
     with the whole frame. The scroller gets a matching negative margin below so
     content still slides under the frosted glass, pixel-identical to before.
     Above the full-height search/subview panels (z55/56) so it seats flush over
     them with no gap; still below the bottom sheets (z60/61) so those cover it. */
  position:relative;flex:0 0 auto;z-index:58;
  width:100%;max-width:var(--maxw);
  height:calc(var(--tabbar-h) + 0px);  /* 34px floor: some installed iOS apps report inset-bottom as 0 */
  /* 2026-07-19 (Paul): "nav bar is cut off on the bottom on some iPhones —
     bring it up a bit." The old tuck (inset − 10px, floor 4px) sat the icons
     low enough to clip on some devices. Raised by ~8px everywhere: floor 8px
     for home-button phones, inset − 2px for notch/island phones. The bar's
     HEIGHT still includes the full inset — only the contents ride higher. */
  padding-bottom:0px;  /* flush to the bottom edge */
  display:flex;align-items:stretch;
  background:var(--bg);                /* flat solid = app background #050506, no blur/gradient (Paul 2026-07-21) */
  border-top:1px solid var(--line-2);
}
/* PHONES (2026-07-22, the NHL-bar structure): anchor the bar to the REAL bottom of
   the screen with position:fixed + bottom:0, instead of guessing the window height.
   The bar's own padding (34px floor above) carries it over the home indicator —
   the safe area is applied ONCE, inside the bar. The old boot-time "float" that
   made us abandon fixed is masked by the splash guard (bar stays hidden until the
   splash dismisses). Desktop keeps its sticky in-frame bar below. */
@media (max-width:619.98px){
  .rw-tabbar{position:fixed;left:0;right:0;bottom:0;width:auto;max-width:none}
}
@media (min-width:620px){ .rw-tabbar{position:sticky;left:auto;transform:none;width:auto;max-width:none} }
/* FIRST-OPEN FLOAT (Paul, 2026-07-16): on iOS the fixed, backdrop-blurred tab bar gets
   its own compositor layer, and WebKit can paint that layer OVER the splash during boot
   regardless of z-index — the menu bar appears to float on the splash when the app first
   opens, then "settles" as viewport insets land. A previous fix pinned the bar with
   position:fixed; it seated the bar but could not stop the early paint. So: don't fight
   the compositor — the bar does not PAINT AT ALL until the splash is dismissed. Same DOM,
   same layout, no timing change; the bar fades in behind the splash's own .45s fade-out.
   (hideSplash() always fires — data-ready or its 6s safety — so the bar can never stay
   hidden.) */
.rw-splash:not(.hide)~.rw-tabbar{visibility:hidden}
.rw-tab{
  flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  background:none;border:0;color:var(--muted-2);padding:6px 2px 5px;position:relative;
}
.rw-tab svg{width:23px;height:23px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.rw-tab .lbl{font-size:10px;font-weight:700;letter-spacing:.02em}
.rw-tab.on{color:var(--accent)}
/* A11Y 2026-07-18 (axe): the ACTIVE tab's tiny 9.5px label in --accent (#2e6bff)
   hit only 4.31:1 on the dark bar — just under WCAG AA's 4.5:1 for small text.
   The icon, the underline bar and the glow stay --accent (graphics need only
   3:1); ONLY the label text lifts to the app's brighter blue so it passes.
   Difference is imperceptible; the brand accent is untouched. */
.rw-tab.on .lbl{color:var(--blue)}
.rw-tab.on::before{content:"";position:absolute;top:0;width:28px;height:3px;border-radius:0 0 3px 3px;background:var(--accent);box-shadow:0 0 10px rgba(46,107,255,.4)}

/* ---------------- Team detail sheet ---------------- */
.rw-sheet-back{position:absolute;inset:0;z-index:60;background:rgba(3,7,14,.6);opacity:0;pointer-events:none;transition:.2s}
.rw-sheet-back.on{opacity:1;pointer-events:auto}
.rw-sheet{position:absolute;left:0;right:0;bottom:0;z-index:61;max-height:88%;
  background:var(--bg);border-top:1px solid var(--line-2);border-radius:22px 22px 0 0;
  transform:translateY(102%);transition:transform .26s cubic-bezier(.32,.72,0,1);
  display:flex;flex-direction:column;box-shadow:0 -20px 60px rgba(0,0,0,.6)}
.rw-sheet.on{transform:translateY(0)}
.rw-sheet-grab{width:38px;height:4px;border-radius:999px;background:var(--line-2);margin:9px auto 4px}
.rw-sheet-hero{display:flex;align-items:center;gap:14px;padding:8px 18px 16px;border-bottom:1px solid var(--line)}
.rw-sheet-hero .nm{font-size:19px;font-weight:850;letter-spacing:-.01em}
.rw-sheet-hero .sub{font-size:12px;color:var(--muted);margin-top:3px}
.rw-sheet-stats{display:flex;gap:8px;padding:14px 18px}
.rw-stat{flex:1;background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:11px 8px;text-align:center}
.rw-stat b{display:block;font-size:20px;font-weight:900;font-variant-numeric:tabular-nums}
.rw-stat span{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2)}
/* team snapshot (analytics) */
.rw-snap{margin:0 16px 4px;background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:4px 14px 12px}
.rw-snap-row{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.07);font-size:13px;color:var(--muted)}
.rw-snap-row:last-of-type{border-bottom:0}
.rw-snap-row .v{color:#eef4fb}
.rw-snap-row b{color:#eef4fb;font-weight:800}
.rw-snap-row b.up{color:var(--green)}.rw-snap-row b.down{color:var(--red)}
.rw-snap-row .rw-form{display:inline-flex;vertical-align:middle;margin-right:5px}
.rw-snap-meter{margin-top:11px;height:6px;border-radius:999px;background:rgba(255,255,255,.15);overflow:hidden}
.rw-snap-meter i{display:block;height:100%;background:linear-gradient(90deg,#85a8ff,var(--blue))}
.rw-snap-cap{font-size:10px;color:var(--muted-2);margin-top:5px;text-align:right;font-weight:800;letter-spacing:.06em;text-transform:uppercase}
/* 2026-07-20 (Paul): "on the picker the last pill boxes are cut off." The
   sheet pins to bottom:0 and this body only left 24px under the final pill
   row — inside the iPhone home-indicator zone. Now clears the full inset. */
.rw-sheet-body{overflow-y:auto;padding:2px 0 calc(34px + env(safe-area-inset-bottom, 0px))}
.rw-sheet-close{position:absolute;top:12px;right:14px;width:30px;height:30px;border-radius:50%;background:var(--surface-2);border:1px solid var(--line-2);color:var(--muted);font-size:15px;display:flex;align-items:center;justify-content:center}
.rw-sheet-close::after{content:"";position:absolute;inset:-7px} /* 30 -> 44 hit area (audit) */

/* ---------------- Misc ---------------- */
.rw-empty{padding:40px 24px;text-align:center;color:var(--muted-2);font-size:13.5px}
.rw-skel{margin:16px;height:74px;border-radius:var(--r);background:linear-gradient(90deg,rgba(255,255,255,.03),rgba(255,255,255,.07),rgba(255,255,255,.03));background-size:200% 100%;animation:sh 1.3s linear infinite}
@keyframes sh{0%{background-position:200% 0}100%{background-position:-200% 0}}
.rw-note{margin:14px 16px;padding:12px 14px;border:1px dashed var(--line-2);border-radius:12px;color:var(--muted);font-size:12px;line-height:1.5;background:rgba(82,132,255,.04)}
.rw-view{display:none}.rw-view.on{display:block}

/* ---------------- In-app sub-screens (native, no site links) ---------------- */
.rw-morelist button.rw-morerow{width:100%;border:0;font:inherit;text-align:left;cursor:pointer}
.rw-subview{position:absolute;left:0;right:0;top:0;bottom:0;z-index:56;
  background:radial-gradient(120% 50% at 50% -10%,#0d1c33 0%,rgba(13,28,51,0) 55%),var(--bg);
  display:flex;flex-direction:column;transform:translateX(100%);transition:transform .26s cubic-bezier(.32,.72,0,1);visibility:hidden}
.rw-subview.on{transform:translateX(0);visibility:visible}
.rw-subhdr{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:6px;height:calc(var(--header-h) + env(safe-area-inset-top));
  padding-top:env(safe-area-inset-top);padding-left:6px;padding-right:16px;
  background:rgba(8,8,10,.9);backdrop-filter:saturate(160%) blur(16px);-webkit-backdrop-filter:saturate(160%) blur(16px);border-bottom:1px solid var(--line)}
.rw-back{width:40px;height:40px;border:0;background:none;color:#dbe6f5;font-size:26px;line-height:1;display:flex;align-items:center;justify-content:center;border-radius:10px}
.rw-back:active{background:var(--surface-2)}
.rw-subhdr .ttl{font-size:17px;font-weight:850;letter-spacing:-.01em}
.rw-subfilters{flex:0 0 auto}
.rw-subbody{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;padding-bottom:calc(var(--tabbar-h) + env(safe-area-inset-bottom) + 16px)}

/* segmented toggle */
.rw-seg2{display:flex;gap:4px;margin:12px 16px 4px;padding:4px;background:var(--surface);border:1px solid var(--line);border-radius:12px}
.rw-seg2 button{flex:1;border:0;background:none;color:var(--muted);font-size:13px;font-weight:800;letter-spacing:.02em;padding:8px;border-radius:9px}
.rw-seg2 button.on{color:#fff;background:var(--accent);box-shadow:0 4px 12px rgba(46,107,255,.35)}

/* rinks + camps cards */
.rw-rinkcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:13px 14px;box-shadow:0 6px 16px rgba(0,0,0,.28)}
.rw-rinkcard .top{display:flex;align-items:center;gap:8px;justify-content:space-between;margin-bottom:3px}
.rw-rinkcard .nm{font-size:15px;font-weight:800;color:#eef4fb;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-rinkcard .sub{font-size:12px;color:var(--muted);line-height:1.45}
.rw-rinkcard .addr{font-size:11.5px;color:var(--muted-2);margin-top:5px}
.rw-rinkcard .meta2{font-size:12px;color:var(--muted);margin-top:4px}
.rw-mini-btn{display:inline-flex;align-items:center;gap:4px;margin-top:10px;font-size:12px;font-weight:800;color:var(--blue);
  padding:7px 12px;border:1px solid var(--line-2);border-radius:9px;background:rgba(82,132,255,.08)}

/* leaders table */
.rw-lead-head,.rw-lead-row{display:grid;grid-template-columns:26px minmax(0,1fr) 30px 28px 28px 32px;align-items:center;gap:6px;padding:9px 14px}
.rw-lead-head{font-size:10.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);position:sticky;top:0;background:var(--bg);z-index:1}
.rw-lead-head span:not(:nth-child(2)),.rw-lead-row .n,.rw-lead-row .rk,.rw-lead-row .pts{text-align:center}
.rw-lead-row{border-top:1px solid rgba(255,255,255,.07);font-size:13px}
.rw-lead-row .rk{font-weight:800;color:var(--muted);font-variant-numeric:tabular-nums}
.rw-lead-row .pl{display:flex;align-items:center;gap:9px;min-width:0;overflow:hidden}
.rw-lead-row .pl>span{display:block;min-width:0;overflow:hidden}
.rw-lead-row .pl b{font-weight:750;color:#e7eefb;font-size:13.5px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.15;overflow-wrap:anywhere}
.rw-lead-row .pl small{color:var(--muted-2);font-size:11px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-lead-row .n{color:var(--muted);font-variant-numeric:tabular-nums}
.rw-lead-row .pts{font-weight:900;color:#fff;font-variant-numeric:tabular-nums}
.rw-lead-row:nth-child(-n+4) .rk{color:var(--blue)}
.rw-champ{font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--amber);background:rgba(255,194,75,.12);border:1px solid rgba(255,194,75,.3);padding:3px 7px;border-radius:999px}
.rw-about p{margin:0 0 12px;font-size:14px;line-height:1.6;color:#cfdcec}
.rw-about b{color:#fff}

/* ================= ESPN-style app pass ================= */
/* native feel */
body{overscroll-behavior:none}
.rw-scroll,.rw-subbody,.rw-sheet-body,.rw-search-body{overscroll-behavior:contain}
.rw-hdr,.rw-toptabs,.rw-tabbar,.rw-subhdr,.rw-ctxbar,.rw-ov-head,.rw-sec-head{-webkit-user-select:none;user-select:none}
.rw-tab .lbl{font-size:9.5px}

/* sub-screen brand header (RinkWire heads every page) */
.rw-subhdr{padding-right:6px}
.rw-subbrand{position:absolute;left:50%;top:env(safe-area-inset-top);bottom:0;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1}
.rw-subbrand .rw-brand-word{display:none}
.rw-subbrand .ttl{font-size:11px;font-weight:850;letter-spacing:.16em;color:var(--muted);text-transform:uppercase;margin:0;white-space:nowrap}
.rw-subact{margin-left:auto;width:40px;height:40px;display:flex;align-items:center;justify-content:center}
.rw-subact .rw-star{width:40px;height:40px}

/* featured hero action buttons */
.rw-hero2-btns{display:flex;gap:9px;padding:11px 14px;border-top:1px solid var(--line);background:rgba(82,132,255,.04)}
.rw-btn-gc,.rw-btn-live{flex:1;display:flex;align-items:center;justify-content:center;gap:7px;font:inherit;font-size:11.5px;font-weight:850;letter-spacing:.05em;text-transform:uppercase;padding:9px 8px;border-radius:999px;cursor:pointer}
.rw-btn-gc{color:#fff;background:var(--accent);border:0;box-shadow:0 6px 16px rgba(46,107,255,.3)}
.rw-btn-gc:active{background:#2559d6}
.rw-btn-live{color:#eef4fb;background:#101318;border:1px solid var(--line-2);text-decoration:none}
.rw-btn-live .rw-live-blink{background:var(--red)}
.rw-live-blink{width:7px;height:7px;border-radius:50%;background:#fff;animation:rwblink 1.1s ease infinite}
@keyframes rwblink{0%,100%{opacity:1}50%{opacity:.25}}
.rw-tcard-top.live,.rw-tg-l .st.live,.rw-hero2-meta .st.live{color:var(--red)}
.rw-tcard-top.sched,.rw-tg-l .st.sched,.rw-hero2-meta .st.sched{color:var(--muted)}

/* scores: date rail + live section */
.rw-daterail{display:flex;gap:7px;overflow-x:auto;padding:10px 16px 4px;scrollbar-width:none}
.rw-daterail::-webkit-scrollbar{display:none}
.rw-datechip{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:1px;min-width:52px;padding:7px 10px;border-radius:11px;border:1px solid var(--line);background:var(--surface);color:var(--muted);font:inherit;cursor:pointer}
.rw-datechip b{font-size:12.5px;font-weight:850;color:#dbe6f5}
.rw-datechip small{font-size:9px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2)}
.rw-datechip.on{border-color:var(--blue);background:rgba(82,132,255,.12);box-shadow:inset 0 0 0 1px rgba(82,132,255,.4)}
.rw-datechip.on b{color:#fff}.rw-datechip.on small{color:var(--blue)}
/* Scores calendar popover (2026-07-27): jump to any game day of the season.
   Same tokens as the date chips, flat design system, no gradients. */
.rw-calpop{position:fixed;left:16px;right:16px;top:130px;z-index:60;background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:12px;box-shadow:0 24px 60px rgba(0,0,0,.6)}
.rw-calpop[hidden]{display:none}
.rw-calhead{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.rw-calhead b{flex:1;text-align:center;font-size:13px;font-weight:850;letter-spacing:.05em;text-transform:uppercase;color:#dbe6f5}
.rw-calnav{width:36px;height:36px;border:1px solid var(--line);border-radius:9px;background:transparent;color:#dbe6f5;font:inherit;font-weight:900;cursor:pointer}
.rw-calnav:disabled{opacity:.35}
.rw-calgrid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}
.rw-caldow{text-align:center;font-size:9.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2);padding:4px 0}
.rw-calday{height:38px;display:grid;place-items:center;border:1px solid transparent;border-radius:9px;background:transparent;color:var(--muted-2);font:inherit;font-size:13px;font-weight:800}
.rw-calday.has{color:#dbe6f5;background:rgba(255,255,255,.05);border-color:var(--line);cursor:pointer}
.rw-calday.has.sel{border-color:var(--blue);background:rgba(82,132,255,.16);color:#fff}
.rw-cal-empty{padding:14px;text-align:center;color:var(--muted);font-size:13px}
.rw-livehdr{display:flex;align-items:center;gap:8px;padding:14px 16px 8px;font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--red)}
.rw-livehdr .ct{font-size:10px;font-weight:900;color:#fff;background:var(--red);border-radius:999px;padding:1px 7px;box-shadow:0 0 10px rgba(255,84,104,.5)}
.rw-tg .sc.live,.rw-tg-r .dt.live{color:var(--red)}

/* standings: mode toggle + RW table */
.rw-standseg{padding:0 0 2px}
.rw-tbl-head.rw3,.rw-tbl-row.rw3{grid-template-columns:20px minmax(0,1fr) 26px 24px 24px 22px 32px 36px}
/* Under-12 divisions ship no RW rating (see noRank() in app.js — RinkWire does not rank
   children under 12). One fewer column; the space goes back to the team name. */
.rw-tbl-head.rw3.rw-tbl-norw,.rw-tbl .rw-tbl-norw ~ .rw-tbl-row.rw3,.rw-tbl.rw-tbl-norw .rw-tbl-head.rw3,.rw-tbl.rw-tbl-norw .rw-tbl-row.rw3{grid-template-columns:20px minmax(0,1fr) 26px 24px 24px 22px 32px}
.rw-tbl-row.rw3{height:auto;min-height:58px;padding-top:6px;padding-bottom:6px}
.rw-tbl-row .tm .tx{min-width:0;overflow:hidden}
.rw-tbl-row.rw3 .tm .nm{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;white-space:normal;line-height:1.15;overflow:hidden;text-overflow:ellipsis;overflow-wrap:anywhere}
.rw-tbl-row .tm .tx .rw-form{margin-top:3px}
.rw-tbl-row .n.rw{font-weight:850;color:var(--blue)}
.rw-tbl-row.fav{background:linear-gradient(90deg,rgba(255,194,75,.07),rgba(255,194,75,0))}
.rw-divhdr{display:flex;align-items:baseline;gap:8px;padding:16px 16px 8px;font-size:12px;font-weight:850;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.rw-divhdr small{font-size:10px;color:var(--muted-2);letter-spacing:.04em;text-transform:none;font-weight:700}

/* teams: search + A-Z */
.rw-teamsearch{padding:10px 16px 2px}
.rw-teamsearch input{width:100%;background:var(--surface);border:1px solid var(--line-2);border-radius:11px;color:#eef4fb;font:inherit;font-size:16px;padding:10px 13px}
.rw-teamsearch input:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-glow)}
.rw-az-hdr{padding:14px 16px 6px;font-size:12px;font-weight:900;letter-spacing:.1em;color:var(--blue)}
/* TAP FIX 2026-07-18 (found by runtime tests): this rail spans the full height of
   the Teams list on top of every team card, so its CONTAINER was swallowing taps
   aimed at the favorite stars beneath it — the gaps between letters did nothing
   at all. The wrapper is only for positioning; only the letters should be
   tappable, so the container passes taps through and the buttons take them back.
   No visual change. */
.rw-az-rail{position:absolute;right:2px;top:96px;bottom:calc(var(--tabbar-h) + env(safe-area-inset-bottom) + 14px);z-index:8;display:flex;flex-direction:column;justify-content:center;gap:1px;padding:0 3px;-webkit-user-select:none;user-select:none;pointer-events:none}
.rw-az-rail button{pointer-events:auto}
/* A–Z rail: 9.5px letters with a taller/wider pad per button (~17px hit rows,
   up from ~13). 26 letters can never each be 44px in one column — WCAG 2.5.8's
   compact-list exception applies — but every letter is now bigger AND easier to
   land. Still fits the rail's fixed top/bottom bounds on an iPhone SE. */
.rw-az-rail button{border:0;background:none;color:var(--muted-2);font-size:9.5px;font-weight:900;padding:3px 6px;cursor:pointer;line-height:1.15}
.rw-az-rail button:active{color:var(--blue)}
.rw-favhead{display:flex;align-items:baseline;gap:8px;padding:14px 16px 8px;font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.rw-favhead .s{color:var(--amber)}
.rw-favhead .edit{margin-left:auto;font-size:11.5px;font-weight:800;letter-spacing:.02em;text-transform:none;color:var(--blue);cursor:pointer}

/* stats screen */
.rw-statwrap{padding-bottom:6px}
.rw-stathd{display:flex;align-items:baseline;gap:9px;padding:16px 16px 8px}
.rw-stathd .ttl{font-size:11.5px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.rw-stathd .sub{font-size:11px;font-weight:750;color:var(--muted-2)}
.rw-statchips{display:flex;gap:6px;overflow-x:auto;padding:4px 16px 10px;scrollbar-width:none}
.rw-statchips::-webkit-scrollbar{display:none}
.rw-statchip{flex:0 0 auto;font-size:11.5px;font-weight:850;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);padding:8px 14px;border-radius:9px;border:1px solid var(--line);background:var(--surface);cursor:pointer;font-family:inherit}
.rw-statchip.on{color:#fff;background:var(--accent);border-color:var(--accent);box-shadow:0 4px 12px rgba(46,107,255,.35)}
.rw-lead-row .n.sel,.rw-lead-row .pts.sel{color:#fff}
.rw-lead-head span.sel{color:var(--blue)}
.rw-lead-row .pl .rw-crest{width:27px;height:27px}

/* gamecenter page */
.rw-gc-hero{margin:12px 16px 0;background:linear-gradient(180deg,#16161b,#0c0c10);border:1px solid var(--line-2);border-radius:16px;box-shadow:var(--shadow);overflow:hidden}
.rw-gc-top{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px 14px 2px;font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2)}
.rw-gc-main{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:6px;padding:10px 14px 4px}
.rw-gc-side{display:flex;flex-direction:column;align-items:center;gap:7px;min-width:0;text-align:center}
.rw-gc-side .nm{font-size:12.5px;font-weight:800;color:#eaf1fb;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rw-gc-side .rec{font-size:10.5px;color:var(--muted-2);font-variant-numeric:tabular-nums}
.rw-gc-mid{display:flex;flex-direction:column;align-items:center;gap:3px;padding:0 6px}
.rw-gc-score{display:flex;align-items:center;gap:12px;font-size:38px;font-weight:900;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.rw-gc-score .w{color:#fff}.rw-gc-score .l{color:var(--muted)}
.rw-gc-score .x{font-size:16px;color:var(--muted-2);font-weight:800}
.rw-gc-st{font-size:10.5px;font-weight:900;letter-spacing:.09em;text-transform:uppercase;color:var(--green)}
.rw-gc-st.live{color:var(--red)}.rw-gc-st.sched{color:var(--muted)}
.rw-gc-venue{display:flex;align-items:center;justify-content:center;gap:6px;padding:9px 14px 13px;font-size:11.5px;color:var(--muted);border-bottom:0}
.rw-gc-tabs{margin:12px 16px 2px}
.rw-gc-recrow{display:flex;justify-content:space-between;gap:10px;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.07);font-size:13px;color:var(--muted)}
.rw-gc-recrow:last-of-type{border-bottom:0}
.rw-gc-recrow .v{color:#eef4fb;font-weight:750;display:flex;align-items:center;gap:8px}

/* team profile page (mockup: logo left, big uppercase name) */
.rw-tp-hero{display:flex;align-items:center;gap:15px;padding:18px 16px 8px;text-align:left}
.rw-tp-hero .tx{min-width:0}
.rw-tp-hero .rw-crest.xl{width:76px;height:76px;border-radius:18px;font-size:23px}
.rw-tp-hero .nm{font-size:21px;font-weight:900;letter-spacing:-.01em;line-height:1.12;color:#f4f8fd;text-transform:uppercase}
.rw-tp-hero .sub{font-size:10.5px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--muted-2);margin-top:4px}
/* favorite star sits on the hero row, pushed to the far right of the crest + name */
.rw-tp-hero .rw-star{margin-left:auto;flex:0 0 48px;width:48px;height:48px}
.rw-tp-hero .rw-star svg{width:31px;height:31px}
.rw-tp-stats{display:flex;gap:8px;padding:12px 16px 4px}
.rw-nextgame{margin:10px 16px 2px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line-2);border-radius:14px;padding:12px 14px;display:flex;align-items:center;gap:12px;cursor:pointer;box-shadow:var(--shadow)}
.rw-nextgame:active{border-color:var(--blue)}
.rw-nextgame .tx{flex:1;min-width:0}
.rw-nextgame .tx small{display:block;font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--blue);margin-bottom:3px}
.rw-nextgame .tx b{display:block;font-size:14.5px;font-weight:850;color:#eef4fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-nextgame .tx span{display:block;font-size:11.5px;color:var(--muted-2);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-tp-about{margin:4px 16px 12px;background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:4px 14px}

/* ================= July pass: surgical additions only ================= */
/* collapsing brand header — shrinks away scrolling down, returns scrolling up.
   Height (not margin) because the header is sticky: a negative margin would
   pin the brand in place and slide the tab row underneath it instead. */
.rw-hdr{transition:height .22s ease,border-color .22s ease}
.rw-app.rw-hdrhide .rw-hdr{height:env(safe-area-inset-top,0px);overflow:hidden;border-bottom-color:transparent}
/* followed team rows in standings: subtle blue marker (approved) */
.rw-tbl-row.fav{background:linear-gradient(90deg,rgba(82,132,255,.09),rgba(82,132,255,0));box-shadow:inset 3px 0 0 var(--blue)}
/* For You: next-game / season-state line under each followed team */
/* min-width:0 — the row is a grid item, so min-width:auto floored it at the
   nowrap next-game line and pushed the card off the right edge. */
.rw-fyrow{flex-wrap:wrap;min-width:0}
.rw-fy-next{flex:0 0 100%;display:flex;align-items:center;gap:7px;margin-top:9px;padding-top:9px;border-top:1px solid rgba(255,255,255,.07);font-size:11.5px;color:var(--muted);min-width:0}
.rw-fy-next .k{flex:0 0 auto;font-size:9px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--blue)}
.rw-fy-next .k.done{color:var(--muted-2)}
.rw-fy-next .v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-fy-next .rw-chev{font-size:13px}
/* new-final alerts banner (Home) */
.rw-alerts{margin:12px 16px 0;background:linear-gradient(180deg,#0f1a13,#0b0e0c);border:1px solid rgba(46,224,106,.28);border-radius:14px;overflow:hidden}
.rw-alerts-h{display:flex;align-items:center;gap:8px;padding:10px 13px 8px;font-size:10.5px;font-weight:900;letter-spacing:.1em;text-transform:uppercase;color:var(--green)}
.rw-alerts-h .x{margin-left:auto;width:26px;height:26px;border:0;background:none;color:var(--muted-2);font-size:17px;line-height:1;cursor:pointer;padding:0}
.rw-alert-row{display:flex;align-items:center;gap:10px;padding:9px 13px;border-top:1px solid rgba(255,255,255,.06);cursor:pointer}
.rw-alert-row:active{background:rgba(255,255,255,.04)}
.rw-alert-row .tx{flex:1;min-width:0;font-size:13px;font-weight:750;color:#eaf1fb;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rw-alert-row .tx b.w{color:var(--green)}.rw-alert-row .tx b.l{color:var(--red)}
.rw-alert-row .dt{flex:0 0 auto;font-size:10.5px;color:var(--muted-2)}
/* richer empty states */
.rw-empty2{margin:14px 16px;padding:22px 18px;text-align:center;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px dashed var(--line-2);border-radius:14px}
.rw-empty2 b{display:block;font-size:14.5px;font-weight:850;color:#eaf1fb}
.rw-empty2 span{display:block;font-size:12.5px;color:var(--muted-2);margin-top:6px;line-height:1.5}
.rw-empty2 .rw-foryou-cta{margin-top:14px}
/* gamecenter: directions link on the venue row */
.rw-gc-venue .dir{flex:0 0 auto;font-weight:800;color:var(--blue);cursor:pointer;white-space:nowrap}
/* Scores: mode chips (My Teams / All Games / Division) inside the ctx bar */
#scoresCtx{flex-direction:column;align-items:stretch;gap:8px}
.rw-scoremodes{display:flex;gap:7px}
.rw-scoremodes .rw-chip{flex:1;text-align:center}
.rw-divpick{display:flex;align-items:center;gap:6px}
.rw-divpick:empty{display:none}
.rw-divpick>button{min-width:0;display:flex;align-items:center;gap:10px;width:100%;border:1px solid var(--line-2);background:var(--surface);color:#eaf1fb;border-radius:12px;padding:11px 14px;font:inherit;box-shadow:0 6px 16px rgba(0,0,0,.28)}
.rw-divpick>button:first-child{flex:1}
.rw-divpick>button:active{background:var(--surface-2)}
.rw-divpick>button.rw-star{flex:0 0 44px;width:44px;padding:0;justify-content:center}
/* first-run team picker (shows once when nothing is followed) */
.rw-onb{position:fixed;inset:0;z-index:59;display:none;align-items:center;justify-content:center;padding:16px;background:rgba(0,0,0,.66);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}
.rw-onb.on{display:flex}
.rw-onb-card{display:flex;flex-direction:column;width:min(94vw,440px);max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);overflow:hidden;border-radius:20px;border:1px solid var(--line);box-shadow:0 24px 70px rgba(0,0,0,.55);background:radial-gradient(120% 50% at 50% -10%,#0d1c33 0%,rgba(13,28,51,0) 55%),var(--bg)}
.rw-onb-hd{padding:22px 20px 4px}
.rw-onb-hd h2{margin:0;font-size:24px;font-weight:900;letter-spacing:-.02em}
.rw-onb-hd p{margin:7px 0 0;font-size:13px;color:var(--muted);line-height:1.5}
.rw-onb-search{padding:14px 16px 4px}
.rw-onb-search input{width:100%;background:var(--surface);border:1px solid var(--line-2);border-radius:11px;color:#eef4fb;font:inherit;font-size:16px;padding:11px 13px}
.rw-onb-search input:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-glow)}
.rw-onb .rw-chips{flex:0 0 auto}
.rw-onb-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-bottom:12px}
.rw-onb-foot{flex:0 0 auto;display:flex;flex-direction:column;gap:8px;padding:12px 16px 14px;border-top:1px solid var(--line);background:rgba(8,8,10,.92);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}
.rw-onb-done{font-size:15px;font-weight:850;color:#fff;background:var(--accent);border:0;border-radius:12px;padding:14px;cursor:pointer;box-shadow:0 6px 18px rgba(46,107,255,.35)}
.rw-onb-done:disabled{opacity:.45;box-shadow:none;cursor:default}
.rw-onb-skip{font-size:12.5px;font-weight:700;color:var(--muted-2);background:none;border:0;padding:4px;cursor:pointer}
.rw-onb-legal{margin:0;font-size:10.5px;line-height:1.5;color:var(--muted-2);text-align:center}
.rw-onb-legal a{color:var(--muted);text-decoration:underline;text-underline-offset:2px}
/* offline indicator (shows only with no connection) */
.rw-offline{display:none;align-items:center;justify-content:center;gap:7px;padding:6px 12px;font-size:10.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--amber);background:rgba(255,194,75,.08);border-bottom:1px solid rgba(255,194,75,.22)}
.rw-offline.on{display:flex}
/* team comparison */
.rw-cmp-slots{display:flex;align-items:stretch;gap:9px;padding:14px 16px 4px}
.rw-cmp-slot{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px dashed var(--line-2);border-radius:14px;padding:14px 10px;cursor:pointer;min-width:0;font:inherit;color:inherit}
.rw-cmp-slot.filled{border-style:solid}
.rw-cmp-slot .nm{font-size:12.5px;font-weight:800;color:#eaf1fb;text-align:center;line-height:1.15;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rw-cmp-slot .sub{font-size:10px;color:var(--muted-2);text-align:center}
.rw-cmp-slot .hint{font-size:11.5px;font-weight:800;color:var(--blue)}
.rw-cmp-vs{align-self:center;flex:0 0 auto;font-size:11px;font-weight:900;color:var(--muted-2)}
.rw-cmp-search{padding:10px 16px 2px}
.rw-cmp-search input{width:100%;background:var(--surface);border:1px solid var(--line-2);border-radius:11px;color:#eef4fb;font:inherit;font-size:16px;padding:10px 13px}
.rw-cmp-search input:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-glow)}
/* weekly division digest card (Home) */
.rw-digest{margin:0 16px;background:linear-gradient(180deg,var(--surface),#0b0b0e);border:1px solid var(--line);border-radius:14px;padding:13px 15px;font-size:13.5px;line-height:1.62;color:#cfdcec;box-shadow:var(--shadow)}
/* rankings movement column */
.rw-lead-row .mv,.rw-lead-head .mv{text-align:center}
.rw-lead-row .mv{font-size:11px;font-weight:900;font-variant-numeric:tabular-nums;color:var(--muted-2)}
.rw-lead-row .mv.up{color:var(--green)}
.rw-lead-row .mv.down{color:var(--red)}
.rw-lead-row .mv.new{color:var(--blue);font-size:9.5px;letter-spacing:.05em} /* type floor (audit) */

/* ==========================================================================
   ACCESSIBILITY — WCAG 2.1 AA  (2026-07-12)
   Visual design is deliberately untouched: no layout, spacing, colour or type
   changes. The only things added are focus indicators, which are invisible
   until someone actually navigates by keyboard.
   ========================================================================== */

/* Visible keyboard focus (WCAG 2.4.7).
   The app had ZERO focus styles and five `outline:none` rules on the search
   inputs — a keyboard / switch-control user had no idea where they were.
   outline + outline-offset do not participate in layout, so nothing reflows. */
.rw-tab:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
a:focus-visible,
[tabindex]:focus-visible,
[role="button"]:focus-visible {
  outline: 2px solid var(--blue);
  outline-offset: 2px;
  border-radius: 10px;
}
/* Rows we promote to buttons (game rows, team rows, standings rows) sit INSIDE
   cards that clip their overflow. An outward ring gets sliced off and renders as a
   stray line, so draw it just inside the row's own edge instead — full ring, never
   clipped, and it costs no layout because outline never reflows. */
[role="button"][tabindex="0"]:focus-visible {
  outline: 2px solid var(--blue);
  outline-offset: -2px;
  border-radius: 10px;
}
/* Windows High Contrast / forced-colors — never let the ring get optimised away. */
@media (forced-colors: active) {
  :focus-visible { outline: 3px solid Highlight !important; }
}
/* Respect the OS "reduce motion" setting — the app animates page pushes and sheets. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* Teams list: the age/tier is the differentiator between a club's squads, so
   it leads the sub-line and carries the emphasis (see the card() comment). */
.rw-div-tag{color:var(--text);font-weight:900;letter-spacing:.02em}

/* Gamecenter: the division a borrowed record came from (see findRecAnywhere).
   Deliberately quiet — it is a qualifier on the number above it, not a headline. */
.rw-alt-div{margin-top:2px;font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);opacity:.85}

/* Update toast — created by app.js on controllerchange when a NEWER build has
   taken control of an already-open page (see the UPDATE TOAST comment there).
   Real <button>: keyboard/AT operable for free. 12.5px text (over the 9px
   floor), ≥44pt tap target via padding, sits above the bottom nav. */
/* CENTRED 2026-07-20: this sat just above the bottom nav, where it read as
   chrome and got ignored — people stayed on stale data. Dead centre is the one
   place it cannot be mistaken for furniture. */
.rw-update-toast{
  position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);
  z-index:80;
  appearance:none;-webkit-appearance:none;
  border:1px solid rgba(136,170,214,.35);
  border-radius:999px;
  background:#1a5cff;color:#fff;
  font-family:inherit;font-size:12.5px;font-weight:800;letter-spacing:.02em;line-height:1;
  padding:14px 20px;min-height:44px;
  box-shadow:0 10px 26px rgba(0,0,0,.45);
  cursor:pointer;white-space:nowrap;
}


/* SEASON TOGGLE 2026-08-16. Header-level control, same restrained pill as the
   website's. Deliberately quiet: it is a control, not a feature. 32px targets. */
.rw-season-sw{display:inline-flex;align-items:center;gap:2px;margin-right:8px;
  border:1px solid rgba(255,255,255,.16);border-radius:999px;padding:2px;
  background:rgba(255,255,255,.04)}
.rw-season-sw-b{appearance:none;background:transparent;border:0;cursor:pointer;
  font:inherit;font-size:11px;line-height:1;letter-spacing:.02em;white-space:nowrap;
  color:rgba(255,255,255,.62);padding:6px 9px;border-radius:999px;min-height:32px}
.rw-season-sw-b.on{background:rgba(45,124,246,.20);color:#fff;
  box-shadow:inset 0 0 0 1px rgba(45,124,246,.45)}
.rw-season-sw-b:focus-visible{outline:2px solid #2d7cf6;outline-offset:2px}

/* ==========================================================================
   GAMECENTER LIVE BOX (2026-08-20)
   Line score, latest plays, team stats, box score and play-by-play. Additive
   only: no existing selector is touched, and every value comes from the tokens
   already in :root so this reads as the same surface as the rest of the app.
   ========================================================================== */
.rw-gc-clock{display:flex;align-items:center;gap:7px;font-variant-numeric:tabular-nums;line-height:1}
.rw-gc-clock b{font-size:17px;font-weight:900;color:#fff;letter-spacing:-.01em}
.rw-gc-clock span{font-size:11px;font-weight:850;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
/* The power-play chip owns a full row below the matchup. Keeping it outside
   the five-column score grid prevents a long club name from pushing both
   crest cards beyond the viewport. */
.rw-gc-pprow{display:flex;justify-content:center;min-width:0;padding:0 16px 4px}
.rw-gc-pprow:empty{display:none}
.rw-gc-pp{max-width:100%;font-size:9.5px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;
  color:#ffcf5a;border:1px solid rgba(255,207,90,.45);border-radius:6px;padding:3px 7px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* line score */
.rw-gc-ls{margin:0 16px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.rw-gc-ls table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}
.rw-gc-ls th,.rw-gc-ls td{padding:9px 6px;text-align:center;font-size:12.5px;border-bottom:1px solid rgba(255,255,255,.06)}
.rw-gc-ls tbody tr:last-child td{border-bottom:0}
.rw-gc-ls th{font-size:10px;font-weight:900;letter-spacing:.06em;color:var(--muted-2);text-transform:uppercase}
.rw-gc-ls .tm{text-align:left;padding-left:12px;font-weight:800;color:#eaf1fb;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}
.rw-gc-ls .tot{font-weight:900;color:#fff}

/* latest + play-by-play share one row */
.rw-gc-latest{margin:0 16px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.rw-gc-play{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.06)}
.rw-gc-play:last-child{border-bottom:0}
.rw-gc-play .ic{flex:0 0 auto;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:900;margin-top:1px}
.rw-gc-play .ic.g{background:rgba(88,214,141,.16);color:var(--green);border:1px solid rgba(88,214,141,.32)}
.rw-gc-play .ic.p{background:rgba(255,71,87,.14);color:#ff8b96;border:1px solid rgba(255,71,87,.32)}
.rw-gc-play .bd{min-width:0;flex:1}
.rw-gc-play .top{display:flex;align-items:center;gap:7px;font-size:10.5px;font-weight:850;letter-spacing:.04em}
.rw-gc-play .top .tm{color:var(--muted);font-variant-numeric:tabular-nums}
.rw-gc-play .top .team{flex:0 1 auto;min-width:0;max-width:45%;color:#eaf1fb;font-weight:900;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rw-gc-play .top .kind{text-transform:uppercase;letter-spacing:.07em}
.rw-gc-play .top .kind.g{color:var(--blue)}
.rw-gc-play .top .kind.p{color:#ffcf5a}
.rw-gc-play .who{font-size:13px;font-weight:800;color:#f1f6ff;margin-top:2px;overflow:hidden;text-overflow:ellipsis}
.rw-gc-play .det{font-size:11.5px;font-weight:700;color:var(--muted);margin-top:1px}
.rw-gc-play .rs{flex:0 0 auto;align-self:center;font-variant-numeric:tabular-nums;font-weight:900;font-size:13px;color:#fff;
  background:rgba(255,255,255,.06);border:1px solid var(--line);border-radius:7px;padding:3px 8px;white-space:nowrap}
/* Penalty minutes, in the same right-rail chip a goal uses for the score, so
   both read as "the number for this row". Red to match the P badge on the left
   (.rw-gc-play .ic.p) rather than introducing a second penalty colour. */
.rw-gc-play .rs.pim{color:#ff8b96;background:rgba(255,71,87,.14);border-color:rgba(255,71,87,.32)}
.rw-gc-pbp{max-height:none}

/* team stats */
.rw-gc-tstats{margin:0 16px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 12px}
.rw-gc-strow{display:flex;align-items:center;gap:9px;padding:10px 0;border-bottom:1px solid rgba(255,255,255,.06)}
.rw-gc-strow:last-child{border-bottom:0}
.rw-gc-strow .v{flex:0 0 34px;font-size:15px;font-weight:900;color:#fff;font-variant-numeric:tabular-nums}
.rw-gc-strow .v:last-child{text-align:right}
.rw-gc-strow .lab{flex:0 0 auto;font-size:10.5px;font-weight:850;letter-spacing:.07em;text-transform:uppercase;color:var(--muted-2)}
.rw-gc-strow .bar{flex:1;height:4px;border-radius:3px;background:rgba(255,255,255,.07);overflow:hidden;display:flex}
.rw-gc-strow .bar i{display:block;height:100%;background:var(--blue);border-radius:3px}
.rw-gc-strow .bar.r{justify-content:flex-start}

/* box score tables */
.rw-gc-box{margin:0 16px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.rw-gc-box table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}
.rw-gc-box th,.rw-gc-box td{padding:8px 6px;text-align:center;font-size:12.5px;border-bottom:1px solid rgba(255,255,255,.06)}
.rw-gc-box tbody tr:last-child td{border-bottom:0}
.rw-gc-box th{font-size:10px;font-weight:900;letter-spacing:.06em;color:var(--muted-2);text-transform:uppercase}
.rw-gc-box .num{width:30px;color:var(--muted-2);font-weight:800}
.rw-gc-box .pn{text-align:left;font-weight:800;color:#eaf1fb;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}

/* --- Gamecenter hero + tabs, matched to Paul's reference (2026-08-20) ---
   Scoped to .rw-gc-* only. The app's shared .rw-seg2 pill control is untouched;
   the Gamecenter tab strip simply stopped using it and owns its own look. */
.rw-gc-side .side-lab{font-size:9.5px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;color:var(--muted-2)}
.rw-gc-st.live{color:#fff;background:var(--red);border-radius:6px;padding:3px 9px;letter-spacing:.1em}
.rw-gc-mid .rw-gc-clock{margin-top:5px}
.rw-gc-mid .rw-gc-clock b{font-size:22px}
.rw-gc-tabs{display:flex;gap:0;margin:14px 16px 2px;border-bottom:1px solid var(--line)}
.rw-gc-tabs button{flex:1;border:0;background:none;color:var(--muted);font:inherit;font-size:11.5px;font-weight:900;
  letter-spacing:.06em;text-transform:uppercase;padding:11px 4px 10px;border-bottom:2px solid transparent;margin-bottom:-1px}
.rw-gc-tabs button.on{color:#fff;border-bottom-color:var(--blue)}
/* Align the two team columns to the top so the AWAY / HOME eyebrows sit on one
   line even when one club name wraps to two. */
.rw-gc-main .rw-gc-side{align-self:start}

/* Gamecenter secondary actions: LiveBarn + Add to Calendar, side by side and
   quiet. Deliberately NOT .rw-btn-gc, which Home's Featured Game button uses
   and which must stay the loud primary. */
.rw-gc-acts{display:flex;gap:8px;padding:10px 14px 12px;border-top:1px solid var(--line)}
.rw-gc-acts[hidden]{display:none}
.rw-gc-act{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;font:inherit;font-size:10.5px;
  font-weight:850;letter-spacing:.06em;text-transform:uppercase;padding:9px 8px;border-radius:9px;
  color:var(--muted);background:transparent;border:1px solid var(--line-2);text-decoration:none;white-space:nowrap}
.rw-gc-act:active{background:rgba(255,255,255,.05);color:#eef4fb}

/* --- Gamecenter hero, matched to Paul's reference (2026-08-20, pass 2) ---
   Flat on the page instead of a floating card; one meta line; the two scores
   flank a boxed clock panel. Every rule below is scoped to .rw-gc-*. */
.rw-gc-hero{margin:0;background:none;border:0;border-bottom:1px solid var(--line);border-radius:0;box-shadow:none}
.rw-gc-top{flex-wrap:wrap;justify-content:center;gap:7px;padding:12px 16px 4px;font-size:10px;letter-spacing:.09em;color:var(--muted-2)}
.rw-gc-top b{font-weight:900;color:var(--muted);border-bottom:1px dotted var(--line-2);cursor:pointer}
.rw-gc-main{grid-template-columns:1fr auto auto auto 1fr;gap:8px;padding:8px 12px 6px}
/* THE MATCHUP WAS SHIFTED LEFT ON EVERY GAME WITHOUT A SCORE (2026-08-21).
   The five tracks above match the FINAL/LIVE markup, which emits
   side + .rw-gc-num + .rw-gc-mid + .rw-gc-num + side. Two rows never do:
   a SCHEDULED game (app.js paint(): aNum/hNum are empty unless fin||live) and
   Home's Next Game hero (app.js renderHero(), which emits no number at all).
   Those rows put three children into a five-track grid, so tracks 4 and 5 sat
   empty on the right and the whole matchup was pushed left by one 1fr column
   plus a gap. Measured at 390px: away centre 63, clock 139, home 233, against
   a true centre of 195. Every 2026-27 game is scheduled until the season
   starts, so this was the state of the app on opening day.
   Give a row with no score numbers the three-track template it actually fills.
   Rows that DO carry numbers keep the five-track layout, untouched. */
.rw-gc-main:not(:has(.rw-gc-num)){grid-template-columns:1fr auto 1fr}
.rw-gc-num{font-size:38px;font-weight:900;font-variant-numeric:tabular-nums;letter-spacing:-.03em;line-height:1;min-width:26px;text-align:center}
.rw-gc-num.w{color:#fff}.rw-gc-num.l{color:var(--muted)}
.rw-gc-mid{gap:6px;padding:0 2px;min-width:0}
.rw-gc-when{font-size:19px;font-weight:900;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap}
.rw-gc-panel{display:flex;flex-direction:column;align-items:center;gap:1px;padding:5px 12px;
  /* The LIVE pill already says it, in the same red. Transparent not removed, so
     the box model and every gap around it are unchanged. 2026-08-29. */
  border:1px solid transparent;border-radius:10px;background:transparent}
.rw-gc-panel .rw-gc-clock{flex-direction:column;gap:0;margin:0}
.rw-gc-panel .rw-gc-clock b{font-size:21px;line-height:1.05}
.rw-gc-panel .rw-gc-clock span{font-size:10px}
.rw-gc-dirrow{text-align:center;padding:0 16px 10px;font-size:12px;font-weight:800;color:var(--blue);cursor:pointer}
.rw-gc-acts{border-top:0;padding:2px 16px 12px}

/* card headers sit INSIDE the card, on the first row, like the reference */
.rw-gc-cardh{padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.08);
  font-size:10.5px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.rw-gc-ls th.tm{text-align:left;font-size:10.5px;letter-spacing:.12em;color:var(--muted)}
.rw-gc-ls,.rw-gc-latest,.rw-gc-tstats{margin-top:12px}
.rw-gc-tstats{padding:0}
.rw-gc-tstats .rw-gc-strow{padding:10px 12px}
.rw-gc-main{padding:8px 16px 6px;gap:7px}
.rw-gc-side .rec{white-space:nowrap}
.rw-gc-dirrow{padding:0 16px 8px}

/* Solid badges (2026-08-20, Paul): the goal / penalty circles and the LIVE tag
   were tinted fills with translucent borders and read washed out. Solid now,
   on the existing --green / --red tokens with dark ink so they still clear the
   AA contrast floor the a11y pass set. */
.rw-gc-play .ic.g{background:var(--green);color:#06210f;border:0}
.rw-gc-play .ic.p{background:var(--red);color:#2b0409;border:0}
.rw-gc-st.live{background:var(--red);color:#fff;border:0}
.rw-gc-panel{border-color:transparent;background:transparent}
