  :root{
    --paper:#0a0a0a;
    --paper-2:#181818;
    --ink:#f4f6f8;
    --ink-rgb:244,246,248;
    --rule:#2c2c2c;
    --on-accent:#0a0a0a; /* foreground on accent fills; = legacy --paper default. applyTenantTheme overrides by accent luminance. */
    --track:#F0C00C;
    --field:#B39244;
    --gold:#F0C00C;
    --accent:#F0C00C;
    /* RGB channels of the two themeable colors, for rgba() tints/glows that can't
       wrap a hex var. Keep in sync with --accent and --paper above. Per-tenant
       theming overrides --accent + --accent-rgb (and optionally --paper + --paper-rgb)
       together. */
    --accent-rgb:240,192,12;
    --paper-rgb:10,10,10;
    --muted:#9a9a9a;
    --shadow:rgba(0,0,0,.4);
  }
  *{box-sizing:border-box;margin:0;padding:0}
  /* Reserve the scrollbar gutter at all times so switching between short tabs
     (Attendance/Stopwatch/Clipboard) and the taller Testing tab doesn't add/
     remove the window scrollbar and shift the centered layout horizontally. */
  html{scroll-behavior:smooth;scrollbar-gutter:stable}
  body{
    background:var(--paper);
    color:var(--ink);
    font-family:'Barlow',sans-serif;
    line-height:1.5;
    /* Kill the mobile double-tap-to-zoom gesture (and the legacy ~300ms tap
       delay) app-wide, so rapid consecutive taps on buttons/cards/tabs register
       as taps rather than a zoom. Pinch-to-zoom and scrolling are preserved, so
       accessibility isn't hurt. Elements that need a different gesture model set
       their own, more-specific touch-action: the splash swipe carousel uses
       pan-y, and Leaflet maps (.leaflet-container) set their own. */
    touch-action:manipulation;
    /* Fixed-radius glow: the falloff is pinned in px so it no longer scales with
       page height / viewport aspect. Before, the `transparent 50%` stop was
       relative to the farthest corner, so tall/wide pages (Schedule, Almanac,
       Winner's Circle) spread the warm tint into a visible "brown" band while
       short pages and mobile looked flat. A fixed 620px circle renders the same
       subtle top accent on every page and every device. */
    background-image:radial-gradient(circle 620px at 50% -10%, rgba(var(--accent-rgb),.04), transparent);
    min-height:100vh;
    /* Belt-and-suspenders against any latent right-edge bleed on mobile
       (e.g. an outline:2px on an input near the edge). Vertical scroll is
       unaffected — the body is already the scroll root. */
    overflow-x:hidden;
  }
  .grain{display:none}
  .wrap{max-width:1180px;margin:0 auto;padding:0 28px 80px;position:relative;z-index:2}

  /* ---------- Splash ---------- */
  #splash{
    /* Lock the splash to the viewport — this page never scrolls vertically.
       dvh tracks the *visible* area on mobile (excludes the browser chrome) so
       the footer isn't pushed under the URL bar; vh is the fallback. */
    height:100vh;
    height:100dvh;
    overflow:hidden;
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
    padding:40px 28px;
    text-align:center;
    position:relative;
  }
  .splash-kicker{
    font-family:'JetBrains Mono',monospace;
    font-size:12px;letter-spacing:.32em;
    text-transform:uppercase;color:var(--muted);
    margin-bottom:32px;
  }
  .splash-title{
    font-family:'Oswald',sans-serif;font-weight:700;
    font-size:clamp(52px,12vw,120px);
    line-height:.88;letter-spacing:.01em;text-transform:uppercase;
  }
  .splash-title em{font-style:normal;color:var(--gold)}
  .splash-rule{width:64px;height:3px;background:var(--gold);margin:32px auto}
  .splash-sub{
    font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
    font-size:clamp(16px,2.2vw,20px);color:var(--muted);
    max-width:42ch;margin:0 auto 48px;
  }
  /* Reserves a constant height for the picker↔Front-Office swap so changing
     slides doesn't resize the vertically-centered splash column (which would
     bump the carousel up/down). Sized to the taller of the two states; the
     add-athlete form still expands past it on click, which is intended. */
  /* The entry zone is no longer shown — each app enters via its peek card,
     which proxies the matching button's click. Kept in the DOM (hidden) because
     #athleteSelect inside it is the app-wide roster data source. */
  .splash-entry-zone{display:none}
  .splash-select-wrap{display:flex;flex-direction:column;align-items:center;gap:12px}
  .splash-label{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
  }
  .splash-select{
    font-family:'Barlow',sans-serif;font-size:17px;font-weight:600;
    padding:12px 20px;border:1px solid var(--gold);
    background:var(--paper-2);color:var(--ink);
    cursor:pointer;border-radius:2px;min-width:260px;
  }
  .splash-select:focus{outline:2px solid var(--gold);outline-offset:2px}
  .splash-spinner{
    display:none;align-items:center;gap:10px;
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
    margin-top:4px;
  }
  .splash-spinner.on{display:flex}
  .splash-spinner::before{
    content:'';width:14px;height:14px;border-radius:50%;
    border:2px solid rgba(var(--accent-rgb),.25);border-top-color:var(--gold);
    animation:spin .8s linear infinite;
  }
  @keyframes spin{to{transform:rotate(360deg)}}
  .splash-notice{
    display:none;max-width:340px;margin-top:8px;
    font-family:'Barlow',sans-serif;font-size:12px;color:var(--muted);
    border-top:1px solid rgba(var(--accent-rgb),.3);padding-top:8px;line-height:1.5;
  }
  .splash-notice.on{display:block}

  /* ---------- Front Office — add-new-athlete affordance ---------- */
  /* Inline expand inside the Front Office roster so coaches can create athletes
     who don't yet have an athletic.net id (e.g. kids new to the club, pre-season).
     The "+ Add new athlete" link toggles the form open in place above the roster. */
  .admin-add-link{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
    background:none;border:none;cursor:pointer;padding:0;
    border-bottom:1px solid transparent;transition:color .15s,border-color .15s;
  }
  .admin-add-link:hover{color:var(--gold);border-bottom-color:var(--gold)}
  .admin-add-link .plus{color:var(--gold);margin-right:4px}
  .admin-add-form{
    display:none;flex-direction:column;gap:10px;
    width:100%;max-width:340px;
    border:1px solid var(--rule);background:var(--paper-2);
    padding:18px;border-radius:2px;text-align:left;
  }
  .admin-add-form.on{display:flex}
  .admin-add-form .field{display:flex;flex-direction:column;gap:6px}
  .admin-add-form .field-label{
    font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  }
  .admin-add-form input[type="text"],
  .admin-add-form input[type="number"]{
    font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .admin-add-form input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .admin-add-form .gender-toggle{display:flex;gap:6px}
  .admin-add-form .gender-toggle button{
    flex:1;font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s,border-color .15s;
  }
  .admin-add-form .gender-toggle button:hover{border-color:var(--gold)}
  .admin-add-form .gender-toggle button.on{
    background:var(--gold);color:var(--on-accent);border-color:var(--gold);
  }
  .admin-add-form .actions{display:flex;gap:8px;margin-top:4px}
  .admin-add-form .save-btn{
    flex:1;font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;
    padding:10px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .admin-add-form .save-btn:hover{background:transparent;color:var(--gold)}
  .admin-add-form .save-btn:disabled{opacity:.4;cursor:default}
  .admin-add-form .cancel-btn{
    flex:0 0 auto;font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
    background:none;border:1px solid var(--rule);
    padding:10px 14px;cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .admin-add-form .cancel-btn:hover{color:var(--ink);border-color:var(--ink)}

  /* Club Users (owner user-admin) — share the Front Office form look (the invite
     form has no .admin-add-form class, so it needs its own scoped rules). */
  .admin-users .field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
  .admin-users .field-label{
    font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  }
  .admin-users input,
  .admin-users select{
    font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .admin-users input:focus,
  .admin-users select:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .admin-users .field input,
  .admin-users .field select{width:100%;box-sizing:border-box}
  .admin-users .actions{display:flex;gap:8px;margin-top:4px}
  .admin-users .save-btn{
    font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;
    padding:10px 16px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .admin-users .save-btn:hover{background:transparent;color:var(--gold)}
  .admin-users .save-btn:disabled{opacity:.4;cursor:default}
  .admin-users .cancel-btn{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
    background:none;border:1px solid var(--rule);
    padding:8px 12px;cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .admin-users .cancel-btn:hover{color:var(--ink);border-color:var(--ink)}
  .admin-users .users-list select{padding:6px 10px;font-size:13px}

  /* Login gate + invite-accept gate (Phase 3) — themed to match the splash: black paper +
     gold, Oswald title. Both are full-screen centered overlays so the splash carousel never
     shows through behind them. */
  #authGate, #inviteGate{
    display:none;position:fixed;inset:0;z-index:10000;
    background:var(--paper);color:var(--ink);
    align-items:center;justify-content:center;padding:28px;
  }
  .auth-gate-card{width:100%;max-width:330px;text-align:center}
  .auth-gate-kicker{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.28em;text-transform:uppercase;color:var(--muted);margin-bottom:12px;
  }
  .auth-gate-title{
    font-family:'Oswald',sans-serif;font-weight:700;font-size:46px;line-height:1;
    text-transform:uppercase;margin:0;
  }
  .auth-gate-title em{font-style:normal;color:var(--gold)}
  .auth-gate-rule{width:56px;height:3px;background:var(--gold);margin:22px auto}
  .auth-gate-note{font-family:'Barlow',sans-serif;font-size:14px;color:var(--muted);margin:0 0 24px}
  .auth-gate-input{
    width:100%;box-sizing:border-box;font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:11px 12px;border:1px solid var(--rule);background:var(--paper-2);
    color:var(--ink);border-radius:2px;margin-bottom:10px;
  }
  .auth-gate-input::placeholder{color:var(--muted)}
  .auth-gate-input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .auth-gate-btn{
    width:100%;font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.16em;text-transform:uppercase;font-weight:600;cursor:pointer;
    padding:12px;border:1px solid var(--gold);background:transparent;color:var(--gold);
    border-radius:2px;transition:background .15s,color .15s;
  }
  .auth-gate-btn:hover{background:var(--gold);color:var(--on-accent)}
  .auth-gate-btn-primary{background:var(--gold);color:var(--on-accent)}
  .auth-gate-btn-primary:hover{background:transparent;color:var(--gold)}
  .auth-gate-or{
    display:flex;align-items:center;gap:12px;
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.2em;
    text-transform:uppercase;color:var(--muted);margin:18px 0;
  }
  /* Hairlines flanking the "OR", separating social sign-in from email sign-in. */
  .auth-gate-or::before,.auth-gate-or::after{content:'';flex:1;height:1px;background:var(--rule)}
  .auth-gate-fine{font-family:'Barlow',sans-serif;font-size:12px;color:var(--muted);margin-top:20px}

  /* Muted assist under the "Sign in with Apple" button: tells invitees to pick
     "Share My Email" so the address matches their email-keyed invite (Hide My
     Email hands us a per-app privaterelay address that won't match). */
  .auth-gate-apple-hint{
    font-family:'Barlow',sans-serif;font-size:12px;color:var(--muted);
    line-height:1.4;margin:6px 2px 0;
  }
  .auth-gate-apple-hint strong{color:var(--text,inherit);font-weight:600}

  /* "Show password" toggle — sits just under a password field on every sign-in
     form. Left-aligned and muted so it reads as a small assist, not a field.
     Uses theme vars so it works on the dark member gate and the Front Office /
     Press Box forms alike. */
  .pw-show{
    display:flex;align-items:center;gap:7px;cursor:pointer;user-select:none;
    font-family:'Barlow',sans-serif;font-size:13px;color:var(--muted);
    /* Generous bottom gap so toggling "Show password" can't fat-finger the
       Sign in button sitting right below it. */
    margin:-2px 0 22px;
  }
  .pw-show input{width:auto;margin:0;cursor:pointer;accent-color:var(--gold)}

  /* Global account menu — small chip fixed top-right; shown only when signed in. The
     chip opens a dropdown holding the name-order toggle and Sign out. */
  .acct-menu{ display:none; position:fixed; top:12px; right:12px; z-index:9000; }
  .acct-menu:not([hidden]){ display:block; }
  .acct-chip{
    display:flex;align-items:center;gap:6px;max-width:42vw;
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.14em;text-transform:uppercase;
    color:var(--muted);background:rgba(var(--paper-rgb),.6);border:1px solid var(--rule);
    padding:6px 10px;border-radius:2px;cursor:pointer;transition:color .15s,border-color .15s;
  }
  .acct-chip:hover{ color:var(--gold);border-color:var(--gold); }
  #acctChipName{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }
  .acct-caret{ font-size:8px;opacity:.7; }

  .acct-dropdown{
    position:absolute;top:calc(100% + 6px);right:0;min-width:184px;
    background:rgba(var(--paper-rgb),.97);border:1px solid var(--rule);border-radius:3px;
    padding:10px;box-shadow:0 8px 24px rgba(0,0,0,.4);
  }
  .acct-dropdown[hidden]{ display:none; }

  /* Identity header — who you're signed in as. */
  .acct-ident{ padding:2px 2px 0; }
  .acct-ident-name{
    font-size:12px;font-weight:600;color:var(--ink);line-height:1.3;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .acct-ident-meta{
    display:flex;align-items:center;gap:8px;margin-top:3px;
    font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--muted);
  }
  .acct-ident-email{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0; }
  .acct-role{
    flex:none;font-size:8px;letter-spacing:.12em;text-transform:uppercase;
    color:var(--gold);border:1px solid var(--gold);border-radius:2px;padding:1px 5px;
  }

  .acct-dd-label{
    font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.16em;text-transform:uppercase;
    color:var(--muted);margin-bottom:6px;
  }
  .acct-setting-name{ font-size:11px;color:var(--ink);margin-bottom:5px; }
  .acct-nameorder{ display:flex;gap:4px; }
  .acct-no-opt{
    flex:1;white-space:nowrap;
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.06em;
    color:var(--muted);background:transparent;border:1px solid var(--rule);
    padding:6px 8px;border-radius:2px;cursor:pointer;transition:color .15s,border-color .15s,background .15s;
  }
  .acct-no-opt:hover{ color:var(--ink); }
  .acct-no-opt[aria-pressed="true"]{ color:var(--gold);border-color:var(--gold);background:rgba(240,192,12,.10); }
  .acct-splashview{ display:flex;gap:4px; }
  .acct-sv-opt{
    flex:1;white-space:nowrap;
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.06em;
    color:var(--muted);background:transparent;border:1px solid var(--rule);
    padding:6px 8px;border-radius:2px;cursor:pointer;transition:color .15s,border-color .15s,background .15s;
  }
  .acct-sv-opt:hover{ color:var(--ink); }
  .acct-sv-opt[aria-pressed="true"]{ color:var(--gold);border-color:var(--gold);background:rgba(240,192,12,.10); }
  .acct-dd-error{ font-family:'JetBrains Mono',monospace;font-size:10px;color:#d68a6a;margin-top:6px; }
  .acct-dd-sep{ height:1px;background:var(--rule);margin:10px 0 8px; }
  .acct-dd-item{
    display:block;width:100%;text-align:left;
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.14em;text-transform:uppercase;
    color:var(--muted);background:transparent;border:0;padding:4px 2px;cursor:pointer;transition:color .15s;
  }
  .acct-dd-item:hover{ color:var(--gold); }
  /* Send feedback — a noticeable accent action, set apart from the muted Sign out. */
  .acct-dd-feedback{
    text-align:center;color:var(--gold);
    border:1px solid var(--gold);border-radius:3px;
    padding:8px;background:rgba(240,192,12,.08);
  }
  .acct-dd-feedback:hover{ color:var(--gold);background:rgba(240,192,12,.18); }

  /* Mobile: the fixed top-right overlay collides with right-aligned masthead text
     (e.g. Coach's Corner's ".kicker-right"). Drop the chip into normal flow at the
     top of the page instead so content sits below it and nothing is overlaid. Use
     position:relative (NOT static) so the chip stays in flow BUT remains a
     positioning + stacking context — otherwise the absolutely-positioned dropdown
     escapes to the viewport (opening ~100vh off-screen) and loses its z-index, so
     the menu can't be seen/used. The dropdown stays right-aligned under the chip.
     (Desktop keeps the fixed pin.) */
  @media(max-width:600px){
    .acct-menu{
      position:relative;width:fit-content;
      margin:10px max(16px,env(safe-area-inset-right)) 0 auto;
    }
    /* In-flow only works on the splash. Every surface (My Locker, The Huddle,
       the Almanac, the stopwatch…) is a full-viewport fixed layer (.surface,
       z-index:60) with its own Back button, so the chip's z-index:9000 floats
       it on top of the surface's own top-right controls (e.g. The Huddle's
       Active|Archived toggle). Hide the chip while any surface is open — it
       returns on the splash. */
    body:has(.surface.show) .acct-menu{ display:none; }
  }

  .admin-add-error{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    color:#d68a6a;line-height:1.4;
  }

  /* ---- Import-meet (paste) form ---- */
  /* Wider than the add-athlete form (340px) because it holds a results textarea
     and a preview table. Shares .admin-add-form for the open/close + base look. */
  .admin-paste-form{max-width:760px}
  .admin-paste-form .paste-blob{
    width:100%;box-sizing:border-box;resize:vertical;
    font-family:'JetBrains Mono',monospace;font-size:12px;line-height:1.4;
    white-space:pre;overflow:auto;
    padding:10px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .admin-paste-form .paste-blob:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .paste-csv-load{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:6px}
  .paste-csv-btn{display:inline-block;cursor:pointer;font-family:'JetBrains Mono',monospace;
    font-size:11px;letter-spacing:.06em;text-transform:uppercase;padding:5px 10px;
    border:1px solid var(--gold);border-radius:3px;color:var(--gold);background:rgba(var(--accent-rgb),.08)}
  .paste-csv-btn:hover{background:rgba(var(--accent-rgb),.16)}
  .paste-csv-name{font-family:'JetBrains Mono',monospace;font-size:11px;color:#6cc47c}
  .admin-paste-form input[type="date"]{
    font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .admin-paste-form input[type="date"]:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .paste-fields{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px}
  .field-opt{text-transform:none;letter-spacing:0;color:var(--muted)}
  .paste-checkbox{display:flex;align-items:center;gap:8px;cursor:pointer;
    font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);padding-top:6px}
  .paste-checkbox input{width:auto;margin:0}

  .paste-preview{margin-top:6px}
  .paste-empty{padding:12px 14px;border:1px solid #f0c8c2;background:#2a1f1d;
    border-radius:2px;font-family:'Barlow',sans-serif;font-size:14px;color:#e0b4a8}
  .paste-summary{font-family:'JetBrains Mono',monospace;font-size:12px;
    color:var(--muted);line-height:1.5;margin-bottom:10px}
  .paste-summary strong{color:var(--ink);font-weight:600}
  .paste-tablewrap{max-height:340px;overflow:auto;border:1px solid var(--rule);border-radius:2px}
  .paste-table{width:100%;border-collapse:collapse;font-family:'Barlow',sans-serif;font-size:13px}
  .paste-table th,.paste-table td{text-align:left;padding:8px 10px;
    border-bottom:1px solid var(--rule);vertical-align:top}
  .paste-table thead th{position:sticky;top:0;background:var(--paper-2);
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.12em;
    text-transform:uppercase;color:var(--muted);font-weight:400}
  .paste-table .paste-mark{font-family:'JetBrains Mono',monospace;font-weight:500;
    font-variant-numeric:tabular-nums}
  .paste-badge{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:9px;
    letter-spacing:.1em;text-transform:uppercase;padding:2px 6px;border-radius:2px;
    margin-left:6px;vertical-align:middle}
  .paste-badge-existing{background:rgba(var(--accent-rgb),.15);color:var(--gold)}
  .paste-badge-new{background:rgba(214,138,106,.18);color:#d68a6a}
  .paste-badge-dup{background:rgba(214,138,106,.22);color:#e0926a}
  /* Roster-first match tiers */
  .paste-badge-confident{background:rgba(108,196,124,.16);color:#6cc47c}
  .paste-badge-unlisted{background:rgba(var(--accent-rgb),.15);color:var(--gold)}
  .paste-badge-collision{background:rgba(214,138,106,.22);color:#e0926a}
  .paste-row-note{font-family:'JetBrains Mono',monospace;font-size:11px;color:#d68a6a}
  .paste-row-dup td{background:rgba(214,138,106,.06)}
  .paste-dup-count{color:#e0926a}
  .paste-skip-count{color:var(--muted)}
  .paste-table th.paste-pick,.paste-table td.paste-pick{width:54px;text-align:center}
  .paste-row-check{width:auto;margin:0;cursor:pointer}
  .paste-dup-hint{font-family:'JetBrains Mono',monospace;font-size:11px;
    color:#e0926a;margin:8px 0 0}
  .paste-venue-ok{font-family:'JetBrains Mono',monospace;font-size:11px;
    color:var(--muted);margin-bottom:10px}
  .paste-venue-warn{font-family:'JetBrains Mono',monospace;font-size:11px;
    color:#e0926a;line-height:1.4;margin-bottom:10px;
    padding:8px 10px;border:1px solid rgba(214,138,106,.4);border-radius:2px;
    background:rgba(214,138,106,.08)}
  .admin-meets-title{margin-top:44px}

  /* ---- Roster row actions + inline edit form ---- */
  .admin-row-actions{display:flex;gap:8px;align-items:center}
  .admin-edit{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.12em;text-transform:uppercase;
    background:none;border:1px solid var(--rule);color:var(--muted);
    padding:6px 12px;cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .admin-edit:hover{color:var(--gold);border-color:var(--gold)}
  .admin-edit-form{
    display:flex;flex-direction:column;gap:10px;
    width:100%;max-width:340px;margin:2px 0 12px;
    border:1px solid var(--gold);background:var(--paper-2);
    padding:16px 18px;border-radius:2px;text-align:left;
  }
  .admin-edit-title{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:16px;
    text-transform:uppercase;letter-spacing:.02em;color:var(--ink);
  }
  .admin-edit-form .field{display:flex;flex-direction:column;gap:6px}
  .admin-edit-form .field-label{
    font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  }
  .admin-edit-form input[type="text"],
  .admin-edit-form input[type="number"]{
    font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .admin-edit-form input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .admin-edit-form .gender-toggle{display:flex;gap:6px}
  .admin-edit-form .gender-toggle button{
    flex:1;font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s,border-color .15s;
  }
  .admin-edit-form .gender-toggle button:hover{border-color:var(--gold)}
  .admin-edit-form .gender-toggle button.on{
    background:var(--gold);color:var(--on-accent);border-color:var(--gold);
  }
  .admin-edit-form .actions{display:flex;gap:8px;margin-top:4px}
  .admin-edit-form .save-btn{
    flex:1;font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;
    padding:10px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .admin-edit-form .save-btn:hover{background:transparent;color:var(--gold)}
  .admin-edit-form .save-btn:disabled{opacity:.4;cursor:default}
  .admin-edit-form .cancel-btn{
    flex:0 0 auto;font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
    background:none;border:1px solid var(--rule);
    padding:10px 14px;cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .admin-edit-form .cancel-btn:hover{color:var(--ink);border-color:var(--ink)}
  @media (max-width:640px){.paste-fields{grid-template-columns:1fr}}
  .splash-footer{
    position:absolute;bottom:28px;left:0;right:0;
    font-family:'JetBrains Mono',monospace;font-size:11px;
    color:var(--muted);text-align:center;letter-spacing:.1em;
    display:flex;flex-direction:column;align-items:center;gap:10px;
  }
  .splash-footer-meta{color:var(--muted)}
  .whats-new-link{
    position:relative;background:none;border:none;cursor:pointer;
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.1em;
    text-transform:uppercase;color:var(--gold);
    padding:2px 0;border-bottom:1px solid transparent;transition:border-color .15s;
  }
  .whats-new-link:hover{border-bottom-color:var(--gold)}
  .whats-new-dot{
    display:inline-block;width:6px;height:6px;border-radius:50%;
    background:var(--gold);margin-left:6px;vertical-align:middle;
    box-shadow:0 0 6px rgba(var(--accent-rgb),.8);
  }
  /* Credits link — far-right of the footer on wider screens (lives inside
     .splash-footer, which is the positioned ancestor). On phones it drops out
     of the corner and flows as a centered line under the meta to avoid
     overlapping "…athletic.net data". */
  .splash-credits-link{
    position:absolute;right:24px;bottom:0;z-index:2;
    background:none;border:none;cursor:pointer;
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.1em;
    text-transform:uppercase;color:var(--muted);
    padding:2px 0;border-bottom:1px solid transparent;
    transition:color .15s,border-color .15s;
  }
  .splash-credits-link:hover{color:var(--gold);border-bottom-color:var(--gold)}
  @media (max-width:480px){
    .splash-credits-link{position:static;right:auto;bottom:auto}
  }
  /* Height-constrained viewports (small laptops with a docked taskbar): the
     vertically-centered column grows tall enough that its bottom (the admin
     hint) collides with the absolutely-pinned footer. Top-align the column and
     let the footer flow to the bottom as a sticky footer (margin-top:auto) so
     the two can never overlap; also tighten the vertical rhythm so the column
     fits without scrolling. Tall screens keep the centered design above.
     Gated to wider (laptop) screens: phones are also <900px tall but want the
     carousel centered (thumb-reachable), so they keep the centered base layout. */
  @media (max-height:900px) and (min-width:600px){
    #splash{justify-content:flex-start;padding-top:32px;padding-bottom:24px}
    .splash-kicker{margin-bottom:20px}
    .splash-rule{margin:20px auto}
    .splash-sub{margin-bottom:32px}
    .splash-entry-zone{min-height:0}
    .splash-footer{position:static;margin-top:auto;padding-top:24px}
    .splash-credits-link{position:static;right:auto;bottom:auto}
  }
  /* Credits modal body (shell reuses the .wn-* overlay styles). */
  .cr-body{padding-top:18px;display:flex;flex-direction:column;gap:18px}
  .cr-label{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.18em;
    text-transform:uppercase;color:var(--gold);margin-bottom:8px;
  }
  .cr-text{
    font-family:'Barlow',sans-serif;font-size:14.5px;line-height:1.55;
    color:var(--ink);margin-bottom:4px;
  }
  .cr-text:last-child{margin-bottom:0}
  .cr-link{color:var(--gold);text-decoration:none;border-bottom:1px solid var(--rule)}
  .cr-link:hover{border-bottom-color:var(--gold)}

  /* ---------- What's New overlay ---------- */
  .wn-overlay{
    position:fixed;inset:0;z-index:50;
    display:flex;align-items:center;justify-content:center;padding:24px;
    background:rgba(0,0,0,.66);backdrop-filter:blur(2px);
    opacity:0;transition:opacity .2s ease;
  }
  .wn-overlay.open{opacity:1}
  .wn-modal{
    position:relative;width:100%;max-width:560px;max-height:82vh;
    overflow-y:auto;background:var(--paper-2);
    border:1px solid var(--rule);border-radius:4px;
    padding:34px 32px 30px;box-shadow:0 24px 60px var(--shadow);
    transform:translateY(8px) scale(.99);transition:transform .2s ease;
  }
  .wn-overlay.open .wn-modal{transform:none}
  .wn-close{
    position:absolute;top:12px;right:14px;background:none;border:none;
    color:var(--muted);font-size:26px;line-height:1;cursor:pointer;
    padding:4px 8px;transition:color .15s;
  }
  .wn-close:hover{color:var(--ink)}
  .wn-kicker{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.28em;
    text-transform:uppercase;color:var(--muted);
  }
  .wn-title{
    font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;
    font-size:30px;letter-spacing:.01em;margin:6px 0 2px;
  }
  .wn-sub{
    font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
    font-size:14px;color:var(--muted);
  }
  .wn-head{border-bottom:1px solid var(--rule);padding-bottom:18px;margin-bottom:6px}
  .wn-release{padding-top:18px}
  .wn-date{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.18em;
    text-transform:uppercase;color:var(--gold);margin-bottom:14px;
  }
  .wn-items{list-style:none}
  .wn-item{
    display:flex;gap:12px;align-items:baseline;
    padding:11px 0;border-top:1px solid var(--rule);
  }
  .wn-item:first-child{border-top:none}
  .wn-tag{
    flex:0 0 96px;font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.06em;text-transform:uppercase;color:var(--field);
    padding-top:2px;
  }
  .wn-text{font-family:'Barlow',sans-serif;font-size:14.5px;line-height:1.5;color:var(--ink)}
  @media (max-width:480px){
    .wn-modal{padding:30px 22px 24px}
    .wn-item{flex-direction:column;gap:3px}
    .wn-tag{flex-basis:auto;padding-top:0}
  }

  /* ---------- The Huddle: + Create compose modal ---------- */
  /* Reuses the .wn-overlay/.wn-modal chrome (centered scrim + open/close
     transition); these styles only restyle the inner form for the dark
     compose surface. */
  /* The compose modal opens from inside The Huddle's .surface (z-index:60),
     so it must sit above it — .wn-overlay's default z-index:50 would hide it
     behind the surface. */
  #createOverlay{ z-index:80; }
  .huddle-create-btn{ font-family:'Barlow',sans-serif; font-size:13px; letter-spacing:.04em; color:var(--on-accent); background:var(--gold); border:none; border-radius:6px; padding:7px 14px; cursor:pointer; }
  .huddle-create-btn:hover{ filter:brightness(1.08); }
  /* Mobile: lift "+ Create" out of the cramped header into a thumb-reachable FAB
     (bottom-right, big + labeled). Fixed to the viewport but only rendered while the
     Huddle surface is shown; z-index above the surface (60) yet below the compose
     overlay (80) so the modal still covers it. */
  @media (max-width:640px){
    .huddle-create-btn{
      position:fixed; right:16px; bottom:16px; z-index:70; margin-left:0;
      padding:14px 22px; font-size:15px; font-weight:600; border-radius:999px;
      box-shadow:0 6px 18px rgba(0,0,0,.45);
    }
  }
  .create-modal{ max-width:520px; }
  .create-title{ font-family:'Oswald',sans-serif; color:var(--ink); margin:0 0 14px; }
  .create-types,.create-audience{ display:flex; gap:16px; align-items:center; flex-wrap:wrap; margin-bottom:12px; color:var(--ink); font-size:13px; }
  /* Theme the radio inputs to the gold scheme (browser default is blue). */
  .create-types label,.create-audience label{ display:inline-flex; align-items:center; gap:6px; cursor:pointer; }
  .create-types input,.create-audience input{ accent-color:var(--gold); cursor:pointer; }
  .create-type-disabled{ opacity:.5; }
  .create-type-disabled span{ font-size:11px; color:var(--muted); }
  .create-label{ font-size:10px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); margin-right:4px; }
  .create-input{ width:100%; margin-bottom:12px; background:var(--paper); border:1px solid var(--rule); border-radius:6px; color:var(--ink); padding:9px 11px; font-family:'Barlow',sans-serif; }
  /* Full-width on its own line so athlete names aren't clipped to a few chars. */
  .create-athlete{ flex:1 1 100%; min-width:0; background:var(--paper); border:1px solid var(--rule); border-radius:6px; color:var(--ink); padding:9px 10px; font-family:'Barlow',sans-serif; }
  .create-actions{ display:flex; justify-content:flex-end; gap:10px; margin-top:6px; }
  .create-cancel{ background:none; border:1px solid var(--rule); color:var(--muted); border-radius:6px; padding:7px 14px; cursor:pointer; }
  .create-submit{ background:var(--gold); color:var(--on-accent); border:none; border-radius:6px; padding:7px 16px; cursor:pointer; }
  .create-submit:disabled{ opacity:.6; cursor:default; }
  .create-error{ color:#f0a; font-size:12px; margin-top:8px; }
  .create-ok{ color:var(--gold); font-size:13px; margin-top:8px; }

  /* ---------- Feedback (compose modal + Front Office inbox) ---------- */
  /* Stack the two intent buckets vertically (unlike the inline create-types radios). */
  .fb-types{ flex-direction:column; align-items:flex-start; gap:8px; }
  .fb-types label{ align-items:flex-start; }
  .fb-hint{ color:var(--muted); font-size:12px; }
  #feedbackBody{ width:100%; margin-top:4px; }
  .fo-feedback-list{ display:flex; flex-direction:column; gap:12px; }
  .fo-feedback-item{ border:1px solid var(--rule); border-radius:8px; padding:12px 14px; background:var(--surface); }
  .fo-feedback-item.fb-is-resolved{ opacity:.6; }
  .fb-item-head{ display:flex; gap:8px; align-items:baseline; flex-wrap:wrap; color:var(--ink); }
  .fb-item-meta{ color:var(--muted); font-size:12px; }
  .fb-item-body{ margin:8px 0; color:var(--ink); white-space:pre-wrap; }
  .fb-item-actions{ display:flex; justify-content:flex-end; }
  .fb-badge{ font-size:11px; letter-spacing:.08em; text-transform:uppercase; padding:3px 8px; border-radius:999px; }
  .fb-resolved{ background:var(--rule); color:var(--muted); }

  /* ---------- Splash app carousel ---------- */
  /* The title + rule + subtitle live inside a horizontally-paged carousel so
     the user can swipe (mobile) or arrow (desktop) between "The Progress
     Almanac" and "The Coach's Corner". The athlete picker below the carousel
     stays static — both apps draw from the same athlete pool. */
  /* ---------- Splash peek carousel ----------
     The active app is a centred card at full size; its neighbours peek in from
     both edges, scaled down + dimmed, so the user always sees what's adjacent
     and which way to swipe. Each card's translateX/scale is set inline by JS
     relative to the active index (see updateSplashUI). */
  .splash-peek{
    --card-w:clamp(300px,42vw,460px);
    position:relative;width:100%;max-width:960px;margin:0 auto;
  }
  /* The viewport clips the rail so far cards don't spill or create a scrollbar;
     neighbours still show because they sit just inside the edges. */
  .splash-peek-viewport{
    position:relative;width:100%;height:360px;overflow:hidden;
    touch-action:pan-y;  /* let vertical page scroll through; we capture horizontal */
  }
  /* The rail is a zero-size anchor at the viewport centre; each card is
     absolutely positioned and translated relative to it. */
  .splash-peek-rail{position:absolute;top:50%;left:50%;width:0;height:0}

  .splash-card{
    position:absolute;top:0;left:0;
    width:var(--card-w);height:360px;
    display:flex;flex-direction:column;justify-content:center;
    padding:30px 30px;
    background:var(--paper-2);border:1px solid var(--rule);border-radius:6px;
    text-align:left;text-decoration:none;color:inherit;cursor:pointer;
    transform-origin:center center;user-select:none;
    /* Soften the OUTER edge of a peeking card so its outline melts into the
       backdrop instead of stopping hard at the rectangle. --peek-mask-stop
       (where the fade begins) and --peek-mask-dir (which edge fades) are set
       inline by JS from each card's distance + side relative to centre; the
       defaults (stop 100%, dir right) leave a card fully opaque, so the active
       card and the grid layout are untouched. */
    -webkit-mask-image:linear-gradient(to var(--peek-mask-dir,right),#000 var(--peek-mask-stop,100%),transparent);
            mask-image:linear-gradient(to var(--peek-mask-dir,right),#000 var(--peek-mask-stop,100%),transparent);
    /* translateX + scale set inline by JS; transition them together with the
       opacity/depth/mask fade. */
    transition:transform .42s cubic-bezier(.22,.61,.36,1),
               opacity .42s ease,
               -webkit-mask-image .42s ease,
               mask-image .42s ease,
               border-color .15s ease,
               box-shadow .15s ease;
    will-change:transform,opacity;
  }
  /* During a finger drag the rail follows live — no transition; on click/key/
     release nav it glides over a longer, softly-decelerating curve. */
  .splash-peek-rail.dragging .splash-card,
  .splash-peek-rail.dragging .splash-card::after{transition:none}
  .splash-peek-rail.gliding .splash-card{
    transition-duration:.58s;transition-timing-function:cubic-bezier(.22,1,.36,1);
  }
  /* The active card gets a depth shadow but deliberately NO gold border: the border
     flickered from card to card during a multi-card flick and read as glitchy, so the
     centred card is signalled by scale/opacity/shadow instead. */
  .splash-card.is-active{box-shadow:0 24px 60px rgba(0,0,0,.45)}
  .splash-card.is-active:focus-visible{outline:2px solid var(--gold);outline-offset:4px}
  /* A scrim dims the peeking (non-active) cards so the centre reads as primary
     even with bright gold accents on its neighbours. */
  /* --scrim (0–.45) is set inline by JS from the card's fractional distance to
     the centre, so the veil deepens/lifts continuously as you drag. */
  .splash-card::after{
    content:"";position:absolute;inset:0;border-radius:6px;
    background:var(--paper);opacity:var(--scrim,0);pointer-events:none;transition:opacity .42s ease;
  }

  .splash-card-kicker{
    font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.24em;
    text-transform:uppercase;color:var(--muted);margin-bottom:16px;
  }
  /* The title/rule/sub keep their classes (so the locker-badge + parent-title JS
     still finds them) but are resized + left-aligned for the card. */
  .splash-card .splash-title{font-size:clamp(34px,5vw,50px);line-height:.9;text-align:left}
  .splash-card .splash-rule{width:52px;margin:16px 0}
  .splash-card .splash-sub{font-size:15px;max-width:34ch;margin:0;text-align:left}

  /* ---------- Splash card icons ----------
     A per-app line glyph (SPLASH_ICONS, injected by decorateSplashCards) in two
     places: a small chip beside the kicker + a large faint centred background glyph.
     overflow:hidden clips the Living Window surface (the glyph + veil/sheen layers)
     to the card's rounded corners; it doesn't clip the box-shadow or focus outline
     (those draw outside the box). */
  .splash-card{overflow:hidden}
  .splash-ico{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
  /* kicker + chip share one row (the chip is inserted before the kicker inside a wrapper). */
  .splash-card-kickrow{display:flex;align-items:center;gap:10px;margin-bottom:16px;position:relative;z-index:1}
  .splash-card-kickrow .splash-card-kicker{margin-bottom:0}
  .splash-card-chip{
    flex:0 0 auto;width:28px;height:28px;display:grid;place-items:center;
    border:1px solid var(--rule);border-radius:7px;background:rgba(0,0,0,.35);color:var(--gold);
  }
  .splash-card-chip .splash-ico{width:17px;height:17px}
  /* ---------- Living Window surface ----------
     A large, faint per-app glyph (SPLASH_ICONS, injected by decorateSplashCards)
     sits centred behind the text as the card's "background image"; a dark veil keeps
     the title legible; a sheen layer only animates during the landing performance.
     Colours come from --gold so per-tenant themes flow through. The glyph rests
     fully drawn (dashoffset 0); .landed replays the stroke-by-stroke draw. */
  .splash-card-glyph{
    position:absolute;inset:0;z-index:0;pointer-events:none;opacity:.10;
    display:flex;align-items:flex-end;justify-content:flex-end;
  }
  /* Anchored bottom-right and nudged so it bleeds slightly off the corner (clipped by
     the card's overflow:hidden) — a watermark-style placement, not centred. */
  .splash-card-glyph svg{
    width:auto;height:66%;max-width:80%;display:block;overflow:visible;
    transform:translate(16%,16%);
  }
  /* Stroke each sub-shape and arm it for the draw. Each shape is normalised to
     pathLength=100 in JS; the dash is 102 (a hair longer than the path) so it OVERLAPS
     the seam on closed shapes (circles, the calendar rect) — a dash of exactly 100
     meets its own start and sub-pixel rounding leaves a hairline gap at the end of the
     draw. At rest (offset 0) every shape is fully covered; the keyframe draws them all
     in unison over the full duration. */
  .splash-card-glyph svg :is(path,circle,line,polyline,rect){
    fill:none;stroke:var(--gold);stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;
    stroke-dasharray:102;stroke-dashoffset:0;
  }
  .splash-card-veil{
    position:absolute;inset:0;z-index:1;pointer-events:none;
    background:linear-gradient(155deg,rgba(24,24,24,.26),rgba(24,24,24,.82));
  }
  .splash-card-sheen{
    position:absolute;inset:0;z-index:3;pointer-events:none;opacity:0;
    background:linear-gradient(115deg,transparent 32%,rgba(255,255,255,.14) 48%,transparent 62%);
  }
  /* ---------- The landing performance ----------
     Replays every time a card becomes the settled centre (JS toggles .landed with a
     reflow re-trigger). Motion is on the active card ONLY; peeks stay static. */
  .splash-card.landed .splash-card-glyph{opacity:.22}
  .splash-card.landed .splash-card-glyph svg{filter:drop-shadow(0 0 8px rgba(240,192,12,.35))}
  .splash-card.landed .splash-card-glyph svg :is(path,circle,line,polyline,rect){
    animation:splashGlyphDraw 1.5s cubic-bezier(.4,0,.2,1) forwards;
  }
  .splash-card.landed .splash-card-sheen{animation:splashSheen 1.05s cubic-bezier(.4,0,.2,1) .12s}
  .splash-card.landed .splash-title{animation:splashRise .6s cubic-bezier(.22,1,.36,1)}
  .splash-card.landed .splash-rule{
    transform-origin:left center;animation:splashWipe .55s cubic-bezier(.22,1,.36,1) .1s backwards;
  }
  .splash-card.landed .splash-card-chip{animation:splashChip 1.1s ease}
  .splash-card.landed .splash-card-kickrow,
  .splash-card.landed .splash-sub{animation:splashFadeUp .6s ease .08s backwards}

  @keyframes splashGlyphDraw{from{stroke-dashoffset:102}to{stroke-dashoffset:0}}
  @keyframes splashSheen{from{opacity:1;transform:translateX(-120%)}to{opacity:0;transform:translateX(120%)}}
  @keyframes splashRise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}
  @keyframes splashWipe{from{transform:scaleX(0)}to{transform:scaleX(1)}}
  @keyframes splashChip{0%{box-shadow:0 0 0 0 rgba(240,192,12,.5)}60%{box-shadow:0 0 0 8px rgba(240,192,12,0)}100%{box-shadow:0 0 0 0 rgba(240,192,12,0)}}
  @keyframes splashFadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
  /* Keep all text content above the Living Window layers (spark z0, veil z1). */
  .splash-card .splash-card-kickrow,
  .splash-card .splash-title,
  .splash-card .splash-rule,
  .splash-card .splash-sub{position:relative;z-index:3}

  /* Arrows — round edge controls overlaid on the viewport. */
  .splash-arrow{
    position:absolute;top:50%;transform:translateY(-50%);z-index:6;
    width:48px;height:48px;display:flex;align-items:center;justify-content:center;
    /* Opaque so a peeking card can never bleed through and wash the button out. */
    background:var(--paper);border:1px solid var(--rule);border-radius:50%;
    box-shadow:0 2px 12px rgba(0,0,0,.55);
    color:var(--ink);font-family:'Oswald',sans-serif;font-size:30px;line-height:1;
    cursor:pointer;padding:0;
    transition:border-color .15s,color .15s,background .15s,opacity .15s;
  }
  .splash-arrow:hover:not(:disabled){border-color:var(--gold);color:var(--gold)}
  .splash-arrow:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
  .splash-arrow:disabled{opacity:.22;cursor:default}
  .splash-arrow-left{left:4px}
  .splash-arrow-right{right:4px}
  /* Desktop: widen the active card (via --card-w). Card/viewport height is a flat
     360px at every breakpoint, so no height override is needed here. */
  @media (min-width:760px){
    /* Pull the paging arrows out past the peeking neighbour cards into the gutter
       so they're never sitting on top of (and washed out by) a dim side card. The
       #splash side padding absorbs the negative offset on narrower desktops. */
    .splash-arrow-left{left:-26px}
    .splash-arrow-right{right:-26px}
    .splash-card-chip{width:34px;height:34px}
    .splash-card-chip .splash-ico{width:21px;height:21px}
  }
  /* ---------- Cards (grid) layout ----------
     Same .splash-card nodes, dropped out of the absolute peek rail into a CSS grid.
     The inline peek styles (transform/opacity/--scrim/z-index) are cleared by
     renderSplashGrid() so these rules win; #splash scrolls if the grid overflows. */
  #splash.view-cards{justify-content:flex-start;overflow-y:auto}
  #splash.view-cards .splash-peek{max-width:1100px}
  #splash.view-cards .splash-peek-viewport{height:auto;overflow:visible}
  #splash.view-cards .splash-peek-rail{
    position:static;top:auto;left:auto;width:100%;height:auto;
    display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px;
  }
  #splash.view-cards .splash-card{
    position:static;width:auto;height:auto;min-height:188px;
  }
  #splash.view-cards .splash-card::after{opacity:0}     /* no peek scrim in the grid */
  /* In the grid there's no single active card, so each card shows its glyph static
     and replays the draw + sheen on hover (a lightweight echo of the carousel pop). */
  #splash.view-cards .splash-card-veil{background:linear-gradient(155deg,rgba(24,24,24,.18),rgba(24,24,24,.66))}
  #splash.view-cards .splash-card:hover{transform:translateY(-5px)}
  #splash.view-cards .splash-card:hover .splash-card-glyph{opacity:.22}
  #splash.view-cards .splash-card:hover .splash-card-glyph svg :is(path,circle,line,polyline,rect){animation:splashGlyphDraw 1.45s cubic-bezier(.4,0,.2,1) forwards}
  #splash.view-cards .splash-card:hover .splash-card-sheen{animation:splashSheen 1s cubic-bezier(.4,0,.2,1)}
  #splash.view-cards .splash-card .splash-title{font-size:clamp(28px,3.4vw,38px)}
  #splash.view-cards .splash-arrow,
  #splash.view-cards .splash-dots{display:none}
  /* In cards mode #splash scrolls, so the carousel's absolutely-pinned footer would
     stay at the visual bottom and overlay the grid as you scroll. Let it flow at the
     end of the cards instead (and un-pin the credits link, which is absolute inside it). */
  #splash.view-cards .splash-footer{position:static;margin-top:24px}
  #splash.view-cards .splash-credits-link{position:static;right:auto;bottom:auto}
  .splash-dots{
    display:flex;gap:10px;justify-content:center;
    margin:28px 0 32px;
  }
  .splash-dot{
    width:8px;height:8px;border-radius:50%;
    background:var(--rule);border:none;padding:0;cursor:pointer;
    transition:background .25s,width .3s cubic-bezier(.2,.7,.2,1),border-radius .3s;
  }
  /* Active dot stretches into a gold pill rather than just recolouring. */
  .splash-dot.on{background:var(--gold);width:24px;border-radius:4px}

  /* ---------- Splash peek: intro + reduced motion ---------- */
  /* A gentle one-shot fade on first load. The per-card transforms are set inline
     by JS, so we fade the rail as a whole rather than animate transforms that
     would fight them. #splash.intro is added on load and dropped after it settles. */
  #splash.intro .splash-peek-rail{animation:splashRailIn .5s ease backwards}
  @keyframes splashRailIn{from{opacity:0}to{opacity:1}}

  /* Honour reduced-motion: snap between cards instead of sliding/scaling. */
  @media (prefers-reduced-motion: reduce){
    .splash-card{transition:opacity .01s linear,border-color .15s ease}
    .splash-card::after{transition:none}
    #splash.intro .splash-peek-rail{animation:none}
    .splash-arrow,.splash-dot{transition:none}
    /* Living Window: show the glyph drawn + static, skip the performance entirely. */
    .splash-card.landed .splash-card-glyph svg :is(path,circle,line,polyline,rect),
    .splash-card.landed .splash-card-sheen,
    .splash-card.landed .splash-title,
    .splash-card.landed .splash-rule,
    .splash-card.landed .splash-card-chip,
    .splash-card.landed .splash-card-kickrow,
    .splash-card.landed .splash-sub,
    #splash.view-cards .splash-card:hover .splash-card-glyph svg :is(path,circle,line,polyline,rect),
    #splash.view-cards .splash-card:hover .splash-card-sheen{animation:none}
    .splash-card-glyph svg :is(path,circle,line,polyline,rect){stroke-dashoffset:0}
  }

  /* ---------- Front Office — splash entry ---------- */
  /* The picker navigates into a single athlete; the Front Office is its own
     destination, so on that slide the picker is swapped for this button. */
  .splash-admin-entry{display:flex;flex-direction:column;align-items:center;gap:14px}
  .splash-enter-btn{
    font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;
    letter-spacing:.14em;text-transform:uppercase;
    padding:13px 28px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .splash-enter-btn:hover{background:transparent;color:var(--gold)}
  .splash-admin-hint{
    font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
    font-size:13px;color:var(--muted);max-width:32ch;text-align:center;
  }

  /* ---------- Front Office — roster admin page ---------- */
  .admin-section{margin-top:36px}
  .admin-add{margin:6px 0 26px}

  /* ---------- Front Office — admin login wall ---------- */
  .admin-login{margin-top:36px;max-width:360px}
  .admin-login-form{
    display:flex;flex-direction:column;gap:12px;
    border:1px solid var(--rule);background:var(--paper-2);
    padding:20px;border-radius:2px;margin-top:18px;
  }
  .admin-login-form .field{display:flex;flex-direction:column;gap:6px}
  .admin-login-form .field-label{
    font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  }
  .admin-login-form input{
    font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .admin-login-form input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .admin-login-form .actions{margin-top:4px}
  .admin-login-form .save-btn{
    width:100%;font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;
    padding:11px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .admin-login-form .save-btn:hover{background:transparent;color:var(--gold)}
  .admin-login-form .save-btn:disabled{opacity:.4;cursor:default}
  /* Mobile: the auto-focused username pops the soft keyboard. Reserve scroll
     headroom below the form so the field can be scrolled up (see showAdminLogin).
     scroll-margin-top sets where the field lands from the top — a larger value
     means a gentler scroll (field stops partway down rather than near the top). */
  @media (max-width:600px){
    .admin-login{padding-bottom:24vh}
    .admin-login-form .field{scroll-margin-top:220px}
  }
  .admin-note{
    font-family:'Barlow',sans-serif;font-size:14px;color:var(--muted);
    line-height:1.6;max-width:60ch;margin:14px 0 24px;
  }
  .admin-row{
    display:flex;align-items:center;gap:16px;flex-wrap:wrap;
    padding:14px 0;border-bottom:1px solid var(--rule);
  }
  .admin-row:last-child{border-bottom:none}
  .admin-row-name{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:18px;
    letter-spacing:.02em;color:var(--ink);flex:1 1 160px;min-width:0;
  }
  .admin-row-ids{display:flex;gap:16px 18px;flex-wrap:wrap}
  .admin-id{display:flex;flex-direction:column;gap:2px}
  .admin-id-label{
    font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.12em;
    text-transform:uppercase;color:var(--muted);
  }
  .admin-id-val{
    font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--ink);
    white-space:nowrap;
  }
  .admin-id-val.muted{color:var(--muted)}
  /* Read-only detail tags on a roster row (school / birth year / USATF#). Not
     interactive — they inform, they don't toggle, so no hover or pointer cursor. */
  .admin-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
  .admin-tag{
    font-family:'JetBrains Mono',monospace;font-size:12px;
    padding:4px 10px;border:1px solid var(--rule);border-radius:999px;
    background:var(--paper);color:var(--ink);white-space:nowrap;
  }
  .admin-tag-label{
    color:var(--muted);text-transform:uppercase;font-size:9px;letter-spacing:.12em;
    margin-right:5px;
  }
  .admin-remove{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.12em;
    text-transform:uppercase;font-weight:600;
    padding:8px 16px;border:1px solid var(--rule);background:var(--paper);
    color:var(--muted);cursor:pointer;border-radius:2px;white-space:nowrap;
    transition:color .15s,border-color .15s;
  }
  .admin-remove:hover{color:#d68a6a;border-color:#d68a6a}
  .admin-empty{
    font-family:'Barlow',sans-serif;font-style:italic;font-size:15px;
    color:var(--muted);padding:24px 0;line-height:1.6;
  }

  /* ---------- Front Office roster: search + responsive table (#adminRoster) ----------
     One grid per row sharing a column template (not one big grid) so an inline Edit
     form can be inserted between rows without disturbing the columns. Desktop/tablet
     show aligned columns; mobile collapses each row into a card with a muted meta line. */
  .fo-filters{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:0 0 12px}
  .fo-search{
    flex:1 1 240px;min-width:0;font-family:'JetBrains Mono',monospace;font-size:13px;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper-2);color:var(--ink);border-radius:2px;
  }
  .fo-search::placeholder{color:var(--muted)}
  .fo-search:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .fo-filter{
    flex:0 0 auto;   /* keep the full label ("All genders"); let the search box shrink instead */
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--ink);
    padding:9px 30px 9px 12px;border:1px solid var(--rule);background:var(--paper-2);border-radius:2px;
    appearance:none;-webkit-appearance:none;cursor:pointer;
    background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'><path d='M2 4 L6 8 L10 4' stroke='%239a9a9a' stroke-width='2' fill='none' stroke-linecap='round'/></svg>");
    background-repeat:no-repeat;background-position:right 8px center;
  }
  .fo-filter:focus{outline:2px solid var(--gold);outline-offset:-1px}

  /* Shared table primitives — used by the Roster (#adminRoster), Club Users
     (#usersList), and Meet Log (#adminMeetLog) tables. The Meet Log's grid row is
     its .admin-meet-head (not a .fo-trow), so it's styled separately below; only
     the element-level styles (.fo-name/.fo-cell/…) are shared here. */
  #adminRoster .fo-thead, #adminRoster .fo-trow,
  #adminDeparted .fo-thead, #adminDeparted .fo-trow,
  #usersList   .fo-thead, #usersList   .fo-trow{
    display:grid;align-items:center;gap:16px;padding:13px 0;border-bottom:1px solid var(--rule);
  }
  #adminRoster .fo-thead, #adminDeparted .fo-thead, #usersList .fo-thead, #adminMeetLog .fo-thead{
    font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.14em;
    text-transform:uppercase;color:var(--muted);padding:6px 0;
  }
  #adminRoster .fo-trow:last-child, #adminDeparted .fo-trow:last-child, #usersList .fo-trow:last-child{border-bottom:none}
  #adminRoster .fo-name, #adminDeparted .fo-name, #usersList .fo-name, #adminMeetLog .fo-name{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:18px;letter-spacing:.02em;color:var(--ink);
    min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  #adminRoster .fo-cell, #adminDeparted .fo-cell, #usersList .fo-cell, #adminMeetLog .fo-cell{
    font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--ink);
    min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  #adminRoster .fo-cell.muted, #usersList .fo-cell.muted, #adminMeetLog .fo-cell.muted{color:var(--muted)}
  #adminRoster .fo-rowacts, #adminDeparted .fo-rowacts, #usersList .fo-rowacts, #adminMeetLog .fo-rowacts{display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}
  #adminRoster .mlabel, #adminDeparted .mlabel, #usersList .mlabel, #adminMeetLog .mlabel{display:none}
  #adminRoster .fo-empty, #usersList .fo-empty{
    font-family:'Barlow',sans-serif;font-style:italic;color:var(--muted);padding:20px 0;line-height:1.6;
  }

  /* Roster columns: Name · Age · School · USATF# · Account · actions. */
  #adminRoster .fo-thead, #adminRoster .fo-trow{
    grid-template-columns:minmax(0,1.6fr) 58px minmax(0,1.4fr) minmax(0,1.2fr) minmax(0,1.05fr) 150px;
  }
  #adminRoster .fo-acct{overflow:visible}        /* don't clip the account chip */
  .fo-acct-none{color:var(--muted)}
  /* Club Users columns: Email · Status · Role · actions. Email reads better in
     mono than the Oswald used for people-names, so override .fo-name here. */
  #usersList .fo-thead, #usersList .fo-trow{
    grid-template-columns:minmax(0,2.2fr) minmax(0,1.5fr) 150px 184px;
  }
  #usersList .fo-name{
    font-family:'JetBrains Mono',monospace;font-weight:500;font-size:14px;text-transform:none;letter-spacing:0;
  }
  #usersList .fo-sub{display:block;font-family:'Barlow',sans-serif;font-weight:400;font-size:13px;color:var(--muted);margin-top:3px;white-space:normal}
  #usersList .fo-status-cell{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0}
  #usersList .fo-role-cell{display:flex;align-items:center;gap:6px;min-width:0}
  #usersList .fo-role{width:100%;max-width:170px;font-size:13px}
  #usersList .fo-del{color:#d68a6a}
  #usersList .fo-del:hover{border-color:#d68a6a}

  /* Status / access chips — text + glyph, never colour alone (reusable: Club Users
     status now, the Roster Account column once the backend exposes the linkage). */
  .fo-chip{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.06em;text-transform:uppercase;
    padding:3px 9px;border-radius:999px;border:1px solid var(--rule);white-space:nowrap;
    display:inline-flex;align-items:center;gap:5px;color:var(--ink);background:var(--paper);
  }
  .fo-chip--active{background:var(--gold);color:var(--on-accent);border-color:var(--gold);font-weight:500}
  .fo-chip--pending{color:var(--gold);border-color:var(--gold);border-style:dashed}
  .fo-chip--disabled{color:var(--muted);text-decoration:line-through}
  .fo-chip--warn{color:#d68a6a;border-color:#d68a6a}
  .fo-chip--link{color:var(--gold);border-color:var(--gold)}
  .fo-chip-ic{font-size:10px;line-height:1}

  /* Meet Log: the expandable meet head reuses the table vocabulary. It stays
     .admin-meet-head so the delegated expand/edit/delete listener keeps working;
     the results panel stays full-width below it, and .admin-meet draws the divider.
     Columns: Meet · Date · Where · Athletes · Results · actions. */
  #adminMeetLog .fo-thead,
  #adminMeetLog .admin-meet-head{
    display:grid;align-items:center;gap:16px;
    grid-template-columns:minmax(0,2fr) minmax(0,1.1fr) minmax(0,1.2fr) 88px 88px 104px;
  }
  #adminMeetLog .fo-thead{border-bottom:1px solid var(--rule)}
  #adminMeetLog .admin-meet-head{padding:14px 0}

  /* Tablet: drop the secondary columns (School/USATF; meet Where) to keep the
     primaries aligned. */
  @media(min-width:601px) and (max-width:860px){
    #adminRoster .fo-sec, #adminMeetLog .fo-sec{display:none}
    #adminRoster .fo-thead,
    #adminRoster .fo-trow{grid-template-columns:minmax(0,1.6fr) 58px minmax(0,1fr) 132px}
    #adminMeetLog .fo-thead,
    #adminMeetLog .admin-meet-head{grid-template-columns:minmax(0,2fr) minmax(0,1.1fr) 80px 80px 96px}
  }

  /* Mobile: each row becomes a card. Roster collapses its secondary cells into a
     muted meta line; Users stacks email → status chips → role → actions. */
  @media(max-width:600px){
    #adminRoster .fo-thead, #adminDeparted .fo-thead, #usersList .fo-thead{display:none}
    #adminRoster .fo-trow, #adminDeparted .fo-trow, #usersList .fo-trow{
      display:block;border:1px solid var(--rule);border-radius:8px;background:var(--paper-2);
      padding:14px 14px 12px;margin-bottom:10px;
    }
    #adminRoster .fo-trow:last-child, #adminDeparted .fo-trow:last-child, #usersList .fo-trow:last-child{border-bottom:1px solid var(--rule)}
    #adminRoster .fo-name, #adminDeparted .fo-name, #usersList .fo-name{display:block;white-space:normal;font-size:17px;margin-bottom:6px}
    #adminRoster .fo-rowacts, #adminDeparted .fo-rowacts, #usersList .fo-rowacts{justify-content:flex-start;margin-top:10px}

    /* Roster + Departed: secondary cells collapse into one muted, dot-separated meta line. */
    #adminRoster .fo-cell, #adminDeparted .fo-cell{display:inline;white-space:normal;overflow:visible;color:var(--muted);font-size:12px}
    #adminRoster .fo-cell + .fo-cell::before, #adminDeparted .fo-cell + .fo-cell::before{content:"· ";color:var(--muted)}
    #adminRoster .mlabel, #adminDeparted .mlabel{display:inline}

    /* Users: keep email compact; status chips on their own line; role labelled. */
    #usersList .fo-name{font-size:15px}
    #usersList .fo-status-cell{margin-bottom:10px}
    /* Stack the role label over a full-width select (border-box is global, so
       width:100% fits the card exactly — no flex growth past the edge). */
    #usersList .fo-role-cell{display:block}
    #usersList .fo-role{display:block;width:100%;max-width:none;min-width:0}
    #usersList .mlabel{display:block;margin-bottom:4px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.1em}

    /* Meet Log: the head stacks (name → muted meta line → Delete). No card border —
       .admin-meet already separates meets and the results panel sits below. */
    #adminMeetLog .fo-thead{display:none}
    #adminMeetLog .admin-meet-head{display:block;padding:14px 0}
    #adminMeetLog .fo-name{display:block;white-space:normal;font-size:17px;margin-bottom:6px}
    #adminMeetLog .fo-cell{display:inline;white-space:normal;overflow:visible;color:var(--muted);font-size:12px}
    #adminMeetLog .fo-cell + .fo-cell::before{content:"· ";color:var(--muted)}
    #adminMeetLog .mlabel{display:inline}
    #adminMeetLog .fo-rowacts{justify-content:flex-start;margin-top:10px}
  }

  /* ---------- Meet Log: expandable meet + editable result rows ---------- */
  .admin-meet{border-bottom:1px solid var(--rule)}
  .admin-meet:last-child{border-bottom:none}
  .admin-meet-head{border-bottom:none;cursor:pointer}
  .admin-meet-head:focus-visible{outline:2px solid var(--gold);outline-offset:-2px}
  .meet-caret{
    display:inline-block;color:var(--gold);font-size:12px;width:1em;
    transition:transform .15s;
  }
  .admin-meet.open .meet-caret{transform:rotate(90deg)}
  .admin-meet-results{padding:4px 0 14px;display:flex;flex-direction:column;gap:2px}
  /* The display:flex above would otherwise beat the UA [hidden]{display:none}, so the
     panel never collapsed — re-assert hiding with a more specific selector. */
  .admin-meet-results[hidden]{display:none}
  .meet-result-row{
    display:flex;align-items:center;justify-content:space-between;gap:12px;
    flex-wrap:wrap;padding:8px 10px;margin-left:4px;border-left:2px solid var(--rule);
  }
  .meet-result-row.editing{border-left-color:var(--gold);background:rgba(var(--accent-rgb),.04)}
  .mrr-main{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;flex:1 1 auto;min-width:0}
  .mrr-athlete{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:15px;
    color:var(--ink);min-width:120px;
  }
  .mrr-event{font-family:'Barlow',sans-serif;font-size:14px;color:var(--muted)}
  .mrr-mark{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--ink)}
  .mrr-meta{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted)}
  .mrr-actions{display:flex;gap:8px;align-items:center}
  .mrr-btn{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.12em;
    text-transform:uppercase;font-weight:600;padding:6px 14px;
    border:1px solid var(--rule);background:var(--paper);color:var(--muted);
    cursor:pointer;border-radius:2px;transition:color .15s,border-color .15s;
  }
  .mrr-btn:hover{color:var(--gold);border-color:var(--gold)}
  .mrr-edit{display:flex;flex-direction:column;gap:10px;width:100%}
  .mrr-fields{display:flex;gap:10px 14px;flex-wrap:wrap;align-items:flex-end}
  .mrr-field{display:flex;flex-direction:column;gap:3px}
  .mrr-field span{
    font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.12em;
    text-transform:uppercase;color:var(--muted);
  }
  .mrr-field input{
    font-family:'Barlow',sans-serif;font-size:14px;padding:7px 10px;
    border:1px solid var(--rule);background:var(--paper);color:var(--ink);
    border-radius:2px;width:160px;max-width:46vw;
  }
  .mrr-field input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .mrr-field-sm input{width:80px}
  .mrr-field select{
    font-family:'Barlow',sans-serif;font-size:14px;padding:7px 10px;
    border:1px solid var(--rule);background:var(--paper);color:var(--ink);
    border-radius:2px;width:180px;max-width:46vw;cursor:pointer;
  }
  .mrr-field select:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .mrr-edit-error{font-family:'Barlow',sans-serif;font-size:13px;color:#d68a6a;line-height:1.5}
  .mrr-edit .save-btn,.mrr-edit .cancel-btn,
  .meet-detail-edit .save-btn,.meet-detail-edit .cancel-btn{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.12em;
    text-transform:uppercase;font-weight:600;padding:8px 18px;cursor:pointer;
    border-radius:2px;border:1px solid var(--rule);
  }
  .mrr-edit .save-btn,.meet-detail-edit .save-btn{border-color:var(--gold);background:var(--gold);color:var(--on-accent)}
  .mrr-edit .save-btn:hover,.meet-detail-edit .save-btn:hover{background:transparent;color:var(--gold)}
  .mrr-edit .save-btn:disabled,.meet-detail-edit .save-btn:disabled{opacity:.4;cursor:default}
  .mrr-edit .cancel-btn,.meet-detail-edit .cancel-btn{background:var(--paper);color:var(--muted)}
  .mrr-edit .cancel-btn:hover,.meet-detail-edit .cancel-btn:hover{color:var(--ink)}

  /* ---------- Add a meet (manual builder) ---------- */
  .manual-rows{display:flex;flex-direction:column;gap:10px;margin:6px 0 12px}
  .manual-row{
    display:flex;gap:10px 14px;flex-wrap:wrap;align-items:flex-end;
    padding:10px;border-left:2px solid var(--rule);
  }
  .manual-row .mrr-field select,.manual-row .mrr-field input{width:150px;max-width:44vw}
  .manual-row-remove{
    align-self:center;width:32px;height:32px;line-height:1;
    font-family:'JetBrains Mono',monospace;font-size:18px;
    border:1px solid var(--rule);background:var(--paper);color:var(--muted);
    cursor:pointer;border-radius:2px;transition:color .15s,border-color .15s;
  }
  .manual-row-remove:hover{color:#d68a6a;border-color:#d68a6a}
  .manual-add-row{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.12em;
    text-transform:uppercase;font-weight:600;padding:8px 14px;
    border:1px dashed var(--rule);background:transparent;color:var(--muted);
    cursor:pointer;border-radius:2px;transition:color .15s,border-color .15s;
  }
  .manual-add-row:hover{color:var(--gold);border-color:var(--gold)}
  .manual-add-row .plus{margin-right:4px}

  /* ---------- Edit meet details (in an expanded meet) ---------- */
  .meet-detail-bar{padding:2px 0 8px;margin-bottom:6px;border-bottom:1px dashed var(--rule)}
  .meet-detail-edit{display:flex;flex-direction:column;gap:10px;padding:2px 0 12px}
  .mrr-field-check{
    display:flex;align-items:center;gap:6px;align-self:center;
    font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);
  }

  /* ---------- Coach's Corner — athlete picker in the masthead ---------- */
  /* The athlete name in the Corner masthead is a styled <select> so coaches
     can switch kids without backing out to the splash. Styled to read like the
     existing italic subtitle, with a small chevron hinting that it's tappable. */
  .corner-athlete-picker{
    font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
    font-size:clamp(17px,2.4vw,22px);color:var(--ink);
    background:transparent;border:none;border-bottom:1px dashed var(--rule);
    padding:2px 28px 4px 0;cursor:pointer;
    appearance:none;-webkit-appearance:none;
    background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'><path d='M2 4 L6 8 L10 4' stroke='%239a9a9a' stroke-width='2' fill='none' stroke-linecap='round'/></svg>");
    background-repeat:no-repeat;background-position:right 4px center;
    max-width:100%;text-overflow:ellipsis;
    transition:border-color .15s,color .15s;
  }
  .corner-athlete-picker:hover{border-bottom-color:var(--gold)}
  .corner-athlete-picker:focus{outline:none;border-bottom-color:var(--gold)}
  /* The native dropdown popup is OS-rendered. On Windows Chrome it defaults
     to white regardless of the closed-select background. Setting explicit
     background-color + color on the <option> elements lets Chrome paint the
     popup itself in our dark theme. Safari macOS ignores this (uses fixed
     native styling) — acceptable, the closed state still reads right there. */
  .corner-athlete-picker option{
    background-color:var(--paper-2);
    color:var(--ink);
  }
  /* Stand-in for the picker on the Stopwatch tab when 2+ runners are selected.
     Mirrors the picker's italic subtitle voice so the masthead doesn't jump
     visually when it swaps in/out. The runner count rides along in gold. */
  .corner-group-label{
    font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
    font-size:clamp(17px,2.4vw,22px);color:var(--ink);
    display:inline-block;padding:2px 0 4px;
  }
  .corner-group-label b{
    font-style:normal;font-weight:500;color:var(--gold);
  }

  /* ---------- Corner subsection tabs (Testing | Clipboard | Stopwatch) ---------- */
  .corner-tabs{margin:28px 0 14px;display:flex}
  .corner-tabs .toggle{width:100%}
  /* Icon + label centered with a small gap. Scoped to .corner-tabs so the
     Almanac's year/unit toggles (plain .toggle) are unaffected. The SVG uses
     stroke:currentColor, so it inherits the ink color and flips to --paper
     on the active gold tab automatically. */
  .corner-tabs .toggle button{
    flex:1;min-width:0;padding:11px 14px;font-size:12px;
    display:inline-flex;align-items:center;justify-content:center;gap:8px;
  }
  .corner-tabs .toggle button svg{
    width:20px;height:20px;flex:0 0 auto;
  }
  @media(max-width:600px){
    /* Five tabs can't fit icon-beside-label across a phone — the row would
       overflow and .toggle's overflow:hidden clips the last (Progress) tab.
       Stack the icon over the label and let buttons shrink (min-width:0 above)
       so all five fit. */
    .corner-tabs .toggle button{
      flex-direction:column;gap:3px;padding:8px 4px;font-size:10px;
      letter-spacing:0;line-height:1.15;
    }
    .corner-tabs .toggle button svg{width:18px;height:18px}
  }

  /* Front Office section-tab counts — "Users 7 · Roster 142 · Meets 38". Muted so
     the count reads as secondary to the label; inherits the tab's ink/paper color. */
  .fo-count{font-weight:500;font-size:.9em;letter-spacing:0;opacity:.55}

  /* Departed (soft-deleted) athletes: a recoverable list under the active roster.
     Set off with a top rule + breathing room so it reads as a distinct, lower-priority
     zone — and dimmed slightly to signal these athletes are on their way out. The table
     reuses the shared .fo-thead/.fo-trow primitives above; only its columns differ.
     Columns: Name · Removed · Scheduled deletion · actions. */
  .fo-departed{margin-top:2.5rem;padding-top:1.5rem;border-top:1px solid var(--fo-divider,rgba(127,127,127,.22))}
  .fo-departed-title{opacity:.8}
  .fo-departed .admin-roster{opacity:.85}
  #adminDeparted .fo-thead, #adminDeparted .fo-trow{
    grid-template-columns:minmax(0,1.8fr) minmax(0,1.1fr) minmax(0,1.2fr) 150px;
  }

  /* ---------- Coach's Corner ---------- */
  /* Coach-facing dashboard. Reuses the masthead chrome from the Almanac; the
     body is a stack of per-event cards (30m Fly, Throw, Broad Jump, Mile).
     Each card has a quick-add form, a Best line, and a list of past entries
     with inline edit + delete. Designed for clipboard-style entry during
     practice — no modals, single Enter to save. */
  .corner-events{margin-top:36px}
  .corner-event-card{
    border:1px solid var(--rule);background:var(--paper-2);
    padding:18px 22px;margin-bottom:18px;border-radius:4px;
  }
  .corner-event-head{
    display:flex;align-items:center;gap:10px;margin-bottom:14px;
    flex-wrap:nowrap;cursor:pointer;
  }
  /* Attendance head: keep the title and its practice-date chip together on the left,
     letting the "N present" count sit at the far right via the head's space-between. */
  .corner-attend-head-left{
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  }
  /* Custom calendar popover for the Attendance date chip — themed to match the site
     (the native date picker can't be). Anchored under the chip. */
  .corner-attend-date{position:relative;display:inline-flex}
  .corner-cal{
    position:absolute;top:calc(100% + 8px);left:0;z-index:40;
    width:280px;max-width:calc(100vw - 56px);
    background:var(--paper-2);border:1px solid var(--rule);border-radius:4px;
    padding:14px;box-shadow:0 12px 32px var(--shadow);
  }
  .corner-cal[hidden]{display:none}
  .corner-cal-head{
    display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:12px;
  }
  .corner-cal-month{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:16px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink);
  }
  .corner-cal-nav{
    display:flex;align-items:center;justify-content:center;
    width:30px;height:30px;font-size:18px;line-height:1;
    border:1px solid var(--rule);background:var(--paper);color:var(--ink);
    border-radius:2px;cursor:pointer;transition:border-color .15s,color .15s;
  }
  .corner-cal-nav:hover:not(:disabled){border-color:var(--gold);color:var(--gold)}
  .corner-cal-nav:disabled{opacity:.3;cursor:default}
  .corner-cal-dow,.corner-cal-grid{
    display:grid;grid-template-columns:repeat(7,1fr);gap:2px;
  }
  .corner-cal-dow{margin-bottom:4px}
  .corner-cal-dow span{
    font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:600;
    color:var(--muted);text-align:center;padding:4px 0;
  }
  .corner-cal-day{
    font-family:'JetBrains Mono',monospace;font-size:13px;
    aspect-ratio:1;display:flex;align-items:center;justify-content:center;
    border:1px solid transparent;background:transparent;color:var(--ink);
    border-radius:2px;cursor:pointer;transition:border-color .15s,background .15s,color .15s;
  }
  .corner-cal-day.blank{cursor:default}
  button.corner-cal-day:hover{border-color:var(--gold);color:var(--gold)}
  .corner-cal-day.is-today{border-color:var(--gold);color:var(--gold)}
  .corner-cal-day.is-selected{
    background:var(--gold);border-color:var(--gold);color:var(--on-accent);font-weight:600;
  }
  .corner-cal-day.is-disabled{color:var(--rule);cursor:default}
  .corner-event-title{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:17px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink);
    flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .corner-event-best{
    font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--muted);
    white-space:nowrap;
  }
  .corner-event-best b{color:var(--gold);font-weight:500}
  .corner-add-row{
    display:flex;gap:8px;align-items:center;flex-wrap:wrap;
    margin-bottom:14px;padding-bottom:14px;
    border-bottom:1px solid var(--rule);
  }
  .corner-add-row input[type="date"],
  .corner-add-row input[type="text"]{
    font-family:'Barlow',sans-serif;font-size:15px;font-weight:500;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;min-width:0;
  }
  .corner-add-row input.corner-value{flex:0 0 auto;text-align:center}
  .corner-add-row input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  /* Date entry: the native <input type="date"> chrome is bulky on mobile and
     dominates the row, so the date is hidden behind a small "Today" chip. The
     coach taps the chip to open the native picker via showPicker(); chip text
     + color flip when a non-today date is selected so the backfill state is
     obvious before they hit Add. Modern browsers (iOS Safari 16+, Chrome 99+)
     support showPicker; the fallback inlines the actual input. */
  .corner-date-input{
    /* Hidden behind the chip but kept in the DOM so .showPicker() can target it
       and form submission picks up its value. opacity:0 wins over the .corner-add-row
       padding rule without specificity gymnastics; pointer-events:none keeps clicks
       passing through to the chip. */
    position:absolute;width:1px;height:1px;
    opacity:0;pointer-events:none;
  }
  .corner-date-input.corner-date-input-visible{
    position:static;width:auto;height:auto;clip:auto;margin:0;overflow:visible;
    font-family:'Barlow',sans-serif;font-size:16px;font-weight:500;
    padding:9px 12px;border:1px solid var(--gold);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .corner-date-chip{
    font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600;
    letter-spacing:.08em;text-transform:uppercase;
    padding:9px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);cursor:pointer;border-radius:2px;white-space:nowrap;
    transition:border-color .15s,color .15s,background .15s;
  }
  .corner-date-chip:hover{border-color:var(--gold);color:var(--gold)}
  .corner-date-chip.non-today{
    border-color:var(--gold);color:var(--on-accent);background:var(--gold);
  }
  .corner-add-btn{
    font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;
    padding:9px 18px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .corner-add-btn:hover{background:transparent;color:var(--gold)}
  .corner-row{
    display:flex;gap:12px;align-items:baseline;
    padding:10px 0;border-bottom:1px solid rgba(var(--ink-rgb),.05);
  }
  .corner-row:last-child{border-bottom:none}
  .corner-row-date{
    font-family:'JetBrains Mono',monospace;font-size:13px;
    color:var(--muted);flex:0 0 110px;
  }
  .corner-row-value{
    font-family:'JetBrains Mono',monospace;font-size:14px;
    font-weight:500;color:var(--ink);flex:1;min-width:0;
  }
  .corner-row-notes{
    font-family:'Barlow',sans-serif;font-size:12px;color:var(--muted);
    font-style:italic;
  }
  /* "by <coach>" attribution — who entered / last edited a mark, note, roll
     call, or timing session. Deliberately quiet (small, muted, italic) so it
     reads as provenance metadata, not part of the result. */
  .corner-row-by{
    font-family:'Barlow',sans-serif;font-size:11px;color:var(--muted);
    font-style:italic;
  }
  .corner-note-by{
    font-family:'Barlow',sans-serif;font-size:11px;color:var(--muted);
    font-style:italic;margin-top:4px;
  }
  .corner-attend-by{
    display:block;font-family:'Barlow',sans-serif;font-size:11px;
    color:var(--muted);font-style:italic;margin-top:3px;
  }
  /* Throw implement chip — shown on each throw row in place of the generic
     notes treatment, so the test type (6lb shot / 4kg med ball / etc.) reads
     as primary context for the mark rather than an afterthought. */
  .corner-row-implement{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    padding:2px 9px;border:1px solid var(--rule);border-radius:10px;
    color:var(--muted);background:var(--paper);white-space:nowrap;
  }
  /* Live preview line under each value input — shows what the digit-only
     entry will parse to as the coach types (e.g. "342" -> "3.42s"). Sits at
     full-width inside the flex form, breaking to its own line. */
  .corner-input-preview{
    flex:0 1 auto;margin-left:auto;text-align:right;min-height:1.2em;
    font-family:'JetBrains Mono',monospace;font-size:11px;
    color:var(--muted);letter-spacing:.04em;
  }
  .corner-input-preview b{color:var(--ink);font-weight:500}
  .corner-input-preview.empty{opacity:0}
  .corner-row-actions{display:flex;gap:6px}
  .corner-row-actions button{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    padding:4px 10px;border:1px solid var(--rule);background:var(--paper);
    color:var(--muted);cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .corner-row-actions button:hover{color:var(--gold);border-color:var(--gold)}
  .corner-row-actions .corner-delete:hover{color:#d68a6a;border-color:#d68a6a}

  /* ---------- Clipboard (notes subsection) ---------- */
  /* The note add form is a stacked card: textarea on top (where the eye lands
     first for fast typing), then a compact bottom row with the date chip on
     the left and the Add button on the right. Mirrors the testing card chrome
     so coaches don't have to re-learn the controls when they switch tabs. */
  .corner-note-add{flex-direction:column;align-items:stretch;gap:8px;flex-wrap:nowrap}
  .corner-note-add textarea{
    width:100%;font-family:'Barlow',sans-serif;font-size:16px;font-weight:400;
    padding:10px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;resize:vertical;min-height:54px;
    line-height:1.4;
  }
  .corner-note-add textarea:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .corner-note-add .corner-note-controls{
    display:flex;align-items:center;gap:8px;justify-content:flex-start;
  }
  .corner-note-add .corner-add-btn{margin-left:auto}
  /* Note rows: date + actions on top, full text body below. Keeps long notes
     readable without truncation, while staying compact when collapsed. */
  .corner-note-row{flex-direction:column;align-items:stretch;gap:6px}
  .corner-note-row-top{
    display:flex;align-items:center;justify-content:space-between;gap:8px;
  }
  .corner-note-text{
    font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);
    line-height:1.5;white-space:pre-wrap;word-wrap:break-word;
  }
  /* Inline edit form for a note */
  .corner-note-edit{flex-direction:column;align-items:stretch;gap:8px;flex-wrap:nowrap}
  .corner-note-edit textarea{
    width:100%;font-family:'Barlow',sans-serif;font-size:16px;font-weight:400;
    padding:9px 11px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;resize:vertical;min-height:54px;line-height:1.4;
  }
  .corner-note-edit textarea:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .corner-note-edit .corner-note-controls{
    display:flex;align-items:center;gap:8px;
  }
  .corner-note-edit .corner-row-actions{margin-left:auto}
  .corner-row-edit{flex-wrap:wrap;gap:8px}
  .corner-row-edit input[type="date"],
  .corner-row-edit input[type="text"]{
    font-family:'Barlow',sans-serif;font-size:14px;font-weight:500;
    padding:7px 10px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;min-width:0;
  }
  .corner-row-edit input.corner-value{flex:1;min-width:100px}
  .corner-row-edit input:focus{outline:2px solid var(--gold);outline-offset:-1px}
  .corner-empty{
    padding:16px 0;text-align:center;color:var(--muted);
    font-family:'JetBrains Mono',monospace;font-size:12px;
  }
  /* Progress tab — read-only report card + per-event charts. The report card is
     a borderless table (bottom rule per row); charts reuse the Almanac's
     Chart.js styling at a shorter height since several stack vertically. */
  .corner-report{
    width:100%;border-collapse:collapse;
    font-family:'JetBrains Mono',monospace;font-size:13px;
  }
  .corner-report th{
    text-align:left;padding:6px 10px;border-bottom:1px solid var(--rule);
    color:var(--muted);font-weight:500;text-transform:uppercase;
    letter-spacing:.06em;font-size:11px;
  }
  .corner-report td{
    padding:9px 10px;border-bottom:1px solid var(--rule);color:var(--ink);
  }
  .corner-report tbody tr:last-child td{border-bottom:none}
  .corner-report .rc-best b{color:var(--gold);font-weight:500}
  .corner-report .rc-untested{color:var(--muted)}
  /* Safety net: an auto-layout table can exceed the viewport on a phone (5
     columns of mono text), spilling the whole card off-screen. Scroll the table
     within its card instead. The mobile sizing below usually makes it fit so no
     scrollbar appears. */
  .corner-report-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .corner-chart-box{position:relative;height:280px;margin-top:6px}
  .corner-chart-box canvas{max-width:100%}
  @media(max-width:600px){
    .corner-report{font-size:11px}
    .corner-report th{padding:5px 6px}
    .corner-report td{padding:7px 6px}
    .corner-chart-box{height:240px}
  }
  /* Progress · Team view — squad matrix, per-event leaderboards, coverage gaps. */
  .corner-matrix td, .corner-matrix th{white-space:nowrap}
  .tm-imp{display:block;font-size:10px;color:var(--muted);font-weight:400}
  .tm-athlete{
    font-family:'JetBrains Mono',monospace;font-size:inherit;color:var(--gold);
    background:none;border:none;padding:0;cursor:pointer;text-align:left;
    text-decoration:underline;text-underline-offset:2px;text-decoration-color:var(--rule);
  }
  .tm-athlete:hover{text-decoration-color:var(--gold)}
  .tm-imp-group{margin-bottom:12px}
  .tm-imp-group:last-child{margin-bottom:0}
  .tm-imp-head{
    font-family:'JetBrains Mono',monospace;font-size:11px;text-transform:uppercase;
    letter-spacing:.08em;color:var(--muted);margin:4px 0 6px;
  }
  .tm-rank{display:flex;flex-direction:column}
  .tm-row{
    display:grid;grid-template-columns:1.6em 1fr auto auto;align-items:baseline;
    gap:10px;padding:6px 0;border-bottom:1px solid var(--rule);
    font-family:'JetBrains Mono',monospace;font-size:13px;
  }
  .tm-rank .tm-row:last-child{border-bottom:none}
  .tm-pos{color:var(--muted);text-align:right}
  .tm-mark{color:var(--gold)}
  .tm-when{color:var(--muted);font-size:11px}
  /* "Highlight gaps" toggle on the matrix: dim the filled cells so the '—'s pop. */
  .tm-gaps-toggle{
    font-family:'JetBrains Mono',monospace;font-size:11px;text-transform:uppercase;
    letter-spacing:.06em;padding:4px 10px;border:1px solid var(--rule);
    background:var(--paper);color:var(--muted);cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .tm-gaps-toggle:hover{color:var(--gold);border-color:var(--gold)}
  .tm-gaps-toggle.on{color:var(--gold);border-color:var(--gold)}
  .corner-matrix.gaps-on td.rc-best{opacity:.28}
  .corner-matrix.gaps-on td.rc-untested{color:var(--gold);font-weight:600}
  /* Today's testing — present-today, no mark yet (the one date-scoped block). */
  /* Per-coach event picker: which events THIS coach is testing now. Session-only
     + client-side so simultaneous coaches don't override each other's view. The
     selectable-pill styling mirrors .tm-gaps-toggle (off=muted, on=gold). */
  .tm-test-picker{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
  .tm-test-chip{
    font-family:'JetBrains Mono',monospace;font-size:11px;text-transform:uppercase;
    letter-spacing:.06em;padding:4px 10px;border:1px solid var(--rule);
    background:var(--paper);color:var(--muted);cursor:pointer;border-radius:999px;
    transition:color .15s,border-color .15s,background .15s;
  }
  .tm-test-chip:hover{color:var(--gold);border-color:var(--gold)}
  .tm-test-chip.on{color:var(--gold);border-color:var(--gold);background:rgba(var(--accent-rgb),.10)}
  .tm-opp-done{color:var(--muted);font-size:12px;font-family:'JetBrains Mono',monospace}
  .tm-opp-list{display:flex;flex-direction:column}
  .tm-opp-row{
    display:grid;grid-template-columns:9em 1fr;gap:12px;align-items:center;
    padding:8px 0;border-bottom:1px solid var(--rule);
    font-family:'JetBrains Mono',monospace;font-size:13px;
  }
  .tm-opp-list .tm-opp-row:last-child{border-bottom:none}
  .tm-opp-event{color:var(--ink);text-transform:uppercase;letter-spacing:.04em;font-size:11px}
  /* Each untested athlete is its own clickable chip — fixes the unreadable
     comma run ("Lopez, Maya, Rivera, Sam") and gives a one-tap jump to Testing. */
  .tm-opp-chips{display:flex;flex-wrap:wrap;gap:6px}
  .tm-opp-chip{
    font-family:'JetBrains Mono',monospace;font-size:12px;
    padding:4px 10px;border:1px solid var(--rule);border-radius:999px;
    background:var(--paper);color:var(--gold);cursor:pointer;
    transition:border-color .15s,background .15s;
  }
  .tm-opp-chip:hover{border-color:var(--gold);background:rgba(var(--accent-rgb),.10)}
  @media(max-width:600px){
    .tm-row{font-size:12px;gap:8px;grid-template-columns:1.4em 1fr auto}
    .tm-when{display:none}
    .tm-opp-row{grid-template-columns:1fr;gap:2px;font-size:12px}
  }
  /* Entries history collapses by default so coaches can input results across
     all four events without scrolling past prior rows. Uses the same clip-path
     tween + .is-rotated chevron pattern as the Almanac's Record Book / Award
     Shelf / Travel Map cards (see wireSmoothToggle), so the motion feels
     consistent across the app. */
  .corner-list-details{margin-top:6px}
  .corner-list-details summary{
    list-style:none;cursor:pointer;padding:10px 0 6px;user-select:none;
    display:flex;align-items:center;justify-content:space-between;gap:8px;
    /* No border-top here — the add form's border-bottom is already drawing
       the separator between the input area and the history toggle. Adding a
       second one made the gap between them read as two stacked rules. */
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
    transition:color .15s;
  }
  .corner-list-details summary::-webkit-details-marker{display:none}
  .corner-list-details summary:hover{color:var(--gold)}
  .corner-list-chev{
    color:var(--gold);font-size:12px;display:inline-block;
    transition:transform 200ms cubic-bezier(.4,0,.2,1);will-change:transform;
  }
  .corner-list-details.is-rotated .corner-list-chev{transform:rotate(180deg)}
  .corner-list-details > .corner-list{overflow:hidden;contain:layout style paint}
  @media(max-width:640px){
    .corner-event-card{padding:14px 16px;margin-bottom:14px}
    .corner-event-title{font-size:16px}
    .corner-add-row input.corner-value{flex:0 0 auto}
    .corner-input-preview{flex:1 0 100%;margin-left:0}
    .corner-event-toggle{width:40px;height:40px}
    /* iOS Safari auto-zooms any focused input whose font-size < 16px, and the
       page often doesn't fully zoom back when the field blurs — leaving an
       apparent horizontal scroll. Pin all corner inputs to 16px on mobile to
       suppress the zoom entirely. */
    .corner-add-row input[type="date"],
    .corner-add-row input[type="text"],
    .corner-row-edit input[type="date"],
    .corner-row-edit input[type="text"]{font-size:16px}
    .corner-add-btn{flex:0 0 auto}
    .corner-row{flex-wrap:wrap;gap:8px}
    .corner-row-date{flex:0 0 90px;font-size:12px}
    .corner-row-value{font-size:13px}
  }

  /* ---------- Stopwatch tab (Coach's Corner) ---------- */
  /* Three sub-screens live in #cornerEvents on the stopwatch tab:
       1. Setup       — coach picks athletes + starts the session
       2. Active      — running clock + tap-grid for capturing splits
       3. Results     — read-only table of splits/pace/lap per athlete
     Each one renders in its own container so transitions are a simple
     render swap, no animation needed for v1. */

  /* --- Setup --- */
  .sw-setup{
    border:1px solid var(--rule);background:var(--paper-2);
    padding:18px 22px;border-radius:4px;
  }
  .sw-setup-head{
    display:flex;justify-content:space-between;align-items:baseline;
    gap:12px;margin-bottom:18px;flex-wrap:wrap;
  }
  .sw-setup-title{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:22px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink);
  }
  .sw-setup-event{
    font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--muted);
  }
  .sw-setup-event b{color:var(--gold);font-weight:500}
  .sw-setup-label{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
    margin:14px 0 10px;display:block;
  }
  .sw-athlete-grid{
    display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));
    gap:8px;margin-bottom:14px;
  }
  .sw-athlete-pick{
    font-family:'Barlow',sans-serif;font-size:14px;font-weight:500;
    padding:10px 14px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);cursor:pointer;border-radius:2px;text-align:left;
    transition:border-color .15s,background .15s,color .15s;
  }
  .sw-athlete-pick:hover{border-color:var(--gold)}
  .sw-athlete-pick.on{
    background:var(--gold);color:var(--on-accent);border-color:var(--gold);
  }
  .sw-setup-actions{
    display:flex;align-items:center;gap:14px;flex-wrap:wrap;
    padding-top:14px;border-top:1px solid var(--rule);
  }
  .sw-setup-count{
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
  }
  .sw-setup-count b{color:var(--gold);font-weight:500}
  .sw-start-btn{
    margin-left:auto;
    font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;
    letter-spacing:.16em;text-transform:uppercase;
    padding:11px 22px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .sw-start-btn:hover:not(:disabled){background:transparent;color:var(--gold)}
  .sw-start-btn:disabled{opacity:.4;cursor:default}

  /* --- Active timing screen --- */
  /* Clock is rendered from Date.now()-startedAt every animation frame, so it
     stays accurate even when the phone screen locks (interval timers throttle
     aggressively in the background; absolute-time read doesn't). The tenths
     digit at the end is visual proof the loop is alive. */
  .sw-active{
    border:1px solid var(--rule);background:var(--paper-2);
    padding:18px 22px;border-radius:4px;
  }
  .sw-active-head{
    display:flex;align-items:baseline;justify-content:space-between;gap:12px;
    margin-bottom:14px;flex-wrap:wrap;
  }
  .sw-active-meta{
    font-family:'JetBrains Mono',monospace;font-size:12px;
    color:var(--muted);letter-spacing:.04em;
  }
  .sw-active-meta b{color:var(--ink);font-weight:500}
  .sw-active-sync{
    font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  }
  .sw-active-sync.pending{color:var(--gold)}
  .sw-active-sync.error{color:#d68a6a}
  .sw-clock{
    font-family:'JetBrains Mono',monospace;font-weight:600;
    font-size:clamp(48px,12vw,96px);line-height:1;letter-spacing:.02em;
    color:var(--gold);text-align:center;
    padding:18px 0 22px;margin-bottom:14px;
    border-bottom:1px solid var(--rule);
    font-variant-numeric:tabular-nums;
    /* tabular-nums keeps digit widths fixed so the clock doesn't jitter as
       seconds/tenths roll over */
  }
  .sw-tile-grid{
    display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));
    gap:10px;margin-bottom:14px;
  }
  .sw-tile{
    position:relative;display:flex;flex-direction:column;
    text-align:left;gap:6px;
    padding:14px 16px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);cursor:pointer;border-radius:3px;
    transition:transform .08s ease, border-color .15s, background .15s;
    /* Big touch target — coaches use this on phones in the middle of a race */
    min-height:84px;
    user-select:none;-webkit-tap-highlight-color:transparent;
  }
  .sw-tile:hover{border-color:var(--gold)}
  .sw-tile:active{transform:scale(0.98)}
  .sw-tile-name{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:17px;
    text-transform:uppercase;letter-spacing:.02em;line-height:1.1;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .sw-tile-next{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
  }
  .sw-tile-next b{color:var(--gold);font-weight:500}
  .sw-tile-last{
    font-family:'JetBrains Mono',monospace;font-size:13px;
    color:var(--ink);font-weight:500;letter-spacing:.04em;
  }
  /* Brief flash when a tap registers — visual confirmation the split landed
     even when the coach is looking at the next runner crossing the line. */
  @keyframes sw-tap-flash {
    0%   { background: var(--gold); color: var(--on-accent); }
    100% { background: var(--paper); color: var(--ink); }
  }
  .sw-tile.flash{animation:sw-tap-flash 360ms ease-out}
  /* Done state — all planned splits captured. Greyed + not clickable. */
  .sw-tile.done{
    opacity:.5;cursor:default;border-style:dashed;
  }
  .sw-tile.done:hover{border-color:var(--rule)}
  .sw-tile.done .sw-tile-next{color:var(--gold)}
  /* DNF state — visually struck out, taps disabled. Coach toggles via menu. */
  .sw-tile.dnf{
    opacity:.4;cursor:default;border-color:#d68a6a;
  }
  .sw-tile.dnf:hover{border-color:#d68a6a}
  .sw-tile.dnf .sw-tile-name{text-decoration:line-through}
  .sw-tile.dnf .sw-tile-next{color:#d68a6a}

  /* --- PaceWheel verdict (treatment B: action-first) ---
     The action the coach should yell, color-coded: ON PACE (green #2ea043),
     FASTER ▲ (red #e5534b, runner too slow), EASE ▼ (blue #4aa3ff, too fast).
     Lives inside the active tile + as a chip in the results table. */
  .sw-verdict{
    display:flex;align-items:baseline;gap:8px;
    font-family:'JetBrains Mono',monospace;font-size:13px;letter-spacing:.06em;
  }
  .sw-verdict b{font-weight:700;text-transform:uppercase;letter-spacing:.1em}
  .sw-verdict span{font-size:11px;color:var(--muted)}
  .sw-verdict-on   b{color:#2ea043}
  .sw-verdict-slow b{color:#e5534b}
  .sw-verdict-fast b{color:#4aa3ff}
  /* Tile-tint variants — a left border + faint wash so the whole tile reads
     at a glance from across the track. */
  .sw-tile.sw-verdict-on{border-left:3px solid #2ea043;
    background:linear-gradient(90deg, rgba(46,160,67,.10), var(--paper) 60%)}
  .sw-tile.sw-verdict-slow{border-left:3px solid #e5534b;
    background:linear-gradient(90deg, rgba(229,83,75,.12), var(--paper) 60%)}
  .sw-tile.sw-verdict-fast{border-left:3px solid #4aa3ff;
    background:linear-gradient(90deg, rgba(74,163,255,.12), var(--paper) 60%)}
  .sw-tile.sw-verdict-on:hover{border-color:#2ea043}
  .sw-tile.sw-verdict-slow:hover{border-color:#e5534b}
  .sw-tile.sw-verdict-fast:hover{border-color:#4aa3ff}

  /* --- Live pace ghost (the "wavelight") ---
     A target-pace indicator for the CURRENT split segment, animated live by
     swUpdatePacers(). Single-athlete sessions show an oval-track ghost (a glowing
     gold dot laps the stadium once per the segment's target time, trailing a
     progress arc); group sessions show a compact bar per tile. Non-interactive
     (pointer-events:none) so taps still land on the tile button. Overdue =
     fraction > 1 (the athlete should already have crossed) → red + pulse. */
  .sw-ghost{display:flex;flex-direction:column;align-items:center;gap:2px;pointer-events:none;margin-top:2px}
  .sw-ghost-svg{width:100%;max-width:240px;height:auto;display:block;overflow:visible}
  .sw-ghost-track{fill:none;stroke:var(--rule);stroke-width:10}
  .sw-ghost-arc{fill:none;stroke:var(--gold);stroke-width:10;stroke-linecap:round;
    filter:drop-shadow(0 0 5px rgba(var(--accent-rgb),.8))}
  .sw-ghost-finish{stroke:var(--ink);stroke-width:2;opacity:.45}
  .sw-ghost-dot{fill:var(--gold);filter:drop-shadow(0 0 6px rgba(var(--accent-rgb),.9))}
  .sw-ghost-cap{
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.1em;
    text-transform:uppercase;color:var(--muted);
  }
  /* Overdue: the ghost parks on the finish line, dot + arc go red and pulse. */
  .sw-ghost-dot.sw-ghost-overdue{fill:#e5534b;filter:drop-shadow(0 0 6px rgba(229,83,75,.9));
    animation:sw-ghost-pulse 1s ease-in-out infinite}
  .sw-ghost-arc.sw-ghost-overdue{stroke:#e5534b;filter:drop-shadow(0 0 5px rgba(229,83,75,.8))}
  @keyframes sw-ghost-pulse{0%,100%{opacity:1}50%{opacity:.4}}

  /* Group-session pacer bar (one per tile). */
  .sw-pacer-wrap{display:flex;flex-direction:column;gap:3px;pointer-events:none;margin-top:2px}
  .sw-pacer{
    height:8px;border-radius:5px;background:var(--paper-2);overflow:hidden;
    border:1px solid var(--rule);
  }
  .sw-pacer-fill{
    display:block;height:100%;width:0;border-radius:5px;
    background:var(--gold);box-shadow:0 0 6px rgba(var(--accent-rgb),.8);
  }
  .sw-pacer-fill.over{background:#e5534b;box-shadow:0 0 6px rgba(229,83,75,.8)}
  .sw-pacer-cap{
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.1em;
    text-transform:uppercase;color:var(--muted);
  }

  /* --- Setup: training-zone picker --- */
  .sw-zone-picker{
    padding-top:14px;margin-top:4px;border-top:1px solid var(--rule);
    display:flex;flex-direction:column;gap:10px;
  }
  .sw-zone-chips{display:flex;flex-wrap:wrap;gap:8px}
  .sw-zone-chip{
    font-family:'Barlow',sans-serif;font-size:13px;font-weight:500;
    padding:7px 12px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);cursor:pointer;border-radius:2px;
    transition:border-color .15s,background .15s,color .15s;
  }
  .sw-zone-chip:hover{border-color:var(--gold)}
  .sw-zone-chip.on{background:var(--gold);color:var(--on-accent);border-color:var(--gold)}
  .sw-zone-athletes{
    display:flex;flex-direction:column;gap:6px;
    padding-top:8px;
  }
  .sw-zone-athlete{
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
  }
  .sw-zone-athlete-name{color:var(--ink);min-width:120px}
  .sw-zone-athlete-fit{color:var(--muted)}
  .sw-zone-athlete-nofit{color:#e5534b}
  .sw-zone-athlete-target{color:var(--gold);font-weight:600;margin-left:auto}
  .sw-zone-athlete-target small{color:var(--muted);font-weight:400}
  .sw-zone-loading{color:var(--muted)}
  .sw-baseline-form-label{
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.06em;
    text-transform:uppercase;color:var(--muted);
  }
  .sw-baseline-set,.sw-baseline-edit-link{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.08em;
    padding:4px 10px;border:1px solid var(--rule);background:transparent;
    color:var(--gold);cursor:pointer;border-radius:2px;
  }
  .sw-baseline-set:hover,.sw-baseline-edit-link:hover{border-color:var(--gold)}
  .sw-baseline-edit-link{border:none;text-decoration:underline;padding:0;opacity:.8}
  .sw-baseline-form{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
  .sw-baseline-form select,.sw-baseline-form input{
    font-family:'JetBrains Mono',monospace;font-size:13px;
    padding:6px 8px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .sw-baseline-form input{width:90px}
  .sw-baseline-mmss{display:inline-flex;align-items:center;gap:4px}
  .sw-baseline-form .sw-baseline-min,.sw-baseline-form .sw-baseline-sec{width:48px;text-align:center}
  .sw-baseline-colon{color:var(--muted);font-weight:700}
  .sw-baseline-save{
    font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.08em;
    padding:6px 12px;border:1px solid var(--gold);background:var(--gold);
    color:var(--on-accent);cursor:pointer;border-radius:2px;
  }
  .sw-baseline-save:disabled{opacity:.5;cursor:default}
  .sw-baseline-cancel{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    padding:6px 10px;border:1px solid var(--rule);background:transparent;
    color:var(--muted);cursor:pointer;border-radius:2px;
  }
  .sw-active-zone{color:var(--gold)}

  /* --- Progress · Training Zones card (one athlete) --- */
  .cz-card{display:flex;flex-direction:column;gap:14px}
  .cz-head{display:flex;align-items:flex-start;gap:10px}
  .cz-eyebrow{
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.12em;
    text-transform:uppercase;color:var(--muted);
  }
  .cz-name{font-size:18px;font-weight:700;color:var(--ink);margin-top:2px}
  .cz-edit{
    margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.06em;padding:5px 12px;border:1px solid var(--rule);
    background:transparent;color:var(--gold);cursor:pointer;border-radius:2px;
  }
  .cz-edit:hover{border-color:var(--gold)}
  .cz-mono,.cz-card .mono{font-variant-numeric:tabular-nums}
  /* Current fitness block */
  .cz-cf{
    background:var(--paper-2);border:1px solid var(--rule);border-radius:3px;
    padding:13px 14px;
  }
  .cz-cf-race{font-size:24px;font-weight:700;color:var(--ink);margin-top:4px}
  .cz-cf-none{font-size:16px;color:var(--muted);margin-top:4px}
  .cz-cf-hint{font-size:12px;color:var(--muted);margin-top:6px}
  .cz-cf-form{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:6px}
  .cz-cf-form select,.cz-cf-form input{
    font-family:'JetBrains Mono',monospace;font-size:13px;
    padding:6px 8px;border:1px solid var(--rule);background:var(--paper);
    color:var(--ink);border-radius:2px;
  }
  .cz-cf-form .sw-baseline-min,.cz-cf-form .sw-baseline-sec{width:48px;text-align:center}
  /* Equivalent race times strip */
  .cz-equiv-label{font-size:12px;color:var(--muted)}
  .cz-equiv-label b{color:var(--ink)}
  .cz-equiv{
    display:grid;grid-template-columns:repeat(auto-fit,minmax(54px,1fr));gap:5px;margin-top:7px;
  }
  .cz-eq{
    background:var(--paper-2);border:1px solid var(--rule);border-radius:3px;
    padding:7px 2px;text-align:center;
  }
  .cz-eq-d{
    font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.03em;
    text-transform:uppercase;color:var(--muted);
  }
  .cz-eq-t{font-size:13px;font-weight:600;color:var(--ink);margin-top:2px}
  .cz-eq.entered{border-color:var(--gold);background:rgba(var(--accent-rgb),.08)}
  .cz-eq-tag{font-size:9px;color:var(--gold);letter-spacing:.06em;margin-top:3px}
  /* Training-zone rows */
  .cz-zhead{font-size:12px;color:var(--muted)}
  .cz-zhead b{color:var(--ink)}
  .cz-zones{margin-top:7px}
  .cz-zone{
    display:flex;align-items:center;gap:10px;padding:9px 0;
    border-top:1px solid var(--rule);
  }
  .cz-zone:first-child{border-top:0}
  .cz-zbar{width:4px;align-self:stretch;border-radius:3px;background:var(--gold)}
  .cz-zone[data-cz-zone="aerobic_base"] .cz-zbar{background:#5bb36a}
  .cz-zone[data-cz-zone="marathon_pace"] .cz-zbar{background:#84b94a}
  .cz-zone[data-cz-zone="lactate_threshold"] .cz-zbar{background:var(--gold)}
  .cz-zone[data-cz-zone="vo2max"] .cz-zbar{background:#e08e3c}
  .cz-zone[data-cz-zone="running_economy"] .cz-zbar{background:#e5534b}
  .cz-zone[data-cz-zone="speed_reps"] .cz-zbar{background:#c2403a}
  .cz-zname{display:flex;flex-direction:column;min-width:120px}
  .cz-zn{font-weight:600;font-size:14px;color:var(--ink)}
  .cz-zpct{font-size:11px;color:var(--muted)}
  .cz-zreps{
    margin-left:auto;text-align:right;font-size:12px;color:var(--ink);
    font-family:'JetBrains Mono',monospace;
  }

  /* Results-table verdict chip — a small colored pill under each lap. */
  .sw-results-verdict{
    display:block;margin-top:3px;
    font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:600;
    letter-spacing:.06em;
  }
  .sw-results-verdict.sw-verdict-on{color:#2ea043}
  .sw-results-verdict.sw-verdict-slow{color:#e5534b}
  .sw-results-verdict.sw-verdict-fast{color:#4aa3ff}
  /* Tile menu (three-dot affordance for undo / DNF / un-DNF) lives in the
     corner; tapped to open a tiny dropdown. Stops propagation so it doesn't
     also count as a split capture. */
  .sw-tile-menu{
    position:absolute;top:6px;right:6px;
    background:transparent;border:none;color:var(--muted);
    font-family:'JetBrains Mono',monospace;font-size:18px;line-height:1;
    padding:4px 8px;cursor:pointer;border-radius:2px;
    transition:color .15s,background .15s;
  }
  .sw-tile-menu:hover{color:var(--gold);background:rgba(var(--ink-rgb),.04)}
  .sw-tile-menu-pop{
    position:absolute;top:34px;right:6px;z-index:5;
    background:var(--paper-2);border:1px solid var(--gold);border-radius:3px;
    box-shadow:0 4px 12px rgba(0,0,0,.5);min-width:140px;
    display:flex;flex-direction:column;
  }
  .sw-tile-menu-pop button{
    background:none;border:none;color:var(--ink);text-align:left;
    font-family:'JetBrains Mono',monospace;font-size:12px;
    letter-spacing:.08em;padding:10px 14px;cursor:pointer;
    transition:background .15s,color .15s;
  }
  .sw-tile-menu-pop button:hover{background:var(--paper);color:var(--gold)}
  .sw-tile-menu-pop button.danger:hover{color:#d68a6a}

  .sw-active-actions{
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    padding-top:14px;border-top:1px solid var(--rule);
  }
  .sw-active-progress{
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
    flex:1;min-width:120px;
  }
  .sw-active-progress b{color:var(--gold);font-weight:500}
  .sw-end-btn{
    font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600;
    letter-spacing:.14em;text-transform:uppercase;
    padding:10px 18px;border:1px solid #d68a6a;background:transparent;
    color:#d68a6a;cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .sw-end-btn:hover{background:#d68a6a;color:var(--paper)}
  .sw-back-btn{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
    background:transparent;border:1px solid var(--rule);
    padding:8px 14px;cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .sw-back-btn:hover{color:var(--ink);border-color:var(--ink)}
  .sw-undo-finish-btn{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
    background:transparent;border:1px solid var(--rule);
    padding:8px 14px;cursor:pointer;border-radius:2px;
    transition:color .15s,border-color .15s;
  }
  .sw-undo-finish-btn:hover{color:var(--ink);border-color:var(--ink)}

  /* --- Resume banner (when a session is mid-flight on page load) --- */
  .sw-resume{
    margin-bottom:14px;padding:14px 18px;
    border:1px solid var(--gold);background:rgba(var(--accent-rgb),.08);
    border-radius:4px;display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  }
  .sw-resume-text{
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--ink);
    flex:1;min-width:200px;
  }
  .sw-resume-text b{color:var(--gold);font-weight:500}
  .sw-resume-actions{display:flex;gap:8px}
  .sw-resume-actions button{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;
    padding:8px 14px;border:1px solid var(--gold);background:transparent;
    color:var(--gold);cursor:pointer;border-radius:2px;
    transition:background .15s,color .15s;
  }
  .sw-resume-actions button:hover{background:var(--gold);color:var(--on-accent)}
  .sw-resume-actions .sw-resume-discard{
    border-color:var(--rule);color:var(--muted);
  }
  .sw-resume-actions .sw-resume-discard:hover{
    background:transparent;color:#d68a6a;border-color:#d68a6a;
  }

  /* --- Results screen --- */
  .sw-results{
    border:1px solid var(--rule);background:var(--paper-2);
    padding:18px 22px;border-radius:4px;
  }
  .sw-results-head{
    display:flex;align-items:baseline;justify-content:space-between;
    gap:12px;margin-bottom:6px;flex-wrap:wrap;
  }
  .sw-results-title{
    font-family:'Oswald',sans-serif;font-weight:600;font-size:22px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink);
  }
  .sw-results-meta{
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
    margin-bottom:18px;line-height:1.5;
  }
  .sw-results-meta b{color:var(--ink);font-weight:500}
  .sw-results-zone{
    display:inline-block;margin-bottom:14px;
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;
    color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);
    padding:3px 10px;border-radius:3px;border:1px solid color-mix(in srgb,var(--accent) 30%,transparent);
  }
  /* Horizontal scroll on narrow viewports — coaches reviewing on a phone
     should still see all split columns without us collapsing to a card stack
     that breaks vertical "compare athletes at the same distance" reads. */
  .sw-results-table-wrap{margin:0 -22px;overflow-x:auto;padding:0 22px}
  .sw-results-table{
    width:100%;border-collapse:collapse;min-width:560px;
    font-family:'Barlow',sans-serif;
  }
  .sw-results-table thead th{
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
    text-align:left;padding:10px 12px;border-bottom:1px solid var(--rule);
    font-weight:400;white-space:nowrap;
  }
  .sw-results-table thead th.num{text-align:right}
  .sw-results-table tbody tr{
    border-bottom:1px solid var(--rule);
  }
  .sw-results-table tbody tr:last-child{border-bottom:none}
  .sw-results-table tbody td{
    padding:14px 12px;vertical-align:top;
    font-family:'Barlow',sans-serif;color:var(--ink);
  }
  .sw-results-name{font-weight:600;font-size:14px}
  .sw-results-cell{
    font-family:'JetBrains Mono',monospace;
    text-align:right;white-space:nowrap;
  }
  .sw-results-cum{
    font-size:14px;font-weight:600;color:var(--ink);letter-spacing:.02em;
  }
  .sw-results-lap{
    display:block;font-size:11px;color:var(--muted);margin-top:3px;
  }
  .sw-results-finish-cum{color:var(--gold)}
  .sw-results-best-badge{
    display:inline-block;margin-left:6px;
    font-family:'JetBrains Mono',monospace;font-size:9px;
    letter-spacing:.12em;text-transform:uppercase;color:var(--on-accent);
    background:var(--gold);padding:2px 6px;border-radius:2px;
    vertical-align:middle;
  }
  .sw-results-dnf{color:#d68a6a;font-weight:500;font-size:13px}
  .sw-results-empty-cell{color:var(--muted);font-size:13px}
  .sw-results-pace{font-size:13px;color:var(--ink);font-weight:500}
  .sw-results-actions{
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    margin-top:18px;padding-top:14px;border-top:1px solid var(--rule);
  }
  .sw-results-summary{
    flex:1;min-width:140px;
    font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
  }
  .sw-results-summary b{color:var(--gold);font-weight:500}

  /* ---------- Back link in dashboard ---------- */
  .back-link{
    font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.16em;
    text-transform:uppercase;color:var(--muted);
    cursor:pointer;background:none;border:none;
    /* Bigger mouse target without moving the text: padding grows the hit area,
       the equal negative margin keeps the visual position/alignment unchanged. */
    padding:8px 10px;margin:-8px -10px;transition:color .15s;
  }
  .back-link .back-arrow{color:var(--gold);font-size:14px;margin-right:2px}
  .back-link:hover{color:var(--gold);text-decoration:underline}

  /* ---------- Masthead ---------- */
  header.masthead{padding:48px 0 28px;border-bottom:3px solid var(--gold)}
  .kicker{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.32em;
    text-transform:uppercase;color:var(--muted);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;
    position:relative;z-index:1}
  .kicker-right{display:flex;flex-direction:column;align-items:flex-end;gap:4px}
  h1{font-family:'Oswald',sans-serif;font-weight:700;font-size:clamp(44px,8vw,96px);
    line-height:.92;letter-spacing:.01em;margin:14px 0 6px;text-transform:uppercase}
  h1 em{font-style:normal;color:var(--gold)}
  /* Symmetric breathing room around the bio in the masthead — name -> bio
     matches bio -> chips. .bio-row's margin-top is 24px (18px on mobile),
     mirrored here on the h1's bottom margin so the bio paragraph sits in the
     middle of equal gaps. Scoped to .masthead so the splash <h1> isn't
     affected. */
  header.masthead h1{margin-bottom:24px}
  .subtitle{font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
    font-size:clamp(17px,2.4vw,22px);color:var(--muted);max-width:64ch;line-height:1.45}
  .bio-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:24px}
  .chip{font-family:'JetBrains Mono',monospace;font-size:12px;padding:7px 13px;border:1px solid var(--rule);
    border-radius:100px;display:inline-flex;align-items:center;gap:8px;background:var(--paper-2);color:var(--ink)}
  .chip .dot{width:8px;height:8px;border-radius:50%;background:var(--gold)}
  .chip.ma .dot{border-radius:0;clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%)}

  /* ---------- Stat band ---------- */
  .stats{display:grid;grid-template-columns:repeat(3,1fr);
    gap:1px;background:var(--rule);border:1px solid var(--rule);margin:36px 0 14px}
  @media(min-width:1000px){.stats{grid-template-columns:repeat(6,1fr)}}
  .stat{background:var(--paper-2);padding:20px 22px}
  .stat .num{font-family:'Oswald',sans-serif;font-size:42px;font-weight:600;line-height:1;letter-spacing:-.02em;color:var(--ink)}
  .stat .lbl{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.18em;
    text-transform:uppercase;color:var(--muted);margin-top:8px}
  .stat.split{display:flex;align-items:flex-start;gap:24px}
  .stat.split .half{flex:1;min-width:0}
  .stat.split .num{font-size:32px}

  /* ---------- Empty state (athlete with no plottable marks) ---------- */
  .empty-state{background:var(--paper-2);border:1px solid var(--rule);border-radius:4px;
    padding:32px 28px;margin:32px 0;text-align:center}
  .empty-state .empty-title{font-family:'Oswald',sans-serif;font-size:22px;font-weight:600;
    margin:0 0 10px;color:var(--ink);letter-spacing:-.01em}
  .empty-state .empty-sub{font-family:'Barlow',sans-serif;font-size:14px;color:var(--muted);
    margin:0;max-width:560px;margin-left:auto;margin-right:auto;line-height:1.5}

  /* ---------- Controls ---------- */
  .controls{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin:40px 0 26px;
    padding:18px 20px;background:var(--paper-2);border:1px solid var(--rule);border-radius:4px}
  .controls .label{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.18em;
    text-transform:uppercase;color:var(--muted)}
  select{font-family:'Barlow',sans-serif;font-size:15px;font-weight:600;
    padding:9px 14px;border:1px solid var(--rule);background:var(--paper);color:var(--ink);
    cursor:pointer;border-radius:2px}
  .toggle{display:inline-flex;border:1px solid var(--rule);border-radius:2px;overflow:hidden}
  .toggle button{font-family:'JetBrains Mono',monospace;font-size:12px;padding:8px 12px;border:none;
    background:var(--paper);cursor:pointer;color:var(--ink)}
  .toggle button.on{background:var(--gold);color:var(--on-accent)}
  .toggle.disabled{opacity:.4;pointer-events:none}
  /* Desktop: enough room for long labels like
     "21st Annual Tommie Smith Youth Track Meet · May 23, 2026" (~520px).
     Mobile naturally caps shorter via the row width, so no separate rule needed. */
  .meet-select{flex:1;min-width:0;max-width:520px;text-overflow:ellipsis}
  /* Force-wrap inside the controls bar: Event+Meet on row 1, Window+Export on row 2. */
  .controls .flex-break{flex-basis:100%;height:0;margin:0;padding:0}
  .src-note{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted)}
  .src-note b{color:var(--gold)}
  .export-btn{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
    background:none;border:1px solid var(--rule);border-radius:2px;
    padding:6px 12px;cursor:pointer;transition:color .15s,border-color .15s;white-space:nowrap}
  .export-btn:hover{color:var(--gold);border-color:var(--gold)}

  /* ---------- Feature chart ---------- */
  .feature{border:1px solid var(--rule);background:var(--paper-2);
    padding:26px 26px 20px;margin-bottom:40px;border-radius:4px}
  .feature .head{display:flex;justify-content:space-between;align-items:baseline;
    flex-wrap:wrap;gap:10px;margin-bottom:6px}
  .feature h2{font-family:'Oswald',sans-serif;font-weight:600;font-size:30px;letter-spacing:.01em;text-transform:uppercase;color:var(--ink)}
  .feature .head .meta{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted)}
  .pb-line{font-family:'JetBrains Mono',monospace;font-size:13px;margin-bottom:18px;color:var(--ink)}
  .pb-line .pb{color:var(--gold);font-weight:500}
  .chart-box{position:relative;height:360px}
  .team-key{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted);
    margin-top:12px;display:flex;flex-wrap:wrap;gap:18px;letter-spacing:.08em}
  .team-key svg{display:inline-block;vertical-align:middle;margin-right:6px}
  .feat-mode-toggle{display:inline-flex;background:#0e0e0e;border:1px solid var(--rule,rgba(255,255,255,.08));border-radius:9px;padding:3px;margin-left:auto}
  .feat-mode-toggle button{appearance:none;border:0;background:transparent;color:var(--muted);font:600 12px/1 inherit;padding:6px 12px;border-radius:7px;cursor:pointer}
  .feat-mode-toggle button.on{background:var(--accent);color:var(--on-accent,#1a1400)}
  .overlay-span-label{margin-left:10px;color:var(--muted);font-size:12px}
  .overlay-legend{display:flex;flex-wrap:wrap;gap:18px;margin-top:14px}
  .overlay-legend[hidden]{display:none}
  .overlay-legend h4{font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:0 0 8px}
  .ol-chips{display:flex;flex-wrap:wrap;gap:8px}
  .ol-chip{display:inline-flex;align-items:center;gap:8px;background:#0e0e0e;border:1px solid var(--rule,rgba(255,255,255,.08));border-radius:999px;padding:5px 11px 5px 9px;font-size:13px}
  .ol-dot{width:9px;height:9px;border-radius:50%;flex:none}
  .ol-ev{font-weight:600}
  .ol-delta{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
  .ol-delta.up{color:#7bd88f}

  /* ---------- Small multiples ---------- */
  .section-title{font-family:'Oswald',sans-serif;font-weight:600;font-size:22px;letter-spacing:.18em;text-transform:uppercase;
    margin:32px 0 20px;display:flex;align-items:center;gap:14px;color:var(--ink)}
  .section-title::after{content:"";flex:1;height:2px;background:var(--gold)}
  .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:22px}
  .card{border:1px solid var(--rule);background:var(--paper-2);padding:18px 18px 14px;border-radius:4px;
    transition:transform .18s ease, border-color .18s ease;cursor:pointer}
  .card:hover{transform:translate(-2px,-2px);border-color:var(--gold)}
  .card .ctop{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:3px}
  .card h3{font-family:'Oswald',sans-serif;font-weight:600;font-size:19px;text-transform:uppercase;letter-spacing:.02em;color:var(--ink)}
  .card .tag{font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:500;letter-spacing:.1em;
    text-transform:uppercase;padding:3px 7px;border-radius:3px;color:var(--on-accent)}
  /* foreground (--on-accent) is set on the base .card .tag rule above; new .tag.X types only set background */
  .tag.T{background:var(--track)} .tag.F{background:var(--field)}
  .card .best{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);margin-bottom:10px}
  .card .best b{color:var(--ink);font-size:15px}
  .mini-box{position:relative;height:120px}
  /* For events with only non-measurable attempts (DNS/FOUL/NM) — replaces the
     empty mini chart with a compact list of dated attempts. */
  .scratch-list{list-style:none;padding:0;margin:0;height:120px;overflow-y:auto;
    display:flex;flex-direction:column;gap:6px}
  .scratch-list li{display:flex;justify-content:space-between;align-items:baseline;
    font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted);
    padding:6px 8px;background:var(--paper);border:1px solid var(--rule);border-radius:3px}
  .scratch-list .sl-mark{color:var(--ink);font-weight:600;letter-spacing:.04em}
  /* Click feedback for cards that have no measurable marks: a brief darken
     pulse instead of navigating to an empty feature chart. brightness()
     works regardless of the card's actual background colors. */
  @keyframes card-nope-pulse {
    0%, 100% { filter: brightness(1); }
    45%      { filter: brightness(0.6); }
  }
  .card.card-nope { animation: card-nope-pulse 480ms ease-out; }

  /* Smooth open/close for the main collapsible cards (Record Book, Award
     Shelf, On The Road). Native <details> snap, which on mobile feels like
     the page jumps. JS uses the Web Animations API to tween the body's
     height; CSS sets up the surrounding perf hints.

     Mobile Safari is jank-prone on layout animations of dense content
     (each Record Book body has ~8 mini-chart canvases). Three hints help:
       • `contain: layout style paint` keeps reflows/repaints inside the
         body — the rest of the page doesn't get touched on every frame.
       • `will-change: height` is added by JS only while animating so the
         compositor can promote the body to its own layer just for those
         200ms (no permanent layer-promotion cost).
       • The chevron uses its own .is-rotated class so its transform spins
         in parallel with the height tween rather than waiting for it. */
  .record-book > .rb-body,
  .awards-card > .aw-body,
  .travel-map > .tm-body {
    overflow: hidden;
    contain: layout style paint;
  }
  /* Chevron rotation decoupled from [open] so it can start spinning the
     instant the user taps, before the height animation finishes. */
  .record-book .rb-chev,
  .awards-card .aw-chev,
  .travel-map .tm-chev {
    transform: rotate(0deg);
    transition: transform 200ms cubic-bezier(.4, 0, .2, 1);
    will-change: transform;
  }
  .record-book.is-rotated .rb-chev,
  .awards-card.is-rotated .aw-chev,
  .travel-map.is-rotated .tm-chev {
    transform: rotate(180deg);
  }

  footer{margin-top:60px;padding-top:22px;border-top:1.5px solid var(--rule);
    font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted);
    display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px}

  /* ---------- Meet summary (shown in place of feature chart when a meet is selected) ---------- */
  .meet-summary{border:1px solid var(--rule);background:var(--paper-2);
    padding:26px 26px 22px;margin-bottom:40px;border-radius:4px}
  .ms-head{display:flex;align-items:baseline;justify-content:space-between;
    gap:14px;flex-wrap:wrap}
  .ms-title{font-family:'Oswald',sans-serif;font-weight:600;font-size:28px;
    letter-spacing:.01em;text-transform:uppercase;color:var(--ink);line-height:1.1}
  .ms-context{font-family:'JetBrains Mono',monospace;font-size:13px;
    color:var(--muted);margin-top:8px;line-height:1.5}
  .ms-context b{color:var(--ink);font-weight:500}
  .ms-weather{font-family:'JetBrains Mono',monospace;font-size:12px;
    color:var(--muted);margin-top:4px}
  .ms-table-wrap{margin-top:18px;overflow-x:auto}
  .ms-table{width:100%;border-collapse:collapse;min-width:0}
  .ms-table thead th{font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
    text-align:left;padding:10px 12px;border-bottom:1px solid var(--rule);font-weight:400}
  .ms-table thead th.num{text-align:right}
  .ms-table tbody tr{cursor:pointer;border-bottom:1px solid var(--rule);
    transition:background .15s}
  .ms-table tbody tr:last-child{border-bottom:none}
  .ms-table tbody tr:hover{background:rgba(var(--accent-rgb),.05)}
  .ms-table td{padding:14px 12px;font-family:'Barlow',sans-serif;
    font-size:14px;color:var(--ink);vertical-align:middle}
  .ms-event{font-weight:600}
  .ms-mark, .ms-prev{font-family:'JetBrains Mono',monospace;font-weight:500}
  .ms-prev{color:var(--muted)}
  .ms-diff{font-family:'JetBrains Mono',monospace;font-size:13px;white-space:nowrap}
  .ms-diff.improved{color:var(--gold)}
  .ms-diff.regressed{color:#d68a6a}
  .ms-diff.neutral{color:var(--muted)}
  .ms-place{font-family:'JetBrains Mono',monospace;text-align:right;color:var(--muted)}
  .ms-pb-badge{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:9px;
    letter-spacing:.12em;text-transform:uppercase;color:var(--on-accent);
    background:var(--gold);padding:2px 6px;border-radius:2px;margin-left:6px;vertical-align:middle}
  .ms-first-badge{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:9px;
    letter-spacing:.12em;text-transform:uppercase;color:var(--muted);
    border:1px solid var(--rule);padding:1px 6px;border-radius:2px;vertical-align:middle}

  .controls .event-control,
  .controls .window-control{display:inline-flex;align-items:center;gap:14px}
  /* When a meet filter is active, hide controls that no longer apply. */
  .controls.meet-mode .event-control,
  .controls.meet-mode .window-control{display:none}
  .meet-back{display:none}
  .controls.meet-mode .meet-back{display:inline-flex;align-items:center}

  /* ---------- The Record Book (collapsible container, open by default) ---------- */
  .record-book{border:1px solid var(--rule);background:var(--paper-2);
    border-radius:4px;margin:36px 0 14px}
  .record-book summary{list-style:none;cursor:pointer;padding:20px 26px;
    display:flex;align-items:center;justify-content:space-between;gap:14px;
    border-bottom:1px solid transparent}
  .record-book summary::-webkit-details-marker{display:none}
  .record-book[open] summary{border-bottom-color:var(--rule)}
  .rb-title{font-family:'Oswald',sans-serif;font-weight:600;font-size:24px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink)}
  .rb-chev{color:var(--gold);font-size:14px;display:inline-block;
    font-family:'JetBrains Mono',monospace}
  /* Rotation rule moved into the shared smooth-toggle CSS block above
     (.record-book.is-rotated .rb-chev). Tied to a JS-managed class so it
     can rotate in lockstep with the height tween rather than waiting on
     details.open to flip at the end of a close animation. */
  .rb-body{padding:22px 26px}
  .rb-body > .controls{margin-top:0}
  .rb-body > #cardGridSection > .section-title{margin-top:8px}

  /* ---------- Awards card ---------- */
  .awards-card{border:1px solid var(--rule);background:var(--paper-2);
    border-radius:4px;margin:36px 0 14px}
  .awards-card summary{list-style:none;cursor:pointer;padding:20px 26px;
    display:flex;align-items:center;justify-content:space-between;gap:14px;
    border-bottom:1px solid transparent}
  .awards-card summary::-webkit-details-marker{display:none}
  .awards-card[open] summary{border-bottom-color:var(--rule)}
  .aw-title{font-family:'Oswald',sans-serif;font-weight:600;font-size:24px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink)}
  .aw-meta{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
    display:flex;align-items:center;gap:28px;flex-wrap:wrap;justify-content:flex-end}
  .aw-meta .ct-gold{color:var(--gold);font-weight:500}
  .aw-meta .ct-silver{color:#C0C0C0;font-weight:500}
  .aw-meta .ct-bronze{color:#CD7F32;font-weight:500}
  .aw-chev{color:var(--gold);font-size:14px;display:inline-block}
  /* Rotation in the .is-rotated rule near the smooth-toggle CSS block. */
  .aw-body{padding:18px 26px 22px}
  .aw-stats{display:grid;grid-template-columns:repeat(4,1fr);
    gap:1px;background:var(--rule);border:1px solid var(--rule);margin-bottom:18px}
  .aw-stats .aw-stat{background:var(--paper-2);padding:16px 18px;min-width:0;
    cursor:pointer;transition:background .15s,box-shadow .15s}
  .aw-stats .aw-stat:hover{background:var(--paper-2)}
  .aw-stats .aw-stat.active{box-shadow:inset 0 0 0 2px var(--gold)}
  .aw-filter-bar{display:none;align-items:center;justify-content:space-between;
    gap:12px;padding:10px 14px;margin-bottom:12px;border:1px solid var(--gold);
    border-radius:2px;background:rgba(var(--accent-rgb),.06);
    font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--ink)}
  .aw-filter-bar.on{display:flex}
  .aw-filter-bar .aw-clear{cursor:pointer;color:var(--gold);background:none;
    border:none;padding:0;font-family:inherit;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase}
  .aw-filter-bar .aw-clear:hover{text-decoration:underline}
  .aw-stats .aw-stat .num{font-family:'Oswald',sans-serif;font-size:34px;font-weight:600;
    line-height:1;letter-spacing:-.01em}
  .aw-stats .aw-stat.gold .num{color:var(--gold)}
  .aw-stats .aw-stat.silver .num{color:#C0C0C0}
  .aw-stats .aw-stat.bronze .num{color:#CD7F32}
  .aw-stats .aw-stat.top10 .num{color:var(--ink)}
  .aw-stats .aw-stat .lbl{font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);margin-top:6px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .aw-list{border:1px solid var(--rule);border-radius:2px;overflow:hidden}
  .aw-list-row{display:grid;grid-template-columns:1fr auto auto;gap:14px;align-items:center;
    padding:12px 14px;border-bottom:1px solid var(--rule)}
  .aw-list-row:last-child{border-bottom:none}
  .aw-list-row:hover{background:rgba(var(--accent-rgb),.04)}
  .aw-list-name{font-family:'Barlow',sans-serif;font-size:13px;color:var(--ink);
    line-height:1.3;min-width:0}
  .aw-list-name b{display:block;font-weight:600;margin-bottom:2px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .aw-list-name .aw-list-meet{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--muted);
    display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .aw-list-mark{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:500;
    color:var(--muted);white-space:nowrap}
  .aw-list-place{font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.12em;text-transform:uppercase;font-weight:500;
    padding:4px 9px;border-radius:2px;white-space:nowrap;min-width:54px;text-align:center}
  .aw-list-place.gold{background:var(--gold);color:var(--on-accent)}
  .aw-list-place.silver{background:#C0C0C0;color:var(--paper)}
  .aw-list-place.bronze{background:#CD7F32;color:var(--paper)}
  .aw-list-place.top10{background:transparent;color:var(--muted);border:1px solid var(--rule)}
  .aw-empty{padding:24px;text-align:center;color:var(--muted);
    font-family:'JetBrains Mono',monospace;font-size:12px}
  .aw-pager{display:flex;align-items:center;justify-content:space-between;
    gap:10px;margin-top:12px}
  .aw-pager-btn{font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
    background:none;border:1px solid var(--rule);border-radius:2px;
    padding:7px 14px;cursor:pointer;transition:color .15s,border-color .15s;white-space:nowrap}
  .aw-pager-btn:not(:disabled):hover{color:var(--gold);border-color:var(--gold)}
  .aw-pager-btn:disabled{opacity:.3;cursor:default}
  .aw-pager-btn.highlight{color:var(--gold);border-color:var(--gold);font-weight:600}
  .aw-pager-info{font-family:'JetBrains Mono',monospace;font-size:11px;
    color:var(--muted);text-align:center;flex:1;line-height:1.8}
  .aw-pager-dots{display:flex;gap:6px;justify-content:center;margin-top:4px}
  .aw-pager-dot{width:7px;height:7px;border-radius:50%;background:var(--rule);
    transition:background .2s}
  .aw-pager-dot.on{background:var(--gold)}

  /* ---------- Travel map ---------- */
  .travel-map{border:1px solid var(--rule);background:var(--paper-2);border-radius:4px;margin:36px 0 14px}
  .travel-map summary{list-style:none;cursor:pointer;padding:20px 26px;
    display:flex;align-items:center;justify-content:space-between;gap:14px;border-bottom:1px solid transparent}
  .travel-map summary::-webkit-details-marker{display:none}
  .travel-map[open] summary{border-bottom-color:var(--rule)}
  .tm-title{font-family:'Oswald',sans-serif;font-weight:600;font-size:24px;
    letter-spacing:.02em;text-transform:uppercase;color:var(--ink)}
  .tm-meta{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);
    display:flex;align-items:center;gap:28px}
  .tm-meta b{color:var(--gold);font-weight:500}
  .tm-chev{color:var(--gold);font-size:14px;display:inline-block}
  /* Rotation in the .is-rotated rule near the smooth-toggle CSS block. */
  .tm-body{padding:18px 26px 22px}
  .tm-stats{display:grid;grid-template-columns:repeat(4,1fr);
    gap:1px;background:var(--rule);border:1px solid var(--rule);margin-bottom:18px}
  .tm-stats .tm-stat{background:var(--paper-2);padding:16px 18px;min-width:0}
  .tm-stats .tm-stat .num{font-family:'Oswald',sans-serif;font-size:30px;font-weight:600;
    line-height:1;letter-spacing:-.01em;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .tm-stats .tm-stat .lbl{font-family:'JetBrains Mono',monospace;font-size:10px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted);margin-top:6px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .tm-controls{display:flex;align-items:center;gap:14px;margin-bottom:14px;flex-wrap:wrap}
  .tm-controls .label{font-family:'JetBrains Mono',monospace;font-size:11px;
    letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
  .tm-grid{display:grid;grid-template-columns:1fr 320px;gap:18px}
  .tm-map-wrap{position:relative;height:380px;border:1px solid var(--rule);
    border-radius:2px;overflow:hidden;background:var(--paper)}
  .tm-map{width:100%;height:100%}
  .tm-side{border:1px solid var(--rule);border-radius:2px;background:var(--paper);
    max-height:380px;overflow-y:auto}
  .tm-meet-row{padding:12px 14px;border-bottom:1px solid var(--rule);cursor:pointer;
    transition:background .15s}
  .tm-meet-row:last-child{border-bottom:none}
  .tm-meet-row:hover{background:var(--paper-2)}
  .tm-meet-row.furthest{background:rgba(var(--accent-rgb),.06)}
  .tm-meet-row.no-coords{cursor:default;opacity:.7}
  .tm-meet-name{font-family:'Barlow',sans-serif;font-weight:600;font-size:13px;
    color:var(--ink);margin-bottom:4px;line-height:1.3;display:flex;
    align-items:center;gap:6px;flex-wrap:wrap}
  .tm-meet-meta{font-family:'JetBrains Mono',monospace;font-size:10px;
    color:var(--muted);display:flex;justify-content:space-between;gap:8px}
  .tm-meet-dist{color:var(--gold);font-weight:500;white-space:nowrap}
  .tm-no-coords{font-family:'JetBrains Mono',monospace;font-size:9px;
    letter-spacing:.1em;text-transform:uppercase;color:var(--muted);
    border:1px solid var(--rule);padding:1px 6px;border-radius:2px;white-space:nowrap}
  .tm-furthest-badge{font-family:'JetBrains Mono',monospace;font-size:9px;
    letter-spacing:.12em;text-transform:uppercase;color:var(--on-accent);
    background:var(--gold);padding:2px 6px;border-radius:2px}
  .tm-empty{padding:24px;text-align:center;color:var(--muted);
    font-family:'JetBrains Mono',monospace;font-size:12px}
  /* Leaflet dark popup overrides */
  .leaflet-popup-content-wrapper{background:var(--paper-2);color:var(--ink);
    border:1px solid var(--gold);border-radius:2px;box-shadow:0 4px 12px rgba(0,0,0,.5)}
  .leaflet-popup-tip{background:var(--paper-2);border:1px solid var(--gold)}
  .leaflet-popup-content{font-family:'Barlow',sans-serif;font-size:13px;margin:10px 12px;line-height:1.4}
  .leaflet-popup-content b{font-family:'Oswald',sans-serif;font-weight:600;
    text-transform:uppercase;letter-spacing:.02em;display:block;margin-bottom:4px;font-size:14px}
  .leaflet-popup-content .pop-meta{font-family:'JetBrains Mono',monospace;
    font-size:11px;color:var(--muted);margin-top:4px}
  .leaflet-container{background:var(--paper)}
  .leaflet-control-attribution{background:rgba(var(--paper-rgb),.7)!important;
    color:var(--muted)!important;font-size:10px!important}
  .leaflet-control-attribution a{color:var(--muted)!important}
  .leaflet-bar a{background:var(--paper-2)!important;color:var(--ink)!important;
    border-color:var(--rule)!important}
  .leaflet-bar a:hover{background:var(--gold)!important;color:var(--on-accent)!important}

  /* ---------- Mobile ---------- */
  @media(max-width:640px){
    #splash{padding:32px 20px}
    /* Phones: narrow the active card so its neighbours genuinely peek at the
       edges — peek per side ≈ (100vw − card-w)/2, so 62vw leaves ~19vw a side.
       Title shrinks to fit the narrower card; the sub is line-clamped so it
       can't overflow the fixed-height card. Arrows hide — swipe is primary. */
    .splash-peek{--card-w:min(62vw,300px)}
    .splash-peek-viewport{height:360px}
    .splash-card{height:360px;padding:24px 18px}
    .splash-card .splash-title{font-size:clamp(28px,7.5vw,38px)}
    .splash-card .splash-sub{
      font-size:13.5px;
      display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;
    }
    .splash-arrow{display:none}  /* swipe is the primary interaction on mobile */
    .wrap{padding:0 16px 48px;padding-left:max(16px,env(safe-area-inset-left));
      padding-right:max(16px,env(safe-area-inset-right))}
    header.masthead{padding:28px 0 20px}
    .kicker{font-size:11px;letter-spacing:.24em}
    .bio-row{margin-top:18px;gap:8px}
    .chip{font-size:11px;padding:6px 11px}
    .stats{grid-template-columns:repeat(2,1fr);margin:24px 0 10px}
    .stat{padding:16px 14px}
    .stat .num{font-size:30px}
    .stat .lbl{font-size:10px;margin-top:6px}
    .stat.split{gap:14px}
    .stat.split .num{font-size:24px}
    .controls{margin:28px 0 20px;padding:14px;gap:10px}
    .controls .label{width:100%}
    select{flex:1;min-width:0}
    .refresh{padding:7px 10px;font-size:10px}
    .feature{padding:18px 16px;margin-bottom:30px}
    .feature h2{font-size:24px}
    .pb-line{font-size:12px;margin-bottom:14px;line-height:1.6}
    .chart-box{height:260px}
    .section-title{font-size:18px;margin:24px 0 16px;letter-spacing:.14em}
    .grid{grid-template-columns:minmax(0,1fr);gap:14px}
    .card{padding:14px 14px 12px;min-width:0}
    .card:hover{transform:none;border-color:var(--rule)}
    .card h3{font-size:17px}
    .mini-box{height:96px;min-width:0}
    footer{margin-top:40px;font-size:10px}
    /* On mobile, let label + select behave as direct flex children of
       .controls so the existing 'label on its own row, select fills width'
       layout works. display:contents makes the wrapper transparent to
       layout without removing the element. */
    .controls .event-control,
    .controls .window-control{display:contents}
    .record-book{margin:24px 0 10px}
    .record-book summary{padding:16px 14px;gap:10px}
    .rb-title{font-size:18px}
    .rb-body{padding:14px}
    .awards-card{margin:24px 0 10px}
    .awards-card summary{padding:16px 14px;gap:10px}
    .aw-title{font-size:18px}
    .aw-meta{font-size:11px;gap:6px}
    .aw-top10-meta{display:none}
    .aw-body{padding:14px}
    .aw-stats{grid-template-columns:repeat(2,1fr);margin-bottom:14px}
    .aw-stats .aw-stat{padding:12px 12px}
    .aw-stats .aw-stat .num{font-size:26px}
    .aw-list-row{padding:10px 12px;gap:10px}
    .aw-list-name{font-size:12px}
    .meet-summary{padding:18px 16px;margin-bottom:30px}
    .ms-title{font-size:20px}
    .ms-context, .ms-weather{font-size:11px}
    .ms-table thead th{font-size:10px;letter-spacing:.14em;padding:8px 6px}
    .ms-table td{padding:10px 6px;font-size:13px}
    .ms-mark, .ms-diff{font-size:12px}
    .ms-table .ms-imperial{display:none}
    .travel-map{margin:24px 0 10px}
    .travel-map summary{padding:16px 14px;gap:10px}
    .tm-title{font-size:18px}
    .tm-meta{font-size:11px;gap:8px}
    .tm-body{padding:14px}
    .tm-stats{grid-template-columns:repeat(2,1fr);margin-bottom:14px}
    .tm-stats .tm-stat{padding:12px 12px}
    .tm-stats .tm-stat .num{font-size:22px}
    .tm-grid{grid-template-columns:1fr;gap:12px}
    .tm-map-wrap{height:260px}
    .tm-side{max-height:240px}
  }

/* Coach's Corner — in-tab athlete picker + Clipboard mode toggle (Phase 3) */
.corner-athlete-bar{
  display:flex;align-items:center;gap:10px;margin-bottom:14px;
}
.corner-athlete-bar-label{
  font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--muted);
}
.corner-athlete-bar .corner-athlete-picker{flex:1;min-width:0}
.corner-clip-modes{
  display:inline-flex;margin-bottom:16px;border:1px solid var(--rule);
  border-radius:2px;overflow:hidden;
}
.corner-clip-mode{
  font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600;
  letter-spacing:.1em;text-transform:uppercase;
  padding:8px 18px;border:0;background:var(--paper);color:var(--muted);cursor:pointer;
  transition:background .15s,color .15s;
}
.corner-clip-mode + .corner-clip-mode{border-left:1px solid var(--rule)}
.corner-clip-mode.on{background:var(--gold);color:var(--on-accent)}

/* ============================================================
   The Winner's Circle — athlete/parent-facing rankings
   Award cards with podiums + the season Hall of Fame. Reuses the
   masthead chrome and design tokens; podium rows echo the Corner's
   .tm-row leaderboards.
   ============================================================ */
.rk-controls{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  margin:28px 0 24px;
}
.rk-period-toggle{flex:0 0 auto}
.rk-yearnav{
  display:inline-flex;align-items:center;gap:4px;
  border:1px solid var(--rule);border-radius:2px;overflow:hidden;
}
.rk-yearnav button{
  font-family:'JetBrains Mono',monospace;font-size:15px;line-height:1;
  padding:6px 12px;border:none;background:var(--paper);color:var(--ink);cursor:pointer;
}
.rk-yearnav button:hover{color:var(--gold)}
.rk-year-label{
  font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--ink);
  min-width:3.4em;text-align:center;padding:0 2px;
}
.rk-hof-btn{
  margin-left:auto;
  font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.06em;
  text-transform:uppercase;padding:8px 16px;border:1px solid var(--rule);
  background:var(--paper);color:var(--ink);cursor:pointer;border-radius:2px;
}
.rk-hof-btn:hover{border-color:var(--gold);color:var(--gold)}
.rk-hof-btn.on{background:var(--gold);color:var(--on-accent);border-color:var(--gold)}

.rk-period-head{
  display:flex;align-items:center;gap:12px;margin-bottom:18px;
  font-family:'Oswald',sans-serif;font-weight:600;font-size:24px;
  letter-spacing:.04em;text-transform:uppercase;color:var(--ink);
}
.rk-badge{
  font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;padding:3px 9px;border-radius:2px;font-weight:500;
}
.rk-badge.rk-live{background:var(--gold);color:var(--on-accent)}
.rk-badge.rk-final{border:1px solid var(--rule);color:var(--muted)}
.rk-badge.rk-soon{border:1px solid var(--rule);color:var(--muted)}

.rk-cards{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;
}
.rk-card{
  border:1px solid var(--rule);background:var(--paper-2);
  padding:18px 22px;border-radius:4px;
}
.rk-card-head{display:flex;align-items:center;gap:14px;margin-bottom:14px}
.rk-emoji{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}
.rk-ico{width:30px;height:30px;color:var(--gold);display:block}
.rk-card-titles{min-width:0}
.rk-card-title{
  font-family:'Oswald',sans-serif;font-weight:600;font-size:20px;
  letter-spacing:.02em;text-transform:uppercase;color:var(--ink);
}
.rk-card-sub{
  font-family:'Barlow',sans-serif;font-style:italic;font-weight:300;
  font-size:13px;color:var(--muted);
}
.rk-rank{display:flex;flex-direction:column}
.rk-row{
  display:grid;grid-template-columns:1.6em 1fr auto;align-items:baseline;
  gap:10px;padding:7px 0;border-bottom:1px solid var(--rule);
  font-family:'JetBrains Mono',monospace;font-size:13px;
}
.rk-rank .rk-row:last-child{border-bottom:none}
/* Clickable athlete rows → Progress Almanac. */
.rk-row.rk-clickable{cursor:pointer;border-radius:2px;transition:background .12s}
.rk-row.rk-clickable:hover,.rk-row.rk-clickable:focus-visible{background:rgba(var(--accent-rgb),.08);outline:none}
.rk-row.rk-clickable:hover .rk-name,.rk-row.rk-clickable:focus-visible .rk-name{color:var(--gold)}
.rk-row.rk-clickable:focus-visible{box-shadow:inset 0 0 0 1px var(--gold)}
.rk-pos{color:var(--muted);text-align:right;font-weight:600}
.rk-row.rk-gold .rk-pos{color:var(--gold)}
.rk-row.rk-silver .rk-pos{color:#cdd2d6}
.rk-row.rk-bronze .rk-pos{color:#c08457}
.rk-name{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rk-row.rk-gold .rk-name{color:var(--ink);font-weight:500}
.rk-val{color:var(--gold);text-align:right;white-space:nowrap}
.rk-detail{
  grid-column:2 / -1;font-size:11px;color:var(--muted);margin-top:-2px;
}
.rk-note{
  margin-top:12px;font-family:'JetBrains Mono',monospace;font-size:11px;
  color:var(--muted);font-style:normal;
}
.rk-empty,.rk-loading{
  font-family:'Barlow',sans-serif;font-size:14px;color:var(--muted);
  padding:8px 0;
}
.rk-loading{text-align:center;padding:40px 0}

/* Hall of Fame: one card per frozen season, one line per award winner. */
.rk-hof-card .rk-hof-line{
  display:grid;grid-template-columns:1.6em auto 1fr;align-items:baseline;
  gap:10px;padding:7px 0;border-bottom:1px solid var(--rule);
  font-family:'JetBrains Mono',monospace;font-size:13px;
}
.rk-hof-card .rk-hof-line:last-child{border-bottom:none}
.rk-hof-card .rk-emoji .rk-ico{width:16px;height:16px}
.rk-hof-cat{color:var(--muted);text-transform:uppercase;font-size:11px;letter-spacing:.05em}
.rk-hof-who{color:var(--ink);text-align:right}

@media(max-width:600px){
  .rk-controls{gap:10px;margin:20px 0 18px}
  .rk-hof-btn{margin-left:0}
  .rk-cards{grid-template-columns:1fr;gap:14px}
  .rk-card{padding:14px 16px}
  .rk-card-title{font-size:18px}
  .rk-period-head{font-size:20px}
  .rk-hof-card .rk-hof-line{grid-template-columns:1.4em auto 1fr;gap:8px;font-size:12px}
}

/* ============================================================
   THE PRESS BOX — coach/parent Q&A chat
   ============================================================ */
.chat-section{margin-top:28px;max-width:680px}
.chat-log{
  display:flex;flex-direction:column;gap:12px;
  min-height:320px;max-height:60vh;overflow-y:auto;
  padding:18px;border:1px solid var(--rule);background:var(--paper-2);
  border-radius:4px;
}
.chat-bubble{
  max-width:85%;padding:10px 14px;border-radius:10px;
  font-size:15px;line-height:1.5;white-space:pre-wrap;word-wrap:break-word;
}
.chat-user{
  align-self:flex-end;background:var(--gold);color:var(--on-accent);
  border-bottom-right-radius:2px;
}
.chat-assistant{
  align-self:flex-start;background:var(--paper);color:var(--ink);
  border:1px solid var(--rule);border-bottom-left-radius:2px;
}
.chat-pending{color:var(--muted);font-style:italic}
.chat-error{align-self:flex-start;color:#e57373;border:1px solid #e57373;background:transparent}
.chat-tts-btn{
  display:inline-flex;align-items:center;justify-content:center;
  margin-left:8px;width:22px;height:22px;padding:0;
  border:1px solid var(--muted);border-radius:50%;
  background:transparent;color:var(--muted);
  font-size:11px;line-height:1;cursor:pointer;vertical-align:middle;
}
.chat-tts-btn:hover{color:var(--gold);border-color:var(--gold)}
.chat-tts-btn[data-state="loading"]{cursor:default;opacity:.7}
.chat-tts-btn[data-state="playing"]{color:var(--gold);border-color:var(--gold)}
.chat-input-row{display:flex;gap:10px;margin-top:14px;align-items:flex-end}
.chat-input{
  flex:1;resize:none;min-height:44px;max-height:140px;overflow-y:auto;
  padding:11px 14px;border:1px solid var(--rule);background:var(--paper-2);
  color:var(--ink);border-radius:4px;font:inherit;font-size:15px;line-height:1.4;
}
.chat-input:focus{outline:2px solid var(--gold);outline-offset:-1px}
.chat-input:disabled{opacity:.5}
.chat-send-btn{
  padding:11px 20px;border:1px solid var(--gold);background:var(--gold);
  color:var(--on-accent);cursor:pointer;border-radius:4px;font:inherit;
  font-size:13px;letter-spacing:.12em;text-transform:uppercase;
}
.chat-send-btn:hover{background:transparent;color:var(--gold)}
.chat-send-btn:disabled{opacity:.4;cursor:default}
.chat-disclaimer{margin-top:10px;font-size:12px;color:var(--muted)}
.chat-suggestions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
.chat-suggestion{
  padding:8px 14px;border:1px solid var(--gold);background:transparent;
  color:var(--ink);cursor:pointer;border-radius:999px;font:inherit;
  font-size:13px;line-height:1.3;text-align:left;
}
.chat-suggestion:hover{background:var(--gold);color:var(--on-accent)}
.chat-suggestion:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
@media(max-width:600px){
  /* Lay the Press Box out as a full-height column: heading pinned at the top,
     input pinned at the bottom, and only the message log scrolls. Previously the
     whole page scrolled, so focusing the input on load pushed the heading off the
     top (user couldn't tell it was a chat) and the input was unreachable from the
     top. svh tracks the visible viewport as mobile browser chrome shows/hides. */
  #chatPlaceholder{
    display:flex;flex-direction:column;
    min-height:100vh;min-height:100svh;
    padding-bottom:max(12px,env(safe-area-inset-bottom));
  }
  #chatPlaceholder .masthead{flex:0 0 auto}
  #chatSection{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;margin-top:14px}
  .chat-log{flex:1 1 auto;min-height:0;max-height:none;padding:12px}
  .chat-bubble{max-width:92%}
  .chat-input-row{margin-top:10px}
  .chat-suggestions{margin-top:10px}
  .chat-disclaimer{margin-top:6px}
}
/* ---------- The Schedule view ---------- */
/* Hero now sits BELOW the toolbar; tighter top gap, and no phantom gap when it's empty (search). */
.schedule-hero { margin-top: 16px; }
.schedule-hero:empty { margin: 0; }
.schedule-hero-card {
  border: 1px solid var(--rule);
  border-left: 4px solid var(--gold);
  border-radius: 12px;
  padding: 18px 20px;
  margin-bottom: 16px;
  background: rgba(var(--accent-rgb), .04);
}
.schedule-hero-kicker {
  text-transform: uppercase;
  letter-spacing: .08em;
  font-size: .72rem;
  color: var(--gold);
  display: block;
  margin-bottom: 6px;
}
/* The + add-to-calendar icon sits inline right after the title (same as the rows). */
.schedule-hero-title { margin: .2em 0 .4em; }
.schedule-hero-title .schedule-row-add { vertical-align: middle; }
.schedule-hero-when  { opacity: .85; }
.schedule-hero-where { opacity: .65; font-size: .92rem; margin-top: .2em; }
.schedule-next-practice { opacity: .85; font-size: .95rem; margin-top: 8px; }
.schedule-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 20px;
}
/* Command strip: search + type-filter chips + bulk add-to-calendar. Sticky so it stays reachable
   while scrolling a long schedule. Solid bg + bottom rule so list rows scroll cleanly behind it. */
.schedule-toolbar {
  position: sticky; top: 0; z-index: 3;
  margin-top: 24px; padding: 12px 0;
  background: var(--paper); border-bottom: 1px solid var(--rule);
}
.schedule-toolbar:empty { display: none; }
.schedule-toolbar-main { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.schedule-search {
  flex: 1 1 220px; min-width: 0;
  background: var(--paper-2); border: 1px solid var(--rule); border-radius: 8px;
  color: var(--ink); padding: 9px 12px; font-family: 'Barlow', sans-serif; font-size: .92rem;
}
.schedule-search::placeholder { color: var(--muted); }
.schedule-search:focus { outline: none; border-color: var(--gold); }
.schedule-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.schedule-chip-filter {
  background: none; border: 1px solid var(--rule); border-radius: 999px;
  color: var(--muted); padding: 6px 13px; font-size: .8rem; cursor: pointer; white-space: nowrap;
  font-family: 'Barlow', sans-serif;
}
.schedule-chip-filter:hover { border-color: var(--gold); color: var(--ink); }
.schedule-chip-filter.is-active { background: var(--gold); color: var(--on-accent); border-color: var(--gold); }
/* The bulk buttons live inside the toolbar now (one command strip). */
.schedule-toolbar .schedule-bulk { margin: 10px 0 0; }
.schedule-row {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 6px 12px;
  align-items: baseline;
  padding: 10px 12px;
  border: 1px solid var(--rule);
  border-radius: 10px;
}
.schedule-row-where { grid-column: 2 / -1; opacity: .65; font-size: .88rem; }
/* Sign-up countdown — a pronounced gold pill so viewers see the deadline without opening Details. */
.schedule-countdown {
  grid-column: 1 / -1; justify-self: start; margin-top: 6px;
  display: inline-block;
  font-size: .8rem; font-weight: 600; color: var(--gold);
  background: rgba(var(--accent-rgb), .14);
  border: 1px solid rgba(var(--accent-rgb), .35);
  border-radius: 999px; padding: 3px 11px;
}
.schedule-hero-countdown { grid-column: auto; margin: 12px 0 0; font-size: .9rem; }
.schedule-chip {
  /* Uniform width + centered text so every row's title starts at the same x, regardless of the
     chip word length (MEET / PRACTICE / EVENT). */
  display: inline-block; box-sizing: border-box;
  min-width: 82px; text-align: center;
  font-size: .7rem;
  text-transform: uppercase;
  letter-spacing: .05em;
  padding: 2px 8px;
  border-radius: 999px;
  background: rgba(var(--accent-rgb), .12);
  color: var(--gold);
  white-space: nowrap;
}
/* Practice chip: subdued compared to meet */
.schedule-type-practice .schedule-chip {
  background: rgba(var(--ink-rgb, 244,246,248), .08);
  color: var(--muted);
}
.schedule-row-when { opacity: .7; font-size: .88rem; white-space: nowrap; }
.schedule-footer   { opacity: .6; font-size: .8rem; margin-top: 20px; }
.schedule-empty,
.schedule-loading  { opacity: .7; padding: 24px 0; }
/* Agenda grouping — sticky day-proximity headers ("This week" / "Next week" / month). */
.schedule-group { display: flex; flex-direction: column; gap: 8px; }
.schedule-group-head {
  margin: 0; padding: 16px 0 6px;
  font-size: .72rem; font-weight: 600;
  text-transform: uppercase; letter-spacing: .08em;
  /* Transparent so the page's radial glow shows through (like the transparent rows do) — an
     opaque --paper fill here punched a flat-black box into the gradient behind the label. */
  color: var(--muted); background: transparent;
}
.schedule-group:first-child .schedule-group-head { padding-top: 4px; }
/* "Add to my calendar" — the one real action on a read-only schedule. */
.schedule-add-cal {
  display: inline-block; margin-top: 14px;
  padding: 9px 14px; border: 1px solid var(--rule); border-radius: 8px;
  font-size: .82rem; font-weight: 600; color: var(--gold); text-decoration: none;
}
.schedule-add-cal:hover { background: rgba(var(--accent-rgb), .08); }
/* Per-row "+ add to calendar" — sits right after the event name. */
.schedule-row-add {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; margin-left: 8px; vertical-align: middle;
  border: 1px solid var(--rule); border-radius: 999px;
  color: var(--gold); text-decoration: none; flex: 0 0 auto;
}
.schedule-row-add svg { width: 14px; height: 14px; display: block; }
.schedule-row-add svg path { stroke: currentColor; stroke-width: 2; stroke-linecap: round; fill: none; }
.schedule-row-add:hover { background: rgba(var(--accent-rgb), .12); }

/* ---------- Meet Plan: "+ Meet details" affordance + note/audience modal ---------- */
/* The button is a full-width row inside the .schedule-row grid (its own line). */
.schedule-row-plan {
  grid-column: 1 / -1; justify-self: start;
  margin-top: 2px;
  font-family: 'Barlow', sans-serif; font-size: 12px; letter-spacing: .03em;
  color: var(--gold); background: none;
  border: 1px solid var(--rule); border-radius: 6px;
  padding: 3px 10px; cursor: pointer;
}
.schedule-row-plan:hover { border-color: var(--gold); background: rgba(var(--accent-rgb), .08); }
/* In the schedule (rows + hero), Meet details is the PRIMARY action — filled, so it outweighs the
   secondary add-to-calendar +. Scoped to the schedule so the modal's "+ Add a sign-up" button
   (which reuses .schedule-row-plan) keeps the base outlined style. */
.schedule-row .schedule-row-plan,
.schedule-hero-card .schedule-row-plan {
  background: var(--gold); color: var(--on-accent);
  border: none; padding: 6px 13px; font-weight: 600;
}
.schedule-row .schedule-row-plan:hover,
.schedule-hero-card .schedule-row-plan:hover {
  background: var(--gold); border: none; filter: brightness(1.08);
}
/* On the hero card there's no grid; show it as an inline button below the meta. */
.schedule-hero-plan { grid-column: auto; display: inline-block; margin-top: 12px; }
/* Modal opens from the Schedule view; sit above any surface like the Huddle compose modal. */
#meetPlanOverlay { z-index: 80; }
.mp-hint { color: var(--muted); font-weight: normal; text-transform: none; letter-spacing: 0; font-size: 11px; }
/* Coach event-type correction row in the Details modal. */
.mp-type-row { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.mp-type-select { width: auto; min-width: 170px; margin-bottom: 0; cursor: pointer; }
.mp-type-saved { color: var(--gold); font-size: 11px; }
.mp-invitees { max-height: 220px; overflow: auto; margin-bottom: 12px; }
.mp-note-read {
  white-space: pre-wrap; color: var(--ink);
  background: var(--paper); border: 1px solid var(--rule); border-radius: 6px;
  padding: 12px 14px; font-family: 'Barlow', sans-serif; line-height: 1.5; min-height: 48px;
}
.mp-note-empty { color: var(--muted); font-style: italic; }
.mp-orphan {
  color: var(--gold); font-size: 12px;
  background: rgba(var(--accent-rgb), .08); border: 1px solid rgba(var(--accent-rgb), .3);
  border-radius: 6px; padding: 8px 11px; margin: 0 0 12px;
}
/* Meet sign-up sub-section inside the modal (coach builder + member responder). */
.mp-divider { height: 1px; background: var(--rule); margin: 16px 0 12px; }
.mp-signup-blurb { color: var(--muted); font-size: 12px; margin: 0 0 8px; }
.mp-options { display: flex; flex-direction: column; gap: 8px; margin-bottom: 8px; }
.mp-add-option {
  background: none; border: 1px dashed var(--rule); color: var(--muted);
  border-radius: 6px; padding: 6px 12px; cursor: pointer; font-size: 12px;
}
.mp-add-option:hover { border-color: var(--gold); color: var(--gold); }
.mp-signup-open { color: var(--ink); font-size: 13px; margin: 0 0 8px; }
.mp-deadline-edit { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 12px; }
.mp-deadline-edit .create-label { margin: 0; }
.mp-deadline-input { width: auto; margin-bottom: 0; }
.mp-signup-optlist { margin: 0 0 12px; padding-left: 18px; color: var(--ink); font-size: 13px; }
.mp-signup-optlist li { margin: 2px 0; }
/* Member responder */
.mp-countdown { color: var(--gold); font-weight: 600; font-size: 13px; margin: 0 0 10px; }
.mp-countdown.mp-countdown-soon { color: #e0556b; }
.mp-attend { display: flex; gap: 16px; align-items: center; color: var(--ink); font-size: 13px; margin-bottom: 10px; }
.mp-attend label { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
.mp-attend input { accent-color: var(--gold); cursor: pointer; }
.mp-member-options { max-height: 200px; overflow: auto; margin-bottom: 10px; }
.mp-signup-closed { color: var(--muted); font-style: italic; font-size: 12px; margin: 6px 0 0; }
/* Coach results panel */
.mp-results { max-height: 280px; overflow: auto; margin-bottom: 12px; }
.mp-results-head { font-size: 10px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin: 12px 0 6px; }
.mp-res-event { margin-bottom: 8px; }
.mp-res-event-label { color: var(--ink); font-size: 13px; font-weight: 600; margin-bottom: 4px; }
.mp-res-count { color: var(--muted); font-weight: normal; }
.mp-res-athlete { display: flex; align-items: center; gap: 8px; color: var(--ink); font-size: 13px; padding: 3px 0 3px 8px; cursor: pointer; }
.mp-res-athlete input { accent-color: var(--gold); cursor: pointer; }
.mp-res-names { color: var(--ink); font-size: 13px; opacity: .85; }
.mp-results-actions { display: flex; gap: 10px; flex-wrap: wrap; }

/* Bulk-export bar — "Add all" / "All meets" / "All practices". */
.schedule-bulk { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.schedule-bulk-btn {
  font-size: .78rem; font-weight: 600; color: var(--gold); text-decoration: none;
  border: 1px solid var(--rule); border-radius: 999px; padding: 7px 13px;
}
.schedule-bulk-btn:hover { background: rgba(var(--accent-rgb), .08); }

.sw-event-select select { font: inherit; margin-left:.35rem; padding:.15rem .4rem; }
.sw-split-stepper { margin:.5rem 0; }
.sw-stepper-controls { display:flex; align-items:center; gap:.5rem; margin-top:.25rem; }
.sw-split-stepper select { font: inherit; padding:.15rem .4rem; }
.sw-stepper-hint, .sw-focus-hint { color:var(--muted, #888); font-size:.85rem; }
.sw-focus-hint { margin:.25rem 0 .5rem; }

.corner-evset { display:flex; flex-direction:column; gap:6px; }
.corner-evset-help { color:var(--muted, #888); font-size:.85rem; margin-bottom:6px; }
.corner-evset-row { display:flex; align-items:center; gap:8px; padding:8px 0; border-bottom:1px solid var(--rule); }
.corner-evset-name { flex:1; min-width:0; }
.corner-evset-data { color:var(--muted, #888); font-size:.72rem; text-transform:uppercase; letter-spacing:.08em; }
.corner-evset-filter { margin-bottom:12px; }
.corner-evgroup { border-bottom:1px solid var(--rule); }
.corner-evgroup-head {
  display:flex; align-items:center; gap:8px; padding:10px 0; cursor:pointer;
  list-style:none;
}
.corner-evgroup-head::-webkit-details-marker { display:none; }
.corner-evgroup-head::after { content:'▾'; color:var(--muted,#888); font-size:.7rem; }
.corner-evgroup:not([open]) .corner-evgroup-head::after { content:'▸'; }
.corner-evgroup-title {
  flex:1; font-family:'JetBrains Mono',monospace; font-size:12px;
  letter-spacing:.08em; text-transform:uppercase; color:var(--ink);
}
.corner-evgroup-where { color:var(--muted,#888); font-size:.7rem; text-transform:uppercase; letter-spacing:.06em; white-space:nowrap; }
.corner-evgroup-count { color:var(--gold,#b8862b); font-family:'JetBrains Mono',monospace; font-size:.7rem; white-space:nowrap; }
.corner-evgroup[open] > .corner-evgroup-head { border-bottom:1px solid var(--rule); }
.corner-evgroup-rows { display:flex; flex-direction:column; }
@media (min-width:860px){
  .corner-evgroup-rows { display:grid; grid-template-columns:1fr 1fr; column-gap:24px; }
}
@media (max-width:600px){
  .corner-evgroup-head { position:sticky; top:0; background:var(--paper); z-index:1; }
  .corner-evset-toggle { min-height:44px; }
}
.corner-evset-toggle {
  font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.1em; text-transform:uppercase;
  min-width:3.2rem; text-align:center;
  padding:6px 12px; border:1px solid var(--rule); background:transparent; color:var(--muted,#888);
  cursor:pointer; border-radius:2px; transition:color .15s,border-color .15s,background .15s;
}
.corner-evset-toggle.on { color:var(--paper,#fff); background:var(--gold,#b8862b); border-color:var(--gold,#b8862b); }

/* ---- Testing tab: dense collapsible event cards ---- */
/* Collapsed card = a single underlined row (title · Best · count · +); the bordered
   card chrome is reserved for the expanded (open) state. */
.corner-event-card.is-collapsed{
  border:none;background:transparent;border-radius:0;
  border-bottom:1px solid var(--rule);padding:0 4px;margin-bottom:0;
}
.corner-event-card.is-collapsed .corner-event-head{ margin-bottom:0; padding:10px 0; }
.corner-event-count{
  font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted);
  border:1px solid var(--rule);border-radius:10px;padding:1px 8px;white-space:nowrap;
}
.corner-event-toggle{
  flex:0 0 auto;width:32px;height:32px;display:flex;align-items:center;justify-content:center;
  font-family:'JetBrains Mono',monospace;font-size:18px;line-height:1;
  border:1px solid var(--rule);border-radius:2px;color:var(--muted);background:var(--paper);
}
.corner-event-head:hover .corner-event-toggle{ color:var(--gold);border-color:var(--gold); }
.corner-event-grid{ display:flex;flex-direction:column; }
@media (min-width:860px){
  .corner-event-grid{ display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:start; }
  .corner-event-grid > .corner-event-card{ margin-bottom:0; }
  .corner-event-card.is-open{ grid-column:1 / -1; }
}

/* "Require acknowledgement" toggle — used by The Huddle's "+ Create" compose modal. */
.corner-ack-toggle{
  display:inline-flex; align-items:center; gap:7px;
  font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.1em;
  text-transform:uppercase; color:var(--muted); cursor:pointer; user-select:none;
}
.corner-ack-toggle input{ accent-color:var(--gold); width:15px; height:15px; cursor:pointer; }
.corner-ack-toggle:hover{ color:var(--gold); }

/* ============================================================
   PER-SURFACE SIGNATURE IMAGE SYSTEM
   ------------------------------------------------------------
   Reusable scaffold for a full-screen surface with a photographic
   background held behind a scrim (so text always sits over a scrim,
   never raw photo). My Locker is the first instance; later surfaces
   (Almanac track, stopwatch, clipboard) reuse .surface / .surface-bg /
   .scrim / .surface-inner and only swap the background image + any
   surface-specific accents. Treatment values per spec §11.
   ============================================================ */
.surface{ position:fixed; inset:0; display:none; overflow-y:auto; z-index:60; }
.surface.show{ display:block; }
/* The signature image, held low over the black paper so it reads as atmosphere,
   not a dominant photo. grayscale = hue-free, so it never clashes with a tenant's
   brand color; .32 keeps it subtle behind the scrim. Each surface sets the url. */
.surface-bg{ position:fixed; inset:0; z-index:0; background-position:center; background-size:cover; background-repeat:no-repeat; opacity:.32; filter:grayscale(1); }
/* Left-weighted scrim: the content column (left) stays legible while a
   focal detail on the right keeps peeking through; plus top/bottom fades. */
.scrim{
  position:fixed; inset:0; z-index:1; pointer-events:none;
  background:
    linear-gradient(100deg, rgba(var(--paper-rgb),.92) 0%, rgba(var(--paper-rgb),.7) 42%, rgba(var(--paper-rgb),.15) 72%, rgba(var(--paper-rgb),0) 100%),
    linear-gradient(to bottom, rgba(var(--paper-rgb),.85) 0%, rgba(var(--paper-rgb),0) 22%, rgba(var(--paper-rgb),0) 70%, rgba(var(--paper-rgb),.6) 100%);
}
.surface-inner{ position:relative; z-index:2; max-width:1180px; margin:0 auto; padding:34px 28px 80px; }
.surface-back{
  background:none; border:1px solid var(--rule); color:var(--ink);
  width:38px; height:38px; border-radius:50%; cursor:pointer; font-size:20px;
  display:grid; place-items:center; transition:border-color .2s,color .2s; flex:none;
}
.surface-back:hover{ border-color:var(--gold); color:var(--gold); }

/* ============================================================
   MY LOCKER
   ============================================================ */
.locker-bg{ background-image:url("assets/locker.jpg"); }
.huddle-bg{ background-image:url("assets/huddle-bg.jpg"); }

/* ============================================================
   SHARED-PAGE SIGNATURE BACKGROUND (#appBg)
   ------------------------------------------------------------
   The six non-surface destinations (Press Box, Almanac, Schedule,
   Coach's Corner, Front Office, Winner's Circle) render inside .wrap
   pages, so they share this one fixed layer instead of each carrying a
   .surface-bg. setAppBg() in app.js sets .app-bg-img's background-image
   and toggles #appBg.show on entry; a #splash MutationObserver clears it
   on every return home. Mirrors the .surface-bg treatment (grayscale,
   .32) and reuses .scrim for the same left-weighted legibility gradient.
   z-index:1 sits above the body paint but below .wrap content (z-index:2).
   ============================================================ */
#appBg{ display:none; }
#appBg.show{ display:block; }
/* Negative z-index keeps both the image and its scrim above the body paint but
   BEHIND all page content — even views that aren't .wrap (Almanac, Schedule) and
   so have no z-index of their own. Without this, the positive-z scrim painted
   over their content and dimmed it. Scoped to #appBg so the .surface overlays'
   own z-index:1 scrim (which sits correctly under .surface-inner) is untouched. */
.app-bg-img{
  position:fixed; inset:0; z-index:-2;
  background-position:center; background-size:cover; background-repeat:no-repeat;
  opacity:.32; filter:grayscale(1);
}
#appBg .scrim{ z-index:-1; }
/* Mobile: the six shared-page views (Almanac charts, Front Office tables, Press
   Box chat, Winner's Circle, etc.) are too cramped on a phone to warrant a
   background image, so disable #appBg under the standard 600px breakpoint. The
   .surface overlays (My Locker, The Huddle) deliberately KEEP theirs — they're
   feed-style with plenty of empty space even on mobile. Comes after the base
   #appBg.show rule so it wins at equal specificity when the query is active. */
@media (max-width:600px){ #appBg.show{ display:none; } }
/* Wrap so a crowded masthead (e.g. The Huddle's + Create / Active|Archived /
   Notes|Polls controls) drops to a second line instead of running off the
   right edge. row-gap spaces the wrapped line. */
.locker-top{ display:flex; flex-wrap:wrap; align-items:center; gap:18px; row-gap:10px; margin-bottom:4px; }
/* Push the title (and the controls after it) to the right so it doesn't sit jammed
   next to the back button — matches the Coach's Corner masthead. */
.locker-top .kicker{ margin-left:auto; }
.locker-child-switcher{
  margin-left:auto; font-family:'Barlow',sans-serif; font-size:14px; font-weight:600;
  background:var(--paper-2); color:var(--ink); border:1px solid var(--gold);
  padding:8px 14px; border-radius:6px; cursor:pointer;
}
.locker-head{ padding:6px 0 26px; }
.locker-head .kicker{ display:block; margin-bottom:14px; }
.locker-title{ font-size:clamp(44px,9vw,90px); text-align:left; margin:0; }
.locker-sub{
  font-family:'Barlow',sans-serif; font-style:italic; font-weight:300;
  color:var(--muted); font-size:18px; margin-top:14px; text-align:left;
}
.locker-loading,.locker-empty{
  font-family:'Barlow',sans-serif; color:var(--muted); font-size:16px; padding:18px 0;
}
.locker-error{
  font-family:'Barlow',sans-serif; color:#f0a; font-size:15px; padding:18px 0;
}

.section-label{
  font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.26em;
  text-transform:uppercase; color:var(--muted); margin:30px 0 14px;
  display:flex; align-items:center; gap:12px;
}
.section-label::after{ content:""; flex:1; height:1px; background:var(--rule); }

.feed{ display:flex; flex-direction:column; gap:14px; max-width:680px; }
.note{
  position:relative; background:rgba(20,20,20,.62);
  -webkit-backdrop-filter:blur(7px); backdrop-filter:blur(7px);
  border:1px solid rgba(var(--ink-rgb),.07); border-radius:10px;
  padding:18px 20px 18px 22px; box-shadow:0 14px 34px -22px #000;
}
.note.pinned{ border-left:3px solid var(--gold); background:rgba(var(--accent-rgb),.07); }
.note.unread{ border-left:3px solid var(--gold); }
.note .unread-dot{
  position:absolute; top:20px; right:20px; width:9px; height:9px; border-radius:50%;
  background:var(--gold); box-shadow:0 0 0 4px rgba(var(--accent-rgb),.16);
}
.note-head{ display:flex; align-items:center; gap:10px; margin-bottom:8px; flex-wrap:wrap; }
.note .badge{
  font-family:'JetBrains Mono',monospace; font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; padding:3px 8px; border-radius:4px; font-weight:500;
}
.badge.foryou{ background:var(--gold); color:var(--on-accent); }
.badge.team{ background:rgba(var(--ink-rgb),.1); color:var(--ink); }
.badge.pin{ background:none; border:1px solid var(--gold); color:var(--gold); }
.note-from{
  font-family:'Oswald',sans-serif; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; font-size:14px;
}
.note-time{ font-family:'JetBrains Mono',monospace; font-size:11px; color:var(--muted); margin-left:auto; }
.note-title{ font-family:'Oswald',sans-serif; font-weight:600; font-size:17px; margin:0 0 6px; color:var(--ink); }
.note-body{ color:var(--ink); font-size:15.5px; line-height:1.55; white-space:pre-wrap; }
.note-foot{ margin-top:14px; display:flex; align-items:center; gap:14px; }
.gotit{
  font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em;
  text-transform:uppercase; background:none; border:1px solid var(--gold);
  color:var(--gold); padding:7px 14px; border-radius:5px; cursor:pointer; transition:all .2s;
}
.gotit:hover{ background:var(--gold); color:var(--on-accent); }
.gotit.done{ border-color:var(--rule); color:var(--muted); pointer-events:none; }
.note-seen{ font-family:'JetBrains Mono',monospace; font-size:11px; color:var(--muted); letter-spacing:.08em; }
.note-ack-btn{ font-family:'Barlow',sans-serif; font-size:12px; letter-spacing:.04em; color:var(--on-accent);
  background:var(--gold); border:none; border-radius:5px; padding:6px 14px; cursor:pointer; }
.note-ack-btn:hover{ filter:brightness(1.08); }
.note-ack-btn:disabled{ opacity:.6; cursor:default; }
.note-acked{ font-size:12px; color:#4a8f5b; letter-spacing:.04em; }

@media(max-width:680px){
  .scrim{ background:linear-gradient(to bottom,rgba(var(--paper-rgb),.72),rgba(var(--paper-rgb),.92)); }
  .note-time{ width:100%; margin-left:0; order:3; }
  .locker-child-switcher{ margin-left:0; }
}

/* ============================================================
   THE HUDDLE — staff engagement dashboard. Clean analytical look:
   solid dark, no signature photo. Reuses the .badge color modifiers
   (.foryou/.team/.pin) from My Locker; the base .badge chrome here is
   scoped to .huddle-note since the original base lives on .note .badge.
   .bar/.dot are scoped to avoid leaking into other surfaces.
   ============================================================ */
.huddle-surface{ background:var(--paper); }
.huddle-views{ display:inline-flex; gap:2px; margin-left:12px; background:var(--paper-2); border:1px solid var(--rule); border-radius:7px; padding:2px; }
.huddle-view{ font-family:'Barlow',sans-serif; font-size:12px; letter-spacing:.04em; color:var(--muted); background:none; border:none; border-radius:5px; padding:5px 12px; cursor:pointer; }
.huddle-view.is-on{ background:var(--gold); color:var(--on-accent); }
.huddle-section-label{ font-size:10px; text-transform:uppercase; letter-spacing:.08em; color:var(--muted); margin:14px 0 6px; cursor:default; }
.huddle-section-label.collapsible{ cursor:pointer; }
.huddle-archived-meta{ font-size:11px; color:var(--muted); margin-top:6px; }
.huddle-tiles{ display:flex; gap:10px; margin-bottom:16px; }
.huddle-tile{ flex:1; background:var(--paper-2); border:1px solid var(--rule); border-radius:8px; padding:12px 14px; }
.huddle-tile b{ display:block; color:var(--gold); font-family:'Oswald',sans-serif; font-size:26px; line-height:1; }
.huddle-tile span{ font-size:10px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); }
.huddle-note{ background:var(--paper-2); border:1px solid var(--rule); border-radius:8px; padding:12px 14px; margin-bottom:10px; cursor:pointer; }
.huddle-note-head{ display:flex; justify-content:space-between; align-items:baseline; gap:12px; }
.huddle-note-title{ color:var(--ink); font-size:14px; }
.huddle-note .badge{
  font-family:'JetBrains Mono',monospace; font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; padding:3px 8px; border-radius:4px; font-weight:500; white-space:nowrap;
}
.huddle-counts{ color:var(--muted); font-size:12px; font-variant-numeric:tabular-nums; white-space:nowrap; }
.huddle-note .bar{ height:6px; border-radius:3px; background:var(--rule); overflow:hidden; margin-top:8px; }
.huddle-note .bar>i{ display:block; height:100%; background:var(--gold); }
.huddle-roster{ display:none; margin-top:10px; border-top:1px solid var(--rule); padding-top:8px; }
.huddle-roster.open{ display:block; }
.roster-row{ display:flex; align-items:center; gap:8px; padding:4px 0; font-size:13px; color:var(--ink); }
.roster-row .roster-status{ margin-left:auto; font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; }
/* Parent-proxied engagement marker — subtle, italic, always paired with the status (never the only signal). */
.roster-row .roster-by{ font-size:11px; color:var(--muted); font-style:italic; }
.roster-row .dot{ width:8px; height:8px; border-radius:50%; display:inline-block; }
.roster-row .dot.seen{ background:#4a8f5b; }
.roster-row .dot.ack{ background:var(--gold); }
.roster-row .dot.none{ background:#5a5a5a; }
/* Per-coach unread: gold dot before the title + bolder white title. The base
   .dot sizing is scoped to .roster-row, so size the inline title dot here. */
.huddle-note.unread .huddle-note-title{ font-weight:700; color:var(--ink); }
.huddle-note-title .dot.unread{
  width:8px; height:8px; border-radius:50%; display:inline-block;
  margin-right:6px; vertical-align:middle;
}
.dot.unread{ background:var(--gold); }

/* ---- Relay stopwatch (setup / active / results) ---- */
.sw-relay-legs{ display:grid; gap:.5rem; margin:.75rem 0; }
.sw-relay-leg{ display:flex; align-items:center; gap:.5rem; }
.sw-relay-leg-role{ min-width:4.5rem; font-weight:600; }
.sw-relay-leg-select{ flex:1; padding:.4rem; }
.sw-relay-rows, .sw-relay-table{ width:100%; }
.sw-relay-row{ display:grid; grid-template-columns:4.5rem 1fr 5rem 5rem; gap:.5rem; padding:.35rem 0; }
.sw-relay-head{ font-weight:600; opacity:.7; }
.sw-relay-row.pending{ opacity:.5; }
.sw-handoff-btn{ font-size:1.1rem; padding:.7rem 1rem; }
.sw-relay-total{ font-size:1.25rem; margin:.5rem 0; }
.sw-relay-table th, .sw-relay-table td{ text-align:left; padding:.35rem .5rem; }
.sw-dq{ color:#c0392b; }
.sw-relay-actions{ display:flex; gap:.5rem; align-items:center; margin-top:.5rem; }
.sw-relay-clear-btn{ padding:.5rem .9rem; }

/* The Huddle — archive/restore actions, Undo toast, bulk bar (Phase 3.5 Task 4) */
.huddle-note-actions{ display:flex; align-items:center; gap:8px; }
.huddle-toast{ position:fixed; left:50%; bottom:20px; transform:translateX(-50%) translateY(20px); background:var(--paper-2); border:1px solid var(--gold); color:var(--ink); padding:10px 14px; border-radius:8px; font-size:13px; opacity:0; pointer-events:none; transition:.2s; z-index:90; }
.huddle-toast.show{ opacity:1; transform:translateX(-50%) translateY(0); pointer-events:auto; }
.huddle-toast-undo{ background:none; border:none; color:var(--gold); cursor:pointer; font-weight:600; margin-left:8px; }
.huddle-archive-btn,.huddle-restore-btn{ background:none; border:1px solid var(--rule); color:var(--muted); border-radius:5px; font-size:11px; padding:4px 10px; cursor:pointer; }
.huddle-archive-btn:hover,.huddle-restore-btn:hover{ border-color:var(--gold); color:var(--gold); }
.huddle-sel{ accent-color:var(--gold); margin-right:8px; cursor:pointer; }
.huddle-bulkbar{ position:sticky; bottom:0; display:none; justify-content:space-between; align-items:center; gap:12px; background:var(--paper); border-top:1px solid var(--rule); padding:10px 14px; }
.huddle-bulkbar.show{ display:flex; }
.huddle-bulk-go{ background:var(--gold); color:var(--on-accent); border:none; border-radius:6px; padding:6px 14px; cursor:pointer; }

/* The Huddle — Create Poll compose (Phase 4 Task 6) */
.create-poll .create-input{ margin-bottom:8px; }
.poll-options{ display:flex; flex-direction:column; gap:6px; }
.poll-add-option{ background:none; border:1px dashed var(--rule); color:var(--muted); border-radius:6px;
  padding:6px 10px; cursor:pointer; font-size:12px; margin-top:6px; }
.poll-add-option:hover{ border-color:var(--gold); color:var(--gold); }
.poll-athletes{ display:grid; grid-template-columns:repeat(auto-fill,minmax(140px,1fr)); gap:4px 12px;
  max-height:180px; overflow:auto; margin:6px 0 12px; padding:8px; border:1px solid var(--rule); border-radius:6px;
  background:var(--paper); }
.poll-athlete{ display:flex; align-items:center; gap:6px; color:var(--ink); font-size:13px; }
.poll-select-all{ grid-column:1/-1; border-bottom:1px solid var(--rule); padding-bottom:6px; margin-bottom:2px; color:var(--ink); }

/* The Huddle — Polls sub-view (Phase 4 Task 7) */
.huddle-kinds{ display:flex; gap:4px; margin-left:8px; }
.huddle-kind{ background:none; border:1px solid var(--rule); color:var(--muted); border-radius:6px;
  padding:5px 12px; cursor:pointer; font-size:12px; }
.huddle-kind.is-on{ background:var(--gold); color:var(--on-accent); border-color:var(--gold); }
.poll-views{ margin-bottom:12px; }
.poll-bars{ display:flex; flex-direction:column; gap:6px; margin:8px 0; }
.poll-bar-row{ display:grid; grid-template-columns:120px 1fr 32px; align-items:center; gap:8px; font-size:13px; color:var(--ink); }
.poll-bar-label{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.poll-bar-count{ text-align:right; color:var(--muted); }
.poll-actions{ display:flex; gap:8px; margin-top:6px; }

/* My Locker — Surveys section (Phase 4 Task 8) */
.locker-surveys{ margin-bottom:18px; }
.locker-section-h{ font-family:'Oswald',sans-serif; font-size:15px; letter-spacing:.05em; text-transform:uppercase;
  color:var(--gold); margin:0 0 8px; }
.survey-card .survey-q{ font-weight:600; color:var(--ink); margin-bottom:8px; }
.survey-opts{ display:flex; flex-direction:column; gap:6px; margin-bottom:10px; }
.survey-opt{ display:flex; align-items:center; gap:8px; color:var(--ink); font-size:14px; }
.survey-submit{ background:var(--gold); color:var(--on-accent); border:none; border-radius:6px; padding:7px 16px; cursor:pointer; }
.survey-submit:disabled{ opacity:.6; cursor:default; }
.survey-done{ color:var(--gold); font-weight:600; }
.survey-err{ color:#f0a; font-size:12px; margin-top:6px; }
/* Closed-poll result bars: the .bar/.bar>i fill rules are otherwise scoped to .huddle-note. */
.survey-card .bar{ height:6px; border-radius:3px; background:var(--rule); overflow:hidden; }
.survey-card .bar>i{ display:block; height:100%; background:var(--gold); }

/* My Locker engagement badge (Phase 5) */
#splashDots .splash-dot{ position:relative; }   /* anchor the count bubble */
.splash-dot-badge{ position:absolute; top:-9px; left:50%; transform:translateX(-50%);
  background:var(--gold); color:var(--on-accent); font-family:'Barlow',sans-serif; font-weight:700;
  font-size:9px; line-height:14px; min-width:14px; height:14px; padding:0 3px; border-radius:7px;
  pointer-events:none; }
.locker-slide-badge{ display:inline-block; margin-top:10px; background:var(--gold); color:var(--on-accent);
  font-family:'Barlow',sans-serif; font-weight:700; font-size:13px; letter-spacing:.02em;
  padding:3px 11px; border-radius:11px; }

#seasonAlmanac { max-width: 980px; margin: 0 auto; padding: 24px 16px; }
.sa-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.sa-title { font-size: 1.8rem; margin: 0; }
.sa-kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin: 18px 0; }
.sa-kpi { background: var(--paper-2, #181818); border-radius: 8px; padding: 14px 8px; text-align: center; }
.sa-kpi .num { font-size: 1.6rem; font-weight: 700; color: var(--gold, #f6c945); }
.sa-kpi .lbl { font-size: .75rem; color: var(--muted); margin-top: 2px; }
.sa-charts { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.sa-chartbox { background: var(--paper-2, #181818); border-radius: 8px; padding: 14px; }
/* Bound chart height so Chart.js (maintainAspectRatio:false) can't blow up on mobile. */
.sa-canvas { position: relative; height: 240px; }
.sa-canvas > canvas { max-height: 100%; }
.sa-chartbox h3 { font-size: .9rem; margin: 0 0 8px; color: #cfcfcf; }
.sa-narrative { max-width: 70ch; margin: 4px 0 18px; color: var(--ink, #e9e9e9); line-height: 1.55; font-size: 1rem; }
.sa-narrative.loading { color: var(--muted); font-style: italic; }

/* Collapsible per-meet highlights — sits quietly under the recap until opened. */
.sa-highlights { margin: 0 0 18px; border: 1px solid var(--rule, #2c2c2c); border-radius: 8px; background: var(--paper-2, #181818); }
.sa-highlights > summary { cursor: pointer; padding: 11px 14px; font-size: .9rem; font-weight: 600; color: #cfcfcf;
  list-style: none; display: flex; align-items: center; gap: 8px; }
.sa-highlights > summary::-webkit-details-marker { display: none; }
.sa-highlights > summary::before { content: '\25B8'; color: var(--gold, #F0C00C); transition: transform .15s; }
.sa-highlights[open] > summary::before { transform: rotate(90deg); }
.sa-highlights-body { padding: 2px 14px 14px; max-width: 70ch; }
.sa-hl-item { margin: 0 0 14px; padding-left: 12px; border-left: 2px solid var(--gold, #F0C00C); }
.sa-hl-item:last-child { margin-bottom: 0; }
.sa-hl-meet { color: var(--gold, #F0C00C); font-weight: 700; font-size: .85rem; margin-bottom: 2px; }
.sa-hl-text { margin: 0; font-size: .85rem; line-height: 1.55; color: #c9c9c9; }
/* Weather lifted out of the gold heading: a small chip (hover title on desktop, tap to toggle
   the inline detail on mobile). */
.sa-hl-wx { margin-left: 6px; padding: 0 4px; border: none; background: none; cursor: pointer;
  font-size: .8rem; line-height: 1; opacity: .8; vertical-align: baseline; }
.sa-hl-wx:hover { opacity: 1; }
.sa-hl-wx-detail { margin-left: 6px; font-weight: 400; font-size: .78rem; color: var(--muted); }
.sa-selector { display: flex; align-items: center; gap: 12px; margin-top: 20px; }

/* ── Advanced / timeline widgets ─────────────────────────────────────────── */
.sa-timeline { display: flex; flex-direction: column; gap: 16px; margin-top: 16px; }
.sa-block { background: var(--paper-2, #181818); border-radius: 8px; padding: 14px; }
.sa-block h3 { font-size: .9rem; margin: 0 0 8px; color: #cfcfcf; }
.sa-block-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.sa-block-head h3 { margin: 0; }

/* "i" help button next to a chart heading + the explanation it toggles. */
.sa-info { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px;
  margin-left: 6px; padding: 0; border-radius: 50%; border: 1px solid var(--rule, #2c2c2c);
  background: transparent; color: var(--muted); font: italic 600 .7rem/1 Georgia, "Times New Roman", serif;
  cursor: pointer; vertical-align: middle; transition: color .12s, border-color .12s; }
.sa-info:hover, .sa-info[aria-expanded="true"] { color: var(--gold, #F0C00C); border-color: var(--gold, #F0C00C); }
.sa-help { margin: -2px 0 12px; max-width: 70ch; font-size: .82rem; line-height: 1.55; color: #b9b9b9;
  border-left: 2px solid var(--gold, #F0C00C); padding-left: 10px; }
.sa-chartbox .sa-help, .sa-block .sa-help { background: rgba(var(--ink-rgb),.02); border-radius: 0 4px 4px 0; padding: 8px 10px; }

.sa-heatmap { display: grid; gap: 2px; overflow-x: auto; }
.sa-heat-corner, .sa-heat-label {
  position: sticky; left: 0; z-index: 1; background: var(--paper-2, #181818);
}
.sa-heat-label { font-size: .72rem; color: var(--ink, #e9e9e9); padding: 2px 8px 2px 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; }
.sa-heat-head { font-size: .65rem; color: var(--muted); text-align: center; min-width: 26px; }
.sa-heat-cell {
  min-width: 26px; height: 22px; border-radius: 3px; border: 1px solid var(--rule, #2c2c2c);
  display: flex; align-items: center; justify-content: center;
  font-size: .65rem; color: var(--on-accent); font-weight: 700;
}
.sa-more { font-size: .72rem; color: var(--muted); margin: 8px 0 0; }

/* Always-visible caption under a widget heading (e.g. the age-group caveat). */
.sa-caption { font-size: .72rem; color: #8a8a8a; margin: -4px 0 10px; font-style: italic; }

/* "Where the marks moved" — one before→now row per event (dot → arrow). */
.sa-shifts { display: flex; flex-direction: column; gap: 10px; }
.sa-shift { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: .82rem; }
.sa-shift-evt { flex: 0 0 84px; color: #cfcfcf; font-weight: 600;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sa-shift-start { flex: 0 0 auto; color: #8a8a8a; font-variant-numeric: tabular-nums; }
.sa-shift-now { flex: 0 0 auto; color: #e9e9e9; font-weight: 700; font-variant-numeric: tabular-nums; }
.sa-shift-track { flex: 1 1 60px; min-width: 40px; position: relative; height: 12px; }
/* the line, a start dot on the left, an arrowhead on the right */
.sa-shift-arrow { position: absolute; left: 0; top: 50%; height: 2px; border-radius: 2px;
  transform: translateY(-50%); }
.sa-shift-arrow::before { content: ''; position: absolute; left: -3px; top: 50%; width: 6px; height: 6px;
  border-radius: 50%; transform: translateY(-50%); }
.sa-shift-arrow::after { content: ''; position: absolute; right: -5px; top: 50%; width: 0; height: 0;
  border-style: solid; border-width: 4px 0 4px 5px; border-color: transparent transparent transparent currentColor;
  transform: translateY(-50%); }
.sa-shift-delta { flex: 0 0 auto; margin-left: auto; font-size: .76rem; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.sa-shift-n { flex: 0 0 auto; font-size: .72rem; color: #7a7a7a; white-space: nowrap; }
.sa-shift.improved .sa-shift-arrow { background: #7ccb6b; color: #7ccb6b; }
.sa-shift.improved .sa-shift-arrow::before { background: #7ccb6b; }
.sa-shift.improved .sa-shift-delta { color: #7ccb6b; }
.sa-shift.regressed .sa-shift-arrow { background: #d49a4a; color: #d49a4a; }
.sa-shift.regressed .sa-shift-arrow::before { background: #d49a4a; }
.sa-shift.regressed .sa-shift-delta { color: #d49a4a; }

@media (max-width: 640px) {
  .sa-kpis { grid-template-columns: repeat(2, 1fr); }
  .sa-charts { grid-template-columns: 1fr; }
  .sa-heatmap { overflow-x: auto; }
  .sa-canvas { height: 200px; }
  /* Let the "avg of N athletes" count sit on its own tidy line instead of wrapping mid-row. */
  .sa-shift-n { flex-basis: 100%; margin-left: 0; }
}

/* ============================================================
   ATTESTATION — banner + modal checklist (roster review)
   ============================================================ */
.attest-banner{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  margin-bottom:18px;padding:12px 16px;
  background:rgba(var(--accent-rgb),.10);
  border:1px solid rgba(var(--accent-rgb),.35);
  border-left:3px solid var(--gold);
  border-radius:4px;
  font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);
}
.attest-banner button{
  flex:0 0 auto;
  font-family:'Barlow',sans-serif;font-size:13px;letter-spacing:.03em;
  padding:6px 14px;border:1px solid var(--gold);border-radius:3px;
  background:transparent;color:var(--gold);cursor:pointer;
  transition:background .15s,color .15s;
}
.attest-banner button:hover{background:var(--gold);color:var(--on-accent)}
.attest-modal-note{
  font-family:'Barlow',sans-serif;font-size:13px;line-height:1.55;
  color:var(--muted);margin:0 0 14px;
}
#attestList{margin-bottom:4px}
.attest-row{
  display:flex;align-items:center;gap:10px;
  padding:9px 0;border-bottom:1px solid var(--rule);
  cursor:pointer;user-select:none;
}
.attest-row:last-child{border-bottom:none}
.attest-check{
  flex:0 0 auto;width:16px;height:16px;
  accent-color:var(--gold);cursor:pointer;
}
.attest-name{
  flex:1 1 auto;
  font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);
}
.attest-row:has(.attest-check:not(:checked)) .attest-name{
  color:var(--muted);text-decoration:line-through;
}
.attest-date{
  flex:0 0 auto;
  font-family:'JetBrains Mono',monospace;font-size:11px;
  color:var(--muted);white-space:nowrap;
}
.attest-empty{
  font-family:'Barlow',sans-serif;font-size:14px;
  color:var(--muted);padding:10px 0;
}

/* ---- My Locker: Privacy & consent section (COPPA withdrawal, parents only) ---- */
.locker-privacy-section{
  margin-top:32px;
  padding-top:20px;
  border-top:1px solid var(--rule);
}
.privacy-consent-desc{
  font-family:'Barlow',sans-serif;font-size:13px;color:var(--muted);margin:0 0 14px;
}
.privacy-consent-row{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:10px 0;border-bottom:1px solid var(--rule);flex-wrap:wrap;
}
.privacy-consent-row:last-child{border-bottom:none}
.privacy-consent-name{
  font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);flex:1 1 auto;
}
.privacy-withdraw-btn{
  flex:0 0 auto;
  background:none;border:1px solid #c44;color:#c44;
  border-radius:6px;padding:6px 12px;cursor:pointer;
  font-family:'Barlow',sans-serif;font-size:12px;
  transition:background .15s,color .15s;
}
.privacy-withdraw-btn:hover{background:#c44;color:#fff}
.privacy-undo-btn{
  flex:0 0 auto;
  background:none;border:1px solid var(--rule);color:var(--muted);
  border-radius:6px;padding:6px 12px;cursor:pointer;
  font-family:'Barlow',sans-serif;font-size:12px;
  transition:background .15s,color .15s;
}
.privacy-undo-btn:hover{background:var(--rule);color:var(--ink)}
/* Withdraw modal overrides */
.privacy-modal-label{font-family:'Barlow',sans-serif;font-size:13px;color:var(--ink);margin:0 0 4px;}
.privacy-erased-list{
  font-family:'Barlow',sans-serif;font-size:13px;color:var(--ink);
  margin:0 0 14px;padding-left:18px;
}
.privacy-warning{
  font-family:'Barlow',sans-serif;font-size:13px;
  color:#c44;margin:0 0 14px;
  background:rgba(204,68,68,.08);border-radius:6px;padding:10px 12px;
}
.privacy-ack-row{
  display:flex;align-items:center;gap:8px;margin-bottom:14px;
  font-family:'Barlow',sans-serif;font-size:14px;color:var(--ink);
}
.privacy-ack-row input[type=checkbox]{accent-color:var(--gold);cursor:pointer;}

/* ---- Front Office Departed: parental-withdrawal badge ---- */
.badge-withdrawal{
  display:inline-block;
  font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.04em;
  text-transform:uppercase;color:#c44;
  background:rgba(204,68,68,.12);border:1px solid rgba(204,68,68,.35);
  border-radius:4px;padding:1px 5px;vertical-align:middle;margin-left:6px;
}

/* ============================================================
   OAuth provider buttons (Google / Apple)
   Per Google & Apple sign-in branding guidelines the logos must keep their
   official colors (no per-tenant tinting), and Google's full-color "G" must
   sit on a white/neutral surface. So these six buttons intentionally opt OUT
   of the --gold tenant theme: white button + 4-color G for Google, black
   button + white glyph for Apple. Double-class selectors (.btn-provider.btn-*)
   and placement at end-of-file beat the .auth-gate-btn / .admin-* .save-btn
   rules above on specificity + source order.
   ============================================================ */
.btn-provider{
  display:inline-flex;align-items:center;justify-content:center;gap:10px;
}
.btn-provider-icon{width:18px;height:18px;flex:0 0 auto;display:block}
.btn-provider.btn-google{
  background:#fff;color:#3c4043;border:1px solid #dadce0;
}
.btn-provider.btn-google:hover{background:#f7f8f8;color:#3c4043;border-color:#dadce0}
/* Black button on the near-black page needs an edge or it melts into the
   background; Apple's guidelines permit a bordered black button for this. */
.btn-provider.btn-apple{
  background:#000;color:#fff;border:1px solid rgba(255,255,255,.18);
}
.btn-provider.btn-apple:hover{background:#161617;color:#fff;border-color:rgba(255,255,255,.30)}
/* Keyboard-only focus ring (brand gold), visible on both the white and black buttons. */
.btn-provider:focus-visible{outline:2px solid var(--gold);outline-offset:2px}


/* ============================================================
   THE GRANDSTAND — community photo gallery (Phase 1b)
   Album grid → photo grid → lightbox, member upload, staff Review.
   ============================================================ */
.gs-wrap{max-width:1100px;margin:0 auto;padding:24px 16px 64px}
.gs-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;margin:6px 0 16px}
.gs-title{font-size:1.8rem;margin:0}
.gs-tabs{display:inline-flex;gap:6px}
.gs-tabs button{background:rgba(255,255,255,.06);color:inherit;border:1px solid rgba(255,255,255,.14);
  border-radius:999px;padding:6px 14px;cursor:pointer;font:inherit}
.gs-tabs button.on{background:var(--gold,#c9a227);color:#101010;border-color:transparent}
.gs-btn{background:rgba(255,255,255,.06);color:inherit;border:1px solid rgba(255,255,255,.16);
  border-radius:8px;padding:7px 12px;cursor:pointer;font:inherit}
.gs-btn:hover{background:rgba(255,255,255,.12)}
.gs-toolbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.gs-btn--quiet{opacity:.8}
.gs-album-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px;margin-top:12px}
.gs-album{display:flex;flex-direction:column;gap:4px;border:none;background:none;cursor:pointer;text-align:left;color:inherit}
.gs-album-cover{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:8px}
.gs-album-cover--empty{background:rgba(255,255,255,.08)}
.gs-album-name{font-weight:600}
.gs-album-count{font-size:12px;opacity:.7}
.gs-photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px;margin-top:12px}
.gs-photo{border:none;background:none;cursor:pointer;padding:0}
.gs-photo img{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:6px}
.gs-fab{position:fixed;right:20px;bottom:20px;width:56px;height:56px;border-radius:50%;font-size:28px;
  background:var(--gold,#c9a227);color:#101010;border:none;cursor:pointer;box-shadow:0 4px 14px rgba(0,0,0,.4);z-index:50}
.gs-empty{opacity:.7;padding:24px 0}
/* Grandstand lightbox + toast */
.gs-lightbox-modal{max-width:none;width:auto;max-height:90vh;display:flex;flex-direction:column;align-items:center;text-align:center}
/* Cap the image so the caption + tag chips below it stay on-screen (was 78vh, which
   filled the whole modal and pushed the tags out of view after the image loaded). */
.gs-lightbox-modal img{max-width:88vw;max-height:66vh;object-fit:contain;border-radius:8px}
.gs-lightbox-caption{margin:8px 0;opacity:.85}
.gs-toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(20px);
  background:#222;color:#fff;padding:10px 16px;border-radius:8px;opacity:0;transition:.2s;pointer-events:none;z-index:9999}
.gs-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
/* Grandstand staff Review tab + storage bar */
.gs-review-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;margin:8px 0 18px}
.gs-review-tile img{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:6px}
.gs-review-meta{font-size:12px;font-weight:600;margin-top:4px}
.gs-review-cap{font-size:12px;opacity:.75}
.gs-review-actions{display:flex;gap:4px;margin-top:4px;flex-wrap:wrap}
.gs-storage{margin:8px 0 16px}
.gs-storage-bar{height:8px;background:rgba(255,255,255,.12);border-radius:4px;overflow:hidden}
.gs-storage-bar span{display:block;height:100%;background:var(--gold,#c9a227)}
.gs-storage-label{font-size:12px;opacity:.8}
.gs-tagpick{position:relative;margin-top:8px}
.gs-tag-suggest{position:absolute;left:0;right:0;z-index:60;background:var(--paper-2,#1a1a1a);
  border:1px solid var(--rule,rgba(255,255,255,.14));border-radius:8px;max-height:220px;overflow:auto}
.gs-tag-opt{display:flex;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;color:inherit;cursor:pointer;font:inherit}
.gs-tag-opt:hover{background:rgba(255,255,255,.08)}
.gs-tag-kind{opacity:.6;font-size:12px}
.gs-tag-none{padding:8px 12px;opacity:.6}
.gs-tag-chosen,.gs-chiprow{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.gs-chip{display:inline-flex;align-items:center;gap:6px;background:rgba(255,255,255,.1);
  border-radius:999px;padding:4px 10px;font-size:13px}
.gs-chip button{background:none;border:none;color:inherit;cursor:pointer;font-size:15px;line-height:1}
.gs-chip--static{background:var(--gold,#c9a227);color:#101010}
.gs-review-tags{font-size:12px;opacity:.75;margin-top:2px}
